在gazebo仿真环境下对相机和激光雷达的标定

2023-05-16

相机和激光雷达的标定主要是为了得到两者之间的参数,包括相机的内参和雷达到相机的外参。这样便可以完成点云到图像的投影,从而完成信息融合。
实际上gazebo中这些参数都是真值,是不需要标定的:

  • 相机的内参可以从相机发布的消息:/camera/camera_info中获得
  • Lidar到相机的外参可以从gazebo中设置的两个传感器之间的位姿得到

以我的小车为例,首先看一下我的gazebo小车图片(忽略掉悬空的合理性)
在这里插入图片描述

相机和激光雷达都是朝向小车的前侧,相机高于激光雷达0.3m。
理论上来讲直到这些参数是可以得到雷达到相机的外参的:
雷达坐标系:x向前,y向左,z向上
相机坐标系:x向右,y向下,z向前
根据坐标系之间的旋转平移变换应该可以得到外参(旋转矩阵+平移向量=欧式变换)

因为坐标系转来转去令我头疼,我还使用了Eigen库来求解,就是得不到正确答案(这里的判断依据是我把点云和图像融合为彩色点云,结果颜色没有对上)。所以一气之下选择了标定。

标定过程也是异常坎坷,主要参考了这篇文章、这篇文章。

主要使用了Autoware工具箱,但整个Autoware代码编译器来巨麻烦,环境太多。还好第一篇文章的大佬整理出来了其中必要的部分,并放在了github上。我编译一遍就通过了,真的太感谢了。

gazebo中的标定实际上和现实中的标定没有太大的区别。都是先要录制一个包含有相机和点云消息的包,然后播放出来。只是gazebo中需要自己搭建一个标定的环境,还要有标定板,这里我放出来我用到的world和里面的模型,可供大家使用。
网盘链接:https://pan.baidu.com/s/1H314s6Hn-bY1qFphinnNrg?pwd=2022
提取码:2022
大概长这个样子:在这里插入图片描述(弄这么多灰色的背景是为了让标定程序更快速的检测到我们的标定板。)

具体的操作细节这两篇文章里面都有,主要说一下文章中没有提到注意点:

  • gazebo中拖动标定板比较困难,可以选择点击板子,直接在左侧设置pose
  • 标定位置一共选择6个,每个位置选择5个姿态,可以参考这里
  • 注意标定板转动角度不需要太大,太大更容易产生误差,0.3即可
  • 注意在录制包的时候,不仅打开自带的相机内参标定看看是否能找到,还需要打开rviz看看点云中能否看到整个板子,千万不要只看到板子的一半就认为是整个板子
  • 相机内参是不需要单独标定的,这个程序可以得到内参和外参
  • 得到的外参是相机到雷达的,点云到图像要求个逆

经过标定我得到的参数文件内容为:

%YAML:1.0
---
CameraExtrinsicMat: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ -1.9487212737283599e-03, 1.2995338606212603e-03,
       9.9999725684480878e-01, 2.8479359727213497e-02,
       -9.9999693499389153e-01, 1.5247177575343773e-03,
       -1.9507020743178560e-03, 5.7692333353345825e-03,
       -1.5272485783945355e-03, -9.9999799322173888e-01,
       1.2965586276114660e-03, 2.6759754689266252e-01, 0., 0., 0., 1. ]
CameraMat: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 3.3710092264812880e+02, 0., 3.2016449479134496e+02, 0.,
       3.3730878718418813e+02, 2.3885430457718860e+02, 0., 0., 1. ]
DistCoeff: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ -1.3310624142978161e-02, 4.3596514912675008e-02,
       -3.0808506470280403e-04, 5.1425393407627498e-04,
       -3.8541526166501847e-02 ]
ImageSize: [ 640, 480 ]
ReprojectionError: 1.3258493620696266e-01

上面的就是外参矩阵(相机到点云),下面的是内参矩阵。
结合我们的真值可以知道,实际上外参矩阵就是
0 , 0, 1, 0
-1, 0, 0, 0
0, -1 , 0, 0.3
0, 0, 0, 1
内参就使用相机消息传出来的。
到此,我们就完成了gazebo方针环境下对相机和激光雷达的标定。

为了验证标定是否正确,可以运行点云和图像融合为彩色点云的代码,这些可以参考我的另一篇文章:
ROS中点云学习(七):激光点云和图像的融合

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

