前言

两轮差速轮式机器人可以基于码盘数据和两轮间距以及车轮半径进行航迹推演,得到机器人的轨迹。激光雷达也可以利用 icp 等算法计算出两时刻间机器人的相对运动量。因此,可以利用两者数据进行融合定位,本博客根据 Censi 2013 年发表在 TRO 上的论文 《Simultaneous calibration of odometry and sensor parameters for mobile robots》,对如何标定里程计内参数 ( 轮子半径,两轮间距),以及外参数(激光和里程计之间的坐标关系)进行理论推导,并将对应标定代码整理在了我们的网站上。

说明: 这里的标定仅仅是 3 自由度的(激光坐标系和机器人坐标系都是平行于地面的,只能标定 yaw 和xy),如果还想标定激光相对于水平面的(pitch,roll,主要是安装误差,激光安装的并不水平),可以参考如下两篇论文:

  1. 2007 年 bmvc, Fully Automated Laser Range Calibration
  2. 2016 年 TRO, Full-DOF Calibration of a Rotating 2-D LIDAR with a Simple Plane Measurement

标定原理

原理概述

如下图所示,由于机器人在平面上运动,机器人相对于固定坐标系的姿态可以用 SE(2) 表示 q=(qx,qy,qθ)∈SE(2)​\boldsymbol{q}=\left(q_{x}, q_{y}, q_{\theta}\right) \in \mathrm{SE}(2)​q=(qx​,qy​,qθ​)∈SE(2)​. 考虑到水平上运动,2d 激光通过自身无法确定 roll 和 pitch , 也无法知道相对于地面的高度,因此假设机器人运动时,激光坐标系在一个平行于地面的平面上运动,激光坐标系 (sensor frame) 坐标系相对于机器人坐标系的姿态为 ℓ=(ℓx,ℓy,ℓθ)∈SE⁡(2)​\boldsymbol{\ell}=\left(\ell_{x}, \ell_{y}, \ell_{\theta}\right) \in \operatorname{SE}(2)​ℓ=(ℓx​,ℓy​,ℓθ​)∈SE(2)​.

通常机器人两个轮子上各自装有一个编码器,能够计算左右轮的速度 ωL,ωR\omega_{\mathrm{L}}, \omega_{\mathrm{R}}ωL​,ωR​,利用左右轮速度以及轮半径和轮间距能够计算移动机器人前进速度 vvv 和旋转角速度 ω\omegaω
(vω)=J(ωLωR)\left( \begin{array}{l}{v} \\ {\omega}\end{array}\right)=\boldsymbol{J} \left( \begin{array}{c}{\omega_{\mathrm{L}}} \\ {\omega_{\mathrm{R}}}\end{array}\right) (vω​)=J(ωL​ωR​​)
其中 J​\boldsymbol{J}​J​ 是一个关于左右轮半径及轮间距 rL,rR,b​r_{\mathrm{L}}, r_{\mathrm{R}}, b​rL​,rR​,b​ 的函数:
J=(J11J12J21J22)=(+rL/2+rR/2−rL/b+rR/b)\boldsymbol{J}=\left( \begin{array}{ll}{J_{11}} & {J_{12}} \\ {J_{21}} & {J_{22}}\end{array}\right)=\left( \begin{array}{cc}{+r_{\mathrm{L}} / 2} & {+r_{\mathrm{R}} / 2} \\ {-r_{\mathrm{L}} / b} & {+r_{\mathrm{R}} / b}\end{array}\right) J=(J11​J21​​J12​J22​​)=(+rL​/2−rL​/b​+rR​/2+rR​/b​)
当得到机器人前进速度和旋转速度以后,进行积分,就能得到车体姿态 q​\boldsymbol{q}​q​. 具体推导过程可参看我之前的博客。

