【机器人】ROS2 自定义消息协议设计(msg)与话题观测指南(topic)


🔥大奇个人主页 :https://blog.csdn.net/m0_75192474?type=blog

本文所属专栏:https://blog.csdn.net/m0_75192474/category_13131150.html

在实际开发中,我们通常要定义出自己的数据类型,因为我们的原始数据跟ROS的数据类型大多都不匹配,所以我们需要自定义数据类型,同时接入ROS中。本文将完整、详细地讲解在ROS2 Humble版本中,如何从零创建自定义消息、配置编译环境。

ROS1版本自定义消息可以看这篇文章 地址

🤠 创建消息类型源文件msg

首先你应该有一个ROS的标准功能包,如果没有的话可以使用 ros2 pkg create 创建,然后在该目录下创建一个 msg文件夹

ROS2 消息支持的常用基本数据类型包括:

  • bool:布尔类型(true/false)
  • int8、uint8、int16、uint16、int32、uint32、int64、uint64:整数类型
  • float32、float64:浮点数类型
  • string:字符串类型
  • 数组类型:type[] 表示动态长度数组
    当然也可以添加ros标准数据类型,用了其他消息必须在cmakelist.txt中写 DEPENDENCIES

然后就可以创建以 .msg为后缀的消息类型了,就拿 **RawSpeed.msg**这个文件来说,我创建了三个float32的数据

消息文件必须以大写字母开头,不能用下划线开头,驼峰命名法

  • 正确:ImuData.msg

  • 错误:imu_data.msg_Imu.msg

    float32 speed_vx
    float32 speed_vy
    float32 speed_vz

或者 RawLidar.msg

复制代码
int32 sec             # 时间戳 秒
uint32 nanosec        # 时间戳 纳秒
float32[] distance       # 360个点的距离值 单位:m
float32[] intensity      # 360个点的强度值

紧接着创建RawImu.msg RawMag.msg ,以上就是我们的自定义的四个数据类型了

🔥 配置CMakeLists.txt

配置CMakeLists.txt文件是生成自定义消息头文件的必经之路,关系到我们能否在项目中使用它

添加以下内容

复制代码
set(msg_files
	msg/RawImu.msg
	msg/RawLidar.msg
	msg/RawSpeed.msg
	msg/RawMag.msg
)

这个表示的使用Cmakeset命令,将我们编写的 msg文件存储到 msg_files变量中

复制代码
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
DEPENDENCIES
)

ROS2 中,是用来编译你自定义的 .msg / .srv / .action 接口文件,由于我们的msg文件中没有添加ROS2标准数据类型,所以不用写依赖。

复制代码
rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} "rosidl_typesupport_cpp")
target_link_libraries(udptoros_node
    ${cpp_typesupport_target}
)

找到当前包编译出来的 自定义消息 C++ 类型支持库 ,并把它赋值给变量 ${cpp_typesupport_target};把自定义消息库链接到节点 ,让 C++ 代码可以 #include 并使用你自己写的 .msg

udptoros_node 换成你的可执行文件名

🥊 配置package.xml

添加以下命令即可

复制代码
  <member_of_group>rosidl_interface_packages</member_of_group>
  <depend>rosidl_default_generators</depend>
  • 告诉ROS2编译系统,当前包是一个"接口包",需要生成消息/服务代码
  • 告诉ROS2编译系统,声明依赖ROS2默认的消息生成工具,确保编译时能调用 rosidl 相关工具

配置完这两个文件后就可以执行 colcon build 编译了

编译成功后,可以在install目录下找到

🚅 在本包或者其他包中使用自定义消息类型

在本包文件中直接包含即可

复制代码
#include "looraysbot_udptoros/msg/raw_imu.hpp"
#include "looraysbot_udptoros/msg/raw_lidar.hpp"
#include "looraysbot_udptoros/msg/raw_mag.hpp"
#include "looraysbot_udptoros/msg/raw_speed.hpp"

如果说有红色波浪线报includepath错误,通常是c/c++插件找不到头文件路径

解决方法是在c_cpp_properties.json文件中添加

json 复制代码
"${workspaceFolder}/src/looraysbot_udptoros/include",
"${workspaceFolder}/install/looraysbot_udptoros/include/**",

