标定(二)----------双目相机与IMU联合标定(工具箱使用方法——Kalibr)
16个相机参数:
Overview
ethz-asl/kalibr is a toolbox that solves the following calibration problems:
Multiple camera calibration: intrinsic and extrinsic calibration of a camera-systems with non-globally shared overlapping fields of view
Camera-IMU calibration: spatial and temporal calibration of an IMU w.r.t a camera-system
Rolling Shutter Camera calibration: full intrinsic calibration (projection, distortion and shutter parameters) of rolling shutter cameras
kalibr website:
https://github.com/ethz-asl/kalibr/wiki/multiple-camera-calibration
https://github.com/ethz-asl/kalibr
1.安装
Kalibr 提供两种使用方式。第一种为CDE下直接使用,作者将所需的库文件打包好,省去了配置dependency的步骤,可以直接从
https://github.com/ethz-asl/kalibr/wiki/downloads
下载, 注意需要科学浏览。
下载之后直接用
./cde-exec+命令 即可使用对应的工具。
例如如果我们想使用kalibr内的kalibr_calibrate_cameras功能,
使用
./ced-exec kalibr_calibrate_cameras --target april_6x6.yaml --bag static.bag --models pinhole-equi pinhole-equi omni-radtan omni-radtan --topics /cam0/image_raw /cam1/image_raw /cam2/image_raw /cam3/image_raw
单目+IMU 和 双目+IMU 为例,讲解使用 Kalibr工具 标定 Camera-IMU,其中使用的摄像头分别为 Realsense ZR300 和 MYNT-EYE S系列摄像头。
2.开始标定
Kalibr不仅提供了IMU以及camera的联合标定工具箱,也提供了camera标定工具箱。
在此我们先使用camera标定工具对相机进行标定。
首先我们需要制作标定板,在此推荐使用april tag,可以使用kalibr自带工具自定义生成不同大小的标定板,命令如下
kalibr_create_target_pdf --type apriltag --nx [NUM_COLS] --ny [NUM_ROWS] --tsize [TAG_WIDTH_M] --tspace [TAG_SPACING_PERCENT]
- roscore
- rosrun uvc_camera uvc_camera_node
- rosrun image_view image_view image:=/image_raw
- rostipic list
- rqt_image_view
- rosbag record -o test /image_raw
- rosbag play test_2019-08-14-14-22-35.bag
将生成的pdf打印出来,置于平稳,光照充足的地方,注意要保持平整。
Kalibr作者推荐将camera固定,然后移动标定板,这样可以提高标定的稳定性,但是鉴于我使用场景受限,我使用的是晃动camera方法。
之后就可以开始录制bag了,使用
rosbag record /cam0/image_raw /cam1/image_raw /imu0
若对相机标定结果满意我们可以继续进行camera以及imu的联合标定步骤,此步使用了如下信息:
1. 标定板yaml
2. 相机标定结果yaml
3. imu内参yaml
4. 前面使用的对应bag
有了如上材料即可进行联合标定,具体如下
kalibr_calibrate_imu_camera --target aprilgrid6x4.yaml --cam camchain-2017-06-14-09-13-29.yaml --imu imu.yaml --bag 2017-06-14-09-13-29.bag --bag-from-to 5 45
最后的--bag_from_to是选取地5-45s的bag数据,去除了拾取防止设备产生的抖动部分影响。我们建议进行多组标定之后将标定结果进行最佳无偏估计,不建议对R部分直接取平均值,可以将多组数据的R部分转换成四元数。之后进行处理。
3.标定板文件:target.yaml
Kalibr支持三种标定板,分别是Aprilgrid、Checkerboard和Circlegrid。
4.帮助小陶的标定记录
april.yaml
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.025 #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[-]
imu_adis16448.yaml
rostopic: /imu/data
update_rate: 200.0 #Hz
#accelerometer_noise_density: 2.0000e-3 #continous
#accelerometer_random_walk: 1.9393e-05
#gyroscope_noise_density: 1.6968e-04 #continous
#gyroscope_random_walk: 1.9393e-05
accelerometer_noise_density: 1.2e-2 #continous
accelerometer_random_walk: 3.0e-05
gyroscope_noise_density: 1.0e-02 #continous
gyroscope_random_walk: 3.0e-05
results-imucam-2019-11-12-11-40-05.txt
Calibration results
===================
Normalized Residuals
----------------------------
Reprojection error (cam0): mean 0.233871733163, median 0.206334845347, std: 0.148605727319
Gyroscope error (imu0): mean 0.0943654955325, median 0.0867912466407, std: 0.0496732486016
Accelerometer error (imu0): mean 0.119169698923, median 0.107462875286, std: 0.0668447618807
Residuals
----------------------------
Reprojection error (cam0) [px]: mean 0.233871733163, median 0.206334845347, std: 0.148605727319
Gyroscope error (imu0) [rad/s]: mean 0.0133452963602, median 0.0122741358095, std: 0.00702485818595
Accelerometer error (imu0) [m/s^2]: mean 0.020223768533, median 0.0182370546818, std: 0.011343932259
Transformation (cam0):
-----------------------
T_ci: (imu0 to cam0):
[[ 0.01032731 -0.99994666 -0.00016158 0.01401135]
[ 0.03105076 0.0004822 -0.99951769 0.07414391]
[ 0.99946446 0.01031731 0.03105408 -0.04191072]
[ 0. 0. 0. 1. ]]
T_ic: (cam0 to imu0):
[[ 0.01032731 0.03105076 0.99946446 0.03944135]
[-0.99994666 0.0004822 0.01031731 0.01440725]
[-0.00016158 -0.99951769 0.03105408 0.07541191]
[ 0. 0. 0. 1. ]]
timeshift cam0 to imu0: [s] (t_imu = t_cam + shift)
0.00165763516901
Gravity vector in target coords: [m/s^2]
[-0.00215999 -9.7244984 -1.26591825]
Calibration configuration
=========================
cam0
-----
Camera model: omni
Focal length: [3657.3894212462615, 3636.5284554729647]
Principal point: [638.9568695670013, 503.393652719486]
Omni xi: 5.80194283441
Distortion model: radtan
Distortion coefficients: [1.5274292230602973, -6.475270653629076, 0.0004049030197607094, 0.0019115670188138707]
Type: aprilgrid
Tags:
Rows: 6
Cols: 6
Size: 0.025 [m]
Spacing 0.0075 [m]
IMU configuration
=================
IMU0:
----------------------------
Model: calibrated
Update rate: 200.0
Accelerometer:
Noise density: 0.012
Noise density (discrete): 0.169705627485
Random walk: 3e-05
Gyroscope:
Noise density: 0.01
Noise density (discrete): 0.141421356237
Random walk: 3e-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]
Q1:I imu topics修改:如果标定相机zed leadsensor mynt 等相机录制IMU节点topics可能为xxx/imu/data 需要修改imu.yaml文件进行适配。
Q2:一个是利用rosbag节点运行的时候, 将发布的主题进行修改(remap )。另一个则是这roslaunch文件中进行修改.
下面利用两种不同的方式将/image_raw‘映射到/camera/image_raw.
1. rosbag remap
rosbag play ros.bag /image_raw:=/camera/image_raw
2. roslaunch remap
<remap from="/image_raw" to="/camera/image_raw"/>
- https://github.com/ethz-asl/kalibr/wiki/calibration-targets
- https://www.cnblogs.com/wongyi/p/11152062.html
- https://blog.csdn.net/yangdashi888/article/details/51356385
- https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration
相关文章:

