相机与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
之后,程序会进入等待话题的状态。
得到如下输出结果:
尽快执行rosbag play -r 200 自己的.bag
,程序进入bag读取,并计算allan方差。当bag包加速回放完毕后,执行launch的窗口仍然会显示wait for imu data.,等待一段时间计算,计算完毕后会显示计算结果。
显示done之后,在catkin_ws/src/imu_utils/data
这个文件夹下会出现一系列的data文件,打开xsens_imu_param.yaml
这个文件,会看到计算出来的噪声和随机游走的系数值。
![在这里插入图片描述](https://img-blog.csdnimg.cn/319e45ea36804a1aa6bf7611742df814.png
%YAML:1.0
---
type: IMU
name: xsens
Gyr:unit: " rad/s"avg-axis:gyr_n: 5.0034702036714999e-02gyr_w: 2.4583978028785876e-03x-axis:gyr_n: 2.5852284735645492e-02gyr_w: 1.8303245177389645e-03y-axis:gyr_n: 9.8883151331650182e-02gyr_w: 4.8477797168896648e-03z-axis:gyr_n: 2.5368670042849317e-02gyr_w: 6.9708917400713272e-04
Acc:unit: " m/s^2"avg-axis:acc_n: 9.1440795637947525e-01acc_w: 2.1004351612340905e-02x-axis:acc_n: 2.0238764067980461e-01acc_w: 1.7432126284010131e-02y-axis:acc_n: 4.8601261496646220e-01acc_w: 2.0739830749315680e-02z-axis:acc_n: 2.0548236134921587e+00acc_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。
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.yamlrosrun 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
- xxx/stereo_calibra.bag stpe3 录制的bag路径
- /left_img /right_img 话题名
- omni-radtan omni-radtan 后面是相机/畸变模型,有几目相机就要写几个,这里是两个omni-radtan模型相机,所以是两个omni-radtan;相应地,其他支持的模型可以查看https://github.com/ethz-asl/kalibr/wiki/supported-models。
- xxx/april_6x6_80x80cm_A0.yaml 标定板配置文件 (使用标准的标定板,从官网下载的yaml文件参数不用修改, 笔记本中有这个文件 可以直接用)
- –show-extraction 是在标定过程中的一个显示界面,可以看到图片提取的过程,可以不要;
- –approx-sync 0.05 时间戳不对齐问题
- –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文件是后续联合标定要继续用到的,里面包含了所需的相机的内外参。
可以查看report的pdf,重投影误差(reprojection errors)在1个像素以内标定就是比较好的了。
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 walkrostopic: /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: pinholedistortion_coeffs: [-0.1734857772863602, 0.026545178121976657, 0.0004291887376674085,-3.4873170616746686e-05]distortion_model: radtanintrinsics: [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: pinholedistortion_coeffs: [-0.17456713089475154, 0.027410444232267236, 0.0006360696559962682,-0.0002450168896166665]distortion_model: radtanintrinsics: [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 walkrostopic: /imu/data #the IMU ROS topic
update_rate: 100.0 #Hz (for discretization of the values above)
标定完成以后同样会生成一个报表和在终端里面打印校准信息;
标定结果的重投影误差应该在零点几个像素
标定出来的位移和实际测量或估计的IMU 和相机中心位移比较一致
参考文献
- Kalibr 标定双目内外参数以及 IMU 外参数
- 使用kalibr对双目-IMU进行标定(小觅相机)
- [相机标定] 用Kalibr标定diy的双目相机
- 《视觉SLAM进阶:从零开始手写VIO》第二讲作业
- 没有libelf.h libdw.h
- imu_utils IMU内参标定工具 imu_utils安装教程 imu_utils使用教程
- VIO 中 IMU 的标定流程 (1/3) - imu_utils 使用备忘
- VIO 中 IMU 的标定流程 (2/3) - kalibr_allan 使用备忘
- VIO 中 IMU 的标定流程 (3/3) - imu_tk 使用备忘
- 相机与IMU联合标定_熊猫飞天的博客-CSDN博客_相机和imu联合标定
相机与IMU标定教程相关推荐
- VIO测试准备——使用imu_utils和kalibr进行相机与IMU标定
0 前言 近期主要学习VIO.相机使用海康的两个支持外触发的单目相机,完成硬件同步外触发后,固联安装在机器人机体两侧,搭建了一个简易的双目相机.IMU使用的是LPMS-USBAL2(老型号,官方已经不 ...
- Android相机及IMU标定
文章目录 1. 数据采集 1.1 采集IMU数据 1.2 采集相机+IMU数据 2. IMU标定 2.1 数据预处理 2.2 数据打包⽣成.bag⽂件 2.3 创建.launch文件 2.4 数据标定 ...
- 相机、imu 标定 简介
惯性校准 对于 IMU,重点在于它所测量的是加速度,而非距离或速率.IMU 读数的误差会逐渐累积,累积速度极快! 校准和建模的目的在于确保每秒钟的 X 等分时间段内,对于距离的测量(对加速度进行二重积 ...
- 安卓手机 相机和IMU数据获取标定 在VINS-MONO运行自己的数据集(含打包方法) (非常详细一步一步来)
Android手机上图像和IMU数据采集的方法 网上有相关的教程,但都讲的很模糊,而且不全,甚至还有人要收费.自己完整做了一遍发现还是有些麻烦,固记录下来供大家参考,希望能帮到大家. 采用开源库 Vi ...
- ZED2跑ORB-SLAM3+双目相机、IMU联合标定+显卡驱动与cuda/cudnn安装
一.引言 同样是项目需求,需要利用视觉惯性导航做一些开发,所以第一步先做些算法的测试–仿真与实物测验,通过仿真的测试结果,最终是决定使用ORB-SLAM3来完成任务,当然了,Vins-fusion作为 ...
- 萌新谈相机与IMU的标定(转载)
我发现这里所给的标定板也是这个 https://drive.google.com/file/d/0B0T1sizOvRsUdjFJem9mQXdiMTQ/edit?resourcekey=0-0Cn7 ...
- 相机与IMU联合标定
相机与IMU联合标定 1 imu_utils 标定IMU的内参 1.1 安装环境 1.2 录制IMU数据集 2 kalibr 标定工具 2.1 安装 2.2 校准相机的内外参 2.3 校准相机与IMU ...
- rs_D455相机内外参标定+imu联合标定
IMU标定 <launch><node pkg="imu_utils" type="imu_an" name="imu_an&quo ...
- Ubuntu 18.04 Intel RealSense D435i 相机标定教程
1.D435i相机简介 RealSenseD435i 是一款立体视觉深度相机,如下图所示,其集成了两个红外传感器(IR Stereo Camera).一个红外激光发射器(IR Projector)和一 ...
最新文章
- fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用
- 关于sql中case when的用法
- SharePoint:扩展DVWP - 第21部分:实现可维护的三级联动下拉框
- mybatis foreach 错误_MyBatis高级结果映射之一对一映射
- Mysql中的行级锁、表级锁、页级锁
- ViewPager 简单实现左右无限滑动.
- 传说中的世界500强面试题-情商
- 光纤交换机配置zone
- 中国的程序员工资为什么那么高?
- 反问疑问_反问、疑问还是设问?
- 关于去除“请选择”问题
- 【C++】【整活】鼠标抖动
- html文本框打tab,HTML标签textarea支持tab键
- 世间皆苦,看完这些图,我们还是要笑对生活!
- android官方上拉加载,Android-RecycleView上拉加载更多
- 丰田汽车音频总线AVC-LAN
- springboot Vue网吧会员信息管理系统java源码介绍
- NLP(二十六)限定领域的三元组抽取的一次尝试
- 【学习笔记】认知神经科学
- 盐城大数据提“颜值”增“气质”
热门文章
- 华清远见嵌入式毕业总结
- buuctf-N1Book[第六章 CTF之PWN章]
- pandas保留想要的列或删除指定列
- auth2 并发登录出现 nested exception is org.redisson.client.WriteRedisConnectionException
- 在一个程序中什么算是亮点_算法的五个重要特性是
- JAVA -生日礼物
- 使用ESP8266-01s连接阿里云并发送数据
- python获取当天日期
- 【VB与数据库】机房收费系统开发阶段之登陆
- 报错:cannot match operand(s)in the condition to the corresponding edges in the enclosing event control