考虑一段时间 t∈[tk,tk+1]t \in\left[t_{k}, t_{k+1}\right]t∈[tk​,tk+1​],里程计推算得到的两个时刻机器人坐标系的姿态 qk\boldsymbol{q}^{k}qk 和 qk+1\boldsymbol{q}^{k+1}qk+1,利用外参数 ℓ\boldsymbol{\ell}ℓ 可以得到两时刻时间激光坐标系的相对变化量
sk=⊖(qk⊕ℓ)⊕(qk+1⊕ℓ)(1)\boldsymbol{s}^{k}=\ominus\left(\boldsymbol{q}^{k} \oplus \boldsymbol{\ell}\right) \oplus\left(\boldsymbol{q}^{k+1} \oplus \boldsymbol{\ell}\right) ~~~~~~~ (1) sk=⊖(qk⊕ℓ)⊕(qk+1⊕ℓ)       (1)
其中 ⊕​\oplus​⊕​ 表示 SE(2) 加法:
(axayaθ)⊕(bxbybθ)=(ax+bxcos⁡(aθ)−bysin⁡(aθ)ay+bxsin⁡(aθ)+bycos⁡(aθ)aθ+bθ)\left( \begin{array}{l}{a_{x}} \\ {a_{y}} \\ {a_{\theta}}\end{array}\right) \oplus \left( \begin{array}{l}{b_{x}} \\ {b_{y}} \\ {b_{\theta}}\end{array}\right)=\left( \begin{array}{c}{a_{x}+b_{x} \cos \left(a_{\theta}\right)-b_{y} \sin \left(a_{\theta}\right)} \\ {a_{y}+b_{x} \sin \left(a_{\theta}\right)+b_{y} \cos \left(a_{\theta}\right)} \\ {a_{\theta}+b_{\theta}}\end{array}\right) ⎝⎛​ax​ay​aθ​​⎠⎞​⊕⎝⎛​bx​by​bθ​​⎠⎞​=⎝⎛​ax​+bx​cos(aθ​)−by​sin(aθ​)ay​+bx​sin(aθ​)+by​cos(aθ​)aθ​+bθ​​⎠⎞​
⊖​\ominus​⊖​ 表示求逆:
⊖(axayaθ)=(−axcos⁡(aθ)−aysin⁡(aθ)+axsin⁡(aθ)−aycos⁡(aθ)−aθ)\ominus \left( \begin{array}{l}{a_{x}} \\ {a_{y}} \\ {a_{\theta}}\end{array}\right)=\left( \begin{array}{c}{-a_{x} \cos \left(a_{\theta}\right)-a_{y} \sin \left(a_{\theta}\right)} \\ {+a_{x} \sin \left(a_{\theta}\right)-a_{y} \cos \left(a_{\theta}\right)} \\ {-a_{\theta}}\end{array}\right) ⊖⎝⎛​ax​ay​aθ​​⎠⎞​=⎝⎛​−ax​cos(aθ​)−ay​sin(aθ​)+ax​sin(aθ​)−ay​cos(aθ​)−aθ​​⎠⎞​
对于上述两个运算,如果熟悉坐标系变换的同学,应该很容易理解。

为了简化,将两时刻间里程计得到的姿态记作 rk=⊖qk⊕qk+1=rk(rL,rR,b)\boldsymbol{r}^{k}=\ominus \boldsymbol{q}^{k} \oplus \boldsymbol{q}^{k+1}=\boldsymbol{r}^{k}\left(r_{\mathrm{L}}, r_{\mathrm{R}}, b\right)rk=⊖qk⊕qk+1=rk(rL​,rR​,b), 公式 (1) 可以简化为:
sk=⊖ℓ⊕rk(rL,rR,b)⊕ℓ(2)\boldsymbol{s}^{k}=\ominus \boldsymbol{\ell} \oplus \boldsymbol{r}^{k}\left(r_{\mathrm{L}}, r_{\mathrm{R}}, b\right) \oplus \boldsymbol{\ell}~~~~~~~(2) sk=⊖ℓ⊕rk(rL​,rR​,b)⊕ℓ       (2)

