以双目+IMU为例进行介绍相机和IMU 的联合标定,也叫多传感器融合;
多相机标定节点程序。kalibr_calibrate_cameras --bag [filename.bag] --topics [TOPIC_0 ... TOPIC_N] --models [MODEL_0 ... MODEL_N] --target [target.yaml]
我们使用的最终命令
使用的bag文件XXX.bag,里面存储了含有标定板的图像
使用标定板规格apriltag_6_6.yaml,可多种选择
相机的畸变模型pinhole-radtan,其他模型还有omni-radtan
bag文件中相机发布图像的topic话题/XXX/image_raw
kalibr_calibrate_cameras --target april_6x6.yml --bag images.bag --bag-from-to 5 20 --models pinhole-radtan --topics /cam0/image_raw
参考链接:https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration
(一) 标定的输入文件包括:
(二) 当上述文件都准备好的时候,执行命令行:
rosrun kalibr kalibr_calibrate_imu_camera --target /data/april_6x6_80x80cm.yml --cam /data/cam_april-camchain.yml --imu /data/imu_adis16448.yml --bag /data/imu_april.bag --bag-from-to 5 45
由于数据在采集过程中,在开始和结束处存在躁动和激励,所以仅使用 5到45秒之间的数据;
(三) 输出结果:
(一) 数据采集:
数据采集的过程是手持需要标定的设备,同时激活camera和imu器件分别采集图像和imu数据,对着预先制作好的标定板,在激励充分(从不同的角度,旋转和平移,对标定板拍照,并且使得IMU的accel和gyro两个器件的三个轴都被激活)的情况下,同时保存图像和IMU的数据。采集到的数据应该如下所示(双目+IMU): 假如是单目的话,只需要保留cam0和imu0.csv即可。)
+-- dataset-dir
+-- cam0
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
+-- cam1
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
-- imu0.csv
imu0.csv是一个文本文件,是IMU的数据,每一行就是一个gyro和accel在某一时刻的读数,如下所示: 19位时间戳(精确到ns),角速度,含重力的加速度
(timestamps=[ns], omega=[rad/s], alpha=[m/s^2])
timestamp,omega_x,omega_y,omega_z,alpha_x,alpha_y,alpha_z
1385030208736607488,0.5,-0.2,-0.1,8.1,-1.9,-3.3 ...
1386030208736607488,0.5,-0.1,-0.1,8.1,-1.9,-3.3
(二) 制作 .bag包:
将在连续时间内通过采集获得的拍摄标定板的图像和IMU的数据文件(上述中的:cam0、cam1、imu0.csv),将三个数据利用kalibr工具转化为 .bag格式文件,因为kalibr的所有应用程序使用ROS包作为图像和IMU的数据的源;bag文件制作参考: https://github.com/ethz-asl/kalibr/wiki/bag-format;
命令行(创建ROS包):
rosrun kalibr kalibr_bagcreater --folder /. --output-bag Euroc.bag
dataset-dir/. 是数据输入路径:
其内文件结构应是这样:
dataset-dir/cam0/image_raw
dataset-dir/cam1/image_raw
dataset-dir/imu0
awsome.bag 是制作好的bag文件,输出默认在kalibr_bagcreater同目录下。注意:
a.在包含图片的文件夹的同一目录下需要一个:output空白文件夹,否则 .bag 文件无法生成
b.生成的.bag文件使用:rosbag info XX.bag 判定是否生成成功,如果只有4kb,则生成失败,而一般情况都是路径问题
c.calib可以标定单目+imu,bag内只放单目图像,修改带参运行中的参数即可。
最后包制作完后验证一下,想要的信息是否都加进包里面了: rosbag info XXX.bag
(三) 相机参数文件:
camchain.yaml
camchain.yaml 文件模板:
cam0:
camera_model: pinhole
intrinsics: [461.629, 460.152, 362.680, 246.049]
distortion_model:
radtandistortion_coeffs: [-0.27695497, 0.06712482, 0.00087538, 0.00011556]
T_cam_imu:- [0.01779318, 0.99967549,-0.01822936, 0.07008565]-
[-0.9998017, 0.01795239, 0.00860714,-0.01771023]-
[0.00893160, 0.01807260, 0.99979678, 0.00399246]-
[0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.121e-05
rostopic: /cam0/image_raw
resolution: [752, 480]
cam1:
camera_model: omni
intrinsics: [0.80065662, 833.006, 830.345, 373.850, 253.749]
distortion_model:
radtandistortion_coeffs: [-0.33518750, 0.13211436, 0.00055967, 0.00057686]
T_cn_cnm1:- [ 0.99998854, 0.00216014, 0.00427195,-0.11003785]-
[-0.00221074, 0.99992702, 0.01187697, 0.00045792]-
[-0.00424598,-0.01188627, 0.99992034,-0.00064487]-
[0.0, 0.0, 0.0, 1.0]
T_cam_imu:- [ 0.01567142, 0.99978002,-0.01393948,-0.03997419]-
[-0.99966203, 0.01595569, 0.02052137,-0.01735854]-
[ 0.02073927, 0.01361317, 0.99969223, 0.00326019]-
[0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.681e-05
rostopic: /cam1/image_raw
resolution: [752, 480]
camchain.yaml文件内容说明:
CAMERA_MODEL
camera_model(pinhole / omni)(针孔、全向)intrinsics
包含给定投影类型的内部参数的向量。要素如下:
pinhole:[fu fv pu pv]
omni:[xi fu fv pu pv]
ds:[xi alpha fu fv pu pv]
eucm:[alpha beta fu fv pu pv]distortion_model
distortion_model(radtan /equidistant)distortion_coeffs
失真模型的参数向量T_cn_cnm1
相机外在转换,总是相对于链中的最后一个相机
(例如cam1:T_cn_cnm1 = T_c1_c0,将cam0转换为cam1坐标)T_cam_imu
IMU extrinsics:从IMU到相机坐标的转换(T_c_i)timeshift_cam_imu
相机和IMU时间戳之间的时间间隔,以秒为单位(t_imu = t_cam + shift)rostopic
摄像机图像流的主题resolution
相机分辨率[width,height]
(四) IMU参数文件:imu.yaml
imu.yaml 文件模板:(编写这个文件需要imu的手册。)
#Accelerometers
accelerometer_noise_density: 1.86e-03 #Noise density (continuous-time)
accelerometer_random_walk: 4.33e-04 #Bias random walk#Gyroscopes
gyroscope_noise_density: 1.87e-04 #Noise density (continuous-time)
gyroscope_random_walk: 2.66e-05 #Bias random walkrostopic: /imu0 #the IMU ROS topic
update_rate: 200.0 #Hz (for discretization of the values above)
(五) 标定板文件:target.yaml
Kalibr支持三种标定板,分别是Aprilgrid、Checkerboard和Circlegrid。
参数比较简单:见https://github.com/ethz-asl/kalibr/wiki/calibration-targets
target.yaml文件模板:
1)对于april板.yaml文件格式如:
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltagstag
Rows: 6 #number of apriltags
tagSize: 0.088 #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
2)对于checkboard板.yaml文件格式如:
target_type: 'checkerboard' #gridtypetarget
Cols: 6 #number of internal chessboard cornerstarget
Rows: 7 #number of internal chessboard cornersrow
SpacingMeters: 0.06 #size of one chessboard square [m]
colSpacingMeters: 0.06 #size of one chessboard square [m]
3)对于circle板.yaml文件格式如:
target_type: 'circlegrid' #gridtypetarget
Cols: 6 #number of circles (cols)target
Rows: 7 #number of circles (rows)
spacingMeters: 0.02 #distance between circles [m]
asymmetricGrid: False #use asymmetric grid (opencv) [bool]
从官网 Downloads 下载数据集 IMU-camera calibration。
下载下来内容:4个文件
april_6x6.yaml 标定板参数
camchain.yaml 相机标定参数
imu_adis16448.yaml IMU标定参数
dynamic.bag 拍摄内容
cd到bag所在目录下使用kalibr_bagextractor 解码 dynamic.bag
解压命令:
rosrun kalibr kalibr_bagextractor --image-topics /cam0/image_raw /cam1/image_raw --imu-topic /imu0 --output-folder dataset-dir --bag imu_april.bag
得到结果:cam0, cam1, imu0.csv
使用上述三个文件建立 .bag文件:
source /home/wcd/app/kalibr/devel/setup.bash
kalibr_bagcreater --folder dataset-dir/. --output-bag awsome.bag
运行标定程序:
rosrun kalibr kalibr_calibrate_imu_camera --target april_6x6.yml --cam hand_data_3-camchain.yaml --imu imu_adis16448.yml --bag hand_data_3.bag --bag-from-to 5 45
运行后得到 :
report-imucam-dynamic.pdf
results-imucam-dynamic.txt
包含:
1.相机的重投影误差,IMU的误差(加速度和陀螺仪)可以作为先验误差来影响数据融合的定权问题
2.相机和IMU各自的标定参数,2个.yaml文件给的
3.IMU与相机之间的相对位姿标定(正反旋转矩阵)cam1 to imu0也有
T_ci: (imu0 to cam0):
[[ 0.01680206 0.99985864 -0.00062288 0.06847911]
[-0.99985871 0.01680236 0.00048881 -0.01472898]
[ 0.00049921 0.00061458 0.99999969 -0.00376988]
[ 0. 0. 0. 1. ]]
T_ic: (cam0 to imu0):
[[ 0.01680206 -0.99985871 0.00049921 -0.0158756 ]
[ 0.99985864 0.01680236 0.00061458 -0.06821963]
[-0.00062288 0.00048881 0.99999969 0.00381973]
[ 0. 0. 0. 1. ]]
相机之间的位姿变换标定(基线baseline):
Baseline (cam0 to cam1):
[[ 0.99999877 0.00118911 -0.00102243 -0.1101676 ]
[-0.00118838 0.99999904 0.00071255 -0.00032166]
[ 0.00102327 -0.00071134 0.99999922 0.00012079]
[ 0. 0. 0. 1. ]]
baseline norm: 0.110168134052 [m]
使用标定命令行完成标定演示:
rosrun kalibr kalibr_calibrate_imu_camera --target april_6x6.yml --cam hand_data-camchain.yaml --imu imu_adis16448.yml --bag hand_data.bag --bag-from-to 5 45
参考博客:
https://blog.csdn.net/wwchen61/article/details/78013962
https://blog.csdn.net/heyijia0327/article/details/83583360
https://blog.csdn.net/zhubaohua_bupt/article/details/80222321
https://blog.csdn.net/w492751512/article/details/81218618
https://blog.csdn.net/xinmei4275/article/details/84998506
https://www.ngui.cc/el/38435.html
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc