monoslam融合里程计版

实验环境

实验采用车载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_vectorxyz 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序列12345678910111213
c/c++序列0123456789101112

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),12(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),12(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^t1P1Q^t2P2Q^t3P3Q^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^t3P4Q^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^t1P3Q^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^t2P3Q^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),12(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),12(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^t1P1Q^t2P2Q^t3P3Q^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^t3P4Q^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^t1P3Q^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^t2P3Q^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),12(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),12(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^t1P1Q^t2P2Q^t3P3Q^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^t3P4Q^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^t1P3Q^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^t2P3Q^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)14(Q^t1Q^t3)2 2Q^t10δtranssin(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t1P1P2P3P4Δtδtranscos(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t10Δtδtranssin(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t1000000P2P1P4P3000000δtranscos(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t30δtranssin(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t3P3P4P1P2Δtδtranscos(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t30Δtδtranssin(arcsin(2(Q^t1Q^t3))+δrot1)14(Q^t1Q^t3)2 2Q^t3000000P4P3P2P1000000000000000000000000000000000000000000000000000000000000000000000000000000000000


根据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)0000P2P1P4P3000000000P3P4P1P2000000000P4P3P2P1000000000000000000000000000000000000000000000000000000000000000000000000000000000000


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=q1p1q2p2q3p3q4p4q2=q1p2+q2p1+q3p4q4p3q3=q1p3q2p4+q3p1+q4p2q4=q1p4+q2p3q3p2+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=1x2 1

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=1x2 1

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值