实际上 , 两时刻间激光坐标系的运动量可以使用 icp 算法来估计,本文采用的是 pl-icp 来估计姿态 s^k\hat{\boldsymbol{s}}^{k}s^k。假设估计的相对运动服从高斯分布,就可以采用最小二乘来估计参数,把标定问题转化成优化问题。
J=−12∑k=1n∥s^k−⊖ℓ⊕rk(rL,rR,b)⊕ℓ∥Σk−12(3)\mathcal{J}=-\frac{1}{2} \sum_{k=1}^{n}\left\|\hat{\boldsymbol{s}}^{k}-\ominus \ell \oplus \boldsymbol{r}^{k}\left(r_{\mathrm{L}}, r_{\mathrm{R}}, b\right) \oplus \ell\right\|_{\mathbf{\Sigma}_{k}^{-1}}^{2} ~~~~~~~(3) J=−21​k=1∑n​∥∥∥​s^k−⊖ℓ⊕rk(rL​,rR​,b)⊕ℓ∥∥∥​Σk−1​2​       (3)

标定算法的具体实现

针对公式(3),可能大家会直接使用 ceres 等工具直接优化,Censi 在论文提出了一个闭式求解方法。

  1. 先求线性部分:首先由于激光坐标系和机器人坐标系都是水平面运动,所以两个传感器得到的两个时刻之间的角度变化是相等的 sθk=rθk\boldsymbol{s}_{\theta}^{k}=\boldsymbol{r}_{\theta}^{k}sθk​=rθk​. 因此直接利用公式(2)中的对应项构建等式,用线性最小二乘直接求出轮速计的内参数矩阵的两个元素:
    (J^21J^22)=[∑kLkTLk(σθk)2]−1∑kLkT(σθk)2s^θk\left( \begin{array}{c}{\hat{J}_{21}} \\ {\hat{J}_{22}}\end{array}\right)=\left[\sum_{k} \frac{\boldsymbol{L}_{k}^{T} \boldsymbol{L}_{k}}{\left(\sigma_{\theta}^{k}\right)^{2}}\right]^{-1} \sum_{k} \frac{\boldsymbol{L}_{k}^{T}}{\left(\sigma_{\theta}^{k}\right)^{2}} \hat{s}_{\theta}^{k} (J^21​J^22​​)=[k∑​(σθk​)2LkT​Lk​​]−1k∑​(σθk​)2LkT​​s^θk​
    具体公式可以参照论文。

  2. 再闭式求解非线性部分:有了部分线性内参数,作者对公式(3)进行了简单的变形,变成了J=−12∑k∥ℓ⊕s^k−rk⊕ℓ∥Σk−12\mathcal{J}=-\frac{1}{2} \sum_{k}\left\|\boldsymbol{\ell} \oplus \hat{\boldsymbol{s}}^{k}-\boldsymbol{r}^{k} \oplus \boldsymbol{\ell}\right\|_{\mathbf{\Sigma}_{k}^{-1}}^{2}J=−21​∑k​∥∥∥​ℓ⊕s^k−rk⊕ℓ∥∥∥​Σk−1​2​. 这样这个公式就能转化成带约束的二次型问题,然后利用拉格朗日乘数转化成闭式解。具体的推导请参看论文。

  3. outlier remove : 采样的数据中可能有轮子打滑等无效数据在里面,会降低标定精度,因此标定过程反复迭代多次,每迭代一次,就计算一下每个采样数据的 Chi-2 误差。
    χk=∥s^k−⊖ℓ^⊕rk(r^L,r^R,b^)⊕ℓ^∥Σk−1\chi^{k}=\left\|\hat{\boldsymbol{s}}^{k}-\ominus \hat{\ell} \oplus \boldsymbol{r}^{k}\left(\hat{r}_{\mathrm{L}}, \hat{r}_{\mathrm{R}}, \hat{b}\right) \oplus \hat{\ell}\right\|_{\mathbf{\Sigma}_{k}^{-1}} χk=∥∥∥​s^k−⊖ℓ^⊕rk(r^L​,r^R​,b^)⊕ℓ^∥∥∥​Σk−1​​
    然后根据误差大小排序,丢弃掉一定百分比的数据。

  4. 协方差估计:协方差的估计直接采用信息矩阵的逆来计算。如果给定一个模型 yk=fk(x)+ϵk\boldsymbol{y}_{k}=\boldsymbol{f}_{k}(\boldsymbol{x})+\boldsymbol{\epsilon}_{k}yk​=fk​(x)+ϵk​ 其中 f\boldsymbol{f}f 是可导函数,ϵk\boldsymbol{\epsilon}_{k}ϵk​ 是协方差为 Σk\mathbf{\Sigma}_{k}Σk​ 的高斯噪声。协方差的下界 Cramer-Rao bound,cov⁡(x^)≥I(x)−1\operatorname{cov}(\hat{\boldsymbol{x}}) \geq \mathcal{I}(\boldsymbol{x})^{-1}cov(x^)≥I(x)−1. 在这个应用中,x=(rR,rL,b,ℓx,ℓy,ℓθ)\boldsymbol{x}=\left(r_{\mathrm{R}}, r_{\mathrm{L}}, b, \ell_{x}, \ell_{y}, \ell_{\theta}\right)x=(rR​,rL​,b,ℓx​,ℓy​,ℓθ​),yk=s^k\boldsymbol{y}_{k}=\hat{\boldsymbol{s}}^{k}yk​=s^k ,观测函数 fk\boldsymbol{f}_{k}fk​ 为公式(2)所示。这个模型最小二乘估计的参数 x\boldsymbol{x}x 的信息矩阵为

