双目相机与IMU联合标定

2023-05-16

前言

为了后面的视觉激光融合SLAM以及跑通VINS-Fusion,需要标定双目相机和IMU得内参以及它们得外参(变换矩阵)。

准备工作

  • 双目相机:ZED-m
  • IMU:realsense-t265(仅使用它的imu信息)
  • 系统:Ubuntu16.04 + ROS kinetic (ros推荐使用纯净的,就是新系统装ros,可以使用虚拟机)

双目相机标定

这里需要得到相机的内参矩阵,可以使用相机自带的标定信息,也可以使用标定工具包标定,比如VINS-Fusion,Kalibr,这里我以Kalibr为例。

Kalibr安装

因为后面联合标定也需要使用Kalibr,这里介绍一下它的安装。可以直接进Wiki看官方安装教程,教程写了两种安装方式,这里我们使用源码编译安装。官方使用的Ubuntu14.04+ ROS indigo,亲测Ubuntu16.04也行。

# 这里默认你已经做好了准备工作,比如创建工作空间kalibr_workspace,source了

# 安装libv4l,不然报错找不到libv4l
sudo apt install libv4l-dev

# 首先进入工作空间的src文件夹,克隆下源码
cd ~/kalibr_workspace/src
git clone https://github.com/ethz-asl/Kalibr.git

# 编译,时间有点长可以出去玩一下
cd ~/kalibr_workspace
catkin_make

安装完成后我们进行测试,是否安装成功,这里生成一张标定板,为了能够使用A4纸打印,命令如下

# 启动rosmaster
roscore

# 生成标定板(7行6列,每个棋盘格宽0.05m)
rosrun kalibr kalibr_create_target_pdf --type checkerboard --nx 6 --ny 7 --csx 0.05 --csy 0.05

在当前目录下能找到生成的pdf(如图),按实际大小打印出来,每个格子应该是2.92cm
在这里插入图片描述
新建target_6x7.yaml保存参数

target_type: 'checkerboard'
targetCols: 6
targetRows: 7
rowSpacingMeters: 0.029
colSpacingMeters: 0.029

标定过程

  • 将相机固定,在前方移动标定板大概十几秒,记录下bag包:
    rosbag record /cmaera/image_1 /camera/image_2 -O camera.bag

这里可以降低相机的发布频率,减小包的大小和后面处理时间

  • 进行标定
    rosrun kalibr kalibr_calibrate_cameras --target target_6x7.yaml --bag cameara.bag --models pinhole-radtan pinhole-radtan --topics /cmaera/image_1 /camera/image_2 --show-extraction --bag-from-to 5 20
    在这里插入图片描述

  • 标定结果在当前目录生成yaml文件:
    在这里插入图片描述

cam0:
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [0.0067221785223551735, 0.0006309071251854829, -0.0009206033732726818,
    -0.005807607326385791]
  distortion_model: radtan
  intrinsics: [374.8798664259513, 376.62433296380203, 633.6382978832153, 368.203361863134]
  resolution: [1280, 720]
  rostopic: /zedm/zed_node/left/image_rect_color
cam1:
  T_cn_cnm1:
  - [0.9999958135540992, 0.0007219875640781401, 0.002802072131479685, -0.06140952719752661]
  - [-0.0007241075974458178, 0.9999994523273698, 0.0007556541173352181, -0.0009541268599771967]
  - [-0.0028015250239860137, -0.0007576799555491327, 0.9999957886804435, 0.0005387148522162342]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [0.008041841705316074, 0.0003735182825901831, -0.001170616434022235,
    -0.006061625440876723]
  distortion_model: radtan
  intrinsics: [373.7879644856689, 376.1467414780452, 632.7953296858204, 368.521883006889]
  resolution: [1280, 720]
  rostopic: /zedm/zed_node/right/image_rect_color

相机标定完成


IMU标定

IMU都有高斯白噪声和随机游走误差,这里使用港科大的imu_utils进行标定。

ceres-solver安装

因为工具需要ceres-solver支持,所以首先编译安装ceres-solver。

# 依赖安装
# google-glog + gflags
sudo apt-get install libgoogle-glog-dev libgflags-dev
# BLAS & LAPACK
sudo apt-get install libatlas-base-dev
# SuiteSparse and CXSparse (optional)
sudo apt-get install libsuitesparse-dev

