1. 为什么需要绕过ros2 bag record的限制?
在机器人开发过程中,我们经常需要记录和回放传感器数据、控制指令等关键信息。ROS2自带的ros2 bag record工具虽然方便,但默认只能生成.db3格式的二进制文件。这种格式对于日常调试和数据分析来说,就像把食材锁在保险箱里——安全是安全了,但每次取用都得大费周章。
我最近在做一个机械臂轨迹规划项目时就遇到了这个痛点。需要把关节角度数据导出给做算法的同事分析,结果发现.db3文件就像个黑盒子,没法直接查看内容。更麻烦的是,团队里有人用Windows,有人用Mac,还有人在Linux下工作,光是为了打开这个文件就折腾了半天。
2. ros2 topic echo的妙用
2.1 从源头获取数据的思路
与其在格式转换上浪费时间,不如换个思路:既然bag文件的数据都来自topic,为什么不直接从topic获取呢?ros2 topic echo这个命令自带--csv参数,就像给数据开了个直通车,能把消息直接转成表格格式。
实测下来,这种方法有几个明显优势:
- 零依赖:不需要安装额外工具
- 实时可见:数据生成过程一目了然
- 格式灵活:CSV可以直接用Excel打开,也能轻松转成TXT
2.2 具体操作步骤
假设我们要记录/joint_states这个topic的数据,下面是详细操作:
- 首先启动机器人系统
- 打开终端,运行
ros2 topic list确认目标topic存在 - 新建终端,执行:
ros2 topic echo /joint_states --csv > joint_data.csv- 另开终端播放bag文件:
ros2 bag play your_recording.db3这里有个小技巧:先启动echo命令再播放bag,可以避免丢失开头几帧数据。等bag播放完毕,在echo终端按Ctrl+C结束记录,就能得到完整的CSV文件。
3. 实战中的注意事项
3.1 处理大容量数据
当数据量较大时(比如长时间记录激光雷达点云),直接输出到CSV可能会遇到问题。我的经验是:
- 使用
split命令分割大文件 - 或者添加时间戳过滤:
ros2 topic echo /scan --csv | grep "2023-" > scan_data.csv3.2 多topic同步记录
如果需要同时记录多个topic,可以开多个终端分别执行echo命令。更高效的做法是用tmux分屏:
tmux new-session -s record_session tmux split-window -h tmux send-keys "ros2 topic echo /topic1 --csv > data1.csv" C-m tmux select-pane -R tmux send-keys "ros2 topic echo /topic2 --csv > data2.csv" C-m4. 进阶技巧与替代方案
4.1 自动化脚本实现
我经常用这个bash脚本自动完成整个过程:
#!/bin/bash topics=("/joint_states" "/odom" "/imu/data") for topic in "${topics[@]}"; do filename=$(echo $topic | tr '/' '_').csv ros2 topic echo $topic --csv > $filename & done ros2 bag play $1 pkill -f "ros2 topic echo"4.2 与其他工具的配合
拿到CSV后,可以很方便地用Python做进一步处理:
import pandas as pd data = pd.read_csv('joint_data.csv') # 计算关节速度 data['velocity'] = data['position'].diff() / data['time'].diff()对于需要更高频率记录的场景,可以考虑结合rqt_bag工具,它能提供更直观的数据可视化界面。不过就纯数据导出而言,ros2 topic echo的方法已经能满足大多数需求。