利用Kalibr标定双目相机与IMU

2023-05-16

本文介绍如何利用Kalibr标定工具进行双目相机与IMU的联合标定。主要过程包括以下四步:

  1. 生成标定板
  2. 标定双目相机
  3. 标定IMU
  4. 联合标定

1. 生成标定板

使用AprilTag

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.002 --tspace 0.3

遇到问题"ImportError: No module named pyx" 玄学解法:

sudo apt-get install python-pyx

 

2. 标定双目相机

降低帧率

rosrun topic_tools throttle messages /l_cam/image_raw 4 /left
rosrun topic_tools throttle messages /r_cam/image_raw 4 /right
advertised as /left //出现时说明将帧成功

录制bag包

rosbag record /left /right >mycamera.bag

遇到的错误

ImportError: cannot import name NavigationToolbar2Wx

/home/cjn/kalibr/src/kalibr/Schweizer-Messer/sm_python/python/sm/PlotCollection.py

解决方法:将 PlotCollection.py 中的NavigationToolbar2Wx 改为 NavigationToolbar2WxAgg

ImportError: No module named igraph

sudo apt-get install python2.7-igraph

kalibr标定时出现:ImportError: No module named Image.

解决方法: 在kalibr_workspace/aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/MulticamGraph.py中
将import Image改为from PIL import Image

rosrun kalibr kalibr_calibrate_cameras --bag '/home/guoben/stereocam.bag' --topics /left /right --models pinhole-radtan pinhole-radtan --target '/home/guoben/Project/Kalibr_ws/april_6x6_80x80cm.yaml' --show-extraction --approx-sync 0.1

注意事项:

  • 标定的时候图中不能存在两个标定板
  • 起始画面和终止画面要稳定

3. 标定IMU

参考:IMU噪声标定——加速度计和陀螺仪的白噪声和零偏不稳定性

//录制bag文件

  1. collect the data while the IMU is Stationary, with a two hours duration;
rosbag	record /imu0

有Code_utils和imu_utils两个包 先编译code_utils再编译imu_tils

得到的imu.yaml

type: IMU
name: ICM20602
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 1.4127871720120859e+02
      gyr_w: 4.8477797168896648e-03
   x-axis:
      gyr_n: 3.9615886574940606e+02
      gyr_w: 4.8477797168896648e-03
   y-axis:
      gyr_n: 1.5284722859858114e+01
      gyr_w: 4.8477797168896648e-03
   z-axis:
      gyr_n: 1.2392562994361640e+01
      gyr_w: 4.8477797168896648e-03
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 3.8264508828802807e-01
      acc_w: 1.0613073078261251e-02
   x-axis:
      acc_n: 3.6962189636668691e-01
      acc_w: 1.0916554449621266e-02
   y-axis:
      acc_n: 4.6707198750779616e-01
      acc_w: 1.0721472803944067e-02
   z-axis:
      acc_n: 3.1124138098960102e-01
      acc_w: 1.0201191981218414e-02

修改为如下样式:

rostopic: /imu0
update_rate: 100.0 #Hz
 
accelerometer_noise_density: 3.8264508828802807e-01 #continous
accelerometer_random_walk: 1.0613073078261251e-02 
gyroscope_noise_density: 1.4127871720120859e+02 #continous
gyroscope_random_walk: 4.8477797168896648e-03

4. 录制数据包

沿着3个轴旋转平移三次

5. 联合标定

准备好四个文件

  1. 标定半文件
  2. 相机参数文件
  3. imu参数文件
  4. 数据bag文件
rosrun kalibr kalibr_calibrate_imu_camera --target april_6x6_80x80cm.yaml --cam stereocam.yaml --imu ICM20602.yaml --bag camera_imu.bag --timeoffset-padding 0.1

6. 标定结果

得到结果为camchain.yaml

 

