ros2 的 bag 录制之后, 在主动关停或者进程被杀死后,才会产生 yaml 文件, 如果是突然断电甚至数据包中的数据库文件也会损坏。这时候可以使用下面的脚本进行修复。
并且需要注意 低版本的ros2 比如 foxy 不支持 bag reindex 指令, 需要使用高版本的,比如 humble 版本。
#!/bin/bash
# ros2 录制的 bag 如果损坏,通过这个脚本 以损坏的 db3 文件作为参数, 可以修复。
set -e
# 检查是否提供了输入文件路径
if [ "$#" -ne 1 ]; then
echo "Usage: $0 input_file_path"
exit 1
fi
INPUT_FILE="$1"
# 检查输入文件是否存在
if [ ! -f "$INPUT_FILE" ]; then
echo "Error: Input file does not exist."
exit 1
fi
# 获取输入文件的目录和文件名
INPUT_DIR=$(dirname "$INPUT_FILE")
INPUT_BASENAME=$(basename "$INPUT_FILE")
# 创建输出文件名
OUTPUT_FILE="$INPUT_DIR/fixed_$INPUT_BASENAME"
# 处理SQL转储并替换 ROLLBACK 为 COMMIT
sqlite3 "$INPUT_FILE" .dump | sed 's/ROLLBACK/COMMIT/g' > dump.sql
# 输入文件改名备份,避免影响修复
FILE_NEW_NAME="$INPUT_DIR/${INPUT_BASENAME}.bak"
mv "$INPUT_FILE" "$FILE_NEW_NAME"
echo "backup file: $FILE_NEW_NAME"
# 将修改后的 SQL 导入新的数据库文件
sqlite3 "$OUTPUT_FILE" < dump.sql
# 删除中间文件
rm dump.sql
echo "Processed file saved as: $OUTPUT_FILE"
ros2 bag reindex $INPUT_DIR