【Matlab 六自由度机器人】关于旋转的参数化的相关问题
往期回顾
【主线】
【补充说明】
前言
在本文中,将推导三种方式来表达任意旋转,其中每种方式仅需三个独立变量:欧拉角表示法、姿态角表示法(滚动-俯仰-偏航)及四元数表示法(转轴/角度)。
以下是本篇文章正文内容,包含对欧拉角表示法、滚动-俯仰-偏航表示法及转轴/角度表示法定义的理解和相关代码的分步解析。
正文
一、欧拉角(Euler-angle)表示法
1. 定义
表示旋转矩阵的一种常用方法是使用欧拉角,其中有三个独立变量。考虑固定坐标系
o
0
x
0
y
0
z
0
o_0x_0y_0z_0
o0x0y0z0,以及旋转后的坐标系
o
1
x
1
y
1
z
1
o_1x_1y_1z_1
o1x1y1z1。
我们可以使用三个欧拉角(
ϕ
,
θ
,
ψ
\phi,\theta,\psi
ϕ,θ,ψ)来表示坐标系
o
1
x
1
y
1
z
1
o_1x_1y_1z_1
o1x1y1z1相对于坐标系
o
0
x
0
y
0
z
0
o_0x_0y_0z_0
o0x0y0z0的姿态,它们通过下列三个连续旋转得到。首先,绕当前
z
z
z轴旋转角度
ϕ
\phi
ϕ。然后,绕当前
y
y
y轴旋转角度
θ
\theta
θ。最后,绕当前
z
z
z轴旋转角度
ψ
\psi
ψ。
注意!
这里的旋转均是绕旋转后的坐标系来进行旋转
根据上述描述的旋转,列出以下旋转的对应矩阵。
R
z
,
ϕ
=
[
c
o
s
ϕ
−
s
i
n
ϕ
0
s
i
n
ϕ
c
o
s
ϕ
0
0
0
1
]
R_{z,\phi}= \left[ \begin{matrix} cos\phi& -sin\phi & 0 \\ sin\phi & cos\phi & 0\\ 0 & 0& 1\\ \end{matrix} \right] \\
Rz,ϕ=⎣⎡cosϕsinϕ0−sinϕcosϕ0001⎦⎤
R
y
,
θ
=
[
c
o
s
θ
0
s
i
n
θ
0
1
0
−
s
i
n
θ
0
c
o
s
θ
]
R_{y,\theta}= \left[ \begin{matrix} cos\theta & 0 & sin\theta \\ 0 & 1& 0\\ -sin\theta & 0& cos\theta \\ \end{matrix} \right] \\
Ry,θ=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
R
z
,
ψ
=
[
c
o
s
ψ
−
s
i
n
ψ
0
s
i
n
ψ
c
o
s
ψ
0
0
0
1
]
R_{z,\psi}= \left[ \begin{matrix} cos\psi& -sin\psi & 0 \\ sin\psi & cos\psi & 0\\ 0 & 0& 1\\ \end{matrix} \right] \\
Rz,ψ=⎣⎡cosψsinψ0−sinψcosψ0001⎦⎤通过上述的矩阵按右乘的顺序来进行乘积,得到旋转变换后的旋转矩阵为:
R
Z
Y
Z
=
R
z
,
ϕ
R
y
,
θ
R
z
,
ψ
=
[
c
o
s
ϕ
∗
c
o
s
ψ
∗
c
o
s
θ
−
s
i
n
ϕ
∗
s
i
n
ψ
−
c
o
s
ψ
∗
s
i
n
ϕ
−
c
o
s
ϕ
∗
c
o
s
θ
∗
s
i
n
ψ
c
o
s
ϕ
∗
s
i
n
θ
c
o
s
ϕ
∗
s
i
n
ψ
+
c
o
s
ψ
∗
c
o
s
θ
∗
s
i
n
ϕ
c
o
s
ϕ
∗
c
o
s
ψ
−
c
o
s
θ
∗
s
i
n
ϕ
∗
s
i
n
ψ
s
i
n
ϕ
∗
s
i
n
θ
−
c
o
s
ψ
∗
s
i
n
θ
s
i
n
ψ
∗
s
i
n
θ
c
o
s
θ
]
R_{ZYZ}=R_{z,\phi}R_{y,\theta}R_{z,\psi}= \left[ \begin{matrix} cos\phi*cos\psi*cos\theta - sin\phi*sin\psi& - cos\psi*sin\phi - cos\phi*cos\theta*sin\psi& cos\phi*sin\theta \\ cos\phi*sin\psi + cos\psi*cos\theta*sin\phi& cos\phi*cos\psi - cos\theta*sin\phi*sin\psi& sin\phi*sin\theta \\ -cos\psi*sin\theta&sin\psi*sin\theta&cos\theta \\ \end{matrix} \right] \\
RZYZ=Rz,ϕRy,θRz,ψ=⎣⎡cosϕ∗cosψ∗cosθ−sinϕ∗sinψcosϕ∗sinψ+cosψ∗cosθ∗sinϕ−cosψ∗sinθ−cosψ∗sinϕ−cosϕ∗cosθ∗sinψcosϕ∗cosψ−cosθ∗sinϕ∗sinψsinψ∗sinθcosϕ∗sinθsinϕ∗sinθcosθ⎦⎤
方程中的矩阵
R
Z
Y
Z
R_{ZYZ}
RZYZ被称为
Z
Y
Z
ZYZ
ZYZ欧拉角变换。
2. 代码解析(含实例)
代码如下:
syms phi theta psi
R1 = rotz(phi)*roty(theta)*rotz(psi);
由于需要使用
t
r
p
l
o
t
trplot
trplot 函数来将旋转可视化,因此在这里设欧拉角
ϕ
θ
ψ
\phi\theta\psi
ϕθψ的角度均为
p
i
/
6
pi/6
pi/6。
R
0
R_0
R0为参考系矩阵,
R
1
R_1
R1以
R
0
R_0
R0为参考系矩阵,做
R
z
,
π
/
6
R
y
,
π
/
6
R
z
,
π
/
6
R_{z,\pi/6}R_{y,\pi/6}R_{z,\pi/6}
Rz,π/6Ry,π/6Rz,π/6的旋转。
syms phi theta psi
R0 = rotz(0);
R1 = rotz(pi/6)*roty(pi/6)*rotz(pi/6);
trplot(R0,'color','r','frame','0')
hold on
trplot(R1,'color','b','frame','1')
得到结果如下:
二、姿态角(RPY)表示法
滚动(roll)-俯仰(pitch)-偏航(yaw)表示法
1. 定义
旋转矩阵 R R R也可以被描述为按特定次序进行的一系列关于主坐标轴 x 0 、 y 0 和 z 0 x_0、y_0和z_0 x0、y0和z0轴旋转的产物。这些旋转决定了滚动(roll)、俯仰(pitch)、偏航(yaw) 角度,在这里我们将定义以下规则。
- 绕 z 0 z_0 z0 轴旋转的 ϕ \phi ϕ角度的动作称为滚动(roll)
- 绕 y 0 y_0 y0 轴旋转的 θ \theta θ角度的动作称为俯仰(pitch)
- 绕 x 0 x_0 x0 轴旋转的 ψ \psi ψ角度的动作称为偏航(yaw))
我们指定旋转按照
x
−
y
−
z
x-y-z
x−y−z的顺序进行,换言之,首先绕
x
0
x_0
x0轴旋转角度
ψ
\psi
ψ,然后绕
y
0
y_0
y0 轴旋转角度
θ
\theta
θ。最后,绕
z
0
z_0
z0 轴旋转角度
ϕ
\phi
ϕ。
注意!
这里的旋转均是绕固定坐标系
o
0
x
0
y
0
z
0
o_0x_0y_0z_0
o0x0y0z0来进行旋转
根据上述描述的旋转,列出以下旋转的对应矩阵。
R
z
,
ϕ
=
[
c
o
s
ϕ
−
s
i
n
ϕ
0
s
i
n
ϕ
c
o
s
ϕ
0
0
0
1
]
R_{z,\phi}= \left[ \begin{matrix} cos\phi& -sin\phi & 0 \\ sin\phi & cos\phi & 0\\ 0 & 0& 1\\ \end{matrix} \right] \\
Rz,ϕ=⎣⎡cosϕsinϕ0−sinϕcosϕ0001⎦⎤
R
y
,
θ
=
[
c
o
s
θ
0
s
i
n
θ
0
1
0
−
s
i
n
θ
0
c
o
s
θ
]
R_{y,\theta}= \left[ \begin{matrix} cos\theta & 0 & sin\theta \\ 0 & 1& 0\\ -sin\theta & 0& cos\theta \\ \end{matrix} \right] \\
Ry,θ=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
R
x
,
ψ
=
[
1
0
0
0
c
o
s
ψ
−
s
i
n
ψ
0
s
i
n
ψ
c
o
s
ψ
]
R_{x,\psi}= \left[ \begin{matrix} 1& 0 & 0 \\ 0 & cos\psi & -sin\psi\\ 0 & sin\psi& cos\psi\\ \end{matrix} \right] \\
Rx,ψ=⎣⎡1000cosψsinψ0−sinψcosψ⎦⎤通过上述的矩阵按左乘的顺序来进行乘积,得到旋转变换后的旋转矩阵为:
R
=
R
z
,
ϕ
R
y
,
θ
R
x
,
ψ
=
[
c
o
s
ϕ
∗
c
o
s
θ
c
o
s
ϕ
∗
s
i
n
ψ
∗
s
i
n
θ
−
c
o
s
ψ
∗
s
i
n
ϕ
s
i
n
ϕ
∗
s
i
n
ψ
+
c
o
s
ϕ
∗
c
o
s
ψ
∗
s
i
n
θ
c
o
s
θ
∗
s
i
n
ϕ
c
o
s
ϕ
∗
c
o
s
ψ
+
s
i
n
ϕ
∗
s
i
n
ψ
∗
s
i
n
θ
c
o
s
ψ
∗
s
i
n
ϕ
∗
s
i
n
θ
−
c
o
s
ϕ
∗
s
i
n
ψ
−
s
i
n
θ
c
o
s
θ
∗
s
i
n
ψ
c
o
s
ψ
∗
c
o
s
θ
]
R=R_{z,\phi}R_{y,\theta}R_{x,\psi}= \left[ \begin{matrix} cos\phi*cos\theta& cos\phi*sin\psi*sin\theta - cos\psi*sin\phi& sin\phi*sin\psi + cos\phi*cos\psi*sin\theta \\ cos\theta*sin\phi& cos\phi*cos\psi + sin\phi*sin\psi*sin\theta& cos\psi*sin\phi*sin\theta - cos\phi*sin\psi \\ -sin\theta&cos\theta*sin\psi&cos\psi*cos\theta \\ \end{matrix} \right] \\
R=Rz,ϕRy,θRx,ψ=⎣⎡cosϕ∗cosθcosθ∗sinϕ−sinθcosϕ∗sinψ∗sinθ−cosψ∗sinϕcosϕ∗cosψ+sinϕ∗sinψ∗sinθcosθ∗sinψsinϕ∗sinψ+cosϕ∗cosψ∗sinθcosψ∗sinϕ∗sinθ−cosϕ∗sinψcosψ∗cosθ⎦⎤
2. 代码解析(含实例)
代码如下:
syms phi theta psi
R2 = rotz(phi)*roty(theta)*rotx(psi);
三、四元数(axis/angle)表示法(未完待续)
转轴/角度(axis/angle)表示法
1. 定义
旋转并不总是关于主坐标轴而进行的。我们通常感兴趣的是关于空间中某任意轴线的旋转,这不仅提供了一种描述旋转的简便方法,并且提供了对于旋转矩阵的另一种参数化方法。
令
k
=
[
k
x
,
k
y
,
k
z
]
T
k=[k_x,k_y,k_z]^{T}
k=[kx,ky,kz]T表示坐标系
o
0
x
0
y
0
z
0
o_0x_0y_0z_0
o0x0y0z0内的一个单位向量,它定义了一个转轴,在此推导旋转矩阵
R
k
,
θ
R_{k,\theta}
Rk,θ来表示关于次轴线的转角为
θ
\theta
θ的旋转。
2. 代码解析(含实例)
在MATLAB中使用
q
u
a
t
e
r
n
i
o
n
quaternion
quaternion 函数来实现坐标系绕任意轴线旋转。
代码如下:
参考Quaternion
总结
以上就是关于旋转的参数化(欧拉角、姿态角、四元数)的内容,本文详细介绍了如何理解欧拉角、姿态角、四元数,提供了代码辅助理解旋转的参数化的特性。