wget http://ceres-solver.org/ceres-solver-2.0.0.tar.gz
tar zxf ceres-solver-2.0.0.tar.gz
cd ceres-solver
mkdir build && cd build
cmake ..
make
sudo make install

-------------------------------------------
# 这里如果报eigen3版本错误,就源码安装eigen3.3
git clone https://github.com/eigenteam/eigen-git-mirror

cd eigen-git-mirror
mkdir build && cd build
cmake ..
sudo make install
--------------------------------------------

code_utils安装

# 安装依赖
sudo apt-get install libdw-dev

# 安装
cd kalibr_workspace/src
git clone https://github.com/gaowenliang/code_utils.git
cd ..
catkin_make

报错解决:

backward.hpp No such file

  • 将报错文件的#include "backward.hpp"改成#include "code_utils/backward.hpp"

‘integer_sequence’ is not a member of ‘std’

  • 将CMakeLists.txt中的 set(CMAKE_CXX_FLAGS "-std=c++11") 改成 set(CMAKE_CXX_STANDARD 14)

imu_utils安装

cd kalibr_workspace/src
git clone https://github.com/gaowenliang/imu_utils.git
# 将CMakeLists.txt中的 `set(CMAKE_CXX_FLAGS "-std=c++11")` 改成 `set(CMAKE_CXX_STANDARD 14)`

cd ..
catkin_make

注意一定要先编译code_utils再编译imu_utils

录取bag包

  • 这里将IMU静置,录取bag包,官方建议是两个小时,时间短点也没事。
    rosbag record /imu -O imu.bag

标定

  • imu_utils包中新建一个launch文件,格式如下:
<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/imu"/>    # imu topic的名字
        <param name="imu_name" type="string" value= "my_imu"/>   	# imu名字,和生成的标定结果文件名有关
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
        <param name="max_time_min" type="int" value= "120"/>   #标定的时长,bag包时长
        <param name="max_cluster" type="int" value= "100"/>
    </node>
</launch>
  • 开始标定
# 启动launch文件
roslaunch imu_utils imu.launch

# 以200倍数播放bag包
rosbag play -r 200 imu.bag
  • 大概不到一分钟就能出结果了,生成的yaml文件保存在imu_utilsdata文件夹中,如下:
%YAML:1.0
---
type: IMU
name: my_imu
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 2.2484739538368025e-03
      gyr_w: 3.5602903646558489e-05
   x-axis:
      gyr_n: 1.9584487136985310e-03
      gyr_w: 2.2409337050820371e-05
   y-axis:
      gyr_n: 3.2136018308294412e-03
      gyr_w: 6.1995884096858201e-05
   z-axis:
      gyr_n: 1.5733713169824356e-03
      gyr_w: 2.2403489791996893e-05
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 1.8278764625497403e-02
      acc_w: 6.7504987254087304e-04
   x-axis:
      acc_n: 1.5158936655427320e-02
      acc_w: 6.4629814567923399e-04
   y-axis:
      acc_n: 1.8054000063118674e-02
      acc_w: 7.0841732570667293e-04
   z-axis:
      acc_n: 2.1623357157946221e-02
      acc_w: 6.7043414623671254e-04
  • 保存结果
    为了后面的相机-IMU标定,我们需要gyr_n,gyr_w,acc_n,acc_w四个量,新建imu.yaml,保存下来
rostopic: /imu
update_rate: 200.0 #Hz

accelerometer_noise_density: 1.8278764625497403e-02 
accelerometer_random_walk: 6.7504987254087304e-04
gyroscope_noise_density: 2.2484739538368025e-03
gyroscope_random_walk: 3.5602903646558489e-05

IMU标定完成


相机和IMU联合标定

  • 把IMU和相机固定在一起录制bag 包,录制的时候需要充分激励IMU的各个轴,绕3个轴旋转和3个方向的平移
    rosbag record /cmaera/image_1 /camera/image_2 /imu -o camera_imu.bag

  • 标定
    rosrun kalibr kalibr_calibrate_imu_camera --target target_6x7.yaml --bag camera_imu.bag --cam camchain.yaml --imu imu.yaml --show-extraction --bag-from-to 5 45

  • 运行时间会比较长,结果生成yaml文件,如下