cam0:
  T_cam_imu: # 从IMU到相机坐标的转换
  - [0.08233179976406399, -0.9949127683235393, -0.05805220214946505, -0.008744023342066004]
  - [-0.9959106050536686, -0.08430878258416843, 0.032466843406961834, 0.07000917129335886]
  - [-0.03719598754229868, 0.055141750117018384, -0.9977854708827878, -0.11902680705823296]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [-0.4274960254764774, 0.1522753401860188, 0.022086313718892994,
    -0.0007250205609533983] #失真模型的参数向量
  distortion_model: radtan 
  intrinsics: [576.2948258096362, 570.5120047531799, 290.9276492936449, 165.99488000803987] #相机内参 之前标好的
  resolution: [640, 480] #分辨率
  rostopic: /l_cam/image_raw #话题
  timeshift_cam_imu: -0.04319840825131607 #漂移
cam1: 
  T_cam_imu: # 从IMU到相机坐标的转换
  - [0.0894795247331801, -0.9911722483784674, 0.0978314300104943, -0.06676213145949367]
  - [-0.995095690056223, -0.08480851440432002, 0.05091250844401363, 0.06960856622513922]
  - [-0.04216612722380045, -0.10190726141402426, -0.9938998580269747, -0.12389393733183268]
  - [0.0, 0.0, 0.0, 1.0]
  T_cn_cnm1:
  - [0.9878176058814627, -0.002372804306504643, -0.1555980311904324, -0.07647885002996721]
  - [-0.000506528488511444, 0.9998294218114983, -0.01846268422998622, -0.0025906464811484946]
  - [0.155615297896788, 0.018316579369764666, 0.9876479038507021, -0.0062589855841411746]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [-0.4358292770104687, 0.13856343257725542, 0.01867787729653694,
    -0.011189753016360725]
  distortion_model: radtan
  intrinsics: [572.0873971077864, 571.5888157262697, 349.04660762135626, 174.35778659111406]
  resolution: [640, 480]
  rostopic: /r_cam/image_raw
  timeshift_cam_imu: -0.002440062477866302

7. 使用Kalibr进行单目相机与IMU的联合标定

出现问题:

Spline Coefficient Buffer Exceeded. Set larger buffer margins”

在标定命令最后添加 --timeoffset-padding 0.1 

timeoffset-padding这个参数可以适当的设置的大一些

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用Kalibr标定双目相机与IMU 的相关文章

