使用Kalibr进行IMU+相机的标定

2023-05-16

利用kalibr标定IMU和相机:  https://github.com/ethz-asl/kalibr/wiki/Camera-IMU-calibration#2-collect-images

在开始需要明确几点的是:需要先安装kalibr,该工具主要是标定相机和IMU, 在标定的过程中需要用到IMU和相机的内参文件,这里的内参文件可以用ROS 帮忙获得,或者如果已经有这个文件可以直接用。

接下要做的即安装realsense的ros接口主要是为了方便读取topic来录制rosbag, 因为kalibr在标定的时候需要用rosbag中的数据进行标定;

这里的相机采用realsense D435i 因此在安装标定前要确保相关库已经安装

-----IMU内参标定-----

1. 确保realsense的SDK已经安装:

2. 安装realsense的ros warpper

   https://github.com/IntelRealSense/realsense-ros 这是前两步的参考链接,包含安装realsense的SDK和roswarpper

  我之前已经安装过ros kinect在Ubuntu16.04的平台上,因此这里直接从catkin的工作空间开始

3. 标定IMU

   3.1 安装ceres: https://blog.csdn.net/jz1570551401/article/details/78207208

1. 预安装,其中libgoogle-glog-dev 可能需要再单独安装
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev 
libgoogle-glog-dev libgtest-dev   
2. 下载ceres:https://github.com/ceres-solver/ceres-solver
3. 解压文件后进入ceres-master:
    mkdir build
    cd build
    cmake ..  //如果这一步骤报错,可以检查一下是具体那个库没有安装成功,再sudo apt-get 对应的库就好
    make  //大概等几分钟
    sudo make install 
    
    安装完成后/usr/local/include/ceres 和 /usr/local/lib/ 中

3.2 下载code_utils: https://github.com/gaowenliang/code_utils

解压至catkin下的src文件,然后在code_utils下面找到sumpixel_test.cpp,修改#include "backward.hpp"为 #include “code_utils/backward.hpp”,然后运行catkin_make

错误提示:code_utils/backward.hpp:216:30: fatal error: elfutils/libdw.h: No such file or directory
compilation terminated.

运行: apt-get install libdw-dev 安装对应的库即可,一般安装这个就可以,如果这样还不可以试试:sudo apt-get install elfutils

3.3 下载imu_utils: https://github.com/gaowenliang/imu_utils

           再次catkin_make

3.4 接下来就可以就可以标定IMU了:

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/camera/imu"/>  #imu topic的名字
        <param name="imu_name" type="string" value= "d435i"/>
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/d435i"/>
        <param name="max_time_min" type="int" value= "30"/> #标定的时长
        <param name="max_cluster" type="int" value= "100"/>
    </node>
</launch>

将该launch文件保存成imu.launch至src和install下的launch中, 然后在两个终端中同时运行

~/catkin_ws_rs$ roslaunch realsense2_camera rs_camera.launch
~/catkin_ws_rs/install/share/realsense2_camera/launch$ roslaunch imu.launch

运行imu.launch文件的终端中会出现

process[imu_an-1]: started with pid [8274]
[ INFO] [1571305008.871258796]: Loaded imu_topic: /camera/imu
[ INFO] [1571305008.872137757]: Loaded imu_name: d435i
[ INFO] [1571305008.872762617]: Loaded data_save_path: /home/shinan/catkin_ws_rs/src/imu_utils/data/d435i
[ INFO] [1571305008.873749085]: Loaded max_time_min: 30
[ INFO] [1571305008.874493932]: Loaded max_cluster: 100
gyr x  num of Cluster 100
gyr y  num of Cluster 100
gyr z  num of Cluster 100
acc x  num of Cluster 100
acc y  num of Cluster 100
acc z  num of Cluster 100
wait for imu data.

接下来等待30分钟即可,标定完成后imu的参数将会被保存在data_save_path的路径中;

