第2章 ROS基础与数据录制
ROS,说白了就是机器人的「操作系统胶水」。你想想看,一个机器人身上有激光雷达、摄像头、IMU、轮式里程计……这些硬件各自说各自的语言,怎么让它们协同工作?ROS就是那个翻译官兼调度员。这一章我们不讲虚的,直接聚焦三个最核心的概念:节点、话题、服务,然后手把手教你用rosbag把传感器数据录下来——这可是SLAM数据采集的看家本领。
2.1 节点:ROS里的最小执行单元
节点就是一个可执行程序,它只干一件事,或者几件相关的事。比如一个节点专门读激光雷达数据,另一个节点做SLAM,还有一个节点控制底盘。节点之间互相不知道对方的存在,它们只通过话题或服务交流。
我个人习惯把节点想象成「乐高积木」——每个节点都是一块独立的小积木,拼在一起就成了一个机器人系统。你在终端里用rosrun启动一个节点,它就开始干活了。
2.2 话题:节点间的「广播电台」
话题是ROS里最常用的通信方式。一个节点往话题上发消息(发布者),其他节点从话题上收消息(订阅者)。发布者和订阅者完全解耦,你甚至不知道对方是谁。
举个例子:激光雷达节点发布/scan话题,SLAM节点订阅/scan。如果这时候再加一个可视化节点,也订阅/scan,完全没问题。这就是话题的灵活之处。
/scan写成了/scam,结果雷达数据死活看不到……检查了半小时才发现是拼写错误。
# 查看当前所有话题
rostopic list
# 查看某个话题的消息类型
rostopic info /scan
# 实时打印话题消息
rostopic echo /scan
2.3 服务:一问一答的「电话热线」
话题是单向数据流,适合传感器数据这种持续发布的场景。但有些时候你需要「请求-响应」模式,比如让机器人拍一张照片、保存当前地图。这时候就该服务上场了。
服务由客户端发起请求,服务端处理并返回响应。它不像话题那样持续占用带宽,用完了就断开。我在做多机器人协作时,经常用服务来查询其他机器人的状态——问一句,答一句,干净利落。
| 特性 | 话题 (Topic) | 服务 (Service) |
|---|---|---|
| 通信模式 | 发布/订阅 (异步) | 请求/响应 (同步) |
| 适用场景 | 高频传感器数据 | 低频指令/查询 |
| 是否持续 | 持续流式 | 一次连接 |
| 调试工具 | rostopic echo | rosservice call |
2.4 使用 rosbag 录制传感器数据
好了,前面铺垫了这么多,终于到重头戏了。rosbag 是ROS里录制和回放数据的瑞士军刀。做SLAM数据采集,你几乎天天跟它打交道。
录制数据说白了就是把指定话题的消息存到一个.bag文件里。以后你可以反复回放这些数据,就好像传感器在重新工作一样。这对算法调试、参数调优、复现bug简直太重要了。
# 录制所有话题(不推荐,文件太大)
rosbag record -a
# 录制指定话题(推荐)
rosbag record /scan /camera/image_raw /imu/data
# 录制时指定包名
rosbag record -O my_slam_data.bag /scan /camera/image_raw
rostopic list确认话题名,别录错了。
录制完成后,你会得到一个.bag文件。怎么回放呢?很简单:
# 回放bag文件
rosbag play my_slam_data.bag
# 以0.5倍速回放(方便观察)
rosbag play -r 0.5 my_slam_data.bag
# 只回放指定话题
rosbag play my_slam_data.bag --topics /scan /imu/data
回放时,ROS会按照原始时间戳发布消息。如果你希望消息尽快发布(忽略时间戳),可以加--clock参数。嗯,这里要注意:回放时如果打开了多个终端,记得先启动roscore。
- 节点是执行单元,话题是异步总线,服务是同步RPC。
- 录制数据用
rosbag record,只录你需要的话题。 - 回放数据用
rosbag play,可以调速、选话题。 - 录制前检查话题名,避免录错或漏录。
说实话,rosbag 的用法远不止这些。比如你可以用rosbag info查看包信息,用rosbag filter过滤话题,甚至用Python API直接读写bag文件。这些我们会在后面的章节里慢慢展开。但今天这一课,你只要掌握录制和回放,就已经能应付大部分数据采集场景了。