在其他包中使用时需要在 package.xml 中添加依赖项

json 复制代码
  <depend>looraysbot_udptoros </depend>

表示该包编译时依赖 looraysbot_udptoros 包,需要先编译该包,looraysbot_udptoros就是你自定义消息的那个功能包

💙 使用ros2 topic命令查看消息

  • ros2 topic list 列出所有话题

参数

bash 复制代码
ros2 topic list [-h] [--spin-time N] [-s] [--no-daemon]
[-t] [-c] [--include-hidden-topics] [-v]
参数 简写 说明
-h --help 帮助
--spin-time N --- 发现等待秒数(默认 0.3)
-s --use-sim-time 使用仿真时间
--no-daemon --- 不使用后台守护进程
-t --show-types 显示消息类型(最常用)ROS
-c --count-topics 只显示数量
--include-hidden-topics --- 显示隐藏话题
-v --verbose 详细信息(发布 / 订阅数)

常用

bash 复制代码
ros2 topic list -t
ros2 topic list -c
ros2 topic list -v
  • ros2 topic echo 打印话题内容
bash 复制代码
ros2 topic echo [-h] [--spin-time N] [-s] [--no-daemon]
[--no-arr] [--no-delimit] [--truncate-length N]
[--filter EXPR]
<topic_name> [msg_type]
参数 说明
--no-arr 不展开数组(紧凑显示)
--no-delimit 不打印分隔线
--truncate-length N 字符串截断长度
--filter EXPR Python 表达式过滤消息(高级)
<topic_name> 话题名(必填)
[msg_type] 消息类型(可省略自动识别)

常用

bash 复制代码
ros2 topic echo /cmd_vel --no-arr
ros2 topic echo /cmd_vel --filter "msg.angular.x > 0.5"
  • ros2 topic pub 命令行发布消息

参数

bash 复制代码
ros2 topic pub [-h] [--spin-time N] [-s] [--no-daemon]
[-1] [--keep-last N] [-q {sf,rf}]
[--qos-profile PROFILE]
[--rate HZ] [--wait-matching-subscriptions N]
<topic_name> <msg_type> <yaml_content>
参数 说明
-1 只发 1 次(默认循环发)
--rate HZ 发布频率(Hz)
--keep-last N 队列深度
-q {sf,rf} QoS:sf= 服务端 /rf= 客户端
--qos-profile system/default/services/parameters/sensor_data
--wait-matching-subscriptions N 等待 N 个订阅者再发

常用

bash 复制代码
一次性发布字符串
ros2 topic pub -1 /chatter std_msgs/String "data: 'Hello'"

10Hz 发布速度指令
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/Twist "{linear: {x: 0.5}}"
  • ros2 topic info 查看话题元信息

参数

bash 复制代码
ros2 topic info [-h] [--spin-time N] [-s] [--no-daemon] [-v]
<topic_name>

常用

-v显示完整 QoS、端点、类型、GID

bash 复制代码
ros2 topic info /cmd_vel -v
  • ros2 topic hz测量发布频率
相关推荐
Tech_D11 小时前
微米级的精准魔法:激光微加工,解锁高端制造新可能
人工智能·单片机·机器人·自动化·制造
声讯电子13 小时前
AR1106 声源定位模组 让设备真正“听懂方向”
单片机·机器人·舵机·声源定位·双麦克风阵列·听声辨位
kyle~13 小时前
ROS2 --- RMW(ROS Middleware Interface)
linux·c++·机器人·ros2
User_芊芊君子14 小时前
告别双开终端:UU远程终端功能,开发者的远程命令行新武器
人工智能·机器人·自动化
小熊猫程序猿14 小时前
Datawhale 具身智能与机器人控制(二)强化学习实践
机器人
硅谷秋水14 小时前
ALRM:用于机器人操纵的智体大语言模型
人工智能·语言模型·机器人
05候补工程师1 天前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
牛奶1 天前
Google 说 AI 能"解决所有疾病",我差点就信了
人工智能·机器人·aigc
小鬼头编程1 天前
10岁+孩子硬核科技研学:走进大国智造,探秘机器人未来
科技·机器人
Embedded-Xin2 天前
ROS2进阶——消息服务质量QOS策略
linux·机器人·嵌入式