也可以录制bag保存imu数据后进行标定;https://blog.csdn.net/fang794735225/article/details/92804030

将IMU的标定结果保存到文件imu.yaml中:

#Accelerometers
accelerometer_noise_density: 2.4753056458491202e-02   #Noise density (continuous-time)
accelerometer_random_walk:   5.1092097834339175e-04   #Bias random walk

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

rostopic:                    /imu0      #the IMU ROS topic
update_rate:                 200.0      #Hz (for discretization of the values above)

相机标定:

https://blog.csdn.net/heyijia0327/article/details/43538695

标定realsense的RGB相机,如果使用的是其他相机可以用opencv采集图像后进行单目标定,这里不多写,主要是标定Realsense的彩色相机:

设定好相机的相关参数后(主要是size 和fps):目前设置图像大小为640*480 帧率为30

roslaunch realsense2_camera rs_camera.launch

启动realsense相机后,可以用rostopic list 查看对应的打开的topics

可以用ros自带的标定方法进行相机标定:

~/catkin_ws_rs$ rosrun camera_calibration cameracalibrator.py  --size 8x6 --square 0.035 image:=/camera/color/image_raw

最开始的CALBRATE按钮为灰色,当采集的图像符合条件够就变成绿色,然后可以点击CALIBRATE进行标定,标定结果显示如下:
 

  ('D = ', [0.20848791559812113, -0.36507062055202405, 0.012079145675854016, -0.006358054188595459, 0.0])
('K = ', [653.7064773464425, 0.0, 314.4404941629716, 0.0, 654.2058371422769, 261.91335661459755, 0.0, 0.0, 1.0])
('R = ', [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0])
('P = ', [677.4393920898438, 0.0, 311.13625111082183, 0.0, 0.0, 676.0581665039062, 266.3551872155367, 0.0, 0.0, 0.0, 1.0, 0.0])

将标定的结果保存到.yaml文件中 如下所示:

cam0:  #640*480
  camera_model: pinhole
  intrinsics: [653.7064773464425, 654.2058371422769,314.4404941629716, 261.91335661459755]
  distortion_model: radtan
  distortion_coeffs: [0.20848791559812113, -0.36507062055202405, 0.012079145675854016, -0.006358054188595459]
  rostopic: /camera/color/image_raw
  resolution: [640, 480]

准备标定板文件aprilgrid.yaml:

相机+IMU标定:

https://github.com/ethz-asl/kalibr/wiki/Camera-IMU-calibration#2-collect-images

1. 启动realsense相机和imu,所以也要先设置好rs_camera.launch文件中的相关参数;

其中rs_camera.launch中一定要设置如下两个参数:

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

第一参数保证相机数据和IMU数据的同步, 第二个参数保证输出同步的IMU数据;

 2. 为相机和IMU录制数据包,

可以先运行 rosrun image_view image_view image:=/camera/color/image_raw 查看图像, 保证在录制数据包的时候标定板不会超出画面

录制的时候尽量保证图像清晰,不要剧烈移动,采集数据的起始和结束阶段注意别晃动太大,如从桌子上拿起或者放下。如果有这样的动作,在标定阶段应该跳过bag数据集的首尾的数据. 同时尽可能地激活IMU的各个角度,各个方向,可以先依次绕各个轴运动,运动完后来个在空中画8字之类的操作,当然也要注意别运动太剧烈,图像都模糊了。:

rosbag record /camera/color/image_raw  /camera/imu -O rgb_imu.bag​

 3.  进行标定:参数分别是包名称(不用加.bag),相机参数文件,imu参数文件, 标定板文件

~/Project/kalibr_workspace$ kalibr_calibrate_imu_camera --bag ~/Project/kalibr_workspace/rgb_imu.bag​ --cam ~/Project/kalibr_workspace/camchain.yaml --imu ~/Project/kalibr_workspace/imu.yaml --target ~/Project/kalibr_workspace/aprilgrid.yaml 

 出现错误提示:

