ROS2 编写自定义消息

创建src目录

$ mkdir ros-demo
$ cd ros-demo/
$ mkdir src
$ cd src/

创建工程

在src目录下执行下面的命令,生成message_interfaces文件夹,我们可以在这个文件夹内编写自己的自定义消息

$ ros2 pkg create --build-type ament_cmake message_interfaces

整理文件夹

删除现有的include和src文件夹,并创建msg和srv文件夹,msg用于存放话题的自定义消息,srv用于存放服务的自定义消息

$ ls
CMakeLists.txt  include  package.xml  src
$ rm -rf include/
$ rm -rf src/
$ mkdir msg
$ mkdir srv
$ ls
CMakeLists.txt  msg  package.xml  srv

编写自定义消息

消息文件名一定要大写开头,不然无法编译通过
在这里插入图片描述

在msg文件夹添加Hello.msg文件,内容如下

string msg

在这里插入图片描述

在srv文件夹添加Add.srv文件,内容如下

int64 a
int64 b
int64 c
---
int64 sum

修改CMakeLists.txt文件

需要把需要生成的消息添加到文件中
在这里插入图片描述
添加的内容如下

find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Hello.msg"
  "srv/Add.srv"
 )

修改package.xml文件

添加依赖和运行环境

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

在这里插入图片描述

单独编译

如果需要编译指定包,可通过下面的方式

~/code/ros-demo$ colcon build --packages-select message_interfaces
Starting >>> message_interfaces
Finished <<< message_interfaces [5.24s]                     

Summary: 1 package finished [5.37s]

统一编译

~/code/ros-demo$ colcon build
Starting >>> cpp_pubsub
Starting >>> message_interfaces
Finished <<< cpp_pubsub [0.27s]
Finished <<< message_interfaces [0.60s] 

Summary: 2 packages finished [0.75s]

结果会在install目录下生成对应的头文件
在这里插入图片描述

查看自定义消息

使用ros2 interface show命令可查看消息的详细信息

$ . install/setup.bash
$ ros2 interface show message_interfaces/msg/Hello 
string msg
$ ros2 interface show message_interfaces/srv/Add 
int64 a
int64 b
int64 c
---
int64 sum

增加代码提示

增加生成自定义消息的头文件路径
在这里插入图片描述

{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "",
                "limitSymbolsToIncludedHeaders": true
            },
            "includePath": [
                "/opt/ros/foxy/include/**",
                "/usr/include/**",
                "${workspaceFolder}/install/message_interfaces/include"
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "gnu++14"
        }
    ],
    "version": 4
}

修改代码

https://blog.csdn.net/wei242425445/article/details/115267172?spm=1001.2014.3001.5501
修改上文的cpp_pubsub工程

  • 修改pubnode.h文件
    在这里插入图片描述
  • 修改pubnode.cpp文件
    在这里插入图片描述
  • 修改subnode.h文件
    在这里插入图片描述
  • 修改subnode.cpp文件
    在这里插入图片描述
  • 修改CMakeLists.txt文件
    在这里插入图片描述
  • 修改package.xml文件
    在这里插入图片描述

编译与运行

单独编译

$ colcon build --packages-select cpp_pubsub

统一编译

~/code/ros-demo$ colcon build

运行

$ ros2 run cpp_pubsub publisher 
$ ros2 run cpp_pubsub subscriber
回答: 在ROS2中,如果要发布自定义消息类型,需要进行以下几个步骤。首先,需要在消息定义文件中定义自定义消息类型,该文件需要保存在消息目录中,并使用.msg文件扩展名。\[1\]然后,在发布节点的源代码中,使用ROS2的Publisher类来创建发布者对象,并指定自定义消息类型作为模板参数。例如:ros2::Publisher<my_msgs::MyMessage> pub = node.create_publisher<my_msgs::MyMessage>("my_topic", 10);\[2\]接下来,编写发布消息的逻辑,并使用发布者对象的publish方法来发布消息。最后,运行发布节点,即可发布自定义消息类型的消息。 #### 引用[.reference_title] - *1* *2* [ROS笔记(6)——自定义消息类型](https://blog.csdn.net/weixin_40582034/article/details/129041958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ROS实践07 自定义消息调用python](https://blog.csdn.net/qq_42227760/article/details/130013586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值