相机与惯导联合标定

一、基本信息

相机:FLIR Blackfly S
惯性导航:华测CGI-610
系统:Ubuntu 18.04
ROS版本:Melodic

二、过程

(1)编译安装kalibr

  1. 安装依赖项
sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-melodic-vision-opencv ros-melodic-image-transport-plugins ros-melodic-cmake-modules 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
sudo apt-get install python-igraph
sudo apt-get install python-pyx
  1. 创建并初始化kablir编译空间
mkdir -p ~/kalibr_ws/src
cd ~/kalibr_ws
source /opt/ros/melodic/setup.bash
catkin init
catkin config --extend /opt/ros/melodic
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
  1. 下载驱动源码
cd ~/kalibr_ws/src
git clone https://github.com/FLIR/flir_adk_ethernet.git
  1. 编译源码,-j(根据CPU核数确定)
cd ..
catkin build -DCMAKE_BUILD_TYPE=Release -j16
  1. 将驱动添加至环境变量
echo "source ~/kalibr_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

Kalibr编译参考教程:Installation · ethz-asl/kalibr Wiki · GitHub
注意:
如果报错,error: ‘Eigen::MatrixBase<Derived>::~MatrixBase(),则打开/usr/include/eigen3/Eigen/src/Core/MatrixBase.h将467行附近的protected修改为publicerror: ‘Eigen::MatrixBase<Derived>::~MatrixBase()报错代码修改结果
Kalibr编译报错参考资料:Ubuntu 20.04 + ROS Noetic + OpenCV 4.10编译kalibr相机标定功能包

(2)编译安装IMU分析工具

  1. 安装Ceres依赖项
sudo apt-get install libdw-dev
sudo apt-get install cmake
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev
  1. 下载Ceres源码
mkdir -p ~/ceres/ceres-bin
cd ceres
git clone https://ceres-solver.googlesource.com/ceres-solver
  1. 编译Ceres源码,-j(根据CPU核数确定)
cd ceres-bin
cmake ../ceres-solver
make -j16
make test
sudo make install

Ceres安装参考资料:Installation — Ceres Solver

  1. 创建并初始化code_utils编译空间
mkdir -p ~/imu_ws/src
cd ~/imu_ws/src
git clone https://github.com/gaowenliang/code_utils.git
  1. 编译code_utils源码
cd ..
catkin_make

注意:

  • 如果编译时报错fatal error: backward.hpp: No such file or directory,则打开code_utils/src/sumpixel_test.cp,将第二行#include "backward.hpp"修改为 #include “code_utils/backward.hpp”
    code_util编译错误参考资料:Kalibr使用:imu+camera联合标定过程详解
  1. 下载imu_utils源码
cd src
git clone https://github.com/gaowenliang/imu_utils.git
  1. 编译imu_utils源码
cd ..
catkin_make
  1. 将驱动添加至环境变量
echo "source ~/imu_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

(3)录制标定数据

  1. 新建终端,启动FLIR相机驱动
roslaunch flir_adk_ethernet blackfly.launch
  1. 新建终端,启动华测组合导航驱动
roslaunch gps_driver driver.launch
  1. 新建终端,录制相机与组合导航回传数据
rosbag record /gps/gpchc /gps/fix /gps/imu /gps/vel /gps/pose /flir_adk/image_raw -O img_imu.bag
  1. (可选)根据实际情况生成标定板PDF文件(以下为Aprilgrid板生成)
kalibr_create_target_pdf --type apriltag --nx [NUM_COLS] --ny [NUM_ROWS] --tsize [TAG_WIDTH_M(单位:米)] --tspace [TAG_SPACING_PERCENT]

Aprilgrid参数解析
5. 将相机与组合导航同时稳定地进行如下动作(注意:标定板应始终在画面中,但标定板在每次动作中尽量移动至画面边缘)

  • 横滚3次
  • 俯仰3次
  • 偏航3次
  • 前进后退3次
  • 上下移动3次
  • 左右偏移3次
  • 随机动作若干

标定动作过程参考教程:DIY Indoor Autonomous Drone! - Part 2 (Kalibr & Calibration)

(4)更改发布图像频率

  1. 关闭录制时启动的相机和组合导航驱动
  2. 新建终端,启动ROS核心节点
roscore
  1. 新建终端,新建转换输出频率输出话题,将相机输出频率降低至4Hz。(通常设备采集的频率为 20-60Hz,这会使得标定的图像过多, 而导致计算量太大。一般将ros topic的频率降低到4Hz左右进行采集.)
rosrun topic_tools throttle messages /flir_adk/image_raw 4.0 /img
  1. 新建终端,录制转换后输出数据
rosbag record -O stereo_calibra.bag /img /gps/imu
  1. 新建终端,播放相机与组合导航回传数据
rosbag play img_imu.bag
  1. 当数据播放完成后,关闭数据录制与数据转换

(5)相机内参计算

  1. (可选)根据标定板的实际数据写入对应元数据april_6x6_80x80cm_A0.yaml文件(以下为Aprilgrid板元数据内容)
target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.088           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize
                         #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]

标定板元数据参考资料:Calibration targets

  1. 指定数据包与话题,加载对应标定板数据,运行kalibr(根据FLIR Blackfly S成像原理选择pinhole-equi
rosrun kalibr kalibr_calibrate_cameras --bag stereo_calibra.bag --topics /img --models pinhole-equi --target april_6x6_80x80cm_A0.yaml
  1. 生成的相机内参结果在终端运行目录下的camchain-stereo_calibra.yaml(注意:重复运行会覆盖原有结果)
    yaml文件结果解读:Yaml formats

(6)IMU内参计算

  1. imu_utils/launch文件夹中,新建launch文件
<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/gps/imu"/>
        <param name="imu_name" type="string" value= "Huace"/>
        <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>
</launch>

参数说明:

- imu_topic:表示录制的imu话题名字
- imu_name:imu名称,可以随便取,最后标定数据的结果会根据这个保存。
- data_save_path:表示存放的目录,默认在imu_utils/data下,找到相应的yaml即可查看标定的结果。
- max_time_min:取数据的时长,一般默认120分钟,程序会在最大时间截断读取数据。(应小于bag包持续时长)
  1. 新建终端,启动ROS核心节点
roscore
  1. 新建终端,播放相机与组合导航回传数据
rosbag play img_imu.bag
  1. 新建终端,运行imu计算程序,并使用自己设置的launch文件
roslaunch imu_utils Huace.launch

imu内参计算参考教程:GitHub - gaowenliang/imu_utils: A ROS package tool to analyze the IMU performance.

(7)相机与IMU联合标定

  1. 查看imu内参计算结果yaml文件,默认在imu_utils/data目录中。并根据yaml文件写入新的yaml文件,内容如下:
#Accelerometers
accelerometer_noise_density: 1.86e-03   #对应yaml文件的“Acc->avg-axis->acc_n”
accelerometer_random_walk:   4.33e-04   #对应yaml文件的“Acc->avg-axis->acc_w”

#Gyroscopes
gyroscope_noise_density:     1.87e-04   #对应yaml文件的“Gyr->avg-axis->gyr_n”
gyroscope_random_walk:       2.66e-05   #对应yaml文件的“Gyr->avg-axis->gyr_w”

rostopic:                    /gps/imu   #bag包中imu数据话题
update_rate:                 100.0      #Hz (imu采集频率)
  1. 运行kalibr相机与IMU联合标定
kalibr_calibrate_imu_camera --target april_6x6_80x80cm_A0.yaml --cam camchain-stereo_calibra.yaml --imu imu_Huace.yaml --bag stereo_calibra.bag
  1. 生成的标定结果在终端运行目录下的camchain-imucam-stereo_calibra.yaml(注意:重复运行会覆盖原有结果)
    yaml文件结果解读:Yaml formats
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
相机和IMU联合标定是一种常用的技术,用于将相机和惯性测量单元(IMU)的数据进行融合,以实现精确的定位和姿态估计。在这个过程中,我们需要确定相机和IMU之间的外部参数(如旋转矩阵和平移向量),以及IMU的内部参数(如加速度计和陀螺仪的偏置)。以下是一个常见的相机和IMU联合标定的步骤: 1. 数据采集:在进行标定之前,我们需要同时记录相机和IMU的数据。这可以通过将相机和IMU固定在一个刚性平台上,并进行一系列运动来实现。 2. 图像特征提取:从相机捕获的图像中提取特征点,例如角点或ORB特征点。这些特征点将用于之后的相机标定。 3. 相机标定:使用采集到的图像数据,对相机进行标定,以获取内部参数(例如焦距、主点位置等)和外部参数(例如旋转矩阵和平移向量)。这可以使用常见的相机标定算法,如张正友标定法。 4. IMU预处理:对采集到的IMU数据进行预处理,包括去除噪声、对齐时间戳等操作。这有助于提高后续的联合标定精度。 5. 特征匹配:将IMU数据与图像特征进行匹配,以建立二者之间的对应关系。这可以通过使用IMU数据的角速度和线性加速度与特征点的运动进行配准。 6. 联合优化:使用非线性优化方法,如扩展卡尔曼滤波(EKF)或优化器,将相机和IMU之间的外部参数进行联合优化。这可以通过最小化重投影误差来实现,即将图像特征投影到3D空间,并与IMU数据进行对比。 通过以上步骤,我们可以获得相机和IMU之间的精确外部参数,从而实现精确的相机姿态估计和定位。这对于许多应用领域,如增强现实、机器人导航等都是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值