ROS Melodic中使用sick_scan_xd录制bag文件,如何保存所有分割文件?
解决方案
问题根源
原脚本的两个核心问题导致复制操作失效:
- 每次循环启动前执行
rm -f nav310_ws/bagFiles/*,清空了临时目录里的前一次录制文件,后续无文件可复制 - 没有在每次
rosbag record完成后及时处理生成的bag文件
修改后的工作脚本
以下脚本会保留每次录制的bag文件,并自动复制到allBags目录,同时避免文件名冲突:
#!/bin/bash # 确保目标存储目录存在,不存在则自动创建 mkdir -p nav310_ws/allBags while true; do # 循环录制,直到按下CTRL+C终止 # 执行rosbag录制,输出到临时目录 rosbag record -o nav310_ws/bagFiles/session --split --duration=1 --max-splits 1 /cloud # 遍历临时目录下的所有bag文件,复制到目标目录并重命名 for bag_file in nav310_ws/bagFiles/*.bag; do # 确保文件存在(避免目录为空时的遍历错误) if [ -f "$bag_file" ]; then # 生成唯一时间戳,防止文件名重复覆盖 timestamp=$(date +%Y%m%d_%H%M%S) # 复制并重命名文件到allBags cp "$bag_file" "nav310_ws/allBags/session_${timestamp}_$(basename "$bag_file")" # 可选:复制完成后删除临时文件,节省磁盘空间 # rm "$bag_file" fi done done
关键调整说明
- 移除了开头的
rm -f nav310_ws/bagFiles/*:不再清空临时目录,保留录制完成的bag文件直到复制完成 - 新增
mkdir -p nav310_ws/allBags:确保目标目录存在,避免复制时因目录缺失报错 - 录制完成后立即执行复制逻辑:通过时间戳为复制后的文件添加唯一前缀,彻底解决文件名冲突问题
- 可选删除临时文件:如果磁盘空间有限,可取消注释
rm "$bag_file",复制后删除临时文件释放空间
更简洁的替代方案(无需临时目录)
如果不需要临时存储环节,可直接让rosbag生成唯一命名的文件到allBags目录,省去复制步骤:
#!/bin/bash mkdir -p nav310_ws/allBags while true; do # 生成唯一时间戳作为文件名前缀 timestamp=$(date +%Y%m%d_%H%M%S) # 直接录制到allBags目录,文件名自带时间戳确保唯一 rosbag record -o nav310_ws/allBags/session_${timestamp} --split --duration=1 --max-splits 1 /cloud done
内容的提问来源于stack exchange,提问作者AEW
相关产品推荐
相关产品推荐

