上一篇文章介绍了如何通过topic操作命令实现与机器人的交互,本篇我们介绍如何通过Message(即topic的下一级)实现与机器人的交互。
和topic一样,首先在一个终端通过ssh命令登录机器人、启动机器人,然后打开另外一个终端执行操作命令。
1. Message操作命令
1.1 获取Message操作命令机器详解的语句
rosmsg --help
返回的内容,总共6种操作命令
rosmsg is a command-line tool for displaying information about ROS Message types.Commands:rosmsg show Show message descriptionrosmsg info Alias for rosmsg showrosmsg list List all messagesrosmsg md5 Display message md5sumrosmsg package List messages in a packagerosmsg packages List packages that contain messagesType rosmsg <command> -h for more detailed usage
2. Message操作命令用法
2.1 命令格式
rosmsg show+消息
2.2 以雷达为例
继续以/scan为例,它封装的是雷达数据
在室内机器人移动导航过程中,激光雷达是很重要的传感器,它时刻反馈机器人周边的障碍物信息,在机器人建图、定位、导航算法中起到重要的作用。
在提供的树莓派固件中,已经编写和编译了ROS的激光雷达节点。
rostopic type /scan #查看雷达数据格式
sensor_msgs/LaserScan
我们使用rosmsg show来获取雷达数据内容
rosmsg show sensor_msgs/LaserScan
std_msgs/Header headeruint32 seqtime stampstring frame_idfloat32 angle_minfloat32 angle_maxfloat32 angle_incrementfloat32 time_incrementfloat32 scan_timefloat32 range_minfloat32 range_maxfloat32[] rangesfloat32[] intensities
Header : 是一个结构体,包含 seq、stamp、frame_id。
-
seq 扫描顺序增加的 id 序列
-
stamp 激光数据的时间戳
-
frame-id 是扫描数据的名字
-
angle_min:开始扫描的角度
-
angle_max:结束扫描的角度
-
angle_increment:每次扫描增加的角度
-
time_increment:测量的时间间隔
-
scan_time :扫描的时间间隔
-
range_min:测距的最小值
-
range_max:测距的最大值
-
ranges:测量的距离数据,数组长度和雷达分辨率相关
-
intensities:与设备有关,输出测距强度数据
3. Msaage和Topic的操作关系
至此我们已经把topic和message都进行了介绍,现在我们说明下两者之间的操作关系。
通常来说先执行topic操作,再执行message操作,因为message是topic的子集。
以机器人雷达为例,首先需要 订阅或确认 topic
,即定义数据传递的“频道”。然后,发布消息 才能通过该频道成功传递数据。这样的操作顺序确保了消息在系统中能够有效流动。
为何先订阅 topic
后发布消息?
-
消息的传递是基于订阅的:
你可以把订阅topic
看作是打开一个接收信道,消息必须通过该信道传递才能被正确接收。如果你在没有订阅topic
的情况下发布消息,系统就不知道应该把消息送给谁。换句话说,消息没有目的地,无法到达消费者端。 -
话题创建是基础:
在这个系统中,topic
就是雷达数据的专用通道。要确保消息能被正确分发,必须先确保topic
存在,且有正确的订阅者。 -
确保系统协调:
如果一个模块在订阅topic
后,雷达模块开始发布数据,那么在发布的同时,系统保证订阅者可以实时收到这些消息。如果没有预先订阅,消息的接收者就会错过或无法处理这些数据。
结合实际操作步骤
-
先定义
topic
(如果尚未存在),比如"radar/data"
。这告诉系统所有需要接收雷达数据的模块可以订阅这个 topic。 -
订阅
topic
,比如机器人控制模块、导航模块、决策模块会订阅"radar/data"
,这样它们就可以接收到雷达传感器传来的数据。 -
发布消息,雷达传感器模块将通过
topic
"radar/data"
来发布雷达数据。