相机与IMU联合标定

1、 imu_utils标定IMU的内参,可以校准IMU的噪声密度和随机游走噪声

2、kalibr包标定相机的内外参数,相机与IMU之间的外参

这里我所使用的相机是ZED相机,IMU使用的是Xsens的IMU
在这里插入图片描述

1 imu_utils 标定IMU的内参

1.1 安装环境

这里使用的包是 imu_utils [1],使用这个包可以校准IMU的噪声密度和随机游走噪声

step1: 安装ceres库

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev 
sudo apt-get install libgoogle-glog-dev libgtest-dev

下载编译 ceres-solver

git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver
mkdir build
cd build
cmake ..
make 
sudo make install

step2: 安装 code_utils
构建工作空间

mkdir -p ~/kalibr_workspace/src
cd ~/kalibr_workspace
catkin_make

注意,这里需要修改 code_utils 的 CMakeLists.txt 文件, CMAKE_CXX_FLAGS “-std=c++11” 改为 CMAKE_CXX_STANDARD 14 并在添加 include_directories(include/code_utils)

sudo apt-get install libdw-dev
cd kalibr_workspace/src
git clone https://github.com/gaowenliang/code_utils.git
cd ..
catkin_make

step3: 安装 imu_utils
注意,这里需要t同样修改 imu_utils 的 CMakeLists.txt 文件, CMAKE_CXX_FLAGS “-std=c++11” 改为 CMAKE_CXX_STANDARD 14

cd kalibr_workspace/src
git clone https://github.com/gaowenliang/imu_utils.git
cd ..
catkin_make

1.2 录制IMU数据集

step4: 静止情况下采集IMU的数据,并录制为ROS包,我采集的时间为2小时20分钟。

rosbag record /imu/data -O imu_xsens.bag

step5: 标定 配置xsens.launch文件为如下内容:(指定IMU的topic)

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/imu/data"/>
        <param name="imu_name" type="string" value= "xsens"/>
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
        <param name="max_time_min" type="int" value= "120"/>
        <param name="max_cluster" type="int" value= "100"/>
    </node>
</launch>

其中, max_time_min 表示从ros bag包中加载多长时间的数据
随后,启动 imu_utils 标定IMU

rosbag play -r 200 imu_xsens.bag
roslaunch imu_utils xsens.launch

可得到如下输出结果:

%YAML:1.0
---
type: IMU
name: xsens
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 4.9700389767894345e-03
      gyr_w: 6.8522312307501954e-05
   x-axis:
      gyr_n: 4.9016990946736316e-03
      gyr_w: 7.4721244172569240e-05
   y-axis:
      gyr_n: 4.9561825133283884e-03
      gyr_w: 6.7372212440839068e-05
   z-axis:
      gyr_n: 5.0522353223662842e-03
      gyr_w: 6.3473480309097542e-05
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 5.4303615468688114e-03
      acc_w: 1.4459759280127568e-04
   x-axis:
      acc_n: 5.7602300667994426e-03
      acc_w: 1.5064216759502606e-04
   y-axis:
      acc_n: 5.6378382747581945e-03
      acc_w: 1.4458085233539733e-04
   z-axis:
      acc_n: 4.8930162990487953e-03
      acc_w: 1.3856975847340367e-04

2 kalibr 标定工具

2.1 安装

安装依赖项:

sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev
sudo apt-get install libopencv-dev ros-kinetic-vision-opencv ros-kinetic-image-transport-plugins ros-kinetic-cmake-modules python-software-properties software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev

编译kalibr,这里要确保电脑联网,编译时间有点长.

cd ~/kalibr_workspace/src
git clone https://github.com/ethz-asl/Kalibr.git
cd ~/kalibr_workspace
catkin build -DCMAKE_BUILD_TYPE=Release -j4
source ~/kalibr_workspace/devel/setup.bash

2.2 校准相机的内外参

step1: 改变ZED相机发布的频率

rosrun topic_tools throttle messages /camera/left/image_raw 4.0 /stereo/left/image_raw
rosrun topic_tools throttle messages /camera/right/image_raw 4.0 /stereo/right/image_raw

录制ROS bag 包

rosbag record /stereo/left/image_raw /stereo/right/image_raw -O zed_images.bag

step2: 标定

kalibr_calibrate_cameras --target april_6x6_24x24mm.yaml --bag images.bag --bag-from-to 5 30 \
    --models pinhole-radtan pinhole-radtan --topics /stereo/left/image_raw /stereo/right/image_raw

在这里插入图片描述

这里还有其他的工具包也可以用 ROS camera_calibration 包。标定成功以后会在目录下生成一个 yaml文件(用于后续校准相机和IMU外参) 和 一个pdf校准日志,如果校准的重投影误差在1个像素内就是比较好的结果了.
在这里插入图片描述

2.3 校准相机与IMU外参

step1: 把IMU和相机固定在一起录制ROS bag包, 录制的时候要注意按照官方的说法-充分激励IMU- 绕3个轴旋转和3个方向的平移,这里有个官方视频[3] 可以参考

