【机器人】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测量发布频率
相关推荐
kobesdu2 小时前
ROS导航调参指南:机器人模型、TEB/DWA与Costmap全解析
人工智能·机器人·ros
沫儿笙2 小时前
库卡焊接机器人混合气节气装置
人工智能·机器人
沫儿笙2 小时前
弧焊机器人节气装置
人工智能·机器人
V搜xhliang02463 小时前
多期CT影像组学融合临床危险因素模型预测甲状腺乳头状癌中央区淋巴结转移的价值
人工智能·重构·机器人
V搜xhliang02463 小时前
超声心动图影像组学对肥厚型心肌病心脏重构的预测价值
人工智能·重构·机器人
V搜xhliang02464 小时前
基于MRI多病灶生境影像组学预测肝富血供转移瘤的原发灶来源
大数据·人工智能·重构·数据分析·机器人
Narv工程师21 小时前
机器人操作系统OS进化史:从RTOS到具身智能
机器人
Deepoch21 小时前
VLA 边缘智能新范式:Deepoc 开发板赋能巡检机器人全自主现场决策
人工智能·机器人·巡检·具身模型·deepoc
ZPC821021 小时前
rviz2 仿真控制器与真实机器人切换
人工智能·算法·机器人