【Codeforces】659B Qualifying Contest (sort)
http://codeforces.com/problemset/problem/659/B n个人,m个地区,选出每个地区分数最高的两个人 下面有n行,每一行的第一个数表示姓名,第二个数是地区的序号,第三个数是分数 It is guaranteed that all surnames of…

Protractor测试环境搭建
2019独角兽企业重金招聘Python工程师标准>>> 安装node.js.然后,在cmd下,进入E盘下的,我们自己新建的protractor文件夹下, npm install -g protractor 这样就会在本地安装好两个命令行工具:protractor和webd…

Promise和Promise的方法
(Promise和Promise的方法) Promise是ES6一个伟大的发明,他使我们从回调地狱中能够走出来。 什么是Promise 从字面上来看,Promise就是一个承诺。那么,在ES6当中,Promise通常用来控制异步操作。当一个异步操作…

镜头评价指标及测试方法(三)--------测量原理及3D相机调查
1.测量原理: 1.1、通过红外结构光(Structured Light)来测量像素距离,如Kinect1、Project Tango1、Intel Realsense等; 通过近红外激光器,将具有一定结构特征的光(比如离散光斑、条纹光、编码结构光等)投射到…

Android--Retrofit的简单使用(一)
1,如果不太了解retrofit的同学可以先去官网学习一下简单使用:http://square.github.io/retrofit/,这里我们以一个简单的Get请求的例子来练习一下 2,https://api.douban.com/v2/movie/top250?start0&count10 目标地址…