cam0:
  T_cam_imu:
  - [0.9979030100755206, -0.03697544076091466, 0.05312625775218281, 0.014445441988765368]
  - [-0.04740946675322602, -0.976335826957961, 0.21099927834115637, 0.010927983867985913]
  - [0.044067277478760034, -0.213075502531028, -0.9760414464953624, -0.07194777524510915]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [0.0067221785223551735, 0.0006309071251854829, -0.0009206033732726818,
    -0.005807607326385791]
  distortion_model: radtan
  intrinsics: [374.8798664259513, 376.62433296380203, 633.6382978832153, 368.203361863134]
  resolution: [1280, 720]
  rostopic: /zedm/zed_node/left/image_rect_color
  timeshift_cam_imu: 0.005640967418453902
cam1:
  T_cam_imu:
  - [0.9979880830532742, -0.03827724121820314, 0.0505434356605769, -0.04715785867130577]
  - [-0.0480987303198019, -0.9764695294287694, 0.2102231439180307, 0.00990902333616146]
  - [0.0413073628457973, -0.21223126749346238, -0.9763460405372905, -0.07145750657936548]
  - [0.0, 0.0, 0.0, 1.0]
  T_cn_cnm1:
  - [0.9999958135540998, 0.0007219875640781401, 0.0028020721314796844, -0.06140952719752661]
  - [-0.0007241075974458178, 0.9999994523273704, 0.000755654117335218, -0.0009541268599771967]
  - [-0.0028015250239860133, -0.0007576799555491326, 0.9999957886804441, 0.0005387148522162342]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [0.008041841705316074, 0.0003735182825901831, -0.001170616434022235,
    -0.006061625440876723]
  distortion_model: radtan
  intrinsics: [373.7879644856689, 376.1467414780452, 632.7953296858204, 368.521883006889]
  resolution: [1280, 720]
  rostopic: /zedm/zed_node/right/image_rect_color
  timeshift_cam_imu: 0.0038136751527354084
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双目相机与IMU联合标定 的相关文章

  • C++11特性

    C 43 43 11已经出来很久了 xff0c 网上也早有很多优秀的C 43 43 11新特性的总结文章 xff0c 在编写本博客之前 xff0c 博主在工作和学习中学到的关于C 43 43 11方面的知识 xff0c 也得益于很多其他网友
  • CentOS 7 Squid缓存代理服务器搭建——筑梦之路

    简介 xff1a Squid 是 Linux Unix 平台下最为流行的高性能免费应用层代理服务器 xff0c 它具有权限管理灵活 性能高和效率快的特点 代理服务器可以提供文件缓存 复制和地址过滤等服务 xff0c 充分利用有限的出口带宽
  • python列表的基础操作

    python列表的操作 列表是python最为基础的数据结构 xff0c 极为重要 这话怎么理解呢 xff1f 是最常用的 xff0c 想不到其他的 xff0c 就用列表是其他数据结构的基础 xff0c 可以继承列表然后定义属于自己的数据类
  • C++正则表达式(regex_match、regex_search与regex_replace)

    前言 正则表达式是在字符串处理中常用和重要的工具 xff0c 主要用于字符串的匹配 在C 中正则表达式的使用非常方便 xff0c 但到了C 43 43 中让我有点懵逼了 xff0c 花了些时间查阅了很多资料 xff0c 下面主要会写到C 4
  • Java爬虫详解

    这是 Java 爬虫系列文章的第一篇 第一篇是关于 Java 爬虫入门内容 在该篇中我们以采集开源情报网站中的ip数据为例 需要提取的内容如下图所示 Statistics AbuseIPDB nbsp nbsp nbsp 我们需要提取图中圈
  • ubuntu安装过程

    feat 新增功能 fix 修复 bug docs 文档相关的改动 style 对代码的格式化改动 xff0c 代码逻辑并未产生任何变化 test 新增或修改测试用例 refactor 重构代码或其他优化举措 chore 项目工程方面的改动
  • SpringSecurityOAuth和Jwt

    一 SpringSecurityOAuth简介 grant type为授权模式password为密码模式 64 EnableAuthorizationServer表示定义认证服务器 64 EnableResourceServer表示定义资源
  • 无法使用ssh的可能

    1 SSH服务未启动 xff1a 请确保SSH服务在远程计算机上已经启动 在Ubuntu上 xff0c 可以通过运行以下命令来启动SSH服务 xff1a sudo service ssh start 2 防火墙阻止了SSH连接 xff1a
  • CentOS7.0 关闭防火墙

    systemctl stop firewalld service 停止firewall systemctl disable firewalld service 禁止firewall开机启动
  • 如何查看张量tensor,并将其转换为numpy数据

    在tensorflow 中一般数据都是用tensor来表示 xff0c 而在python 中一般是用numpy包 xff0c 然而有时候需要打印变量的数据 xff0c 可用以下方法来打印 xff1a 一 import tensorflow
  • 浅谈联邦学习Federated Learning

    最近人工智能 大数据领域的公众号疯狂给我推送 联邦学习 相关的文章 xff0c 使得本来并不好奇的我 xff0c 有了一丝丝揭开它神秘面纱的冲动 公众号的每篇推文写得都很好 xff0c 但同时也十分学术 xff0c 作为刚上路的我 xff0
  • 云计算中的容器技术及其实践案例

    第一章 xff1a 什么是容器技术 随着云计算和DevOps的普及 xff0c 容器技术在IT行业中越来越受到关注 容器是一种轻量级 可移植 可扩展的应用程序封装技术 xff0c 可以将应用程序及其所有依赖项打包到一个独立的可执行文件中 相
  • 小坑整理

    for range坑 问题描述 range循环的时候 xff0c 取赋值的地址 xff0c 然后保存到map中 xff0c 结果是什么样子 xff1f 这里先回想下变量是什么时候才申请内存 xff1f 只有赋值给新的变量时 xff0c 内存
  • go操作es

    TOC 前言 xff1a elasticsearch 是一个基于Lucene构建的开源的 分布式 restful接口的全文搜索引擎 es还是一个分布式的文档数据库 xff0c 其中每个字段均可被索引 xff0c 而且每个字段的数据均可被搜索
  • 9-gin使用websocket

    toc gin使用websocket Gin 框架默认不支持 websocket xff0c 可以使用 github com gorilla websocket 实现 Talk is cheap Show me the code xff0c
  • 1. 准备环境

    硬件资源 mac 12 2 1 golang 1 15 3 minikube v1 25 1 prometheus operator 0 35 1 下载地址 xff1a https github com prometheus operato
  • pprof查docker内存占用

    https zhuanlan zhihu com p 363584053 https blog csdn net u010278923 article details 78774914
  • oklog run包使用

    oklog run 包介绍 oklog run 包非常简单 xff0c 只有一个类型 xff0c 两个方法 xff0c 共 60 行代码 其中 Group 是一组 actor xff0c 通过调用 Add 方法将 actor 添加到 Gro
  • windows上IIS实现https,配置ssl证书

    windows2003 系统IIS6安装ssl证书 http bbs qcloud com thread 4793 1 1 html windows2012实现IIS7的https 1 申请证书 xff0c 这里申请腾讯云的证书 1 xff
  • Ubuntu 14.04升级到Ubuntu 16.04(桌面版和字符版)

    下面记录了从Ubuntu 14 04 15 10升级到Ubuntu 16 04的步骤 桌面版 在升级系统之前 xff0c 我们先更新一下系统 打开终端执行如下命令 xff1a sudo apt span class hljs attribu