rosbag record /imu/data_raw /stereo/left/image_raw /stereo/right/image_raw -O images_imu.bag

step2: 启动校准包开始校准

kalibr_calibrate_imu_camera --target april_6x6_55x55mm.yaml --bag ~/bagfiles/zed_xsens.bag --bag-from-to 5 50 --cam camchain_images_zed_3495.yaml  --imu xsens_imu.yaml --imu-models scale-misalignment --timeoffset-padding 0.1

其中 参数:
1) –target april_6x6_24x24mm.yaml 描述标定板的信息
2) –bag images_imu.bag 指定数据包
3) –bag-from-to 5 50 设定bag包开始时间和结束时间,避开拿起和放下IMU的时间段内的数据
4)–cam camchain_images_zed_3495.yaml 相机参数文件
5)–imu xsens_imu.yaml 设定IMU的信息
6)–imu-models scale-misalignment IMU的参数模型

camchain_images_zed_3495.yaml 文件内容如下:

cam0:
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [-0.1734857772863602, 0.026545178121976657, 0.0004291887376674085,
    -3.4873170616746686e-05]
  distortion_model: radtan
  intrinsics: [693.131838769146, 692.5498277671763, 616.3486206381017, 379.6677572220899]
  resolution: [1280, 720]
  rostopic: /stereo/left/image_raw
cam1:
  T_cn_cnm1:
  - [0.9999658061828064, 0.0005632950824424241, 0.0082504038578218, -0.11947602055948268]
  - [-0.0006621128372211408, 0.9999280240823567, 0.011979493367486592, 0.0004870068672051519]
  - [-0.008243062037729159, -0.011984546441186855, 0.9998942056912012, -0.0028910358303400464]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [-0.17456713089475154, 0.027410444232267236, 0.0006360696559962682,
    -0.0002450168896166665]
  distortion_model: radtan
  intrinsics: [694.2107729740508, 693.480347118504, 617.3114354961933, 380.800130116761]
  resolution: [1280, 720]
  rostopic: /stereo/right/image_raw

xsens_imu.yaml 文件内容:

#Accelerometers
accelerometer_noise_density: 5.43036e-03   #Noise density (continuous-time)
accelerometer_random_walk:   1.44598e-04   #Bias random walk

#Gyroscopes
gyroscope_noise_density:     4.9700e-03   #Noise density (continuous-time)
gyroscope_random_walk:       6.8522e-05   #Bias random walk

rostopic:                    /imu/data      #the IMU ROS topic
update_rate:                 100.0      #Hz (for discretization of the values above)

标定完成以后同样会生成一个报表和在终端里面打印校准信息;

在这里插入图片描述

标定结果的重投影误差应该在零点几个像素
标定出来的位移和实际测量或估计的IMU 和相机中心位移比较一致

总结

  1. 相机和IMU标定流程比较简单
  2. 校准时候要注意限制相机的频率为4HZ,校准IMU时候采集数据的时间在2小时左右
  3. 利用kalibr标定的精度看起来还是OK的

参考资料

[1] https://github.com/gaowenliang/imu_utils
[2] https://blog.csdn.net/u011178262/article/details/83316968?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf
[3] https://www.bilibili.com/video/av795841344/

相机IMU联合标定是一种常用的技术,用于将相机和惯性测量单元(IMU)的数据进行融合,以实现精确的定位和姿态估计。在这个过程中,我们需要确定相机IMU之间的外部参数(如旋转矩阵和平移向量),以及IMU的内部参数(如加速度计和陀螺仪的偏置)。以下是一个常见的相机IMU联合标定的步骤: 1. 数据采集:在进行标定之前,我们需要同时记录相机IMU的数据。这可以通过将相机IMU固定在一个刚性平台上,并进行一系列运动来实现。 2. 图像特征提取:从相机捕获的图像中提取特征点,例如角点或ORB特征点。这些特征点将用于之后的相机标定。 3. 相机标定:使用采集到的图像数据,对相机进行标定,以获取内部参数(例如焦距、主点位置等)和外部参数(例如旋转矩阵和平移向量)。这可以使用常见的相机标定算法,如张正友标定法。 4. IMU预处理:对采集到的IMU数据进行预处理,包括去除噪声、对齐时间戳等操作。这有助于提高后续的联合标定精度。 5. 特征匹配:将IMU数据图像特征进行匹配,以建立二者之间的对应关系。这可以通过使用IMU数据的角速度和线性加速度特征点的运动进行配准。 6. 联合优化:使用非线性优化方法,如扩展卡尔曼滤波(EKF)或优化器,将相机IMU之间的外部参数进行联合优化。这可以通过最小化重投影误差来实现,即将图像特征投影到3D空间,并IMU数据进行对比。 通过以上步骤,我们可以获得相机IMU之间的精确外部参数,从而实现精确的相机姿态估计和定位。这对于许多应用领域,如增强现实、机器人导航等都是非常重要的。
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值