前提:本文只考虑平面运动。
EKF的公式及原理不再细述:EKF原理
观测:观测数据为反光板。反光板的检测暂时也不考虑。(一般来说,反光板的检测都是基于反射强度来做的,需要自己手写,如果有疑问留言)。
预测:以轮速计为例,我们只使用轮速计的线速度和角速度,轮速计的模型,我们使用轮速计模型博客中提到的模型。
定位EKF公式推导
假如我们已经事先构建了一个地图(后续再考虑),地图中包含
M
M
M个反光板:
每个反光板还会有一个协方差矩阵,该矩阵的形式为:
假设我们只维护位姿,不考虑新增的反光板,且不更新老地图中反光板的位置和协方差矩阵,所以有:
状态空间
差速运动模型-预测
(1)位姿预测:
初始位姿:
初始位姿的确定,涉及到重定位,重定位有很多手段(比如3点定位法、其他算法给出等),在这里我们假定初始位置是已知的。
运动方程可以写为:
假设轮速计的线速度和角速度服从均值为0的高斯分布,即控制的协方差为
Σ
u
\Sigma_u
Σu
(2)协方差预测
初始时刻的协方差需要给定初值:
添加协方差公式的推导-2023.06.15
状态量在 t t t时刻的协方差预测方程为: Σ ξ , t = G ξ Σ ξ , t − 1 G ξ T + G u Σ u G u T \Sigma_{\xi,t} = G_{\xi}\Sigma_{\xi,t-1}G_{\xi}^T+G_u\Sigma_uG_u^T Σξ,t=GξΣξ,t−1GξT+GuΣuGuT
其中:
G
ξ
G_{\xi}
Gξ是运动模型关于机器人位姿
ξ
t
−
1
\xi_{t-1}
ξt−1的雅克比:
G
u
G_u
Gu是运动模型关于控制(轮速计线速度和角速度)
u
u
u的雅克比:
根据协方差预测可知,假如没有观测数据,预测位姿的协方差矩阵会越来越大,导致位姿不可靠性增大。
全向运动模型-预测-2021.4.11更新
考虑到有些机器人是全向的,所以我们扩展代码,支持差速和全向模型。差速和全向的差别不大,不过是多了 y y y轴速度,所以需要把运动模型进行扩充。为了方便,我们这里仅为了展示推导过程,后面不再针对每一篇博客继续推导 。
(1)位姿预测:
为了方便,我们可以将运动方程可以写为:
[
x
t
y
t
θ
t
]
=
[
x
t
−
1
y
t
−
1
θ
t
−
1
]
+
[
v
x
Δ
t
cos
(
θ
t
−
1
)
−
v
y
Δ
t
sin
(
θ
t
−
1
)
v
x
Δ
t
sin
(
θ
t
−
1
)
+
v
y
Δ
t
cos
(
θ
t
−
1
)
ω
Δ
t
]
\begin{bmatrix}x_t \\ y_t \\ \theta_t\end{bmatrix} =\begin{bmatrix}x_{t-1} \\ y_{t-1} \\ \theta_{t-1}\end{bmatrix} + \begin{bmatrix}v_x\Delta t\cos(\theta_{t-1}) - v_y \Delta t\sin(\theta_{t-1}) \\ v_x\Delta t\sin(\theta_{t-1}) + v_y \Delta t\cos(\theta_{t-1}) \\ \omega\Delta t \end{bmatrix}
xtytθt
=
xt−1yt−1θt−1
+
vxΔtcos(θt−1)−vyΔtsin(θt−1)vxΔtsin(θt−1)+vyΔtcos(θt−1)ωΔt
(2)协方差预测:
Σ t = G t Σ t − 1 G t T + G u Σ u G u T \Sigma_{t} = G_{t}\Sigma_{t-1}G_{t}^T+G_u\Sigma_uG_u^T Σt=GtΣt−1GtT+GuΣuGuT
控制的协方差为 Σ u \Sigma_u Σu
Σ u = [ σ v x 2 0 0 0 σ v y 2 0 0 0 σ ω 2 ] 3 ∗ 3 \Sigma_u=\begin{bmatrix}\sigma_{v_x}^2 & 0 & 0\\ 0 & \sigma_{v_y}^2& 0 \\ 0&0&\sigma_{\omega}^2\end{bmatrix}_{3*3} Σu= σvx2000σvy2000σω2 3∗3
其中:
G t G_{t} Gt是运动模型关于状态量 X t − 1 X_{t-1} Xt−1的雅克比:
G t = ∂ X t ∂ X t − 1 = [ 1 0 − v x Δ t sin ( θ t − 1 ) − v y Δ t cos ( θ t − 1 ) 0 1 v x Δ t cos ( θ t − 1 ) − v y Δ t sin ( θ t − 1 ) 0 0 1 ] 3 ∗ 3 G_{t} = \frac{\partial X_t}{\partial X_{t-1}}=\begin{bmatrix}1 & 0 & -v_x\Delta t\sin(\theta_{t-1}) - v_y \Delta t\cos(\theta_{t-1}) \\ 0 & 1 & v_x\Delta t\cos(\theta_{t-1}) - v_y \Delta t\sin(\theta_{t-1}) \\ 0 & 0 & 1\end{bmatrix}_{3*3} Gt=∂Xt−1∂Xt= 100010−vxΔtsin(θt−1)−vyΔtcos(θt−1)vxΔtcos(θt−1)−vyΔtsin(θt−1)1 3∗3
G u G_u Gu是运动模型关于控制 u = [ v x v y ω ] T u =\begin{bmatrix}v_x & v_y & \omega \end{bmatrix} ^T u=[vxvyω]T的雅克比:
G u = ∂ X t ∂ u = [ Δ t cos ( θ t − 1 ) − Δ t sin ( θ t − 1 ) 0 Δ t sin ( θ t − 1 ) Δ t cos ( θ t − 1 ) 0 0 0 Δ t ] 3 ∗ 3 G_u = \frac{\partial X_t}{\partial u}=\begin{bmatrix}\Delta t\cos(\theta_{t-1}) & -\Delta t\sin(\theta_{t-1}) &0 \\ \Delta t\sin(\theta_{t-1}) & \Delta t\cos(\theta_{t-1}) & 0 \\ 0&0 & \Delta t\end{bmatrix}_{3*3} Gu=∂u∂Xt= Δtcos(θt−1)Δtsin(θt−1)0−Δtsin(θt−1)Δtcos(θt−1)000Δt 3∗3
观测模型
假设当前激光帧中检测到
N
N
N个反光板:
通过数据关联(欧式距离或马氏距离等手段),我们找到地图中对应的
N
N
N个反光板。对于关联不上的反光板,我们不放进观测方程中。观测方程可以写为:
观测对状态空间
X
t
X_t
Xt的雅克比为:
更新
计算增益
K t = Σ ξ , t H t T ( H t Σ ξ , t H t T + Q ) − 1 K_t = \Sigma_{\xi,t}H_{t}^{T}(H_t\Sigma_{\xi,t}H_t^{T}+Q)^{-1} Kt=Σξ,tHtT(HtΣξ,tHtT+Q)−1
K
t
K_t
Kt为
3
∗
2
N
3*2N
3∗2N矩阵。其中,
Q
Q
Q为观测的协方差矩阵。
该矩阵的取值可以为:
(1)采用观测误差,都取一个固定的值;
(2)采用地图中每个反光板的协方差矩阵;
(3)采用观测误差和地图中反光板协方差矩阵的加权,或者和等方式;
这三种方式,理论上都能得到结果,不过,具体到底哪个好,需要根据实际情况来选择。
更新状态空间
X
t
=
X
t
+
K
t
(
z
t
−
z
^
)
X_t = X_t + K_t(z_t-\hat{z})
Xt=Xt+Kt(zt−z^)
更新协方差
Σ ξ , t = ( I − K t H t ) Σ ξ , t \Sigma_{\xi,t} = (I-K_tH_t)\Sigma_{\xi,t} Σξ,t=(I−KtHt)Σξ,t
以上,完成了一个最简单的基于反光板的EKF定位方案,不过还差一些工作需要补充:
(1)反光板的检测;
(2)反光板数据关联方法;
(3)状态空间的扩展:假如在定位过程中出现了一些新的反光板,则需要把该反光板加入状态空间;
(4)反光板地图的构建;
(5)基于反光板的重定位。