【Codeforces】920A Water The Garden(浇花)
http://codeforces.com/problemset/problem/920/A 给你花坛的数目,花坛都是连续的,某一些花坛里有水龙头,给出了这些有水龙头的位置 The garden from test 1. White colour denotes a garden bed without a tap, red colour — a garden be…
Work with Alexa :Echo匹配连接到Alexa
背景: 通过蓝牙可以让你的智能家居设备和Echo设备连接起来,从而达到Echo通过语音控制智能家居设备。 什么事Alexa Gadgets? 我的理解Alexa Gadgets是智能家居设备的一部分,包含硬件和软件。硬件:蓝牙模块;软…

Maven 学习Tips
2019独角兽企业重金招聘Python工程师标准>>> 使用 deploy 应该注意的地方 在项目的pom文件中增加如下节点:<project><distributionManagement><repository><id>releases</id><url>http://192.168.1.99:8081/nexus/c…

【Codeforces】1015B Obtaining the String(字符串 交换)
http://codeforces.com/contest/1015/problem/B n 表示 字符串的长度 然后是两个字符串,每一次只能交换相邻的两个,如果选择第i个字符的话,只能交换第i个和第i1个 然后输出每一次交换选定的位置 暴力,模拟,queue&am…

07 分支管理 —— Feature分支
2019独角兽企业重金招聘Python工程师标准>>> 07 分支管理 —— Feature分支 软件开发中,总有无穷无尽的新的功能要不断添加进来。添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以࿰…

适用于0基础小伙伴的HTML知识点总结 先到先得哟
HTML基础知识点分享 前段时间一直忙于私下学习消化一些PHP中的知识体系,导致博客开通至今一直没发表相关技能贴。最近呢~博主夏天我正在进行前半段知识体系和框架的总结阶段。借此,抽空给大家分享一下私下自己学习时的一些心得体会以及知识体系ÿ…

SLAM小结——求解退化问题解析(F、H、E)(面试经验总结)
总结: 1 Essential Matrix E t ^ R 为3*3的矩阵,奇异值为 [ u, u, 0] ^ T 的形式。为本质矩阵的内在性质。 性质:理论上综合旋转、平移共有6个自由度,因尺度等价,E有5个自由度。 求解:一般使用…

【Codeforces】1065B Vasya and Isolated Vertices (无向图的)
http://codeforces.com/problemset/problem/1065/B 一个图,给定顶点数,边数,求解最小孤立点数和最大孤立点数 最小的话,一个边连接两个顶点成为一个整体,如果最后有多余的点,那些就是孤立的点 最大就是找…
这些资源网站为什么能获得5万知乎大佬推荐,而我错失了什么吗?
现在很多朋友可能只要是一听到资源网站,想必就会好奇是什么网站,用用看是不是由说的那么厉害!其实资源网站给我们的诱惑是在是太大了,其主要原因是可以帮助我们搜索到很多意想不到的资源! 为了回应大家的需求ÿ…

