RealSense T265相机及IMU标定,运行VINS

2023-05-16

转自 https://www.jianshu.com/p/194d6c9ef9a4

不确定该文章有没有对IMU和相机的时间做同步!

1. 使用imu_utils工具包标定IMU。

这里有个坑,imu_utils依赖code_utils,但不要同时放到src下进行编译。 先编译code_utils,再编译imu_utils
此外,编译code_utils会报错,

code_utils-master/src/sumpixel_test.cpp:2:24: fatal error: backward.hpp:No such file or directory

此时在code_utils下面找到sumpixel_test.cpp,修改#include "backward.hpp"#include “code_utils/backward.hpp”,再编译。

1.1 打开T265并发布imu话题

修改rs_t265.launch如下:

<arg name="unite_imu_method" default="linear_interpolation"/>

修改后才能发布imu话题,然后开启:

roslaunch realsense2_camera rs_t265.launch

1.2 新建t265_imu.launch

在~/catkin_ws/src/imu_utils/launch中新建t265_imu.launch,如下: (记得把#号后的内容删除)

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/camera/imu"/> #IMU在ROS中发布的话题
        <param name="imu_name" type="string" value= "BMI055"/> #IMU型号
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
        <param name="max_time_min" type="int" value= "60"/> #运行的时长(min),60-120min
        <param name="max_cluster" type="int" value= "200"/> 
    </node>
</launch>

1.3 运行imu校准程序

roslaunch imu_utils t265_imu.launch

等60分钟后就会生成结果,imu_utils/data下的BMI055_imu_param.yaml。该文件给出了加速度计和陀螺仪三轴的noise_density(后缀n)和random_walk(后缀w),同时计算出了平均值,后面IMU+摄像头联合标定的时候需要这些均值。

2. 相机标定

下载官方给的april_6x6_80x80cm_A0.pdf或者其它标定文件。打印或者在屏幕显示,量尺寸后新建或者修改apriltags.yaml。我的如下:

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.03           #size of apriltag, edge to edge [m]
tagSpacing: 0.333          #ratio of space between tags to tagSize
                         #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]

开启T265

roslaunch realsense2_camera rs_t265.launch

降低图像话题频率

rosrun topic_tools throttle messages /camera/fisheye1/image_raw 4.0 /fisheye1
rosrun topic_tools throttle messages /camera/fisheye2/image_raw 4.0 /fisheye2

然后录制,注意相机要缓慢移动,同时相机视野要充分看到apriltags

rosbag record -O cameras_calibration /fisheye1 /fisheye2

调用kalibr的算法计算各个摄像头的内参和外参
使用默认可能会报错

Using the default setup in the initial run leads to an error of Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance.

这是由于两个相机之间不同步造成的
解决方法:在末尾加上

--approx-sync 0.04
kalibr_calibrate_cameras --target ../apriltags.yaml --bag ./bag/cameras_calibration.bag --bag-from-to 5 80 --models omni-radtan omni-radtan --topics /fisheye1 /fisheye2 --approx-sync 0.04

omni-radtan为相机模型,可参考[3]。
最终输出一个pdf和txt文件,有内外参数据。

3. Camera-IMU联合标定

新建imu.yaml,将之前IMU标定生成的yaml文件复制过来并改为kalibr提供的格式,如下:

#Accelerometers
accelerometer_noise_density: 1.85e-03   #Noise density (continuous-time)
accelerometer_random_walk:   2.548e-05   #Bias random walk

#Gyroscopes
gyroscope_noise_density:     1.094e-02   #Noise density (continuous-time)
gyroscope_random_walk:       5.897e-04   #Bias random walk

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

修改rs_t265.launch,一个是保持IMU和图像信息同步,另一个要确保输出IMU数据。

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

kalibr推荐IMU 200Hz,图像20Hz,参考上面用topic_tools throttle限制频率,然后录制bag。之后调用kalibr的算法计算IMU和camera外参。

kalibr_calibrate_imu_camera --target ../apriltags.yaml --cam ../camchain-stereo_calibration.yaml --imu ../imu.yaml --bag ../imu_cameras_calibration.bag --bag-from-to 10 100 --max-iter 30 --show-extraction

最终输出results-imucam-stereo_calibration.txt和camchain-imucam-stereo_calibration.yaml

4. 运行VINS-Fusion

在config中新建fisheye1.yaml,fisheye2.yaml,stereo_imu.yaml
将上面生成的联合标定结果参照其它相机config写入。我的如下:

fisheye1.yaml
%YAML:1.0
---
model_type: MEI
camera_name: camera
image_width: 848
image_height: 800
mirror_parameters:
   xi: 1.6943561
distortion_parameters:
   k1: -0.1075293
   k2: 0.6081762
   p1: 0.0029581
   p2: 0.0020715
projection_parameters:
   gamma1: 774.927
   gamma2: 773.762
   u0: 420.086
   v0: 402.516
stereo_imu.yaml
%YAML:1.0

#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam; 
imu: 1         
num_of_cam: 2  

#imu_topic: "/imu0"
imu_topic: "/camera/imu"
#image0_topic: "/cam0/image_raw"
#image1_topic: "/cam1/image_raw"
image0_topic: "/camera/fisheye1/image_raw"
image1_topic: "/camera/fisheye2/image_raw"
output_path: "/home/zhang/Downloads/output/"

cam0_calib: "fisheye1.yaml"
cam1_calib: "fisheye2.yaml"
image_width: 848
image_height: 800

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.

body_T_cam0: !!opencv-matrix #cam0 coordinate under body coordinate
   rows: 4
   cols: 4
   dt: d
   data: [-0.9996934517722752, -0.017627605360341365, 0.017385914209325233, 0.005754793009546214,
                0.01763901821691402, -0.999844293739213, 0.0005033025707699151, 0.004283178521816982,
                0.017374335094538958, 0.0008098187417148282, 0.999848726895038, -0.005638553131443425,
                0., 0., 0., 1.]

body_T_cam1: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [-0.999768258980969, -0.01371448358867344, 0.016593410561375914, -0.06100400373236911,
                0.013686981433494675, -0.9999047625489491, -0.001769850606391636, 0.004859511023863885,
                0.016616102834345566, -0.0015423267571366712, 0.9998607534825902, -0.0022157241622004077,
                0., 0., 0., 1. ]

#Multiple thread support
multiple_thread: 1

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 0           # publish tracking image as topic
flow_back: 1            # perform forward and backward optical flow to improve feature tracking accuracy

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 1.09387e-02          # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 1.8491e-03         # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 5.8973e-04         # accelerometer bias random work noise standard deviation.  #0.002
gyr_w: 2.5482e-05       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.805         # gravity magnitude

#unsynchronization parameters
estimate_td: 1                      # online estimate time offset between camera and imu
td: 0.004                            # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)

#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "/home/zhang/Downloads/output/pose_graph/" # save and load path
save_image: 0                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

然后参考官方的运行步骤[4],效果如下(红色为回环轨迹):
在这里插入图片描述

感谢以下相关文章及作者给的帮助
[1] RealSenseD435i - imu + camera标定
[2] 用imu_utils标定IMU,之后用于kalibr中相机和IMU的联合标定
[3] kalibr camera models
[4] VINS-Fusion
[5] Cheng Wei’s Blog

作者:名字都被取完了妈个鸡
链接:https://www.jianshu.com/p/194d6c9ef9a4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

RealSense T265相机及IMU标定,运行VINS 的相关文章

  • vnc安装和开机自启设置

    一 安装VNC 键入以下命令以在 Ubuntu 服务器上安装 TigerVNC xff1a sudo apt install tigervnc standalone server tigervnc common 现在安装了 VNC 服务器
  • 【Linux】线程安全篇Ⅰ

    文章目录 0 概述1 线程不安全举例1 1 前提知识铺垫1 2 场景模拟1 3 代码模拟 2 互斥2 1 什么是互斥2 2 互斥锁的原理 amp amp 特性2 3 互斥锁的计数器如何保证原子性2 4 互斥锁的接口2 4 1 初始化接口2
  • PX4/APM/飞控的学习笔记前言-Cxm

    开始了 开始了 终于有时间可以学习飞控了 此文章是用来当目录 我会持续更新我的学习之旅 希望能对各位有所帮助 如果有错误的地方还请各位前辈指点 此帖持续更新后续内容 其实从21年的一月就开始学习飞控一开始是从PX4开始学习 但是因为对liu
  • kubernetes 中文版

    这个文档非常好用 xff0c 建议收藏 无水印版 https pan baidu com s 1LSI46GBENd90Z06FnuaKmw lukb
  • SimpleBGC三轴云台用户手册

    SimpleBGC三轴云台用户手册 V1 00 硬件平台 xff1a STorM BGC V1 31 软件框架 xff1a SimpleBGC V1 00 本方案是采用俄版STorM BGC硬件平台 xff0c 软件采用SimpleBGC架
  • typedef和define有什么区别

    typedef和define都是替一个对象取一个别名 xff0c 以此增强程序的可读性 xff0c 区别如下 xff1a xff08 1 xff09 原理不同 define是C语言中定义的语法 xff0c 是预处理指令 xff0c 在预处理
  • 接口返回报错 resource notfound,plrase check path

    1 报错原因 post请求的content type application x www form urlencoded 但是请求体中设置的是json数据 34 date 34 34 2022 01 01 34 34 inclTransfe
  • Java中枚举的线程安全性及序列化问题

    一 枚举是如何保证线程安全的 要想看源码 xff0c 首先得有一个类吧 xff0c 那么枚举类型到底是什么类呢 xff1f 是enum吗 xff1f 答案很明显不是 xff0c enum就和class一样 xff0c 只是一个关键字 xff
  • Vscode配置Git

    vscode安装git 首先我们要确保我们下载了vscode和git xff0c 接下来就是给vscode配置git的步骤 xff1a 配置git环境变量 xff08 path值为git安装位置的cmd文件夹 xff09 xff0c 如图
  • SLAM-6视觉里程计里面特征点计算的缺点所做的改进

    缺点的改进方法 xff1a 由于之前的视觉里程计要计算关键点和描述子 xff0c 花费大量的时间 xff0c 有两种办法可以避免 1 只计算关键点 xff0c 通过光流法追踪关键点的运动 xff0c 可以得到同一个关键点在不同时刻图片的位置
  • SLAM8-后端的其他方法,BA与图优化,Pose Graph优化的理论与公式详解、因子图优化

    1 BA方法 Bundle Adjustment翻译过来是 光束调整 xff0c 意思是每个特征反射的光束 xff0c 通过调整它们的空间位置和相机姿态 xff0c 使它们都汇聚到相机光心 xff0c 这个过程叫BA 假定世界坐标系下的点p
  • 【动手学深度学习】 2预备知识

    李沫 动手学习深度学习 课程学习 需要预备的知识原因重点线性代数处理表格数据矩阵运算微积分决定以何种方式调整参数 损失函数 xff08 loss function xff09 衡量 模型有多糟糕 这个问题的分数 梯度 xff08 gradi
  • JDK源码之-java.lang.Object

    JDK源码之 java lang Object public final native Class lt gt getClass public native int hashCode public boolean equals Object
  • Apm飞控学习笔记之-电机解锁和故障保护-Cxm

    前言 CSDN https mp csdn net mp blog creation editor 122115245 这边说的解锁是指的非自动解锁和地面站解锁 常规解锁流程 61 安全开关 gt 内八解锁 这一篇会介绍整个解锁流程以及飞控
  • https://gns3.com/community/discussion/gns3-doesn-t-work-on-vmware-play

    swered Question GNS3 doesn t work on VMWARE player 15 Hi guys today I try to install GNS3 on new VMWARE player 15 with V
  • 基于stm32的数控线性稳压电源,恒压恒流电源资料

    基于stm32的数控线性稳压电源 xff0c 恒压恒流电源资料 极具学习和设计参考价值 xff0c 已验证 xff0c 可做实物 xff0c 送资料 xff0c 此价格仅为资料 xff0c 资料包括源程序 xff0c 原理图 xff0c p
  • Docker安装Elasticsearch的遇到的那些坑

    1 根据百度到的一篇文章 https segmentfault com a 1190000004376504 下载其最新镜像 hangxin1940 docker elasticsearch cn v2 1 0 使用 docker run
  • Spring boot + Spring Security + Thymeleaf 认证失败返回错误信息

    Spring boot 43 Spring Security 43 Thymeleaf 认证失败返回错误信息 Spring boot以其众多友谊的特性 xff0c 如零配置 微服务等 xff0c 吸引了很多的粉丝 而其与Spring Sec
  • Java经典面试题(其三)——JVM原理和调优

    Java经典面试题 xff08 其三 xff09 JVM原理和调优 一 什么是JVM JVM是Java Virtual Machine xff08 Java虚拟机 xff09 的缩写 xff0c JVM是一种用于计算设备的规范 xff0c
  • Spring Boot Starter的面试题

    Spring Boot Starter的面试题 1 常见的starter会包几个方面的内容 xff1f 分别是什么 xff1f span class hljs comment 常见的starter会包括下面四个方面的内容 span span

随机推荐

  • 个人经历:谈一谈的程序员求职途径

    个人经历 xff1a 谈一谈的程序员求职途径 互联网招聘网站的确是五花八门 xff0c 种类繁多 xff0c 在投递简历 xff0c 接听面试电话的过程中 xff0c 要擦亮眼睛 xff0c 慎重选择和沟通 我是去年跳槽的 xff0c 下面
  • JVM调优再学习

    JVM调优再学习 堆大小设置 JVM中最大堆大小有三方面限制 xff1a 相关操作系统的数据模型 xff08 32 bit还是64 bit xff09 限制 xff1b 系统的可用虚拟内存限制 xff1b 系统的可用物理内存限制 32位系统
  • Dubbo源码学习基础

    dubbo源码学习基础 Dubbo源码学习基础Java RMI 基本概念在 Dubbo 中使用注解自定义容错策略正确加载MyFilter类Dubbo可扩展机制实战Dubbo的SPI机制自定义一个LoadBalance扩展Dubbo 外部化配
  • DXP软件使用快捷键

    1 PCB 设计快捷键 xff08 单次按键 xff09 单次按键是指按下该键并放开 1 01 在 PCB 电气层之间切换 xff08 小键盘上的 xff09 在交互布线的过程中 xff0c 按此键则换层并自动添加过孔 这很常用 1 02
  • 将一个字节数据进行高低位镜像对调的实现函数

    unsigned char swap unsigned char pData unsigned char value 61 0 tmp 61 0 unsigned char ii jj for ii 61 0x80 jj 61 0 ii 6
  • PX4-做飞控二次开发需要知道的事情-Cxm

    前言 废话 来了 之前一直在做APM飞控的开发 发现除了企业用APM 在比赛方面还是PX4居多一点 加上最近也有这个需求所以又重拾了PX4 这两个飞控最大的区别应该就是系统了吧 PX4学习起来还是比较简单的 比较系统和模块化 在重拾PX4之
  • 指针函数和函数指针的区别

    1 指针函数 xff1a 带指针的函数 xff0c 其本质是一个函数 xff0c 函数返回是某一类型的指针 例如 xff1a int f x xff0c y 其结构为 类型标识符 函数名 参数 首先你要从心里承认这是一个函数 xff0c 只
  • 什么是中断?

    中断嘛 xff0c 对于很多新手来讲 xff0c 有点难以理解 xff0c 举个容易的现实的例子吧 如果还不懂 xff0c 骚年 xff0c 考虑换行吧 xff0c 或许这不是你的方向呢 xff0c 诗和远方在前面岔路左拐 比如小明和老丈人
  • 什么是看门狗?

    一样采用简单明了的例子来解释 条件 xff1a 你家有条狗 事件 xff1a 让他看门 xff0c 报警 结果 xff1a 1到点不给吃饭 xff0c 会叫 xff0c 2到点喂他吃东西 xff0c 等待下次开饭 影响 xff1a 叫了 x
  • BUG的烦恼

    在我们这个行业的学习和工作中 xff0c bug是个逃不掉的话题 最近两天 xff0c 在调试一个程序 xff0c 程序本来是完整的 xff0c 只是我需要把它移植到另一个平台上 框架是没有动的 xff0c 连平台的架构都很像 xff0c
  • 什么是Handler

    1 什么是Handler xff1f Handler就是将消息放入队列的机制 我们在哪个线程中创新handler xff0c handler就将消息放入所在的线程 xff0c 除非在创建handler对象时是指定具体的线程 通常handle
  • 905协议第四部分简单说明

    905协议以5b开头5d结尾 转成ascii就是 这两个符号 905是用中括号括起来的消息 消息构成 61 43 消息头 43 消息体 43 crc 43 业务逻辑是消息头与消息体两部分组成 消息头 61 数据长度 43 消息序列号 43
  • git命令创建分支|合并分支|删除分支

    一 创建test分支提交步骤 1 列出所有分支 xff1a git branch a 2 创建test分支 xff1a git branch test 3 切换到test分支 xff1a git checkout test 4 添加add修
  • JS版SM2国密算法的签名验证

    前段时间因工作需要 xff0c 了解到在Github上已经有人实现了用JavaScript来写签名和验签 xff0c 支持RSA ECC DSA等算法 xff0c 还能解析X 509证书 xff0c 一时觉得JavaScript是无比强大
  • 配置VNC连接阿里云服务器

    1 安装vncserver2 安装Linux gnome界面3 修改 vnc xstartup4 使用vnc工具连接 使用VNC Viewer使用Remmina Remote Desktop Client 1 安装vncserver 阿里云
  • SCI论文状态

    自己留好投稿时的文件号 xff0c 然后登录网站查询 一般有以下几种情况 xff1a 1 Submitted to Journal 刚提交的状态 2 Manuscript received by Editorial Office 就是你的文
  • STM32控制直流电机笔记(一)——电源转换和电机驱动电路设计及注意事项

    STM32控制直流电机笔记 xff08 一 xff09 电源转换和电机驱动电路设计及注意事项 电压转换电路15V 转 12V 12V 转 5V 所用芯片LM2575 05 LM2575 12 12v直流电机驱动电路 所以芯片TB6612 注
  • CMake Error: The following variables are used in this project, but they are set to NOTFOUND解决办法

    在配置px4 Firmware时 xff0c 编译make时报错 xff1a CMake Error The following variables are used in this project but they are set to
  • PX4 avoidance ROS仿真之——使用自定义的飞机模型

    运行自己的飞机模型主要需解决的问题 飞机模型的stereo相机话题 当你的飞机模型中包含了双目相机时 xff0c 需要运行一个ROS的node xff0c 将下面内容添加到posix sitl launch文件中 xff1a lt span
  • RealSense T265相机及IMU标定,运行VINS

    转自 https www jianshu com p 194d6c9ef9a4 不确定该文章有没有对IMU和相机的时间做同步 xff01 1 使用imu utils工具包标定IMU 这里有个坑 xff0c imu utils依赖code u