相机与IMU标定教程

这篇具有很好参考价值的文章主要介绍了相机与IMU标定教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

标定教程
way

相机与IMU联合标定

1、imu_utils 标定IMU的内参

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

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

1.1安装环境

这里使用的包是 imu_utils ,使用这个包可以校准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 (imu_utils依赖code_utils 先编译code_utils 再编译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表示使用bag数据的最大时长,单位是分钟,默认是120分钟,
step6:启动 imu_utils 标定IMU

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

这一步是关键,在执行上上步roslaunch imu_utils xsens.launch之后,程序会进入等待话题的状态。
得到如下输出结果:
相机与IMU标定教程
尽快执行rosbag play -r 200 自己的.bag,程序进入bag读取,并计算allan方差。当bag包加速回放完毕后,执行launch的窗口仍然会显示wait for imu data.,等待一段时间计算,计算完毕后会显示计算结果。
相机与IMU标定教程显示done之后,在catkin_ws/src/imu_utils/data这个文件夹下会出现一系列的data文件,打开xsens_imu_param.yaml这个文件,会看到计算出来的噪声和随机游走的系数值。
相机与IMU标定教程

%YAML:1.0
---
type: IMU
name: xsens
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 5.0034702036714999e-02
      gyr_w: 2.4583978028785876e-03
   x-axis:
      gyr_n: 2.5852284735645492e-02
      gyr_w: 1.8303245177389645e-03
   y-axis:
      gyr_n: 9.8883151331650182e-02
      gyr_w: 4.8477797168896648e-03
   z-axis:
      gyr_n: 2.5368670042849317e-02
      gyr_w: 6.9708917400713272e-04
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 9.1440795637947525e-01
      acc_w: 2.1004351612340905e-02
   x-axis:
      acc_n: 2.0238764067980461e-01
      acc_w: 1.7432126284010131e-02
   y-axis:
      acc_n: 4.8601261496646220e-01
      acc_w: 2.0739830749315680e-02
   z-axis:
      acc_n: 2.0548236134921587e+00
      acc_w: 2.4841097803696900e-02

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

sudo pip install python-igraph  (sudo apt install python-pip (python2.7))
//若出现问题,用以下命令安装
sudo apt-get install python-igraph

编译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

node:若编译出现如下问题,参考链接[2].

2.2 校准相机的内外参

标定板使用二维码aprilgrid或者棋盘格checkerboard都是可以的,使用时做好相应yaml的修改即可。标定板下载见https://github.com/ethz-asl/kalibr/wiki/downloads,需要有google帐号且要有谷歌云端硬盘的访问权限。如果不可以(比方说我就不可以),可参照https://github.com/ethz-asl/kalibr/wiki/calibration-targets,使用kalibr_create_target_pdf命令自己创建指定标定板然后打印就可以了。
本篇使用了二维码标定板,创建或修改apriltag.yaml

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 

其中tagsize和tagspacing是要根据实际打印出来的标定板做修改的,其参数意义可参照下图,该图同样来自https://github.com/ethz-asl/kalibr/wiki/calibration-targets。
相机与IMU标定教程

step1 运行相机节点

rosrun sensor_driver stereo_left_node 
rosurn sensor_driver stereo_right_node 

step2 修改话题的频率为4
启动相机节点,因为kalibr处理时建议图像频率不能太高,此处使用topic_tools/throttle对输出的图像话题降频,4Hz也是官方推荐的频率。

rosrun topic_tools throttle messages /stereo_left_node/left 4.0 /left 
rosrun topic_tools throttle messages /stereo_right_node/right 4.0 /right  

node:对命令解释说明
rosrun topic_tools throttle messages 修改后的话题名 频率 原始话题名
该命令可以修改话题的名和频率,本文修改了话题的频率,话题名称修改为/left /right

step3 录制bag数据

rosbag record -0 stereo_calibar.bag /left_img  /right_img

node:双目采集数据说明
将相机对准标定板,不断移动相机达到获取不同角度图像,大概采集200张图片(50s左右)

step4 用Kalibr双目相机标定

// 进入到kalibr工具目录下
source devel/setup.bash
rosrun kalibr kalibr_calibrate_cameras --bag xxx/stereo_calibra.bag --topics /left_img /right_img --models  omni-radtan omni-radtan --target xxx/april_6x6_80x80cm_A0.yaml

rosrun kalibr kalibr_calibrate_cameras --bag src/data/2021-09-02-16-24-01.bag --topics /left_img /right_img --models omni-radtan omni-radtan --target src/data/april_6x6_80x80cm_A0.yaml --show-extraction --approx-sync 0.05

node:对命令解释说明

rosrun kalibr kalibr_calibrate_cameras --bag xxx/stereo_calibra.bag --topics /left_img /right_img --models omni-radtan omni-radtan --target xxx/april_6x6_80x80cm_A0.yaml --bag-from-to 5 105

  1. xxx/stereo_calibra.bag stpe3 录制的bag路径
  2. /left_img /right_img 话题名
  3. omni-radtan omni-radtan 后面是相机/畸变模型,有几目相机就要写几个,这里是两个omni-radtan模型相机,所以是两个omni-radtan;相应地,其他支持的模型可以查看https://github.com/ethz-asl/kalibr/wiki/supported-models。
  4. xxx/april_6x6_80x80cm_A0.yaml 标定板配置文件 (使用标准的标定板,从官网下载的yaml文件参数不用修改, 笔记本中有这个文件 可以直接用)
  5. –show-extraction 是在标定过程中的一个显示界面,可以看到图片提取的过程,可以不要;
  6. –approx-sync 0.05 时间戳不对齐问题
  7. –bag-from-to后面是想要使用数据时间段的起始时间和结束时间,单位:秒(s),这个参数可以剔除掉刚开始录制和结束时一些出入视野等画面

个人遇到的问题记录:

标定运行过程中报错,RuntimeError: Optimization failed!

可以参照github上作者的回答https://github.com/ethz-asl/kalibr/issues/41,提高timeOffsetPadding (https://github.com/ethz-asl/kalibr/blob/master/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera#L171)再次尝试。

标定完成会生成下面3个文件,其中命名为camchain的.yaml文件是后续联合标定要继续用到的,里面包含了所需的相机的内外参。

相机与IMU标定教程

可以查看report的pdf,重投影误差(reprojection errors)在1个像素以内标定就是比较好的了。
相机与IMU标定教程

3、相机和IMU联合标定

step1 录制数据集

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

rosrun topic_tools throttle messages /camleft/video_image 4.0 /caml
rosrun topic_tools throttle messages /camright/video_image 4.0 /camr
rosbag record -O stereo_imu_calibra.bag /stereo_left_node/left  /stereo_right_node/right /imu_node/imu0

注意事项:

采集数据的起始和结束阶段注意别晃动太大,如从桌子上拿起或者放下。如果有这样的动作,在标定阶段应该跳过bag数据集的首尾的数据.
采集数据的时候应该给imu各个轴足够的激励,如先依次绕各个轴运动,运动完后来个在空中画8字之类的操作,当然也要注意别运动太剧烈,图像都模糊了。

联合标定中imu内参yaml格式如下,并不能直接拿imu_utils的标定结果yaml文件来用,否则会报错RuntimeError: [ImuConfig Reader]: Could not read configuration from …

#Accelerometers
accelerometer_noise_density: 4.8641695361661035e-03   #Noise density (continuous-time)
accelerometer_random_walk:   2.3944306307068487e-04   #Bias random walk
 
#Gyroscopes
gyroscope_noise_density:     5.4583665041817392e-04   #Noise density (continuous-time)
gyroscope_random_walk:       6.1968037914410386e-06   #Bias random walk
 
rostopic:                    /imu      #the IMU ROS topic
update_rate:                 100.0      #Hz (for discretization of the values above)

step2 标定

source devel/setup.bash 
 
rosrun kalibr kalibr_calibrate_imu_camera --target src/data/april_6x6_80x80cm_A0.yaml --cam src/data/camera.yaml --imu src/data/A1_ium.yaml --bag src/data/stereo_imu_calibra.bag
rosrun kalibr kalibr_calibrate_imu_camera --target april_6x6_55x55mm.yaml --bag ~/bagfiles/zed_xsens.bag --bag-from-to 5 50 --cam src/data/camera.yaml  --imu src/data/A1_ium.yaml --imu-models scale-misalignment --timeoffset-padding 0.1

node:对命令解释说明

1、--target src/data/april_6x6_80x80cm_A0.yaml :标定板的参数文件;

2、--bag images_imu.bag指定数据包

3、–bag-from-to 5 50设定bag包开始时间和结束时间,避开拿起和放下IMU的时间段内的数据

2、--cam src/data/camera.yaml :camera的参数文件,格式参考【文档1:camera.yaml】。使用标定好的相机参数替换对应的内容;
3、--imu src/data/ium.yaml  :imu的配置文件,格式参考【文档2:imu.yaml】,用标定好的imu参数替换相应的参数;
4、–imu-models scale-misalignment IMU的参数模型

camera.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

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标定教程

标定结果的重投影误差应该在零点几个像素
标定出来的位移和实际测量或估计的IMU 和相机中心位移比较一致文章来源地址https://www.toymoban.com/news/detail-417524.html

参考文献

  1. Kalibr 标定双目内外参数以及 IMU 外参数
  2. 使用kalibr对双目-IMU进行标定(小觅相机)
  3. [相机标定] 用Kalibr标定diy的双目相机
  4. 《视觉SLAM进阶:从零开始手写VIO》第二讲作业
  5. 没有libelf.h libdw.h
  6. imu_utils IMU内参标定工具 imu_utils安装教程 imu_utils使用教程
  7. VIO 中 IMU 的标定流程 (1/3) - imu_utils 使用备忘
  8. VIO 中 IMU 的标定流程 (2/3) - kalibr_allan 使用备忘
  9. VIO 中 IMU 的标定流程 (3/3) - imu_tk 使用备忘
  10. 相机与IMU联合标定_熊猫飞天的博客-CSDN博客_相机和imu联合标定

到了这里,关于相机与IMU标定教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Camera-IMU联合标定原理

    ​ 在VIO系统中,camera-imu间内外参精确与否对整个定位精度起着重要的作用。所以良好的标定结果是定位系统的前提工作。 目前标定算法主要分为离线和在线标定,离线标定以kalibr为代表,能够标定camera内参、camera-imu之间位移旋转、时间延时以及imu自身的刻度系数、非正交性

    2024年02月08日
    浏览(43)
  • 联合标定Android手机的IMU和Camera数据

    通过局域网实现安卓手机和ROS的通讯,进一步通过Kalibr工具实现手机IMU和相机的联合标定。 基于ROS下的信息发布和订阅,手机和PC在一个局域网下进行信息(image和IMU)传输。操作步骤: 在安卓手机中安装github上的2个开源Android_Camera-IMU和android_ros_sensors中的任意一个,基于r

    2024年02月09日
    浏览(46)
  • 学习Kalibr工具---Camera与IMU联合标定过程

    以双目+IMU为例进行介绍相机和IMU 的联合标定,也叫多传感器融合; 录制含有标定板图像的bag包,注意需要不断移动标定板。 运行Kalibr工具箱中 多相机标定 节点程序。 我们使用的最终命令 参考链接:https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration (一) 标定的输入文件包括

    2024年02月08日
    浏览(51)
  • 使用kalibr对相机和IMU标定

    目录 一、IMU标定 二、相机标定 三、联合标定 关于需要下载的环境和具体的包参考【1】 记录标定过程 : ①录制imu的rosbag ②标定 单位问题 :   ①连续时间  ②离散时间 parameter symbol units gyr_n acc_n gyr_w acc_w 对于离散时间的白噪声  = 连续时间的白噪声 * 频率的平方根 对于离

    2024年02月15日
    浏览(44)
  • d435i 相机和imu标定

    使用 imu_utils 功能包标定 IMU,由于imu_utils功能包的编译依赖于code_utils,需要先编译code_utils,主要参考 相机与IMU联合标定_熊猫飞天的博客-CSDN博客 Ubuntu20.04编译并运行imu_utils,并且标定IMU_学无止境的小龟的博客-CSDN博客 1.1 编译 code_utils 创建工作空间 1.1.1 修改 CMakeLists.txt 文件

    2024年02月09日
    浏览(59)
  • 使用Kalibr标定相机和IMU(ZED+px4)外参

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文仅使用kalibr中cam-imu的联合标定,关于camera内参默认已经知道了。主要会总结一些标定上的小经验,有不对的地方,希望网友可以指出。文章最后将使用标定的cam-imu外参在VINS-Fusion中进行验证 Kalibr是

    2023年04月19日
    浏览(77)
  • Bunker_mini多传感器外参标定,雷达相机IMU

    使用Livox Viewer标定外参,具体步骤参考https://github.com/Livox-SDK/Livox-SDK/wiki/Calibrate-extrinsic-and-display-under-ros-cn 需要说明的是,Bunker_mini前面拼了三个AVIA,均安装在定制的支架。 外参标定需要给一个初始的标定数据,由于我们的支架有三维模型,所以可以通过CAD算出来 根据CAD计算

    2024年01月21日
    浏览(49)
  • 2d相机和3d相机的联合标定

    2D相机和3D相机的联合标定是通过以下步骤进行的: 1、收集标定数据: 首先,需要收集一组已知世界坐标和图像坐标的标定数据。这可以通过使用已知尺寸和位置的3D物体或平面棋盘格来收集 2、提取特征点: 在收集标定数据后,需要从图像中提取特征点。这些特征点应该是具有

    2024年02月16日
    浏览(48)
  • 激光雷达和相机联合标定

    所有内容仅供个人学习记录 相机内参是相机坐标系转换到图像像素坐标系 相机内参是世界坐标系转换到相机坐标系 相机的成像过程涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 四个坐标系: 1) 世界坐标系(world coordinate system) 现实世界的三维坐

    2024年01月18日
    浏览(53)
  • 激光雷达-相机联合标定

    https://f.daixianiu.cn/csdn/9499401684344864.html imu与lidar标定 https://github.com/PJLab-ADG/SensorsCalibration/blob/master/lidar2imu/README.md 多雷达标定 https://f.daixianiu.cn/csdn/3885826454722603.html ros usb相机内参标定 ROS系统-摄像头标定camera calibration_berry丶的博客-CSDN博客

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包