实验环境
实验采用车载RGB-D相机模型,使用monoslam算法。忽略深度信息,融合odom。
1. ekf-predict 运动方程推导
1.1 一般里程计模型
一般里程计模型,默认机器人的单次运动是由下列三次运动组成:
第一次旋转: deltarot1delta_{rot1}deltarot1
平移: deltatransdelta_{trans}deltatrans
第二次旋转: deltarot2delta_{rot2}deltarot2
1.2 monoslam运动模型
monoslam状态向量维度为13X1,内容为:
| state_vector | x | y | z | Quat1Quat_1Quat1 | Quat2Quat_2Quat2 | Quat3Quat_3Quat3 | Quat4Quat_4Quat4 | vxv_xvx | vyv_yvy | vzv_zvz | ωx\omega_xωx | ωy\omega_yωy | ωz\omega_zωz |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| matlab序列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| c/c++序列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
1.3 monoslam + 里程计运动方程:
x′=x+δtranscos(θz+δrot1)x' = x + \delta_{trans}cos(\theta_z + \delta_{rot1})x′=x+δtranscos(θz+δrot1)
y′=y+δtranssin(θz+δrot1)y' = y + \delta_{trans}sin(\theta_z + \delta_{rot1})y′=y+δtranssin(θz+δrot1)
z′=0z' = 0z′=0
θx′=0\theta'_x = 0θx′=0
θy′=0\theta'_y = 0θy′=0
θz′=θ+δrot1+δrot2\theta'_z = \theta + \delta_{rot1} + \delta_{rot2}θz′=θ+δrot1+δrot2
ωx′=0\omega'_x = 0ωx′=0
ωy′=0\omega'_y = 0ωy′=0
ωx′=0\omega'_x =0ωx′=0
ωy′=0\omega'_y =0ωy′=0
ωz′=(δrot1+δrot2)/Δt\omega'_z = (\delta_{rot1} + \delta_{rot2})/\Delta_tωz′=(δrot1+δrot2)/Δt
vx′=0v'_x = 0vx′=0
vy′=δtranscos(θ+δrot1)/Δtv'_y = \delta_{trans}cos(\theta + \delta_{rot1})/\Delta_tvy′=δtranscos(θ+δrot1)/Δt
vz′=δtranssin(θ+δrot1)/Δtv'_z = \delta_{trans}sin(\theta + \delta_{rot1})/\Delta_tvz′=δtranssin(θ+δrot1)/Δt
根据特定算法,可以将θx\theta_xθx θy\theta_yθy θz\theta_zθz转化为四元数
这个版本的运动方程因该是没有错误,但是跟原文中的并不符合,改起来会很麻烦
1.4 将里程计模型视为恒线速度、角速度模型(采样间隔之间)
xˇt+1=x^t+vxaddΔt\check{x}_{t+1} = \hat{x}_t + v^{add}_x\Delta_txˇt+1=x^t+vxaddΔt
yˇt+1=y^t+vyaddΔt\check{y}_{t+1} = \hat{y}_t + v^{add}_y\Delta_tyˇt+1=y^t+vyaddΔt
zˇt+1=0\check{z}_{t+1}= 0zˇt+1=0
Qˇ1t+1\check{Q}1_{t+1}Qˇ1t+1
Q2Q2Q2
Q3Q3Q3
Q4Q4Q4
ωx′=0\omega'_x = 0ωx′=0
ωy′=0\omega'_y = 0ωy′=0
ωz′=(δrot1+δrot2)/Δt\omega'_z = (\delta_{rot1} + \delta_{rot2})/\Delta_tωz′=(δrot1+δrot2)/Δt
vx′=vxaddv'_x = v^{add}_xvx′=vxadd
vy′=vyaddv'_y = v^{add}_yvy′=vyadd
vz′=0v'_z = 0vz′=0
也就是将系统的输入由:
1.δtrans1.\delta_{trans}1.δtrans
2.δrot12.\delta_{rot1}2.δrot1
3.δrot23.\delta_{rot2}3.δrot2
换成:
δtrans/Δt\delta_{trans}/\Delta_tδtrans/Δt
δrot1/Δt+δrot2/Δt\delta_{rot1}/\Delta_t + \delta_{rot2}/\Delta_tδrot1/Δt+δrot2/Δt
即输入为:
vxv_xvx
vyv_yvy
θz\theta_zθz
注意,monoslam中的相机是人手拿移动的,所以有六个自由度,而本实验中的机器人实际上只有三个自由度的(x,y,θz)(x,y,\theta_z)(x,y,θz)
写到一半发现映射起来更麻烦,弃坑
1.5 还是原版里程计 四元数替换欧拉角版本
xˇt+1=x^t+δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)\check{x}_{t+1} = \hat{x}_t + \delta_{trans}cos(atan2(2(\hat{Q}^1_t\hat{Q}^4_t),1 - 2(\hat{Q}^4_t)^2) + \delta_{rot1})xˇt+1=x^t+δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)
yˇt+1=y^t+δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)\check{y}_{t+1} = \hat{y}_t + \delta_{trans}sin(atan2(2(\hat{Q}^1_t\hat{Q}^4_t),1 - 2(\hat{Q}^4_t)^2) + \delta_{rot1})yˇt+1=y^t+δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)
zˇt+1=0\check{z}_{t+1} = 0zˇt+1=0
Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4\check{Q}^1_{t+1} = \hat{Q}^1_tP^1 - \hat{Q}^2_tP^2 - \hat{Q}^3_tP^3 - \hat{Q}^4_tP^4Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4
Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3\check{Q}^2_{t+1} = \hat{Q}^1_tP^2 + \hat{Q}^2_tP^1 + \hat{Q}^3_tP^4 - \hat{Q}^4_tP^3Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3
Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2\check{Q}^3_{t+1} = \hat{Q}^1_tP^3 - \hat{Q}^2_tP^4 + \hat{Q}^3_tP^1 + \hat{Q}^4_tP^2Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2
Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1\check{Q}^4_{t+1} = \hat{Q}^1_tP^4 + \hat{Q}^2_tP^3 - \hat{Q}^3_tP^2 + \hat{Q}^4_tP^1Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1
vˇt+1x=δtranscos(arccos(Q^t1)+δrot1)/Δt\check{v}^x_{t+1} = \delta_{trans}cos(arccos(\hat{Q}^1_t) + \delta_{rot1})/\Delta_tvˇt+1x=δtranscos(arccos(Q^t1)+δrot1)/Δt
vˇt+1y=δtranssin(arccos(Q^t1)+δrot1)/Δt\check{v}^y_{t+1} = \delta_{trans}sin(arccos(\hat{Q}^1_t) + \delta_{rot1})/\Delta_tvˇt+1y=δtranssin(arccos(Q^t1)+δrot1)/Δt
vˇt+1z=0\check{v}^z_{t+1} = 0vˇt+1z=0
ωˇt+1x=0\check{\omega}^x_{t+1} =0ωˇt+1x=0
ωˇt+1y=0\check{\omega}^y_{t+1} =0ωˇt+1y=0
ωˇt+1z=(δrot1+δrot2)/Δt\check{\omega}^z_{t+1} = (\delta_{rot1} + \delta_{rot2})/\Delta_tωˇt+1z=(δrot1+δrot2)/Δt
其中P1,P2,P3,P4P^1,P^2,P^3,P^4P1,P2,P3,P4 的计算,参考2.1,总之:
P1=cos(δrot1+δrot2)P^1 = cos(\delta_{rot1} + \delta_{rot2})P1=cos(δrot1+δrot2)
P2=0P^2 = 0P2=0
P3=0P^3 = 0P3=0
P4=sin(δrot1+δrot2)P^4 = sin(\delta_{rot1} + \delta_{rot2})P4=sin(δrot1+δrot2)
1.6 更进一步 运动方程
xˇt+1=x^t+δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)\check{x}_{t+1} = \hat{x}_t + \delta_{trans}cos(atan2(2(\hat{Q}^1_t\hat{Q}^4_t),1 - 2(\hat{Q}^4_t)^2) + \delta_{rot1})xˇt+1=x^t+δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)
yˇt+1=y^t+δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)\check{y}_{t+1} = \hat{y}_t + \delta_{trans}sin(atan2(2(\hat{Q}^1_t\hat{Q}^4_t),1 - 2(\hat{Q}^4_t)^2) + \delta_{rot1})yˇt+1=y^t+δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)
zˇt+1=0\check{z}_{t+1} = 0zˇt+1=0
Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4\check{Q}^1_{t+1} = \hat{Q}^1_tP^1 - \hat{Q}^2_tP^2 - \hat{Q}^3_tP^3 - \hat{Q}^4_tP^4Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4
Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3\check{Q}^2_{t+1} = \hat{Q}^1_tP^2 + \hat{Q}^2_tP^1 + \hat{Q}^3_tP^4 - \hat{Q}^4_tP^3Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3
Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2\check{Q}^3_{t+1} = \hat{Q}^1_tP^3 - \hat{Q}^2_tP^4 + \hat{Q}^3_tP^1 + \hat{Q}^4_tP^2Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2
Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1\check{Q}^4_{t+1} = \hat{Q}^1_tP^4 + \hat{Q}^2_tP^3 - \hat{Q}^3_tP^2 + \hat{Q}^4_tP^1Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1
vˇt+1x=δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)/Δt\check{v}^x_{t+1} = \delta_{trans}cos(atan2(2(\hat{Q}^1_t\hat{Q}^4_t),1 - 2(\hat{Q}^4_t)^2) + \delta_{rot1})/\Delta_tvˇt+1x=δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)/Δt
vˇt+1y=δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)/Δt\check{v}^y_{t+1} = \delta_{trans}sin(atan2(2(\hat{Q}^1_t\hat{Q}^4_t),1 - 2(\hat{Q}^4_t)^2) + \delta_{rot1})/\Delta_tvˇt+1y=δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)/Δt
vˇt+1z=0\check{v}^z_{t+1} = 0vˇt+1z=0
ωˇt+1x=0\check{\omega}^x_{t+1} =0ωˇt+1x=0
ωˇt+1y=0\check{\omega}^y_{t+1} =0ωˇt+1y=0
ωˇt+1z=(δrot1+δrot2)/Δt\check{\omega}^z_{t+1} = (\delta_{rot1} + \delta_{rot2})/\Delta_tωˇt+1z=(δrot1+δrot2)/Δt
其中P1,P2,P3,P4P^1,P^2,P^3,P^4P1,P2,P3,P4 的计算,参考2.1,总之:
P1=cos(Δθ)P^1 = cos(\Delta \theta)P1=cos(Δθ)
P2=0P^2 = 0P2=0
P3=0P^3 = 0P3=0
P4=sin(Δθ)P^4 = sin(\Delta \theta)P4=sin(Δθ)
1.7 世界坐标系对齐
md,monoslam的世界坐标系,是跟相机坐标系平行的,不同于我们平面机器人习惯的z轴表示高度,xy表示平面位置…
xˇt+1c=x^tc+δtranssin(asin(2(Q^t1Q^t3))+δrot1)\check{x}_{t+1}^c = \hat{x}_t^c + \delta_{trans}sin(asin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})xˇt+1c=x^tc+δtranssin(asin(2(Q^t1Q^t3))+δrot1)
yˇt+1c=0\check{y}_{t+1}^c = 0yˇt+1c=0
zˇt+1c=z^tc+δtranscos(asin(2(Q^t1Q^t3))+δrot1)\check{z}_{t+1}^c = \hat{z}_t^c + \delta_{trans}cos(asin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})zˇt+1c=z^tc+δtranscos(asin(2(Q^t1Q^t3))+δrot1)
Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4\check{Q}^1_{t+1} = \hat{Q}^1_tP^1 - \hat{Q}^2_tP^2 - \hat{Q}^3_tP^3 - \hat{Q}^4_tP^4Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4
Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3\check{Q}^2_{t+1} = \hat{Q}^1_tP^2 + \hat{Q}^2_tP^1 + \hat{Q}^3_tP^4 - \hat{Q}^4_tP^3Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3
Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2\check{Q}^3_{t+1} = \hat{Q}^1_tP^3 - \hat{Q}^2_tP^4 + \hat{Q}^3_tP^1 + \hat{Q}^4_tP^2Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2
Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1\check{Q}^4_{t+1} = \hat{Q}^1_tP^4 + \hat{Q}^2_tP^3 - \hat{Q}^3_tP^2 + \hat{Q}^4_tP^1Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1
vˇt+1x=δtranssin(asin(2(Q^t1Q^t3))+δrot1)/Δt\check{v}^x_{t+1} = \delta_{trans}sin(asin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})/\Delta_tvˇt+1x=δtranssin(asin(2(Q^t1Q^t3))+δrot1)/Δt
vˇt+1y=0\check{v}^y_{t+1} = 0vˇt+1y=0
vˇt+1z=δtranscos(asin(2(Q^t1Q^t3))+δrot1)/Δt\check{v}^z_{t+1} = \delta_{trans}cos(asin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})/\Delta_tvˇt+1z=δtranscos(asin(2(Q^t1Q^t3))+δrot1)/Δt
ωˇt+1x=0\check{\omega}^x_{t+1} =0ωˇt+1x=0
ωˇt+1y=−(δrot1+δrot2)/Δt\check{\omega}^y_{t+1} = - (\delta_{rot1} + \delta_{rot2})/\Delta_tωˇt+1y=−(δrot1+δrot2)/Δt
ωˇt+1z=\check{\omega}^z_{t+1} =ωˇt+1z=
其中P1,P2,P3,P4P^1,P^2,P^3,P^4P1,P2,P3,P4 的计算,参考2.1,总之:
P1=cos(−Δθ)P^1 = cos(-\Delta \theta)P1=cos(−Δθ)
P2=0P^2 = 0P2=0
P3=sin(−Δθ)P^3 = sin(-\Delta \theta)P3=sin(−Δθ)
P4=0P^4 = 0P4=0
2. ekf-predict 雅各比矩阵
所以有1.7
[100δtranscos(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t11−4(Q^t1Q^t3)20δtranscos(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t31−4(Q^t1Q^t3)200000000000000000000001−δtranssin(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t11−4(Q^t1Q^t3)20−δtranssin(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t31−4(Q^t1Q^t3)20000000000P1−P2−P3−P4000000000P2P1P4−P3000000000P3−P4P1P2000000000P4P3−P2P1000000000δtransΔtcos(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t11−4(Q^t1Q^t3)20δtransΔtcos(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t31−4(Q^t1Q^t3)200000000000000000000000−δtransΔtsin(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t11−4(Q^t1Q^t3)20−δtransΔtsin(arcsin(2(Q^t1Q^t3))+δrot1)2Q^t31−4(Q^t1Q^t3)20000000000000000000000000000000000000000000000]
\begin{gathered}
\begin{bmatrix}
1 & 0 & 0 & \delta_{trans}cos(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^1_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & \delta_{trans}cos(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^3_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & -\delta_{trans}sin(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^1_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & -\delta_{trans}sin(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^3_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & P_1 & -P_2 & -P_3 & -P_4 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & P_2 & P_1 & P_4 & -P_3 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & P_3 & -P_4 & P_1 & P_2 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & P_4 & P_3 & -P_2 & P_1 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & \frac{\delta_{trans}}{\Delta t}cos(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^1_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & \frac{\delta_{trans}}{\Delta t}cos(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^3_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & -\frac{\delta_{trans}}{\Delta t}sin(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^1_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & -\frac{\delta_{trans}}{\Delta t}sin(arcsin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})\frac{2\hat{Q}^3_t}{\sqrt{1 - 4(\hat{Q}^1_t\hat{Q}^3_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
\end{bmatrix}
\end{gathered}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡100000000000000000000000000010000000000δtranscos(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t10−δtranssin(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t1P1P2P3P4Δtδtranscos(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t10−Δtδtranssin(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t1000000−P2P1−P4P3000000δtranscos(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t30−δtranssin(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t3−P3P4P1−P2Δtδtranscos(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t30−Δtδtranssin(arcsin(2(Q^t1Q^t3))+δrot1)1−4(Q^t1Q^t3)22Q^t3000000−P4−P3P2P1000000000000000000000000000000000000000000000000000000000000000000000000000000000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
根据1.5中的运动方程,有:
[100δtranssin(arccos(Q^t1)+δrot1)1−(Q^t1)2000000000010−δtranscos(arccos(Q^t1)+δrot1)1−(Q^t1)20000000000000000000000000P1−P2−P3−P4000000000P2P1P4−P3000000000P3−P4P1P2000000000P4P3−P2P1000000000000000000000000000000000000000000000000δtranssin(arccos(Q^t1)+δrot1)Δt1−(Q^t1)2000000000000−δtranscos(arccos(Q^t1)+δrot1)Δt1−(Q^t1)20000000000000000000000] \begin{gathered} \begin{bmatrix} 1 & 0 & 0 & \frac{\delta_{trans}sin(arccos(\hat{Q}^1_t) + \delta_{rot1})}{\sqrt{1-(\hat{Q}^1_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & -\frac{\delta_{trans}cos(arccos(\hat{Q}^1_t) + \delta_{rot1})}{\sqrt{1-(\hat{Q}^1_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & P_1 & -P_2 & -P_3 & -P_4 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & P_2 & P_1 & P_4 & -P_3 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & P_3 & -P_4 & P_1 & P_2 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & P_4 & P_3 & -P_2 & P_1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\delta_{trans}sin(arccos(\hat{Q}^1_t) + \delta_{rot1})}{\Delta_t\sqrt{1-(\hat{Q}^1_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & -\frac{\delta_{trans}cos(arccos(\hat{Q}^1_t) + \delta_{rot1})}{\Delta_t\sqrt{1-(\hat{Q}^1_t)^2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} \end{gathered} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1000000000000010000000000000000000000001−(Q^t1)2δtranssin(arccos(Q^t1)+δrot1)−1−(Q^t1)2δtranscos(arccos(Q^t1)+δrot1)0P1P2P3P4000Δt1−(Q^t1)2δtranssin(arccos(Q^t1)+δrot1)−Δt1−(Q^t1)2δtranscos(arccos(Q^t1)+δrot1)0000−P2P1−P4P3000000000−P3P4P1−P2000000000−P4−P3P2P1000000000000000000000000000000000000000000000000000000000000000000000000000000000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
3. 算法引入
3.1 引入1:欧拉角转四元数
首先是一般欧拉角转四元数的matlab代码(c++代码块展示):
function q=v2q(v)
theta=norm(v);
if (theta <eps)
q=[1 0 0 0];
else
v_n=v/norm(v);
q=my_quaternion(v_n,theta);
end
+++
function q=quaternion(v,theta)
q=[cos(theta/2) sin(theta/2)*reshape(v,1,3)/norm(v)];
但是本实验中的机器人只有绕z轴的旋转,所以比上述内容来得简单,如对于转角Δθz\Delta\theta_zΔθz ,其对应的四元数p为:
p=[p1,p2,p3,p4]p = [p_1,p_2, p_3, p_4]p=[p1,p2,p3,p4]
其中:
p1=cos(Δθz/2)p_1 = cos(\Delta\theta_z/2)p1=cos(Δθz/2)
p2=0p_2 = 0p2=0
p3=0p_3 = 0p3=0
p4=sin(Δθz/2)p_4 = sin(\Delta\theta_z/2)p4=sin(Δθz/2)
3.2 引入2:旋转角度a与旋转角度b相加的四元数表达
注意 :角度a与角度b并不是一维向量,而是3X1的表达欧拉角(yaw等)的向量
假设,对应于转角a与转交b的四元数为:q、p,有:
q=[q1,q2,q3,q4]q = [q_1,q_2,q_3,q_4]q=[q1,q2,q3,q4]
p=[p1,p2,p3,p4]p = [p_1,p_2,p_3,p_4]p=[p1,p2,p3,p4]
那么对应于a+b的四元数q‘的计算:
matlab代码:(用的c++模板)
function qp=qprod(q,p)
a=q(1);
v=reshape(q(2:4),3,1);
x=p(1);
u=reshape(p(2:4),3,1);
qp = [a*x-v'*u, (a*u+x*v)' + cross(v,u)'];
其中cross函数的运算(a ,b为输入参数,对应于上边的v和u):
c = [a(2).*b(3)-a(3).*b(2);
a(3).*b(1)-a(1).*b(3);
a(1).*b(2)-a(2).*b(1)];
总之可以得到下边的公式:
q1′=q1p1−q2p2−q3p3−q4p4q2′=q1p2+q2p1+q3p4−q4p3q3′=q1p3−q2p4+q3p1+q4p2q4′=q1p4+q2p3−q3p2+q4p1
\begin{gathered}
\begin{matrix} q'_1 = q_1p_1 - q_2p_2 - q_3p_3 - q_4p_4 \\
q'_2 = q_1p_2 + q_2p_1 + q_3p_4 - q_4p_3 \\
q'_3 = q_1p_3 - q_2p_4 + q_3p_1 + q_4p_2 \\
q'_4 = q_1p_4 + q_2p_3 - q_3p_2 + q_4p_1 \end{matrix}
\end{gathered}
q1′=q1p1−q2p2−q3p3−q4p4q2′=q1p2+q2p1+q3p4−q4p3q3′=q1p3−q2p4+q3p1+q4p2q4′=q1p4+q2p3−q3p2+q4p1
3.3 引入3 反三角函数求导
y=arccos(x)y = arccos(x)y=arccos(x) >> y′=−11−x2y' = -\frac{1}{\sqrt{1-x^2}}y′=−1−x21
y=arcsin(x)y = arcsin(x)y=arcsin(x) >> y′=11−x2y' = \frac{1}{\sqrt{1-x^2}}y′=1−x21
y=arctan(x)y = arctan(x)y=arctan(x) >> y′=11+x2y' = \frac{1}{1+x^2}y′=1+x21
y=arccot(x)y = arccot(x)y=arccot(x) >> y′=−11+x2y' = -\frac{1}{1+x^2}y′=−1+x21
本文详细解析了车载RGB-D相机与Monoslam算法结合的EKF预测过程,涉及运动模型的推导,从一般里程计模型到monoslam状态向量的转换,并展示了关键的运动方程和雅可比矩阵计算。特别强调了如何处理旋转和平移以及四元数和欧拉角的转换。
1744

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