大话Redis进阶
2019独角兽企业重金招聘Python工程师标准>>> 使用Redis过程中,总是会遇到各种各样问题,这里进行问题的总结,作为Redis 进阶的经验分享。 更新缓存的问题 [主动]需要操作人员去操作,或者定时调度[被动]由用户触发更新[预…

SLAM精度测评——EVO
1.install GitHub - MichaelGrupp/evo: Python package for the evaluation of odometry and SLAM 注意:安装好依赖! sudo apt install python-pip pip install evo --upgrade --no-binary evo or pip install evo --upgrade --no-binary evo --user…

【UVA】10152 ShellSort (几只乌龟的故事)
https://vjudge.net/problem/UVA-10152 题目大意: 输入N,给你N个乌龟的名字,下面N行是初始状态,在下面N行是最终状态,你选中这只乌龟以后,只能把它移动到最上面,问怎么样操作步数最少…

python2与python3转换记录
为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发。Linux的许多发行版本(如Ubuntu)都会自带Python2.7,但是当我们准备开发一个Python3项目的…

oracle读书笔记之Oracle 11g R2 DBA操作指南(前三章)
Oracle 11g R2 DBA操作指南是我学习的第一本讲述oracle数据库知识的书籍,在此记录下自己的学习笔记,对于书中的知识点本人通过实际操作进行验证。1.Oracle数据库基础1.1.关系数据库1.1.1.关系数据库模型1.关系数据库模型三个核心概念:关系、属…

【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)
https://vjudge.net/problem/UVA-11991 题目大意:就是给你一个序列,然后给出k和v,看整数v第k次出现在该序列的什么位置,没有的话就输出0 结构体(略复杂): #include <iostream> #include…

面试题:2018最全Redis面试题整理
1、什么是Redis?Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次…

Android5.0如何正确启用isLoggable(二) 理分析
转自:http://www.it165.net/pro/html/201506/43374.html 概要 在上文《Android 5.0 如何正确启用isLoggable(一)__使用详解》中分析了isLoggable的使用方法,本文主要分析isLoggable实现原理以及user版系统root后永久enable isLoggable的原理,…

SLAM精度测评——rpg_trajectory_evaluatio
1. install https://github.com/ccxslam/rpg_trajectory_evaluation#install 下载catkin_simple:https://github.com/catkin/catkin_simple 建立工作空间 src下载,编译,然后下载rpg_trajectory_evaluatio,编译安装即可。 2&a…
STL set multiset
STL容器大的方向分为两类,序列式容器和关联式容器。 这两者通过数据在容器内的排列来区分。关联容器和顺序容器的根本不同在于:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的。 …

Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍。 使用 EN5 课件获得更好的阅读体验: 【希沃白板5】课件分享 : 《Windows培训 - 消息循环》https://r302.cc/q2d1jB 点击链接直接预览课件 1 程序是怎么跑起来的?…

得到的旋转向量和平移向量转换成旋转矩阵 (SE(3))
理论过程 头文件说明 1.使用罗德里格斯公式需要包含头文件为#include<opencv2/calib3d.hpp> 2.使用函数cv2eigen需要包含头文件<opencv2/core/eigen.hpp>,但是在则之前要包含一个对eigen定义的头文件,否则会报eigen.hpp文件的错,…

[译稿]同步复制提议 2010-09
2019独角兽企业重金招聘Python工程师标准>>> 同步复制9/2010议案 目录 [隐藏] 1 PAGE状态 2 有何不同之处这个补丁? 3 同步复制概述 4 用户视角 4.1 管理员视角 5 实现 5.1 STANDBY 5.2 MASTER 6 CODE 7 性能分析 8 尚未实现 9 ,其他问题 PAG…
STL vector
1、vector是表示可变大小数组的序列容器。 2、就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会…

JavaScript 复习之数据类型
一、简介 JavaScript 的数据类型有 7 种: 数值(number)字符串(string)布尔值(boolean)undefinednull对象(object)Symbol(ES6 中新增的类型,表示独…

Nginx反代配置
一、ngx_http_proxy_module模块ngx_http_proxy_module模块可根据用户请求的uri传递至后端服务器,实现反向代理命令:1.proxy_pass设置一个代理服务器的地址,协议,和一个可选的URI的位置应该映射。作为一个协议,“HTTP”…