随机推荐

  • 编写使用systemctl启动服务脚本

    CentOS 7的服务systemctl脚本存放在 xff1a usr lib systemd xff0c 有系统 xff08 system xff09 和用户 xff08 user xff09 之分 xff0c 像需要开机不登陆就能运行的
  • python中print打印显示颜色

    显示颜色的格式 xff1a 033 显示方式 字体色 背景色m 033 0m 显示颜色的参数 xff1a 显示方式效果字体色背景色颜色描述0终端默认设置3040黑色1高亮显示3141红色4使用下划线3242绿色5闪烁3343黄色7反白显示3
  • ds1302时钟芯片工作原理引脚电路图及功能

    资源获取码 xff1a aaaa DS1302时钟实用仿真图 上面仿真图功能描述 xff1a 1 能读取DS1302数据 xff0c 并显示在数码管上面 2 带按键设置功能 xff0c 可以设置DS1302时分秒数据 3 带倒计时功能 xf
  • 吴恩达 DeepLearning 第一课第二周编程题目及作业(可免费下载资源)

    提示 作业里面会有需要用到的 Python 模块以及数据集 所以我下面再附上所需要的文件下载链接 xff0c 不把所有文件连同作业放一起打包好的目的是让第一次接触 Python 的人更多的了解 Python xff0c 万事开头难 xff0
  • linux centos7.6 关闭防火墙

    停止firewall root 64 lch software systemctl stop firewalld service 禁止firewall开机启动 root 64 lch software systemctl disable f
  • STM32之SHT30温湿度传感器驱动代码(程序稳定,清晰明了)

    第一部分 xff1a SHT30温湿度模块代码头文件 xff08 SHT30 h xff09 ifndef SHT30 H define SHT30 H include 34 delay h 34 include 34 sys h 34 i
  • 数据集(3):从0了解INRIA数据集

    该数据集分为两种格式 xff1a xff08 a xff09 具有对应注释文件的原始图像 xff08 b xff09 原始的负样本图像和标准化64 128像素的正样本图像 xff08 用于CVPR论文中的 xff09 根目录下虽然有六个文件
  • Ubuntu 登录界面,字体变大,输入密码出现循环登录问题

    出现这个问题 xff0c 很大可能就是显卡驱动掉了 xff0c 只需重新安装就好 参考 xff1a https blog csdn net qq 36427732 article details 80914653 一 下载显卡驱动 用一台电
  • virtualenv的使用

    安装 pip install virtualenv 使用 1 创建一个文件夹 xff0c 用来存放环境 xff0c 之后pip install 之类的东西都在里面 2 在该文件夹中建立该环境 virtualenv p usr bin pyt
  • LIF神经元介绍

    Integrate And Fire Models 基础知识 轴突 xff1a 动作电位 xff08 电位差形成电流 xff09 61 神经递质发放 61 脉冲产生 树突或细胞体 xff1a 神经递质的接受 61 产生内外膜电位差 xff0
  • 神经网络中Batch Size的理解

    直观的理解 xff1a Batch Size定义 xff1a 一次训练所选取的样本数 Batch Size的大小影响模型的优化程度和速度 同时其直接影响到GPU内存的使用情况 xff0c 假如你GPU内存不大 xff0c 该数值最好设置小一
  • Hessian矩阵

    转 xff1a 黑塞矩阵 xff08 Hessian Matrix xff09 转 xff1a Hessian矩阵以及在图像中的应用 黑塞矩阵 xff08 Hessian Matrix xff09 xff0c 是一个多元函数的二阶偏导数构成
  • 残差结构详解

    背景知识 xff1a 为什么要构建深层网络 xff1f 答 xff1a 认为神经网络的每一层分别对应于提取不同层次的特征信息 xff0c 有低层 xff0c 中层和高层 xff0c 而网络越深的时候 xff0c 提取到的不同层次的信息会越多
  • 第二章 Internet 地址结构

    第二章 Internet 地址结构 本文为 TCP IP 详解 学习笔记 文章目录 第二章 Internet 地址结构2 1 引言2 2 表示 IP 地址IPv4 地址IPv6 地址 2 3 基本的 IP 地址结构2 3 1 分类寻址2 3
  • 机器学习中数据不均衡问题(分类类别数据不均匀)

    在机器学习中 xff0c 我们经常会遇到类别数据分布不均衡问题 xff0c 即某类中含有很多数据 xff0c 而其他类别中的数据量很少 在这种情况下 使用传统机器学习算法开发的预测模型可能存在偏差和不准确 xff0c 造成上述的原因是 xf
  • EAST: An Efficient and Accurate Scene Text Detector翻译

    Abstract 用于场景文本检测的先前方法已经在各种基准测试中获得了良好的性能 然而 xff0c 在处理具有挑战性的场景时 xff0c 即使配备了深度神经网络模型 xff0c 它们通常也会达不到很好性能 xff0c 因为整体性能取决于管道
  • pytorch搭建网络结构

    记录pytorch怎么搭建网络 xff0c 看起来更舒服 首先定义一个block class myBlock nn module def init self in channel out channel xff1a super myBloc
  • ubuntu codename

    1 查看当前系统的codename lsb release a 2 历史版本codename Ubuntu 发布版本的官方名称是 Ubuntu X YY xff0c 其中 X 表示年份 xff08 减去2000 xff09 xff0c YY
  • xubuntu_18.04取消开机自动登录

    虽然开机自动登录听方便的 xff0c 但是总感觉不是那么的安全 xff0c 就把开机自动登录取消了 xff0c 下面是取消自动登录的方法 1 首先查一下自动登录的用户 grep R 34 autologin 34 etc lightdm 注
  • 双目相机与IMU联合标定

    前言 为了后面的视觉激光融合SLAM以及跑通VINS Fusion xff0c 需要标定双目相机和IMU得内参以及它们得外参 xff08 变换矩阵 xff09 准备工作 双目相机 xff1a ZED mIMU xff1a realsense