I(x)=∑k∂fk∂xΣk−1∂fk∂x\mathcal{I}(\boldsymbol{x})=\sum_{k} \frac{\partial \boldsymbol{f}_{k}}{\partial \boldsymbol{x}} \boldsymbol{\Sigma}_{k}^{-\mathbf{1}} \frac{\partial \boldsymbol{f}_{k}}{\partial \boldsymbol{x}} I(x)=k∑​∂x∂fk​​Σk−1​∂x∂fk​​

工具使用

使用 ROS 录制下移动机器人的 odom 和激光 scan 数据,就能完成标定,只需要修改 launch 文件中的文件路径和文件名等信息。

   cd catkin_ws/srcgit clone https://github.com/MegviiRobot/OdomLaserCalibraToolcd ..catkin_makesource devel/setup.bashroslaunch example.launch

注意:代码可以标定车轮半径等内参数,但是需要你提供左右轮的速度,实际上左右轮速度都知道了,就不需要标定半径了。因此,我们对需求进行了改动,需要你提供 ros odom 数据格式(机器人前进速度和角速度),代码中会假定一个车轮半径和轮间距,从而给你算出一个码盘内参数。

2d Laser 和 Odomter 内外参数标定工具原理及使用方法相关推荐

  1. 2d Laser 和 camera 标定工具原理及使用方法

    2d 激光和相机之间的标定早在 04 年就出了成熟的论文和方法,17 年 ICCV, IROS,今年 IROS 等依然还有论文产出,具体的论文列表可以参考我的<论文阅读整理>博客.本篇博客 ...

  2. QT3D开发的位姿实时显示与轮式机器人参数标定工具

    简易小工具 移动机器人实时位姿显示与简单的机械参数标定 功能:1.通过串口接收和下发数据 2.可以显示离线和在线视频数据:离线支持RGB-D类数据,在线目前支持Kinect和普通usb摄相头 3.按时 ...

  3. ICRA 2023 | 最新激光雷达-相机联合内外参标定,一步到位!

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到石头,为大家分享ICRA 2023最新的激光雷达-相机的联合标定方法,可同时标定内 ...

  4. for根据ID去重_汽车ECU参数标定之配置Overlay RAM实现Qorivva MPC57xx系列MCU参数在线标定和代码重映射原理和方法详解...

    内容提要 引言 1. MPC5744P的Overlay RAM工作原理介绍 2 MPC5744P的Flash Overlay配置详解 2.1 平台Flash标定区域描述字寄存器配置字0--PFLASH ...

  5. 基于平面的约束2D激光雷达和相机的联合标定(2D Laser and Camera Calibration )原理及项目代码具体使用——旷视

    1 基于平面的约束2D激光雷达和相机的联合标定(2D Laser and Camera Calibration )原理 这是旷视做的一个关于2D激光雷达和相机的联合标定算法,在看这个标定算法之前,你可 ...

  6. Kalibr 标定双目内外参数以及 IMU 外参数

    本文记录使用 Kalibr 标定双目相机内外参数以及和IMU之间外参数的标定过程. 采用的硬件设备为小觅的双目VIO设备( MyntEYE), 并且默认你已经有了ROS的知识基础. 标定 stereo ...

  7. 详解:Camera-IMU内外参标定原理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在vio系统中,camera-imu间内外参精确与否对整个定位精度 ...

  8. 一文详解Camera-IMU内外参标定原理

    作者丨Bjergsen@知乎 来源丨https://zhuanlan.zhihu.com/p/68863677 编辑丨3D视觉工坊 在vio系统中,camera-imu间内外参精确与否对整个定位精度起 ...

  9. 从像素坐标到相机坐标_多视图几何基础——深入理解相机内外参数

    上一篇:前言(comming soon) 关键词:相机模型,多视图几何,相机内参数,相机外参数,skew畸变 1. 针孔相机模型 Figure 1 针孔相机模型是一种理想化的简单相机模型,也是成像的最 ...