在gazebo仿真环境下对相机和激光雷达的标定 的相关文章

  • 在keil5中调试串口遇到的问题

    1 问题 在keil5中调试stm32串口实验时 xff0c 向单片机的串口1发送数据 xff0c 观察串口1的寄存器 xff0c 此时串口1的中断服务函数会遇到无法进入下图if 的情况 xff0c 此时观察串口1寄存器 RXEN 的值 由
  • 树莓派在上电后一直重启进入不了系统桌面

    问题描述 树莓派在上电后一直重启进入不了系统桌面 xff0c 在检查了各种接口没问题后解决办法 原因分析与解决方案 xff1a 用了键盘 鼠标 显示器后5v 1A的插头不行 xff0c 换了ipad用的5V 2A的充电器后就可以开启了 xf
  • 树莓派连接“手机热点“或“WiFi“ 后无法上网,以及连接“手机热点“或“WiFi“时VNC连接失败问题

    问题描述 之前一直在开热点 xff0c 通过电脑端VNC控制树莓派拍摄照片 xff0c 今天突然发现树莓派上不去网 xff0c 所以就试着尝试解决了一下 xff0c 心路历程如下 xff1a 要么就是树莓派连不上网 xff0c 要么就是连上
  • 相机标定和双目相机标定标定原理推导及效果展示

    文章目录 前言一 相机标定1 相机的四个坐标系2 相机的畸变 二 张正友标定法1 求解内参矩阵与外参矩阵的积2 求解内参矩阵3 求解外参矩阵4 标定相机的畸变参数5 双目标定6 极线矫正 xff08 立体校正 xff09 三 视差图与深度图
  • keras:tensor从全连接层输出到卷积层

    一 tensor从卷积层输出到全连接层 用过keras的都知道 xff0c 想从卷积层输出tensor到全连接层 xff0c 只需加一层 xff1a model add Flatten shape就不会出现错误 二 但是如果从全连接层输出t
  • 保研面试复习之数据结构篇

    数据项 数据元素和数据结构的概念 数据项是组成数据元素的 xff0c 有独立含义的 xff0c 不可分割的最小单位 数据元素是数据的基本单位 数据结构是带结构的数据元素的集合 数据结构包括逻辑结构和存储结构两个层次 数据结构的三要素是逻辑结
  • 视觉里程计的重定位问题1——SVO的重定位部分

    SVO的重定位部分代码解析与分析 SVO的重定位功能体现在 xff1a 运动跟踪丢失后通过与上一关键帧匹配以及地图点投影 xff0c 找回当前相机位姿 由于没有后端和回环 xff0c SVO的重定位并不是回环校正后的重定位 代码部分被放在运
  • 组合导航(一):定位技术分类与介绍

    组合导航 xff08 一 xff09 xff1a 导航定位技术分类与介绍 一 定位技术分类1 1 基于相对测量的定位 xff08 航位推算 xff09 1 2 基于绝对测量的定位1 3 组合定位 一 定位技术分类 1 1 基于相对测量的定位
  • git bash可以正常commit,但是 VSCode 里不能正常commit使用的解决方法

    问题描述 同一路径下的源码 xff0c 使用git bash可以正常commit xff0c 但是使用vscode提交commit就会一直卡住 xff0c 转圈圈 参考方案链接 xff1a VS CODE GIT 500 问题处理 pudn
  • 组合导航(四):惯性导航系统

    1 惯性导航系统的物理平台2 惯性测量单元IMU3 惯性传感器的测量值3 1静止状态下的加速度测量3 2静止与运动状态下的角速度测量 4 惯性传感器误差4 1 系统误差 xff08 可通过实验进行校正 xff09 4 2 随机误差4 3 惯
  • 组合导航(七):卡尔曼滤波

    Kalman滤波1 离散卡尔曼滤波2 卡尔曼滤波的流程2 1 预测与时间更新2 2 测量更新与校正 3 卡尔曼滤波 算法步骤4 非线性卡尔曼滤波4 1 线性化kalman滤波4 2 扩展kalman滤波 5 卡尔曼滤波发散控制5 1 KF过
  • 组合导航(八):INS/GPS组合导航

    INS GPS组合导航1 误差反馈1 1 开环INS GPS架构1 2 闭环INS GPS架构 2 组合导航的类型2 1 松耦合 的INS GPS组合导航2 2 紧耦合 的INS GPS组合导航2 3 深度耦合的 INS GPS组合导航 3
  • 组合导航(九):三维简化的INS/GPS组合导航系统

    简化INS与GPS组合系统在三维路面上的导航1 MEMS级IMU的三维定位的性能分析2 解决MEMS级IMU在路面导航中存在的问题3 三维简化的惯性传感器系统3 1 3D RISS概述3 2 xff08 轮式车辆 xff09 采用3D RI
  • PX4安装与编译

    第一步 xff1a 下载源码 下载方式一 xff1a git clone https github com PX4 Firmware git recursive 默认下载版本为master 下载时间比较长 xff0c 包含各种包以及依赖工具
  • PX4:【系统架构】

    PX4系统架构 由两个层组成 xff1a 一是飞行控制栈 xff08 flight stack xff09 二是中间件 xff08 middleware xff09 flight stack xff1a 集成了各种自主无人机的制导 导航以及
  • PX4:【uORB通讯机制】

    uORB xff1a Micro Object Request Broker PX4进程间的通讯机制 xff1a 多对多的信息发布与订阅方式 发布消息 xff1a 1 公告 advertise xff1a 相当于初始化 xff0c 在发布消
  • PX4:【传感器校准】

    sensor的校准校准步骤 xff1a 文件目录 xff1a 代码入口 xff1a 求解模型计算公式 sensor的校准 校准步骤 xff1a 首先通过地面站QGC进行校准 xff0c QGC将校准参数设置到sh文件中 此后再基于QGC的校
  • PX4:【sensor_combined】

    功能介绍消息内容sensor combined 产生机制 amp 代码流程 功能介绍 sensor combined 是一个冗余传感器集合的消息 xff0c 通过订阅多个传感器的数据 xff0c 将冗余的数据经过VoteSensorsUpd
  • PX4:【地面站传感器数据校准】

    上电 gt rsC 运行 sensor start commander start 入口函数 xff1a 位于commander文件夹中 Commader cpp Commander run xff08 xff09 commander lo
  • Windows和Linux双系统安装教程

    最近刚刚完成了Windows和Linux双系统 xff08 这里以Ubuntu安装为例 xff09 的安装 xff0c 应某奔同学要求 xff0c 这里简单记录下安装过程 系统启动盘准备Windows系统安装分出给Linux系统的磁盘空间安

随机推荐