【学习记录】Kalibr标定相机与IMU的一点记录

一周更多的时间在搞这个Kalibr的相机与IMU的标定,记录一些问题:

相机重投影误差

相机一定要好好标定,如果重投影误差太大,是优化不出来外参的。好在相机内参,与IMU外参标定,都可以用AprilTag棋盘格标定。重投影误差应该在1px以下才能接受,否则重新标定。

IMU的内参标定

IMU内参标定一开始用的是:imu_utils
后来换成了:allan_variance_ros
因为据说后者没有这些问题:

【学习记录】Kalibr标定相机与IMU的一点记录_第1张图片

详见:https://discourse.ros.org/t/open-source-allan-variance-tool-for-rosbags/23136/6

IMU串口的USB缓存问题

一开始标定出来的结果,IMU和相机外参旋转看起来正确,但平移极其离谱,接近0,在kalibr上还提了一个issue:issue#599
官方指出,IMU和相机的时间offset有问题:我用的是100Hz的IMU,但时间间隔却是0或者30ms,如下图:

【学习记录】Kalibr标定相机与IMU的一点记录_第2张图片
后来发现,是采用 boost::asio::serial_port 读取串口时,时间戳确实有问题:大概过30ms连续读出来3次的IMU数据。最后确定是串口延迟导致,修改方法:每次插入设备后,通过修改 linux 内核,降低串口的延迟。

sudo sh -c 'echo 1 > /sys/bus/usb-serial/devices/ttyUSB0/latency_timer'

之后这个问题解决,能够做到1ms左右输出一个。这个问题整整调试了一天才发现并解决,在此纪念。

其他问题

如下图,是一次失败的标定。这个原因虽然报错是buffer不够,但本质原因是误差太大。注意看, Gyroscope error 在几百,这显然是不正常的。后来发现原因,gyro 的单位是 rad/s 而不能是 degree,因此量级差太多。修改后一切正常。
【学习记录】Kalibr标定相机与IMU的一点记录_第3张图片

附一个正常的标定结果

【学习记录】Kalibr标定相机与IMU的一点记录_第4张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第5张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第6张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第7张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第8张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第9张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第10张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第11张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第12张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第13张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第14张图片
【学习记录】Kalibr标定相机与IMU的一点记录_第15张图片

你可能感兴趣的:(SLAM,软件与库,学习,机器人)