最新文章

  1. 2022-2028年中国低氧铜杆行业市场研究及前瞻分析报告
  2. 疫情之下,武汉女生在家中答辩,获得国外博士学位!
  3. S60 V3版SDK的官方扩展插件
  4. 关注 | 5G 和 WiFi-6,谁是智能制造的主角?
  5. SQL XQuery的Action
  6. 布线须知:无线AP采用PoE交换机供电的好处
  7. 038_CSS3图像透明度
  8. 来自web标准margin的嘲笑,你了解我吗?
  9. ExtJs Grid 合计 [Ext | GridPanel | GridSummary]
  10. c语言数据交换的算法流程图,C语言冒泡排序算法浅析
  11. Xcode7.0.1:升级Xcode7上传AppStore失败问题
  12. Casper 机制的历史起源:第一篇
  13. 设置 Web 服务器控件颜色属性 转
  14. 运筹学中的节约里程法及其python实现
  15. 淘宝打单发货API,淘宝打单发货接口
  16. 字符串压缩算法(腾讯笔试题)
  17. matlab仿真心型函数,matlab绘制心形函数
  18. 2017年总结与展望
  19. 输出菱形(C语言,萌新向)
  20. IE浏览器代理出问题导致的程序网络不可用

热门文章

  1. snownlp文本分词、情感分析、文本相似度与摘要生成
  2. jsoup爬虫,爬取全站代码
  3. 逆波兰计算器android源码简书,汪都能理解的逆波兰计算器(C++实现)
  4. php iis session 超时设置,如何配置IIS Session超时时间
  5. c 语言含移位的程序,c语言的移位练习题目.doc
  6. 安装 Win10 Ubuntu 16.04 双系统以及 Ubuntu 配置深度学习环境记录
  7. mysql 命令行参数
  8. LintCode Python 简单级题目 491.回文数
  9. 代码的抽象三原则【转载】
  10. pat09-散列3. Hashing - Hard Version (30)