实验环境
实验采用车载RGB-D相机模型,使用monoslam算法。忽略深度信息,融合odom。
1. ekf-predict 运动方程推导
1.1 一般里程计模型
一般里程计模型,默认机器人的单次运动是由下列三次运动组成:
第一次旋转:
d
e
l
t
a
r
o
t
1
delta_{rot1}
deltarot1
平移:
d
e
l
t
a
t
r
a
n
s
delta_{trans}
deltatrans
第二次旋转:
d
e
l
t
a
r
o
t
2
delta_{rot2}
deltarot2
1.2 monoslam运动模型
monoslam状态向量维度为13X1,内容为:
state_vector | x | y | z | Q u a t 1 Quat_1 Quat1 | Q u a t 2 Quat_2 Quat2 | Q u a t 3 Quat_3 Quat3 | Q u a t 4 Quat_4 Quat4 | v x v_x vx | v y v_y vy | v z v_z vz | ω 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
+
δ
t
r
a
n
s
c
o
s
(
θ
z
+
δ
r
o
t
1
)
x' = x + \delta_{trans}cos(\theta_z + \delta_{rot1})
x′=x+δtranscos(θz+δrot1)
y
′
=
y
+
δ
t
r
a
n
s
s
i
n
(
θ
z
+
δ
r
o
t
1
)
y' = y + \delta_{trans}sin(\theta_z + \delta_{rot1})
y′=y+δtranssin(θz+δrot1)
z
′
=
0
z' = 0
z′=0
θ
x
′
=
0
\theta'_x = 0
θx′=0
θ
y
′
=
0
\theta'_y = 0
θy′=0
θ
z
′
=
θ
+
δ
r
o
t
1
+
δ
r
o
t
2
\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
′
=
(
δ
r
o
t
1
+
δ
r
o
t
2
)
/
Δ
t
\omega'_z = (\delta_{rot1} + \delta_{rot2})/\Delta_t
ωz′=(δrot1+δrot2)/Δt
v
x
′
=
0
v'_x = 0
vx′=0
v
y
′
=
δ
t
r
a
n
s
c
o
s
(
θ
+
δ
r
o
t
1
)
/
Δ
t
v'_y = \delta_{trans}cos(\theta + \delta_{rot1})/\Delta_t
vy′=δtranscos(θ+δrot1)/Δt
v
z
′
=
δ
t
r
a
n
s
s
i
n
(
θ
+
δ
r
o
t
1
)
/
Δ
t
v'_z = \delta_{trans}sin(\theta + \delta_{rot1})/\Delta_t
vz′=δtranssin(θ+δrot1)/Δt
根据特定算法,可以将
θ
x
\theta_x
θx
θ
y
\theta_y
θy
θ
z
\theta_z
θz转化为四元数
这个版本的运动方程因该是没有错误,但是跟原文中的并不符合,改起来会很麻烦
1.4 将里程计模型视为恒线速度、角速度模型(采样间隔之间)
x
ˇ
t
+
1
=
x
^
t
+
v
x
a
d
d
Δ
t
\check{x}_{t+1} = \hat{x}_t + v^{add}_x\Delta_t
xˇt+1=x^t+vxaddΔt
y
ˇ
t
+
1
=
y
^
t
+
v
y
a
d
d
Δ
t
\check{y}_{t+1} = \hat{y}_t + v^{add}_y\Delta_t
yˇt+1=y^t+vyaddΔt
z
ˇ
t
+
1
=
0
\check{z}_{t+1}= 0
zˇt+1=0
Q
ˇ
1
t
+
1
\check{Q}1_{t+1}
Qˇ1t+1
Q
2
Q2
Q2
Q
3
Q3
Q3
Q
4
Q4
Q4
ω
x
′
=
0
\omega'_x = 0
ωx′=0
ω
y
′
=
0
\omega'_y = 0
ωy′=0
ω
z
′
=
(
δ
r
o
t
1
+
δ
r
o
t
2
)
/
Δ
t
\omega'_z = (\delta_{rot1} + \delta_{rot2})/\Delta_t
ωz′=(δrot1+δrot2)/Δt
v
x
′
=
v
x
a
d
d
v'_x = v^{add}_x
vx′=vxadd
v
y
′
=
v
y
a
d
d
v'_y = v^{add}_y
vy′=vyadd
v
z
′
=
0
v'_z = 0
vz′=0
也就是将系统的输入由:
1.
δ
t
r
a
n
s
1.\delta_{trans}
1.δtrans
2.
δ
r
o
t
1
2.\delta_{rot1}
2.δrot1
3.
δ
r
o
t
2
3.\delta_{rot2}
3.δrot2
换成:
δ
t
r
a
n
s
/
Δ
t
\delta_{trans}/\Delta_t
δtrans/Δt
δ
r
o
t
1
/
Δ
t
+
δ
r
o
t
2
/
Δ
t
\delta_{rot1}/\Delta_t + \delta_{rot2}/\Delta_t
δrot1/Δt+δrot2/Δt
即输入为:
v
x
v_x
vx
v
y
v_y
vy
θ
z
\theta_z
θz
注意,monoslam中的相机是人手拿移动的,所以有六个自由度,而本实验中的机器人实际上只有三个自由度的 ( x , y , θ z ) (x,y,\theta_z) (x,y,θz)
写到一半发现映射起来更麻烦,弃坑
1.5 还是原版里程计 四元数替换欧拉角版本
x
ˇ
t
+
1
=
x
^
t
+
δ
t
r
a
n
s
c
o
s
(
a
t
a
n
2
(
2
(
Q
^
t
1
Q
^
t
4
)
,
1
−
2
(
Q
^
t
4
)
2
)
+
δ
r
o
t
1
)
\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
+
δ
t
r
a
n
s
s
i
n
(
a
t
a
n
2
(
2
(
Q
^
t
1
Q
^
t
4
)
,
1
−
2
(
Q
^
t
4
)
2
)
+
δ
r
o
t
1
)
\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} = 0
zˇt+1=0
Q
ˇ
t
+
1
1
=
Q
^
t
1
P
1
−
Q
^
t
2
P
2
−
Q
^
t
3
P
3
−
Q
^
t
4
P
4
\check{Q}^1_{t+1} = \hat{Q}^1_tP^1 - \hat{Q}^2_tP^2 - \hat{Q}^3_tP^3 - \hat{Q}^4_tP^4
Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4
Q
ˇ
t
+
1
2
=
Q
^
t
1
P
2
+
Q
^
t
2
P
1
+
Q
^
t
3
P
4
−
Q
^
t
4
P
3
\check{Q}^2_{t+1} = \hat{Q}^1_tP^2 + \hat{Q}^2_tP^1 + \hat{Q}^3_tP^4 - \hat{Q}^4_tP^3
Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3
Q
ˇ
t
+
1
3
=
Q
^
t
1
P
3
−
Q
^
t
2
P
4
+
Q
^
t
3
P
1
+
Q
^
t
4
P
2
\check{Q}^3_{t+1} = \hat{Q}^1_tP^3 - \hat{Q}^2_tP^4 + \hat{Q}^3_tP^1 + \hat{Q}^4_tP^2
Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2
Q
ˇ
t
+
1
4
=
Q
^
t
1
P
4
+
Q
^
t
2
P
3
−
Q
^
t
3
P
2
+
Q
^
t
4
P
1
\check{Q}^4_{t+1} = \hat{Q}^1_tP^4 + \hat{Q}^2_tP^3 - \hat{Q}^3_tP^2 + \hat{Q}^4_tP^1
Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1
v
ˇ
t
+
1
x
=
δ
t
r
a
n
s
c
o
s
(
a
r
c
c
o
s
(
Q
^
t
1
)
+
δ
r
o
t
1
)
/
Δ
t
\check{v}^x_{t+1} = \delta_{trans}cos(arccos(\hat{Q}^1_t) + \delta_{rot1})/\Delta_t
vˇt+1x=δtranscos(arccos(Q^t1)+δrot1)/Δt
v
ˇ
t
+
1
y
=
δ
t
r
a
n
s
s
i
n
(
a
r
c
c
o
s
(
Q
^
t
1
)
+
δ
r
o
t
1
)
/
Δ
t
\check{v}^y_{t+1} = \delta_{trans}sin(arccos(\hat{Q}^1_t) + \delta_{rot1})/\Delta_t
vˇt+1y=δtranssin(arccos(Q^t1)+δrot1)/Δt
v
ˇ
t
+
1
z
=
0
\check{v}^z_{t+1} = 0
vˇt+1z=0
ω
ˇ
t
+
1
x
=
0
\check{\omega}^x_{t+1} =0
ωˇt+1x=0
ω
ˇ
t
+
1
y
=
0
\check{\omega}^y_{t+1} =0
ωˇt+1y=0
ω
ˇ
t
+
1
z
=
(
δ
r
o
t
1
+
δ
r
o
t
2
)
/
Δ
t
\check{\omega}^z_{t+1} = (\delta_{rot1} + \delta_{rot2})/\Delta_t
ωˇt+1z=(δrot1+δrot2)/Δt
其中
P
1
,
P
2
,
P
3
,
P
4
P^1,P^2,P^3,P^4
P1,P2,P3,P4 的计算,参考2.1,总之:
P
1
=
c
o
s
(
δ
r
o
t
1
+
δ
r
o
t
2
)
P^1 = cos(\delta_{rot1} + \delta_{rot2})
P1=cos(δrot1+δrot2)
P
2
=
0
P^2 = 0
P2=0
P
3
=
0
P^3 = 0
P3=0
P
4
=
s
i
n
(
δ
r
o
t
1
+
δ
r
o
t
2
)
P^4 = sin(\delta_{rot1} + \delta_{rot2})
P4=sin(δrot1+δrot2)
1.6 更进一步 运动方程
x
ˇ
t
+
1
=
x
^
t
+
δ
t
r
a
n
s
c
o
s
(
a
t
a
n
2
(
2
(
Q
^
t
1
Q
^
t
4
)
,
1
−
2
(
Q
^
t
4
)
2
)
+
δ
r
o
t
1
)
\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
+
δ
t
r
a
n
s
s
i
n
(
a
t
a
n
2
(
2
(
Q
^
t
1
Q
^
t
4
)
,
1
−
2
(
Q
^
t
4
)
2
)
+
δ
r
o
t
1
)
\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} = 0
zˇt+1=0
Q
ˇ
t
+
1
1
=
Q
^
t
1
P
1
−
Q
^
t
2
P
2
−
Q
^
t
3
P
3
−
Q
^
t
4
P
4
\check{Q}^1_{t+1} = \hat{Q}^1_tP^1 - \hat{Q}^2_tP^2 - \hat{Q}^3_tP^3 - \hat{Q}^4_tP^4
Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4
Q
ˇ
t
+
1
2
=
Q
^
t
1
P
2
+
Q
^
t
2
P
1
+
Q
^
t
3
P
4
−
Q
^
t
4
P
3
\check{Q}^2_{t+1} = \hat{Q}^1_tP^2 + \hat{Q}^2_tP^1 + \hat{Q}^3_tP^4 - \hat{Q}^4_tP^3
Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3
Q
ˇ
t
+
1
3
=
Q
^
t
1
P
3
−
Q
^
t
2
P
4
+
Q
^
t
3
P
1
+
Q
^
t
4
P
2
\check{Q}^3_{t+1} = \hat{Q}^1_tP^3 - \hat{Q}^2_tP^4 + \hat{Q}^3_tP^1 + \hat{Q}^4_tP^2
Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2
Q
ˇ
t
+
1
4
=
Q
^
t
1
P
4
+
Q
^
t
2
P
3
−
Q
^
t
3
P
2
+
Q
^
t
4
P
1
\check{Q}^4_{t+1} = \hat{Q}^1_tP^4 + \hat{Q}^2_tP^3 - \hat{Q}^3_tP^2 + \hat{Q}^4_tP^1
Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1
v
ˇ
t
+
1
x
=
δ
t
r
a
n
s
c
o
s
(
a
t
a
n
2
(
2
(
Q
^
t
1
Q
^
t
4
)
,
1
−
2
(
Q
^
t
4
)
2
)
+
δ
r
o
t
1
)
/
Δ
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_t
vˇt+1x=δtranscos(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)/Δt
v
ˇ
t
+
1
y
=
δ
t
r
a
n
s
s
i
n
(
a
t
a
n
2
(
2
(
Q
^
t
1
Q
^
t
4
)
,
1
−
2
(
Q
^
t
4
)
2
)
+
δ
r
o
t
1
)
/
Δ
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_t
vˇt+1y=δtranssin(atan2(2(Q^t1Q^t4),1−2(Q^t4)2)+δrot1)/Δt
v
ˇ
t
+
1
z
=
0
\check{v}^z_{t+1} = 0
vˇt+1z=0
ω
ˇ
t
+
1
x
=
0
\check{\omega}^x_{t+1} =0
ωˇt+1x=0
ω
ˇ
t
+
1
y
=
0
\check{\omega}^y_{t+1} =0
ωˇt+1y=0
ω
ˇ
t
+
1
z
=
(
δ
r
o
t
1
+
δ
r
o
t
2
)
/
Δ
t
\check{\omega}^z_{t+1} = (\delta_{rot1} + \delta_{rot2})/\Delta_t
ωˇt+1z=(δrot1+δrot2)/Δt
其中
P
1
,
P
2
,
P
3
,
P
4
P^1,P^2,P^3,P^4
P1,P2,P3,P4 的计算,参考2.1,总之:
P
1
=
c
o
s
(
Δ
θ
)
P^1 = cos(\Delta \theta)
P1=cos(Δθ)
P
2
=
0
P^2 = 0
P2=0
P
3
=
0
P^3 = 0
P3=0
P
4
=
s
i
n
(
Δ
θ
)
P^4 = sin(\Delta \theta)
P4=sin(Δθ)
1.7 世界坐标系对齐
md,monoslam的世界坐标系,是跟相机坐标系平行的,不同于我们平面机器人习惯的z轴表示高度,xy表示平面位置…
x
ˇ
t
+
1
c
=
x
^
t
c
+
δ
t
r
a
n
s
s
i
n
(
a
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
\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
+
1
c
=
0
\check{y}_{t+1}^c = 0
yˇt+1c=0
z
ˇ
t
+
1
c
=
z
^
t
c
+
δ
t
r
a
n
s
c
o
s
(
a
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
\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
+
1
1
=
Q
^
t
1
P
1
−
Q
^
t
2
P
2
−
Q
^
t
3
P
3
−
Q
^
t
4
P
4
\check{Q}^1_{t+1} = \hat{Q}^1_tP^1 - \hat{Q}^2_tP^2 - \hat{Q}^3_tP^3 - \hat{Q}^4_tP^4
Qˇt+11=Q^t1P1−Q^t2P2−Q^t3P3−Q^t4P4
Q
ˇ
t
+
1
2
=
Q
^
t
1
P
2
+
Q
^
t
2
P
1
+
Q
^
t
3
P
4
−
Q
^
t
4
P
3
\check{Q}^2_{t+1} = \hat{Q}^1_tP^2 + \hat{Q}^2_tP^1 + \hat{Q}^3_tP^4 - \hat{Q}^4_tP^3
Qˇt+12=Q^t1P2+Q^t2P1+Q^t3P4−Q^t4P3
Q
ˇ
t
+
1
3
=
Q
^
t
1
P
3
−
Q
^
t
2
P
4
+
Q
^
t
3
P
1
+
Q
^
t
4
P
2
\check{Q}^3_{t+1} = \hat{Q}^1_tP^3 - \hat{Q}^2_tP^4 + \hat{Q}^3_tP^1 + \hat{Q}^4_tP^2
Qˇt+13=Q^t1P3−Q^t2P4+Q^t3P1+Q^t4P2
Q
ˇ
t
+
1
4
=
Q
^
t
1
P
4
+
Q
^
t
2
P
3
−
Q
^
t
3
P
2
+
Q
^
t
4
P
1
\check{Q}^4_{t+1} = \hat{Q}^1_tP^4 + \hat{Q}^2_tP^3 - \hat{Q}^3_tP^2 + \hat{Q}^4_tP^1
Qˇt+14=Q^t1P4+Q^t2P3−Q^t3P2+Q^t4P1
v
ˇ
t
+
1
x
=
δ
t
r
a
n
s
s
i
n
(
a
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
/
Δ
t
\check{v}^x_{t+1} = \delta_{trans}sin(asin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})/\Delta_t
vˇt+1x=δtranssin(asin(2(Q^t1Q^t3))+δrot1)/Δt
v
ˇ
t
+
1
y
=
0
\check{v}^y_{t+1} = 0
vˇt+1y=0
v
ˇ
t
+
1
z
=
δ
t
r
a
n
s
c
o
s
(
a
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
/
Δ
t
\check{v}^z_{t+1} = \delta_{trans}cos(asin(2(\hat{Q}^1_t\hat{Q}^3_t)) + \delta_{rot1})/\Delta_t
vˇt+1z=δtranscos(asin(2(Q^t1Q^t3))+δrot1)/Δt
ω
ˇ
t
+
1
x
=
0
\check{\omega}^x_{t+1} =0
ωˇt+1x=0
ω
ˇ
t
+
1
y
=
−
(
δ
r
o
t
1
+
δ
r
o
t
2
)
/
Δ
t
\check{\omega}^y_{t+1} = - (\delta_{rot1} + \delta_{rot2})/\Delta_t
ωˇt+1y=−(δrot1+δrot2)/Δt
ω
ˇ
t
+
1
z
=
\check{\omega}^z_{t+1} =
ωˇt+1z=
其中
P
1
,
P
2
,
P
3
,
P
4
P^1,P^2,P^3,P^4
P1,P2,P3,P4 的计算,参考2.1,总之:
P
1
=
c
o
s
(
−
Δ
θ
)
P^1 = cos(-\Delta \theta)
P1=cos(−Δθ)
P
2
=
0
P^2 = 0
P2=0
P
3
=
s
i
n
(
−
Δ
θ
)
P^3 = sin(-\Delta \theta)
P3=sin(−Δθ)
P
4
=
0
P^4 = 0
P4=0
2. ekf-predict 雅各比矩阵
所以有1.7
[
1
0
0
δ
t
r
a
n
s
c
o
s
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
1
1
−
4
(
Q
^
t
1
Q
^
t
3
)
2
0
δ
t
r
a
n
s
c
o
s
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
3
1
−
4
(
Q
^
t
1
Q
^
t
3
)
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
−
δ
t
r
a
n
s
s
i
n
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
1
1
−
4
(
Q
^
t
1
Q
^
t
3
)
2
0
−
δ
t
r
a
n
s
s
i
n
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
3
1
−
4
(
Q
^
t
1
Q
^
t
3
)
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
δ
t
r
a
n
s
Δ
t
c
o
s
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
1
1
−
4
(
Q
^
t
1
Q
^
t
3
)
2
0
δ
t
r
a
n
s
Δ
t
c
o
s
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
3
1
−
4
(
Q
^
t
1
Q
^
t
3
)
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
−
δ
t
r
a
n
s
Δ
t
s
i
n
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
1
1
−
4
(
Q
^
t
1
Q
^
t
3
)
2
0
−
δ
t
r
a
n
s
Δ
t
s
i
n
(
a
r
c
s
i
n
(
2
(
Q
^
t
1
Q
^
t
3
)
)
+
δ
r
o
t
1
)
2
Q
^
t
3
1
−
4
(
Q
^
t
1
Q
^
t
3
)
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
]
\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中的运动方程,有:
[ 1 0 0 δ t r a n s s i n ( a r c c o s ( Q ^ t 1 ) + δ r o t 1 ) 1 − ( Q ^ t 1 ) 2 0 0 0 0 0 0 0 0 0 0 1 0 − δ t r a n s c o s ( a r c c o s ( Q ^ t 1 ) + δ r o t 1 ) 1 − ( Q ^ t 1 ) 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 δ t r a n s s i n ( a r c c o s ( Q ^ t 1 ) + δ r o t 1 ) Δ t 1 − ( Q ^ t 1 ) 2 0 0 0 0 0 0 0 0 0 0 0 0 − δ t r a n s c o s ( a r c c o s ( Q ^ t 1 ) + δ r o t 1 ) Δ t 1 − ( Q ^ t 1 ) 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] \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
=
[
p
1
,
p
2
,
p
3
,
p
4
]
p = [p_1,p_2, p_3, p_4]
p=[p1,p2,p3,p4]
其中:
p
1
=
c
o
s
(
Δ
θ
z
/
2
)
p_1 = cos(\Delta\theta_z/2)
p1=cos(Δθz/2)
p
2
=
0
p_2 = 0
p2=0
p
3
=
0
p_3 = 0
p3=0
p
4
=
s
i
n
(
Δ
θ
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
=
[
q
1
,
q
2
,
q
3
,
q
4
]
q = [q_1,q_2,q_3,q_4]
q=[q1,q2,q3,q4]
p
=
[
p
1
,
p
2
,
p
3
,
p
4
]
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)];
总之可以得到下边的公式:
q
1
′
=
q
1
p
1
−
q
2
p
2
−
q
3
p
3
−
q
4
p
4
q
2
′
=
q
1
p
2
+
q
2
p
1
+
q
3
p
4
−
q
4
p
3
q
3
′
=
q
1
p
3
−
q
2
p
4
+
q
3
p
1
+
q
4
p
2
q
4
′
=
q
1
p
4
+
q
2
p
3
−
q
3
p
2
+
q
4
p
1
\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 = a r c c o s ( x ) y = arccos(x) y=arccos(x) >> y ′ = − 1 1 − x 2 y' = -\frac{1}{\sqrt{1-x^2}} y′=−1−x21
y = a r c s i n ( x ) y = arcsin(x) y=arcsin(x) >> y ′ = 1 1 − x 2 y' = \frac{1}{\sqrt{1-x^2}} y′=1−x21
y = a r c t a n ( x ) y = arctan(x) y=arctan(x) >> y ′ = 1 1 + x 2 y' = \frac{1}{1+x^2} y′=1+x21
y = a r c c o t ( x ) y = arccot(x) y=arccot(x) >> y ′ = − 1 1 + x 2 y' = -\frac{1}{1+x^2} y′=−1+x21