里程计模型可以分为3类:
- 1.两轮差分底盘的运动型模型
- 2.三轮全向底盘的运动学模型
- 3.航迹推算(Dead Rocking)
航机推算
其中航迹推算的方法是最普遍的,其示意图为

推算公式
- (x,y,z)(x,y,z)(x,y,z)为底盘当前位姿
- (dx,dy,dθ)(dx,dy,d\theta)(dx,dy,dθ)为运动学解算增量
[xyθ]=[xyθ]+[cosθ−sinθ0sinθcosθ0001][dxdydθ]\begin{bmatrix} x\\ y\\\theta \end{bmatrix}=\begin{bmatrix} x\\ y\\\theta \end{bmatrix}+ \begin{bmatrix} cos\theta & -sin\theta & 0\\ sin\theta&cos\theta&0\\ 0&0&1 \end{bmatrix}\begin{bmatrix} dx\\ dy\\d\theta \end{bmatrix} ⎣⎡xyθ⎦⎤=⎣⎡xyθ⎦⎤+⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡dxdydθ⎦⎤
由于在工程应用里程计会有误差,所以需要加一个误差,这是一个高斯白噪声
[xyθ]=[xyθ]+[cosθ−sinθ0sinθcosθ0001][dx+ϵxdy+ϵydθ+ϵθ]\begin{bmatrix} x\\ y\\\theta \end{bmatrix}=\begin{bmatrix} x\\ y\\\theta \end{bmatrix}+ \begin{bmatrix} cos\theta & -sin\theta & 0\\ sin\theta&cos\theta&0\\ 0&0&1 \end{bmatrix}\begin{bmatrix} dx+\epsilon_x\\ dy+\epsilon_y\\ d\theta+\epsilon_\theta \end{bmatrix} ⎣⎡xyθ⎦⎤=⎣⎡xyθ⎦⎤+⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡dx+ϵxdy+ϵydθ+ϵθ⎦⎤
线性最小二乘
线性最小二乘是一种比较通用的标定方法,但是由于比较通用,所以无法做到性能最佳,一般最优的线性方法都是根据工程项目来特定的,下面来介绍一下最小二乘的一些原理
原理
线性方程组Ax=bAx=bAx=b
𝐴为𝑚 × 𝑛的矩阵。 x为𝑛 × 1的向量
当m=n时,适定方程组,方程组有唯一解
当m<n时,欠定方程组,方程组有无穷多解
当m>n时,超定方程组,方程组有通常无解
但在现实中,绝大多数情况为m>n,比如说我们要求的参数只有两个,而我们需要采集很多组数据,这些数据都存在误差,可能两两之间都是矛盾的,所以超定方程组,无解,可以寻找最靠近真实解的解,无解但是有最小二乘解,通解: x∗=(ATA)−1ATbx^*=(A^TA)^{-1}A^Tbx∗=(ATA)−1ATb
那么为什么是这个方程呢??
我们从线性空间的角度来考虑,假设AxAxAx表示AAA的列向量空间SSS,无解意味着向量bbb不在S中,最近的解即为向量bbb在SSS中的投影。
假设Ax∗Ax^*Ax∗为向量bbb在空间SSS中的投影,显然(b−Ax∗)(b-Ax^*)(b−Ax∗)垂直于空间SSS,那么(b−Ax∗)(b-Ax^*)(b−Ax∗)跟矩阵AAA的每一个列向量都垂直
设A=[a1a2...an]A=\begin{bmatrix}a_1&a_2&...&a_n \end{bmatrix}A=[a1a2...an]𝑎𝑖表示矩阵A的第i个列向量,则
aiT(b−Ax∗)=0a_i^T(b-Ax^*)=0aiT(b−Ax∗)=0
可得:AT(b−Ax∗)=0A^T(b-Ax^*)=0AT(b−Ax∗)=0
ATb=ATAx∗A^Tb=A^TAx^*ATb=ATAx∗
x∗=(ATA)−1ATbx^*=(A^TA)^{-1}A^Tbx∗=(ATA)−1ATb
里程计标定
- 直接线性方法:通用性强,实现简单,精度不高
- 基于模型的方法:精度高,实现复杂,特异性高
这里介绍一下直接线性方法
1.用激光雷达的scan-match数据作为真值μi∗\mu_i^∗μi∗
2.里程计测量得到的数据为μi\mu_iμi
3.假设成线性关系μ∗=X∗μi\mu^* = X∗\mu_iμ∗=X∗μi
其中:X=[x11x12x13x21x22x23x31x32x33]X=\begin{bmatrix} x_{11}&x_{12}&x_{13}\\ x_{21}&x_{22}&x_{23}\\ x_{31}&x_{32}&x_{33}\\ \end{bmatrix}X=⎣⎡x11x21x31x12x22x32x13x23x33⎦⎤
转换方程得[μixμiyμiθ0000000000μixμiyμiθ00000000000μixμiyμiθ][x11⋮x33]=[μix∗μiy∗μiθ∗]\begin{bmatrix} \mu_{ix}&\mu_{iy}&\mu_{i\theta}&0&0&0&0&0&0&0\\ 0&0&0&\mu_{ix}&\mu_{iy}&\mu_{i\theta}&0&0&0&0\\ 0&0&0&0&0&0&0&\mu_{ix}&\mu_{iy}&\mu_{i\theta}\\ \end{bmatrix}\begin{bmatrix} x_{11}\\ \vdots\\ x_{33} \end{bmatrix}=\begin{bmatrix} \mu_{ix}^*\\ \mu_{iy}^*\\ \mu_{i\theta}^* \end{bmatrix}⎣⎡μix00μiy00μiθ000μix00μiy00μiθ000000μix00μiy00μiθ⎦⎤⎣⎢⎡x11⋮x33⎦⎥⎤=⎣⎡μix∗μiy∗μiθ∗⎦⎤
其中A=[μixμiyμiθ0000000000μixμiyμiθ00000000000μixμiyμiθ]A=\begin{bmatrix} \mu_{ix}&\mu_{iy}&\mu_{i\theta}&0&0&0&0&0&0&0\\ 0&0&0&\mu_{ix}&\mu_{iy}&\mu_{i\theta}&0&0&0&0\\ 0&0&0&0&0&0&0&\mu_{ix}&\mu_{iy}&\mu_{i\theta}\\ \end{bmatrix}A=⎣⎡μix00μiy00μiθ000μix00μiy00μiθ000000μix00μiy00μiθ⎦⎤
x=[x11⋮x33]x=\begin{bmatrix} x_{11}\\ \vdots\\ x_{33} \end{bmatrix}x=⎣⎢⎡x11⋮x33⎦⎥⎤b=[μix∗μiy∗μiθ∗]b=\begin{bmatrix} \mu_{ix}^*\\ \mu_{iy}^*\\ \mu_{i\theta}^* \end{bmatrix}b=⎣⎡μix∗μiy∗μiθ∗⎦⎤
618

被折叠的 条评论
为什么被折叠?



