realsense d435i跑VINS-Mono,实验记录

(一)d435i的launch文件修改

rs_camera.launch:

<arg name="enable_gyro"         default="true"/>
<arg name="enable_accel"        default="true"/>
<arg name="enable_sync"         default="true"/>
<arg name="unite_imu_method"      default="copy"/>

这样就可以接收到/camera/imu话题,如果不修改,只能得到加速度计与陀螺仪各自的话题。

(二)IMU标定

(1)编译港科大的imu_utils标定工具,使用它标定IMU。
(2)录IMU数据:
rosbag record -O imu_calibration /camera/imu
(3)写imu_utils启动文件,这里命名为d435i_imu_calibration.launch:

<launch>
<node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
    <param name="imu_topic" type="string" value= "/camera/imu"/>
    <param name="imu_name" type="string" value= "d435i_imu_calibration"/>
    <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
    <param name="max_time_min" type="int" value= "10"/>
    <param name="max_cluster" type="int" value= "100"/>
</node>
需要注意的是max_time_min代表的是标定时间,这里的单位是分钟;它需要稍微大于(2)中所录数据的时间长度。

(4)开始标定

source ./devel/setup.sh 
rosbag imu_utils d435i_imu_calibration.launch 
roslaunch play -r 200 imu_calibration.bag

完成后,就会在src/imu_utils/data得到标定文件:d435i_imu_calibration_imu_param.yaml。
我们只需要其中四个参数:

Gyr:
   avg-axis:
  gyr_n: 
  gyr_w: 
Acc:
  avg-axis:
  acc_n: 
  acc_w: 

分别是陀螺仪和加速度计 随机游走和 高斯白噪声的平均值,是IMU噪声模型中的两种噪声。
我把这个参数填入vins的yaml文件中,运行后发现轨迹极易漂,放在原地不动也会漂。
最后看到了vins-mono的一个issue,受到启发:上述标定结果应该是连续模型的参数,我们需要将其离散化,再填入vins的配置文件中,离散化公式为:

acc_n/(sqrt(1/imu frequency (hz)))
gyr_n/(sqrt(1/imu frequency (hz)))
acc_w*(sqrt(1/imu frequency (hz)))
gyr_n*(sqrt(1/imu frequency (hz)))

我这里使用的频率是400hz,所以最终结果要乘以20。
我的imu标定结果

#imu parameters The more accurate parameters you provide, the better performance
acc_n: 0.4           # accelerometer measurement noise standard deviation.
gyr_n: 0.063834      # gyroscope measurement noise standard deviation. 
acc_w: 0.014422     # accelerometer bias random work noise 	standard deviation. 
gyr_w: 9.4617e-04   # gyroscope bias random work noise standard deviation.   

相机标定

(1)编译Kalibr。
我的环境:ubuntu18,python2.7,opencv3.2。。。
具体看这个博客。。。
编译时间很长。。。

这里只记录imu+单目标定时候的命令:

标定相机内参:

kalibr_calibrate_cameras --target ./src/kalibr/april_6x6_50x50cm.yaml --bag /media/lzb/Windows-SSD/ubuntu18/myProject/camd435i.bag --bag-from-to 26 100 --models pinhole-radtan --topic /color --show-extraction

标定imu与相机外参:

kalibr_calibrate_imu_camera --target src/kalibr/april_6x6_50x50cm.yaml --cam src/kalibr/camd435i.yaml --imu src/kalibr/imu.yaml --bag /media/lzb/Windows-SSD/ubuntu18/myProject/dynami4.bag --show-extraction

实验结果

实验场地:教学楼
运动:从第三层楼到第四层楼,其中两层走的路线大致是平行的。

结果俯视图:

从俯视图发现,上下楼层的估计轨迹大致一样,但是漂移还是比较大。

累计误差:

回到原来位置,高度差了不少。

原因分析

可能是因为标定结果不太可靠,导致误差较大。
标定imu时候,使用的数据多少会很大影响标定的结果,在标定imu时候,录了不同时间的ros包:10分钟,30分钟,120分钟,最终发现10分钟的标定结果比较好,不知道为啥?
会不会是是传感器便宜,性能不好?

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页