importing libraries
Traceback (most recent call last):
  File "/home/shinan/Project/kalibr_workspace/devel/bin/kalibr_calibrate_imu_camera", line 15, in <module>
    exec(compile(fh.read(), python_script, 'exec'), context)
  File "/home/shinan/Project/kalibr_workspace/src/kalibr-master/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera", line 5, in <module>
    from kalibr_imu_camera_calibration import *
  File "/home/shinan/Project/kalibr_workspace/src/kalibr-master/aslam_offline_calibration/kalibr/python/kalibr_imu_camera_calibration/__init__.py", line 4, in <module>
    import IccSensors as sens
  File "/home/shinan/Project/kalibr_workspace/src/kalibr-master/aslam_offline_calibration/kalibr/python/kalibr_imu_camera_calibration/IccSensors.py", line 16, in <module>
    import scipy.optimize
ImportError: No module named scipy.optimize

 安装python相关库:

sudo apt-get install python-scipy

标定结果如下:

After Optimization (Results)
==================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.552748299525, median 0.473100512902, std: 0.3640429471
Gyroscope error (imu0):        mean 0.215478847361, median 0.161409013393, std: 0.19024901177
Accelerometer error (imu0):    mean 0.165613674102, median 0.132037510374, std: 0.129116309678

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.552748299525, median 0.473100512902, std: 0.3640429471
Gyroscope error (imu0) [rad/s]:     mean 0.0123851576362, median 0.00927736573336, std: 0.0109350130176
Accelerometer error (imu0) [m/s^2]: mean 0.0579749018736, median 0.0462211936851, std: 0.04519859501

Transformation T_cam0_imu0 (imu0 to cam0, T_ci): 
[[ 0.9999488  -0.00279248  0.00972605  0.03555196]
 [ 0.00297818  0.99981255 -0.01913078 -0.00461578]
 [-0.0096708   0.01915877  0.99976968  0.00838297]
 [ 0.          0.          0.          1.        ]]

cam0 to imu0 time: [s] (t_imu = t_cam + shift)
-0.0280180128084

IMU0:
----------------------------
  Model: calibrated
  Update rate: 200.0
  Accelerometer:
    Noise density: 0.0247530564585 
    Noise density (discrete): 0.350061081538 
    Random walk: 0.000510920978343
  Gyroscope:
    Noise density: 0.00406426387456
    Noise density (discrete): 0.0574773709247 
    Random walk: 2.6537322064e-05
  T_i_b
    [[ 1.  0.  0.  0.]
     [ 0.  1.  0.  0.]
     [ 0.  0.  1.  0.]
     [ 0.  0.  0.  1.]]
  time offset with respect to IMU0: 0.0 [s]

  Saving camera chain calibration to file: camchain-imucam-homeshinanProjectkalibr_workspacecam_imu640_480_retrgb_imu​.bag.yaml

  Saving imu calibration to file: imu-homeshinanProjectkalibr_workspacecam_imu640_480_retrgb_imu​.bag.yaml
  Detailed results written to file: results-imucam-homeshinanProjectkalibr_workspacecam_imu640_480_retrgb_imu​.bag.txt
Generating result report...

Timeshift表示的就是IMU相对于camera的延时;

如有疑问,欢迎交流: wx: baobaohaha_ 欢迎对SLAM有兴趣的小伙伴一起交流学习~~

 参考博客:https://blog.csdn.net/mxdsdo09/article/details/83514310

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

