跟着大佬的教程做d435i的标定,原博客链接:RealSense-D435i相机与IMU之间的外参标定-使用kalibr工具箱(完整版)_realsense d435i rgb相机到imu的参数-CSDN博客
过程遇到了几个问题 想着记录下来 方便以后自己重做的时候避坑
文章一 二部分的完成都没有什么问题,作者写的很详细,但是后面第三部分自己开始弄的时候遇到了如下这个情况
1. 使用如下命令在kalibr_ws文件夹里录制包
rosbag record -O d435i /color /imu
2. 录制包后按ctrl+c暂停录制,继续在这个终端里运行如下标定代码(记得先进入kalibr_ws文件夹,并运行source ./devel/setup.bash)
rosrun kalibr kalibr_calibrate_imu_camera --target checkerboard.yaml --cam camchain.yaml --imu imu.yaml --bag d435i.bag --bag-from-to 5 45 --show-extraction
3. 发现报错说RuntimeError: Could not find topic /imu in d435i.bag. 并使用rostopic info d435i.bag查看信息,发现确实topics里没有imu信息只有color信息
4. 使用rostopic list查看发现主题为camera/imu 而不是imu
5. 于是更改录制包的命令如下
rosbag record -O d435i_with_imu.bag /color /camera/imu
6. 完成录制后再用rosbag info d435i_with_imu.bag查看信息就可以发现有camera/imu主题了
7. 然后相应的,肯定也要修改标定命令,先是改为如下:
rosrun kalibr kalibr_calibrate_imu_camera --target checkerboard.yaml --cam camchain.yaml --imu imu.yaml --bag d435i_with_imu.bag --bag-from-to 5 45 --show-extraction --imu-topics /camera/imu
出现报错:[ERROR] [1716182835.034524]: unrecognized arguments: --imu-topics /camera/imu
也就是说kalibr_calibrate_imu_camera工具不接受 --imu-topics这个参数,所以要修改.bag文件中的主题名称。但尝试直接通过命令行参数更改imu主题也行不通,那么就只能通过编辑.bag文件来将imu主题名从/camera/imu改为/imu,可通过以下步骤实现:
(1)创建一个python脚本
打开一个文本编辑器,创建一个新的python文件,叫"change_topic_name.py",内容如下:
import rosbag
import sys
if len(sys.argv) != 3:
print("Usage: python change_topic_name.py input.bag output.bag")
sys.exit(1)
input_bag_path = sys.argv[1]
output_bag_path = sys.argv[2]
with rosbag.Bag(output_bag_path, 'w') as outbag:
for topic, msg, t in rosbag.Bag(input_bag_path).read_messages():
if topic == "/camera/imu":
topic = "/imu" # 修改主题名
outbag.write(topic, msg, t)
我直接把这个文件放在了kalibr_ws文件夹里
(2)运行这个脚本
python3 change_topic_name.py d435i_with_imu.bag d435i_with_correct_imu.bag
注意这个python3是因为我的linux装的是这个版本,可自行更改
(3)标定新的.bag文件
rosrun kalibr kalibr_calibrate_imu_camera --target checkboard.yaml --cam camchain.yaml --imu imu.yaml --bag d435i_with_correct_imu.bag --bag-from-to 5 45 --show-extraction
这里注意,是checkboard.yaml,大佬文章里这一句命令写成了checkerboard(但前面让我们写的是checkboard.yaml),会导致报错说无法读取,注意一下
最后就可以成功得到标定数据了!