主要包括机器人空间的位姿变换以及C++编程实现
说明:本文章中的大部分图片来自南开大学-人工智能学院的《机器人学导论》课件
空间的描述
1. 位置的描述(仅笛卡尔坐标系)
在一个笛卡尔坐标系 (Cartesian coordinate)下,可以用 3 维的位置矢量来确定该空间内任一点的位置
P
A
=
[
P
x
,
P
y
,
P
z
]
T
P^A=[P{x}, P{y}, P{z}]^T
PA=[Px,Py,Pz]T
其中,
P
x
,
P
y
,
P
z
P_x,P_y,P_z
Px,Py,Pz是
P
P
P 点在坐标系的三个坐标轴上坐标分量
2. 姿态的描述
注意:这里只以旋转矩阵和3维平移向量为例,欧拉角和四元数后面会介绍
旋转矩阵R:
R
B
A
=
[
X
B
A
,
Y
B
A
,
Z
B
A
]
R^A _B=[X^A _B, Y^A _B, Z^A _B]
RBA=[XBA,YBA,ZBA]
R
B
A
=
[
X
B
⋅
X
A
Y
B
⋅
X
A
Z
B
⋅
X
A
X
B
⋅
Y
A
Y
B
⋅
Y
A
Z
B
⋅
Y
A
X
B
⋅
Z
A
Y
B
⋅
Z
A
Z
B
⋅
Z
A
]
R^A _B=\begin{bmatrix} X_B\cdot X_A & Y_B\cdot X_A & Z_B\cdot X_A \\ X_B\cdot Y_A & Y_B\cdot Y_A & Z_B\cdot Y_A \\ X_B\cdot Z_A & Y_B\cdot Z_A & Z_B\cdot Z_A \end{bmatrix}
RBA=⎣⎡XB⋅XAXB⋅YAXB⋅ZAYB⋅XAYB⋅YAYB⋅ZAZB⋅XAZB⋅YAZB⋅ZA⎦⎤
旋转矩阵的性质:
- 正交矩阵: R B A = R A B − 1 = R A B T R^A _B={R^B _A}^{-1}={R^B _A}^{T} RBA=RAB−1=RABT
3. 位姿的描述
{ B } = { R B A , P B O R G A } \{B\}=\{R^A _B,P^A _{BORG}\} {B}={RBA,PBORGA} 其中, P B O R G A P^A _{BORG} PBORGA代表 B {B} B坐标系的原点在 A {A} A坐标系下的位置
空间的变化
1. 平移坐标系的映射
其中:
P
A
P^A
PA代表
{
A
}
\{A\}
{A}坐标系的原点在世界坐标系下的位置,
P
B
P^B
PB代表
{
B
}
\{B\}
{B}坐标系的原点在世界坐标系下的位置,
{
A
}
\{A\}
{A}和
{
B
}
\{B\}
{B}之间没有旋转关系,因此只是单纯的加上平移量就可以了。
2. 旋转坐标系的映射
旋转映射:
P
A
=
R
B
A
P
B
P^A=R^A _BP^B
PA=RBAPB
其中:
- R B A R^A _B RBA代表 { B } \{B\} {B}坐标系到 { A } \{A\} {A}坐标系之间的旋转变换
- R B A R^A _B RBA各列向量模均为1,并且这些单位矢量相互正交
3. 一般坐标系的映射
其中:
- P B P^B PB代表 在 { B } \{B\} {B}坐标系下 P P P点的位置, P A P^A PA代表 在 { A } \{A\} {A}坐标系下 P P P点的位置。
4. 齐次变换矩阵
其中:
- 它是坐标系的描述: T B A T^A _B TBA表示相对于坐标系 { A } \{A\} {A}的坐标系 { B } \{B\} {B}的齐次变换。(也就是坐标系 { B } \{B\} {B}变换到坐标系 { A } \{A\} {A}的变换)
5. 混合变换
第一种情况
已知
{
B
}
\{B\}
{B}坐标系到
{
A
}
\{A\}
{A}坐标系的变换
T
B
A
T^A _B
TBA,已知
{
C
}
\{C\}
{C}坐标系到
{
B
}
\{B\}
{B}坐标系的变换
T
C
B
T^B _C
TCB,求
{
C
}
\{C\}
{C}坐标系到
{
A
}
\{A\}
{A}坐标系的变换
T
C
A
T^A _C
TCA
第二种情况
已知
{
B
}
\{B\}
{B}坐标系到
{
A
}
\{A\}
{A}坐标系的变换
T
B
A
T^A _B
TBA,求
{
A
}
\{A\}
{A}坐标系到
{
B
}
\{B\}
{B}坐标系的变换
T
A
B
T^B _A
TAB
注意,这里的
P
A
O
R
G
B
P^B _{AORG}
PAORGB并不是单纯的加一个负号,而是等于
−
R
B
A
T
P
B
O
R
G
A
-{R^A _B}^TP^A _{BORG}
−RBATPBORGA
注意,在Eigen中,求反变换只需要运用函数inverse()就可以,这里介绍的只是一种简单的求解方法。
其他姿态描述方法
Z-Y-X 欧拉角
首先将坐标系
{
B
}
\{B\}
{B} 和一个已知参考坐标系
{
A
}
\{A\}
{A} 重合。先将
{
B
}
\{B\}
{B} 绕
Z
^
B
Ẑ_B
Z^B 旋转
α
α
α 角,绕
Y
^
B
Ŷ_B
Y^B 旋转
β
β
β 角,最后绕
X
^
B
X̂_B
X^B 旋转
γ
γ
γ 角。
注意:欧拉角是绕着旋转后的轴旋转的,不是固定轴
编程实现
注意:
- 以下编程示例均摘自Lio-mapping
- 编程语言:C++
- 调用库:Eigen
四元数和三维向量转换为Eigen::Transform
Eigen::Transform<T, 3, Eigen::TransformTraits::Affine> transform;
// 四元数先归一化才能描述旋转
transform.linear() = rot.normalized().toRotationMatrix();
transform.translation() = pos;