当前位置: 首页 > article >正文

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

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


左乘与右乘的区别

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 度。

总结

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

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

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

http://www.kler.cn/a/597850.html

相关文章:

  • The First Indoor Pathloss Radio Map Prediction Challenge
  • 数组作为哈希表的妙用:寻找缺失的第一个正数
  • TensorFlow面试题及参考答案
  • uniapp vue3使用uniapp的生命周期
  • 如何高效参与 GitHub 知名项目开发并成为核心贡献者
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例11,TableView15_11带分页的导出表格示例
  • SpringCloud构建一个服务步骤
  • 人机交互中的“分布式主体性”与“集中式整体性”
  • WebLogic中间件漏洞攻略
  • 关于极端场景下,数据库更新与 MQ 消息一致性保障方案的详细总结
  • 回顾Python基础语法,辨析和C++等的不同~
  • vue3怎么定义计算属性
  • Java中synchronized 和 Lock
  • 23种设计模式-创建型模式-抽象工厂
  • 数据结构(C\C++)——顺序表
  • C++::多态
  • 各软件快捷键
  • Unity-AI-Deepseek生成的生成模型代码
  • Matlab:二维绘图篇——plot绘图命令(二)
  • 编译原理——词法分析