使用Kalibr进行IMU+相机的标定 的相关文章

  • git push 出现you are not allowed to upload merges

    你本地基于远程分支master上下载的代码工程 xff0c 修改代码并commit了 xff0c 而别人也在他电脑本地基于远程分支master上的代码工程上进行commit xff08 修改的内容可以不一样 xff0c 如果一样那么你pul
  • 桥接模式下电脑主机ping不通虚拟机,出现 :无法访问目标主机。而虚拟机能ping通主机

    1 我的状况描述 xff1a 主机 win7 ip 192 168 0 103 自动分配 xff0c 虚拟机 centos6 7桌面版 ip xff1a 192 168 0 105 昨天刚安装好了虚拟机 xff0c 主机与虚拟机直接都能相互
  • 自己写一个串口调试小助手

    串口调试小助手是我们调试手机程序经常使用的一个工具 一个十分简洁优秀的程序 xff0c 感觉似乎是使用D语言编写的 xff0c 然后作者又使用UPX加了个壳 给一些喜欢反编绎研究别人程序的人造成了一些障碍 其实串口调试小程序原理并不太难 x
  • 【java力扣算法《代码随想录》02】第2章程序的性能分析(刷题如果关键的部分直接用库函数就可以解决,建议不要使用库函数)

    第二章 程序的性能分析 代码随想录刷题整理刷题注意关于使用库函数ACM模式代码风格 时间复杂度O n 中 logn无底数空间复杂度 代码随想录刷题整理 代码随想录 刷题网站 刷题注意 关于使用库函数 如果题目关键的部分直接用库函数就可以解决
  • 四轴飞行器姿态控制

    四轴飞行器姿态控制 一 姿态解算相关概念 1 欧拉角 用来表示三维空间中运动物体绕坐标轴旋转的情况 xff0c 即物体每时每秒的姿态可以由欧拉角表示 2 四元数 四元数用于物体的旋转 xff0c 是一种复杂但是效率较高的旋转方式 对于一个物
  • 串级PID控制四轴飞行器状态-实现

    参考网页 xff1a http blog csdn net nemol1990 article details 45131603 一 上下运动 向上运动 xff0c 四个轴的速度同时增加向下运行 xff0c 四个轴的速度同时减小 二 前后运
  • c和c++调用Python

    参考网页 xff1a https docs python org 3 6 c api index html http blog csdn net taiyang1987912 article details 44779719 http bl
  • yoloV3 darknet GPU手把手从编译到训练再到C++调用API

    我要先声明一下 xff0c 系统是Ubuntu18 04 xff0c 我的机器已经装好了opencv4 1 1 和 cuda10 0 的 xff0c 过程可参考我另一篇博客 xff0c 这部分不再说明 IDE使用qtcreator 1 下载
  • 使用Git命令创建新分支

    1 进入Git Bash Here xff0c 查看仓库所有分支git branch a 2 使用命令 git checkout master xff0c 表示切换到master分支 xff0c 并git pull拉取最新代码 3 由于的所
  • VINS-初探(一)

    vins是香港科技大学开源的一个单目相机结合IMU的一个VIO xff0c 在github上可以下载源码 xff0c 分为iOS系统下的和ros系统下的两种 xff0c ros下的为 span class hljs label https
  • ROS使用官方包进行串口通信

    https www jianshu com p c30f390427e7 参考http span class hljs comment www roswiki com read php tid 61 557 amp fid 61 39 sp
  • STM32F446ZET6关于使用PA11,PA12,PB14,PB15的使用注意事项

    STM32F446ZET6关于使用PA11 xff0c PA12 xff0c PB14 xff0c PB15的使用注意事项 这两天在用PB14做输入时 xff0c 发现总是不灵敏 xff0c 开始还以为布线有问题 xff0c 检查后发现不是
  • numpy基本方法总结

    NumPy基本方法 一 数组方法 创建数组 xff1a arange 创建一维数组 xff1b array 创建一维或多维数组 xff0c 其参数是类似于数组的对象 xff0c 如列表等 读取数组元素 xff1a 如a 0 a 0 0 数组
  • 如何实现Qt上位机软件串口的按字节数据处理?

    1 Qt串口类的选择 最近在做一个小项目 xff0c 需要用到Qt做上位机软件 xff0c 本人也是边学边做 xff0c 买了本 QtCreator快速入门 看了看就动手了 xff0c 由于初学不是很了解Qt5的官方资源 xff0c 一开始
  • 如何使用HAL库手动修改OSC引脚为PD0/1?

    CubeMX不能直接重映射OSC引脚为PD0 1 xff0c 那么 xff0c 如何使用HAL库手动修改OSC引脚为PD0 1 如下图所示配置即可 xff1a
  • “野火FreeRTOS教程”第7章补充知识点-异常流程

    一 知识点 1 Cortex M3 4在复位后CONTROL寄存器初始值为0 xff0c 也就是说MCU会处于线程模式 具有特权访问权限且使用主栈指针 MSP 2 当进入异常时CM3会自动入栈 xff0c 如下图所示 xff1a 3 当异常
  • mini四旋翼飞行器DIY日志

    一 方案 功能描述 xff1a 具备mini四旋翼飞行器的基本功能 xff0c 可以拓展其他模块实现定高 对航向角yaw的校准 xff0c 将所有io引出并设计出最小系统板子功能 xff0c 将设计I2C总线挂载选择电路便于调试和使用 可以
  • Quartus II 13.1.0.162三件套安装包

    QuartusSetup 13 1 0 162 链接 https pan baidu com s 1B01zWG76kfNcGLA0VmwyMw 提取码 jjdd ModelSimSetup 13 1 0 162 链接 https pan
  • DSP Builder安装时的注意事项

    注意事项1 DSP Builder是以组件的形式安装在altera下面的 xff0c 并且altera要与matlab 32位 xff01 xff01 安装在同一路径下 xff0c 这个路径不要带有中文 xff0c 或者空格字符 xff0c
  • Maven3.6.1下载与配置,超详细

    Maven3 6 1下载与配置 xff0c 超详细Maven3 6 1下载与配置 xff0c 超详细Maven3 6 1下载与配置 xff0c 超详细 Maven下载与配置 1 官网下载对应版本 xff0c 推荐下载免安装版 下载地址 ht

