第2章 ROS基础与数据录制

ROS,说白了就是机器人的「操作系统胶水」。你想想看,一个机器人身上有激光雷达、摄像头、IMU、轮式里程计……这些硬件各自说各自的语言,怎么让它们协同工作?ROS就是那个翻译官兼调度员。这一章我们不讲虚的,直接聚焦三个最核心的概念:节点、话题、服务,然后手把手教你用rosbag把传感器数据录下来——这可是SLAM数据采集的看家本领。

ROS 节点 (Node) 话题 (Topic) 服务 (Service) rosbag 数据录制 录制 & 回放 可执行程序 异步通信总线 同步请求/响应

2.1 节点:ROS里的最小执行单元

节点就是一个可执行程序,它只干一件事,或者几件相关的事。比如一个节点专门读激光雷达数据,另一个节点做SLAM,还有一个节点控制底盘。节点之间互相不知道对方的存在,它们只通过话题或服务交流。

我个人习惯把节点想象成「乐高积木」——每个节点都是一块独立的小积木,拼在一起就成了一个机器人系统。你在终端里用rosrun启动一个节点,它就开始干活了。

💡 小经验: 我刚开始学ROS时,总想把所有功能写到一个节点里。后来发现,拆成多个节点,调试起来简直不要太爽。哪个节点崩了,单独重启就行,不用动整个系统。

2.2 话题:节点间的「广播电台」

话题是ROS里最常用的通信方式。一个节点往话题上发消息(发布者),其他节点从话题上收消息(订阅者)。发布者和订阅者完全解耦,你甚至不知道对方是谁。

举个例子:激光雷达节点发布/scan话题,SLAM节点订阅/scan。如果这时候再加一个可视化节点,也订阅/scan,完全没问题。这就是话题的灵活之处。

🔔 注意: 话题的名字是全局的,别搞混了。我见过有人把/scan写成了/scam,结果雷达数据死活看不到……检查了半小时才发现是拼写错误。
# 查看当前所有话题
rostopic list

# 查看某个话题的消息类型
rostopic info /scan

# 实时打印话题消息
rostopic echo /scan

2.3 服务:一问一答的「电话热线」

话题是单向数据流,适合传感器数据这种持续发布的场景。但有些时候你需要「请求-响应」模式,比如让机器人拍一张照片、保存当前地图。这时候就该服务上场了。

服务由客户端发起请求,服务端处理并返回响应。它不像话题那样持续占用带宽,用完了就断开。我在做多机器人协作时,经常用服务来查询其他机器人的状态——问一句,答一句,干净利落。

特性话题 (Topic)服务 (Service)
通信模式发布/订阅 (异步)请求/响应 (同步)
适用场景高频传感器数据低频指令/查询
是否持续持续流式一次连接
调试工具rostopic echorosservice 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
🎯 我的习惯: 我一般只录制SLAM真正需要的话题,比如激光雷达、图像、IMU、里程计。别一股脑录所有话题,否则一个包几十个G,后期处理起来想哭。另外,录制前先用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文件。这些我们会在后面的章节里慢慢展开。但今天这一课,你只要掌握录制和回放,就已经能应付大部分数据采集场景了。