首页 > 其他分享 >Beginner:Client libraries-7实现自定义接口

Beginner:Client libraries-7实现自定义接口

时间:2023-06-02 17:14:41浏览次数:63  
标签:自定义 Beginner interfaces contact libraries book address msg rosidl

目标:在ROS2中学习更多的实现自定义接口

背景

在指定的接口包中声明接口,有时在一个包中声明、创建、使用所有接口很方便。

本教程关注msg接口类型,但是步骤对于其他所有接口类型适用。

任务

1、创建一个包

ros2 pkg create --build-type ament_cmake more_interfaces
mkdir more_interfaces/msg

2、创建一个msg文件

AddressBook.msg

uint8 PHONE_TYPE_HOME=0
uint8 PHONE_TYPE_WORK=1
uint8 PHONE_TYPE_MOBILE=2

string first_name
string last_name
string phone_number
uint8 phone_type

See About ROS 2 interfaces for more ways you can customize interfaces.

2.1 编译msg文件

package.xml

<buildtool_depend>rosidl_default_generators</buildtool_depend>

<exec_depend>rosidl_default_runtime</exec_depend>

<member_of_group>rosidl_interface_packages</member_of_group>

CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(more_interfaces)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
set(msg_files
    "msg/AddressBook.msg"
    
    )

rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
)
ament_export_dependencies(rosidl_default_runtime)
if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

2.2 设置更多的接口

在CMakeLists.txt中设置

set(msg_files
  "msg/Message1.msg"
  "msg/Message2.msg"
  # etc
  )

set(srv_files
  "srv/Service1.srv"
  "srv/Service2.srv"
   # etc
  )

生成所有的消息

rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  ${srv_files}
)

3、使用来自相同包的接口

在more_interfaces/src下创建publish_address_book.cpp

#include <chrono>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "more_interfaces/msg/address_book.hpp"

using namespace std::chrono_literals;

class AddressBookPublisher : public rclcpp::Node
{
public:
  AddressBookPublisher()
  : Node("address_book_publisher")
  {
    address_book_publisher_ =
      this->create_publisher<more_interfaces::msg::AddressBook>("address_book", 10);

    auto publish_msg = [this]() -> void {
        auto message = more_interfaces::msg::AddressBook();

        message.first_name = "John";
        message.last_name = "Doe";
        message.phone_number = "1234567890";
        message.phone_type = message.PHONE_TYPE_MOBILE;

        std::cout << "Publishing Contact\nFirst:" << message.first_name <<
          "  Last:" << message.last_name << std::endl;

        this->address_book_publisher_->publish(message);
      };
    timer_ = this->create_wall_timer(1s, publish_msg);
  }

private:
  rclcpp::Publisher<more_interfaces::msg::AddressBook>::SharedPtr address_book_publisher_;
  rclcpp::TimerBase::SharedPtr timer_;
};


int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<AddressBookPublisher>());
  rclcpp::shutdown();

  return 0;
}

 

在CMakeLists.txt中添加如下

find_package(rclcpp REQUIRED)

add_executable(publish_address_book src/publish_address_book.cpp)
ament_target_dependencies(publish_address_book rclcpp)

install(TARGETS
    publish_address_book
  DESTINATION lib/${PROJECT_NAME})

3.1与自定义接口类型链接

为了使用本包生成的消息,需要再CMakeLists.txt中添加如下

rosidl_get_typesupport_target(cpp_typesupport_target
  ${PROJECT_NAME} rosidl_typesupport_cpp)

target_link_libraries(publish_address_book "${cpp_typesupport_target}")

您可能已经注意到,当使用的接口来自独立构建的不同包时,没有必要执行此步骤。只有当您希望在与定义接口的包相同的包中使用接口时,才需要此CMake代码。

4、编译并运行

colcon build --packages-up-to more_interfaces

source install/local_setup.bash
ros2 run more_interfaces publish_address_book
查看消息内容
source install/setup.bash
ros2 topic echo /address_book

5、使用已经存在的接口定义

注意

可以在一个新的接口定义中使用已经存在的接口定义。例如,有一个消息的名字叫做Contact.msg,其属于包rosidl_tutorials_msgs。可以在自己的包中定义如下的数组

rosidl_tutorial_msgs/Contact[] address_book

为了生成依赖的消息Contack.msg,需要再package.xml中添加对应的包rosidl_tutorial_msgs

如下

<build_depend>rosidl_tutorials_msgs</build_depend>

<exec_depend>rosidl_tutorials_msgs</exec_depend>

在CMakeLists.txt中添加如下

find_package(rosidl_tutorials_msgs REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  DEPENDENCIES rosidl_tutorials_msgs
)

在cpp文件中需要添加头文件#include "rosidl_tutorials_msgs/msg/contact.hpp"

以及如下的修改

