机器人的位姿变换左乘与右乘

对于机器人位姿变换,将变化量(变换矩阵)乘在当前位姿的左边右边并不是完全一样的,它们的物理意义不同。具体效果取决于你要实现的操作——是相对于全局坐标系变换,还是相对于局部坐标系变换。


左乘与右乘的区别

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=ΔTTcurrent

  • ( \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=ΔTTcurrent= 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= 0100100000100001

右乘(局部旋转)

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=ΔTTcurrent

  • 表示机器人在全局坐标系中绕全局的 ( Z ) 轴旋转 90 度。

总结

  • 右乘(局部变换): 用于机器人在自身参考系中移动或旋转。
  • 左乘(全局变换): 用于机器人基于全局参考系进行移动或旋转。

根据场景选择合适的乘法顺序是关键:

  • 若变化量是相对于全局定义的,用左乘。
  • 若变化量是相对于当前姿态定义的,用右乘。

你可能感兴趣的:(机器人,算法,人工智能)