机器人的位姿变换左乘与右乘
对于机器人位姿变换,将变化量(变换矩阵)乘在当前位姿的左边和右边并不是完全一样的,它们的物理意义不同。具体效果取决于你要实现的操作——是相对于全局坐标系变换,还是相对于局部坐标系变换。
左乘与右乘的区别
1. 右乘(Local Transformation, 局部变换)
- 右乘表示在当前坐标系下应用变化量。
- 即变化量是在当前位姿(局部坐标系)中定义的。
公式表示:
T
new
=
T
current
⋅
Δ
T
T_{\text{new}} = T_{\text{current}} \cdot \Delta T
Tnew=Tcurrent⋅ΔT
- T current T_{\text{current}} Tcurrent:当前的位姿。
- Δ T \Delta T ΔT:变化量(在当前坐标系下)。
意义:
右乘表示变化量是相对于当前机器人自身的方向和位置的。例如:
- 如果机器人向前移动 1 米,这个“向前”是基于当前朝向。
2. 左乘(Global Transformation, 全局变换)
- 左乘表示在全局坐标系下应用变化量。
- 即变化量是在全局坐标系中定义的。
公式表示:
T
new
=
Δ
T
⋅
T
current
T_{\text{new}} = \Delta T \cdot T_{\text{current}}
Tnew=ΔT⋅Tcurrent
- ( \Delta T ):变化量(在全局坐标系下)。
- ( T_{\text{current}} ):当前的位姿。
意义:
左乘表示变化量是相对于全局坐标系的。例如:
- 如果全局坐标系中定义了一个固定的移动方向和距离(如沿世界坐标系 X 轴平移 1 米),那么无论机器人当前朝向如何,它都执行全局的变换。
几何直观理解
假设机器人当前的位姿 ( T_{\text{current}} ) 是:
T
current
=
[
R
t
0
1
]
T_{\text{current}} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}
Tcurrent=[R0t1]
右乘:局部变换
T new = T current ⋅ Δ T T_{\text{new}} = T_{\text{current}} \cdot \Delta T Tnew=Tcurrent⋅ΔT
- 变化量 ( \Delta T ) 是基于机器人当前坐标系的。
- 旋转或平移的效果依赖于机器人当前的朝向和位置。
左乘:全局变换
[
T_{\text{new}} = \Delta T \cdot T_{\text{current}}
]
- 变化量 ( \Delta T ) 是基于全局坐标系的。
- 旋转或平移的效果依赖于全局坐标系的方向,而与机器人的当前姿态无关。
示例分析
假设当前位姿 ( T_{\text{current}} ):
T
current
=
[
1
0
0
5
0
1
0
0
0
0
1
0
0
0
0
1
]
T_{\text{current}} = \begin{bmatrix} 1 & 0 & 0 & 5 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
Tcurrent=
1000010000105001
表示机器人位于 ( (5, 0, 0) ),面向 ( X ) 轴方向。
变化量 ( \Delta T ) 是沿 ( X ) 轴移动 3 米:
Δ
T
=
[
1
0
0
3
0
1
0
0
0
0
1
0
0
0
0
1
]
\Delta T = \begin{bmatrix} 1 & 0 & 0 & 3 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
ΔT=
1000010000103001
右乘:局部坐标系变换
T
new
=
T
current
⋅
Δ
T
=
[
1
0
0
5
0
1
0
0
0
0
1
0
0
0
0
1
]
⋅
[
1
0
0
3
0
1
0
0
0
0
1
0
0
0
0
1
]
⋅
=
[
1
0
0
8
0
1
0
0
0
0
1
0
0
0
0
1
]
T_{\text{new}} = T_{\text{current}} \cdot \Delta T = \begin{bmatrix} 1 & 0 & 0 & 5 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 3 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot= \begin{bmatrix} 1 & 0 & 0 & 8 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
Tnew=Tcurrent⋅ΔT=
1000010000105001
⋅
1000010000103001
⋅=
1000010000108001
结果:机器人移动到了 ( (8, 0, 0) )。
左乘:全局坐标系变换
T new = Δ T ⋅ T current = [ 1 0 0 3 0 1 0 0 0 0 1 0 0 0 0 1 ] ⋅ [ 1 0 0 5 0 1 0 0 0 0 1 0 0 0 0 1 ] ⋅ = [ 1 0 0 8 0 1 0 0 0 0 1 0 0 0 0 1 ] T_{\text{new}} = \Delta T \cdot T_{\text{current}} = \begin{bmatrix} 1 & 0 & 0 & 3 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 5 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot= \begin{bmatrix} 1 & 0 & 0 & 8 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Tnew=ΔT⋅Tcurrent= 1000010000103001 ⋅ 1000010000105001 ⋅= 1000010000108001
结果:同样移动到了 ( (8, 0, 0) )。
此时效果看似一致,但这仅适用于纯平移。在旋转的情况下,结果会明显不同。
旋转时的区别
假设变化量 ( \Delta T ) 是绕 ( Z ) 轴旋转 90 度:
Δ
T
=
[
0
−
1
0
0
1
0
0
0
0
0
1
0
0
0
0
1
]
\Delta T = \begin{bmatrix} 0 & -1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
ΔT=
0100−100000100001
右乘(局部旋转)
T new = T current ⋅ Δ T T_{\text{new}} = T_{\text{current}} \cdot \Delta T Tnew=Tcurrent⋅ΔT
- 表示机器人在其当前坐标系中绕 ( Z ) 轴旋转 90 度。
左乘(全局旋转)
T new = Δ T ⋅ T current T_{\text{new}} = \Delta T \cdot T_{\text{current}} Tnew=ΔT⋅Tcurrent
- 表示机器人在全局坐标系中绕全局的 ( Z ) 轴旋转 90 度。
总结
- 右乘(局部变换): 用于机器人在自身参考系中移动或旋转。
- 左乘(全局变换): 用于机器人基于全局参考系进行移动或旋转。
根据场景选择合适的乘法顺序是关键:
- 若变化量是相对于全局定义的,用左乘。
- 若变化量是相对于当前姿态定义的,用右乘。