auto publish_msg = [this]() -> void {
   auto msg = std::make_shared<more_interfaces::msg::AddressBook>();
   {
     rosidl_tutorials_msgs::msg::Contact contact;
     contact.first_name = "John";
     contact.last_name = "Doe";
     contact.phone_number = "1234567890";
     contact.phone_type = message.PHONE_TYPE_MOBILE;
     msg->address_book.push_back(contact);
   }
   {
     rosidl_tutorials_msgs::msg::Contact contact;
     contact.first_name = "Jane";
     contact.last_name = "Doe";
     contact.phone_number = "4254242424";
     contact.phone_type = message.PHONE_TYPE_HOME;
     msg->address_book.push_back(contact);
   }

   std::cout << "Publishing address book:" << std::endl;
   for (auto contact : msg->address_book) {
     std::cout << "First:" << contact.first_name << "  Last:" << contact.last_name <<
       std::endl;
   }

   address_book_publisher_->publish(*msg);
 };

总结

在本教程中,您尝试了不同的字段类型来定义接口,然后在使用接口的同一个包中构建了一个接口。您还学习了如何使用其他接口作为字段类型,以及使用该功能所需的package.xml、CMakeLists.txt和#include语句。

 

标签:自定义,Beginner,interfaces,contact,libraries,book,address,msg,rosidl
From: https://www.cnblogs.com/gary-guo/p/17452334.html

相关文章

  • AtCoder Beginner Contest 286(G)
    AtCoderBeginnerContest286(G)G(欧拉路径)G题意大致为\(n\)个点,\(m\)个边的图,然后给出\(k\)条边的编号,问我们这\(k\)条边可不可以在一条路径上(每条边都可以经过)对于可不可以存在一条路径,里面包含个题目所给的\(k\)条边,其实就是问是否存在一条路可以经历这\(k\)条边,然后我们......
  • spring cloud gateway 自定义GatewayFilterFactory
    官网地址:https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#writing-custom-route-predicate-factories参考地址:https://blog.csdn.net/myli92/article/details/127328893importcom.ruoyi.common.core.utils.StringUtils;importorg.springfr......
  • paddleDetection 训练自定义数据集 第二章 开始训练
    paddleDetection训练自定义数据集第二章开始训练上一章数据集制作文章目录paddleDetection训练自定义数据集第二章开始训练一、环境二、安装1.安装miniconda2.安装paddlepaddle3.下载paddleDetection三、训练自定义数据集1.首先选择预训练模型,然后修改配置文件2.训练3.导......
  • paddleOcr 训练自定义数据
    paddleOcr训练自定义数据文章目录paddleOcr训练自定义数据前言一、创建环境二、安装环境三、使用ppocrlabel标注图片1.打开图片目录2.导出标记结果、导出识别结果四、训练1.切分数据2.修改训练的模型yml3.开始训练五、已经训练的模型,有了新数据需要继续训练1.使用恢复训练2.使......
  • Beginner:Client libraries-3 创建一个包
    目标:使用CMake或者Python来创建一个新的包,运行可执行程序;背景1、ROS2的包是什么一个包是作为ROS2代码的组织单元。如果你想安装你的代码或与他人共享,那么你需要将其组织在一个包中。有了软件包,您可以发布您的ROS2作品,并允许其他人轻松构建和使用它。在ROS2中包的创建使用amen......
  • 自定义View-字体篇
    文章目录来源字体mediumFontMetricstextSize这是为70F的时候自己绘制的线条top、ascent、descent、bottombaseLine通过ascent和descent计算,top和bottom计算出来的还不一样TextPaint和StaticLayoutbreakText(CharSequencetext,intstart,intend,booleanmeasureForwards......
  • Spring Boot如何自定义监控指标
    1.创建项目pom.xml引入相关依赖<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd"......
  • Beginner:Client libraries-2 创建工作空间
    目标:创建一个工作空间,学习如何设置开发和测试覆盖层(overlay)。背景工作空间是一个包含了ROS2的包的路径,在使用ros2之前首先需要source相应的ROS2工作空间来使用对应的包。overlay是一个可以添加新的包而不影响现有ROS2工作区,即underlay的工作空间;underlay中包含着overlay的依......
  • spinner自定义[转]
    转自:https://www.jianshu.com/p/7b03ade29091spinner_drop_down_shape的代码<?xmlversion="1.0"encoding="utf-8"?><layer-listxmlns:android="http://schemas.android.com/apk/res/android"><item><shap......
  • Vue-自定义icon实现
    在项目中引入了element-ui之后,发现其内置的icon有限,无法满足项目的需求,因此需自定义icon来实现需求。在vue项目的components下新建SvgIcon目录,在SvgIcon目录下新建index.vue插入代码:<template><svgclass="svg-icon"aria-hidden="true"><use:xlink:href="ic......