随机推荐

  • FreeRTOS学习笔记-流缓冲区(FreeRTOS中文官网)

    https www freertos org zh cn cmn s RTOS stream buffer API html RTOS 流缓冲区 API RTOS 流缓冲区 API 函数 xff1a xStreamBufferCreate
  • FreeRTOS学习笔记-消息缓冲区(FreeRTOS中文官网)

    RTOS消息缓冲区 API RTOS 消息缓冲区 API 函数 xff1a xMessageBufferCreate xMessageBufferCreateStatic xMessageBufferSend xMessageBufferS
  • ubuntu系统X86环境下配置TX2的ARM环境的交叉编译链

    总步骤 安装qtcreator的IDE安装aarch64 linux gnu g 43 43 交叉编译链下载Qt库的源码 xff0c 配置编译选项 xff0c 编译生成针对TX2的ARM环境的qmake工具配置qtcreator xff0c
  • ROS中Eigen库的引用

    在CmakeList txt中添加两个地方 find package Eigen REQUIRED include directories Eigen INCLUDE DIR 如果找不到Eigen xff0c 我们将第一句改成 find p
  • ROS tf使用

    1 静态tf发布 lt node pkg 61 34 tf 34 type 61 34 static transform publisher 34 name 61 34 link1 link2 broadcaster 34 args 61
  • SLAM算法配置——使用Realsense D435i结合ROS跑通ORB-SLAM2的RGB-D节点

    ORB SLAM2源地址 配置环境依赖 Pangolin xff0c OpenCV xff0c Eigen3 xff0c DBoW2 and g2o xff08 源代码里有 xff0c 不用自己装 xff09 xff0c ROS xff08
  • 代码编写及阅读规范

    阅读常识 1 C语言中在函数名或关键字前加下划线 一般情况是标识该函数或关键字是自己内部使用的 xff0c 与提供给外部的接口函数或关键字加以区分 规范 综述 C 43 43 是一门十分复杂并且威力强大的语言 xff0c 使用这门语言的时候
  • 流媒体开发之路

    其实很早之前 xff0c 就想写属于自己的博客 xff0c 大二就有了CSDN账号 xff0c 很讽刺的是 xff0c 工作几年了 xff0c 账号里面的内容竟然和小鲜肉脸一样干净 干净的让人尴尬 回顾自己的这几年的开发之路 xff0c 接
  • matlab图像处理实例详解---note

    1 直方图均衡及直方图规定化 可以优化图像的亮度及gamma效果 2 图像的标准差 当图像越清晰的时候 xff0c 图像的标准差就越大 是否可以用来做af的判定标准 作为fv的值 另外是否可以用图像的相关系数作为caf的一个trigger
  • promise限制并发请求数量

    所谓并发请求 xff0c 就是指在一个时间点多个请求同时执行 当并发的请求超过一定数量时 xff0c 会造成网络堵塞 xff0c 服务器压力大崩溃或者其他高并发问题 xff0c 此时需要限制并发请求的数量 假如等待请求接口1000个 xff
  • 一个跨平台的 C++ 内存泄漏检测器(转载)

    一个跨平台的 C 43 43 内存泄漏检测器 吴咏炜 adah 64 netstd com 2004 年 3 月 内存泄漏对于C C 43 43 程序员来说也可以算作是个永恒的话题了吧 在Windows下 xff0c MFC的一个很有用的功
  • printf和wprintf、printf输出结束标识符、c++按值返回临时对象是否是const的实验

    ifndef TEST H define TEST H include lt iostream gt include lt string gt using namespace std int x 61 5 struct s public s
  • 自己搭深度学习环境踩坑血泪史

    自己搭深度学习环境踩坑的血泪史 从一个沮丧的事情开始问题1 强行更新了一次win10后 双系统里的ubuntu的启动项就没了 xff0c 直接进入win10系统问题2 sudo apt get update 总是超时问题3 conda in
  • 电脑串口延迟/缓冲设置方法

    使用串口做精确信号发送的时候会经常出现不能时间不精确的问题 xff0c 使用两个u口转串口串连之后一个接收一个发送的情况下 收到的时间延迟数据如下 xff1a 注意 xff1a 这里的因为有一个接收缓冲区和一个发送缓冲区 xff0c 所以这
  • apt-get install 连同诸多依赖包一并安装的指令

    apt get install 连同诸多依赖包一并安装 如题 xff0c apt get安装某个包的时候 xff0c 经常会碰到很多依赖包 xff0c 需要一一安装了才行 xff0c 非常麻烦 当然 xff0c 可以使用以下指令一步到位 a
  • git 分支操作记录

    查看分支 xff1a 查看本地分支 xff1a git branch 查看远程分支 xff1a git branch r 查看全部分支 xff08 本地和远程 xff09 git branch a 新建分支 xff1a 创建新分支 xff1
  • C++ 简析容器Vector

    向量 xff08 Vector xff09 是一个封装了动态大小数组的顺序容器 xff08 Sequence Container xff09 跟任意其它类型容器一样 xff0c 它能够存放各种类型的对象 可以简单的认为 xff0c 向量是一
  • SLAM初始化

    本节的学习要点 xff1a 初始化的目的 单目 双目 初始化的两种方法初始化过程 初始化的目的 单目SLAM初始化的目的是 61 61 构建初始的三维点云地图 xff08 空间点 xff09 并为之后的计算提供初始值 61 61 由于仅从单
  • tensorflow lite example label_image 分析【二】

    接上文 3 代码分析 main函数首先将入参写入参数结构体 Settings s struct Settings bool verbose 61 false bool accel 61 false bool input floating 6
  • 利用Kalibr标定双目相机与IMU

    本文介绍如何利用Kalibr标定工具进行双目相机与IMU的联合标定 主要过程包括以下四步 xff1a 生成标定板标定双目相机标定IMU联合标定 1 生成标定板 使用AprilTag rosrun kalibr kalibr create t