随机推荐

  • 【GIS】GIS矢量空间分析(上)

    0 GIS的基本概念 栅格数据与矢量数据 上图中 xff0c a为图形模拟表示的地理对象 xff0c b为控件对象对应的栅格数据模型表示 xff0c c为对应的矢量数据模型表示 矢量模型的表达源于原型空间实体本身 xff0c 通常以坐标来定
  • ROS简介-从零开始讲解ROS(适合超零基础阅读)

    1 前言 笔者以前是机械专业 xff0c 对于计算机方面的学习是少之又少 xff0c 接触机器人的学习之后 xff0c 比如路径规划 算法等 xff0c 发现很难入门 xff0c 不过慢慢摸爬滚打之后还是有了一些认识 xff0c 俗话说的好
  • C++primer plus第六版课后编程练习答案14.1

    include lt iostream gt include lt string gt using namespace std template lt class T1 class T2 gt class Pair private T1 a
  • 区块链——脱坑truffle

    使用truffle构建一个智能合约 实现输出 helloworld 的功能 网上有很多帖子 但也有很多坑 这里展示我的搭建过程 帮助大家绕过那些麻烦 一 安装web3 solc truffle npm g install solc npm
  • ucosii消息队列使用

    ucosii消息队列简介 ucosii的消息队列源码定义在os q c文件 xff1b 接口全部声明在ucos ii h xff0c 总共有如下接口 xff1a span class token keyword void span span
  • rtthrea-ucosii-freertos三系统学习总结

    三系统基本功能对比 RT thread ucosii freertos 任务调度 抢占式 时间片式 xff08 多级队列位图调度 xff09 抢占式 xff08 纯位图调度 xff09 抢占式 时间片式 xff08 遍历列表调度 xff09
  • VScode的git安装与配置

    git下载与安装 1 在官网下载git的最新版本 2 按照提示一步步安装完成 具体步骤参看以下文章 xff1a 转https blog csdn net qq 40342589 article details 105676715 VScod
  • 将python代码封装成c版本的dll动态链接库

    前言 将python程序打包成DLL文件 xff0c 然后用C 43 43 调用生成的DLL文件 xff0c 这是一种用C 43 43 调用python的方法 xff0c 这一块比较容易遇到坑 网上关于这一块的教程不是很多 xff0c 而且
  • gazebo加载异常或者加载缓慢

    在我们安装完ros的时候会在命令行里运行gazebo命令会打开gazebo一个空白世界 xff0c 往往会卡在如图所示的界面 xff1a 这是模型文件加载缓慢需要很长时间 xff0c 这是在ubuntu16 04下的情况 xff0c 在ub
  • FreeRTOS学习笔记二【源码文件介绍及命名规范】

    FreeRTOS学习笔记二 源码文件介绍及命名规范 源码文件介绍源码中的命名规范两个重要数据类型变量名函数名宏名 参考 本文介绍源码中的命名规范 xff0c 下篇开始介绍FreeRTOS中的任务管理 源码文件介绍 Free RTOS源码中包
  • FreeRTOS学习笔记八【队列-下】

    FreeRTOS学习笔记八 队列 下 队列中传输大数据 一个包 或大小可变的数据传输大数据传输不同类型和长度的数据 从多个队列中获取数据队列集合xQueueCreateSet xQueueAddToSet xQueueSelectFromS
  • 软件mongodbmanager.exe 在打开数据库Collection时报错

    The GuidRepresentation for the reader is CSharpLegacy which requires the binary sub type to be UuidLegacy not UuidStanda
  • CMakeList.txt使用指南

    cmake minimum required 设置所需的最低cmake版本 cmake minimum required VERSION major minor patch tweak FATAL ERROR execute process
  • 初入机器学习之——朴素贝叶斯分类器NBC及Python代码剖析

    初入机器学习之 朴素贝叶斯分类器NBC NBC模型的理论基础一 参数释义二 Training阶段模型所需参数三 Predict阶段四 代码剖析trainingpredicting NBC模型的理论基础 理论基础 xff1a 贝叶斯公式 P
  • 1秒学会 Vim 插件管理

    Vim pathogen 通常情况下安装vim插件 xff0c 通常是将所有的插件和相关的doc文件都安装在中一文件夹中 xff0c 如将插件全部安装在 usr share vim vim73 plugin 目录下 xff0c 将帮助文档全
  • 使用docker-compose在启动mysql容器时新建一个mysql用户并赋予其权限

    使用docker compose在启动mysql容器时新建一个mysql用户并赋予其权限 先来看看启动文件 span class token comment 原始的yml文件 xff0c 只创建了一个wordpress user用户 spa
  • Google Cloud Platform设置centos ssh登录

    Google Cloud Platform设置centos ssh登录 Google Cloud Platform设置centos ssh登录1 创建centos实例2 切换到root编辑ssh配置文件3 修改以下内容4 查看状态5 重启服
  • Apple M1 安装PhpStorm解释器

    执行以下命令 bin bash c span class token string 34 span class token variable span class token variable span span class token f
  • PyCharm本地连接远程conda虚拟环境(Ubuntu+TensorFlow+Cuda)进行代码调试+Jupyter测试

    目录 PyCharm本地连接远程conda虚拟环境 TensorFlow 进行代码调试说明1 GCP创建Ubuntu 43 选择GPU2 示例并远程连接2 安装miniconda 43 创建新虚拟环境3 在新虚拟环境中安装tensorflo
  • 使用Kalibr进行IMU+相机的标定

    利用kalibr标定IMU和相机 xff1a https github com ethz asl kalibr wiki Camera IMU calibration 2 collect images 在开始需要明确几点的是 xff1a 需