心得记录

变换矩阵的左乘和右乘的运动解释是不同的:变换顺序「从右向左」,指明运动是相对固定坐标系而言的;变换顺序「从左向右」,指明运动是相对运动坐标系而言的

结论:相对 基准坐标系 做变换是左乘,相对 当前坐标系 做变换是右乘

左乘和右乘的概念

存在一坐标系{A},坐标系{A}进行齐次坐标变换,得到{B},此时的变换矩阵 TBAT_B^ATBA​;坐标系{B}再进行一次齐次坐标变换,得到{C}, 此时的变换矩阵为 TCA=TCBTBAT_C^A = T_C^BT_B^ATCA​=TCB​TBA​ 时称为左乘,为 TCA=TBATCBT_C^A = T_B^AT_C^BTCA​=TBA​TCB​ 时称为右乘。

变换矩阵的由来

坐标系{A}中的一矢量 ppp,记此时 ppp 为 p0p_0p0​(p0p_0p0​ 与坐标系{A}固连);p0p_0p0​经过坐标系{A}的变换得到坐标系{B}后,相应的得到一个新位置,记此时 ppp 为 p1p_1p1​(p1p_1p1​ 与坐标系{B}固连,注意 p1p_1p1​ 在坐标系{B}中的坐标值就是 p0p_0p0​);p1p_1p1​经过坐标系{B}的变换得到坐标系{C}后,也相应的得到一个新位置,记此时 ppp 为 p2p_2p2​(p2p_2p2​ 与坐标系{B}固连,注意 p2p_2p2​ 在坐标系{B}中的坐标值也是 p0p_0p0​)。

变换矩阵 TBAT_B^ATBA​ 的含义是坐标系{A}变换到坐标系{B}的变换矩阵(并没有提到变换的方式),但这里有一个问题(左乘和右乘区别的来源):TBAT_B^ATBA​ 是怎么计算的?——TBA=[RBAPBoA01]T_B^A = \left[ \begin{matrix} R_B^A & P_{B_o}^A \\\ 0 & 1\end{matrix} \right]TBA​=[RBA​ 0​PBo​A​1​],其中的 RBAR_B^ARBA​ 与 PBoAP_{B_o}^APBo​A​ 的计算直接导致了左乘和右乘。

以旋转矩阵为例,在坐标系{B}变换到坐标系{C}的过程中,RBA=Rot(x,θ)R_B^A = Rot(x,\theta)RBA​=Rot(x,θ) 中 xxx 的来源(坐标系{A}?坐标系{B}?)

现给出 p1=Rot(x,θ)p0p_1 = Rot(x, \theta) p_0p1​=Rot(x,θ)p0​(没有进行平移变换),其中 x 轴是指坐标系{A}中的 x 轴。

注意上式中各个变量的意义:

  • p1p_1p1​:矢量 ppp 变换后的坐标
  • p0p_0p0​:矢量 ppp 变换前的坐标(原坐标)
  • Rot(x,θ)Rot(x, \theta)Rot(x,θ):以矢量 p0p_0p0​(原坐标)所在的坐标系的轴为旋转轴进行旋转(角度为 θ\thetaθ)

也就是说 TBAT_B^ATBA​ 的基准坐标系是 坐标系{A}(原坐标系)

左乘与右乘

  1. 坐标系{B}变换到坐标系{C},变换基准是坐标系{A}

变换前 ppp 在{A}中的坐标为 p1p_1p1​,变换后 ppp 在{A}中的坐标为 p2p_2p2​,得到

p2=TCBp1p_2 = T_C^B p_1p2​=TCB​p1​

因此有

p2=TCAp1=TCB(TBAp0)=TCBTBAp0p_2 = T_C^A p_1 = T_C^B (T_B^A p_0) = T_C^B T_B^A p_0p2​=TCA​p1​=TCB​(TBA​p0​)=TCB​TBA​p0​
==> TCA=TCBTBAT_C^A = T_C^B T_B^ATCA​=TCB​TBA​(左乘)

  1. 坐标系{B}变换到坐标系{C},变换基准是坐标系{B}

变换前 ppp 在{B}中的坐标为 p1Bp_1^Bp1B​,变换后 ppp 在{B}中的坐标为 p2Bp_2^Bp2B​,得到

p2B=TCBp1Bp_2^B = T_C^B p_1^Bp2B​=TCB​p1B​

现在来看 p1B,p2Bp_1^B,p_2^Bp1B​,p2B​ 与 p0,p1,p2p_0, p_1, p_2p0​,p1​,p2​ 之间的关系

p1B=p0p_1^B = p_0p1B​=p0​

p2=TBAp2Bp_2 = T_B^A p_2^Bp2​=TBA​p2B​

因此有
{p2=TBAp2B=TBA(TCBp1B)=TBA(TCBp0)=TBATCBp0p2=TCAp0\left\{ \begin{array}{l} p_2 = T_B^A p_2^B = T_B^A (T_C^B p_1^B) = T_B^A (T_C^B p_0) = T_B^A T_C^B p_0 \\ p_2 = T_C^A p_0 \end{array} \right. {p2​=TBA​p2B​=TBA​(TCB​p1B​)=TBA​(TCB​p0​)=TBA​TCB​p0​p2​=TCA​p0​​

==> TCA=TBATCBT_C^A = T_B^AT_C^BTCA​=TBA​TCB​(右乘)

关于一些细节的说明

  • 教材《机器人学基础》里的 齐次变换矩阵 是在 2.3齐次坐标变换 中提出来的,但我个人认为齐次坐标矩阵只是齐次坐标变换问题的求解工具,而齐次变换矩阵本身的求解需要依靠坐标系变换(即上文内容)。
  • 关于变换矩阵的求解使用的是单独的矢量而不是坐标系的原因:请注意求解过程中矢量本身的值对求解过程并无作用(即矢量可以是任意值),而且,坐标系的本质也是一组基向量,所以可以直接将对坐标系的操作和这个对矢量的操作等同。

一些碎碎念

  • 一些零碎的吐槽记录

首先是最现实的解题:题目中常常会出现对于一个给定的点 ppp 问其在另一个坐标系中的坐标。这种问题也就是上面提到过的齐次坐标变换中提出的最核心的问题,但是这里面一点和上文有着极大的不同:ppp 是不会变的!这让我对本文方法求解出的齐次变换矩阵求解这种题时相当的迷惑
另外就是这本书中对于左乘和右乘并没有详细解释,唯一的说明就是本文开头的运动解释……好像也够做题了……
最后要吐槽的一个大的问题就是:关于左乘和右乘有一种说法:矢量问题是左乘,坐标系问题是右乘。刚开始变换矩阵的时候,这句话让我烦恼了两天……

如有错误欢迎指正

机器人学基础–左乘和右乘相关推荐

  1. 机器人学基础(1)-位置运动学-正运动学、逆运动学方程建立及其求解

    机器人学基础(1)位置运动学:正运动学.逆运动学方程建立及其求解 机器人学基础学了个知识框架入门,以此来写一下总结笔记,便于以后要用到相关知识点进行翻阅. 本次机器人学基础笔记主要分为几个章节:位置运 ...

  2. oracle in的用法_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法

    Oracle中的连接可分为,内连接(INNER JOIN).外连接(OUTER JOIN).全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式. Oracle ...

  3. 【杂谈】野生在左 科班在右——数据结构学习誓师贴

    [杂谈]野生在左 科班在右--数据结构学习誓师贴 一. 科班 Vs 野生 这个老生常谈的问题让很多野生码农觉得不公平,在一次次面试中因为学历和那些工作中根本就用不到的知识虐的一脸懵逼,然后除了抱怨什么 ...

  4. c++中的左值与右值

    转载自 http://www.cnblogs.com/catch/p/3500678.html 左值 (lvalue)和右值 (rvalue) 是 c/c++ 中一个比较晦涩基础的概念,有的人可能甚至 ...

  5. c语言 变量的左值和右值,C++雾中风景10:聊聊左值,纯右值与将亡值

    C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...

  6. 内连接,外链接(左连接、右连接、全连接),交叉连接大总结

    转载自 内连接,外链接(左连接.右连接.全连接),交叉连接大总结 1.什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 2.分类: 首先划分 ...

  7. oracle 建表id自增长_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法...

    Oracle中的连接可分为,内连接(INNER JOIN).外连接(OUTER JOIN).全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式. Oracle ...

  8. C++ 右值引用 | 左值、右值、move、移动语义、引用限定符

    文章目录 C++11为什么引入右值? 区分左值引用.右值引用 move 移动语义 移动构造函数 移动赋值运算符 合成的移动操作 小结 引用限定符 规定this是左值or右值 引用限定符与重载 C++1 ...

  9. Oracle左连接、右连接、全外连接以及(+)号用法

    1.准备工作 Oracle  外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/F ...

  10. js判断手指的上滑,下滑,左滑,右滑,事件监听

    2019独角兽企业重金招聘Python工程师标准>>> 原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmo ...

最新文章

  1. python rjust() 方法 与 ljust()方法 的使用
  2. PCL:点云特征描述子3D_object_recognition_(descriptors)
  3. ORB + OPENCV
  4. RESTful 架构基础
  5. Javascript绘图
  6. 北京小伙用AI修复100年前的京城老视频爆火网络,作者:7天完成,颜色还有不足...
  7. iOS 取四舍五入取平均值
  8. 关于域帐户将计算机加入域登陆上限问题
  9. 在tomcat上全手工部署Servlet3.0
  10. JZOJ 3427. 归途与征程
  11. 同态滤波 matlab代码,同态滤波处理光照不均匀图像Matlab代码
  12. vue resource的应用
  13. uniCloud开发公众号:一、接收、解析、组装xml消息
  14. 我的专业计算机作文说明文,我的电脑作文说明文
  15. idea 如何将本地新建项目上传到gitlab
  16. 4.5 拉普拉斯定理
  17. 深度解读《关于防范NFT相关金融风险倡议》透露哪些监管信号与数字藏品新发展之路?
  18. 信息系统项目管理师 - 信息系统项目管理基础
  19. 【历史上的今天】8 月 5 日:微信 5.0 发布;百度上市;LinkedIn 创始人诞生
  20. 2018互联网月饼哪家强?阿里有情怀、腾讯最实在、咪咕最暖萌、联想最简单粗暴......

热门文章

  1. IPOP-CMA-ES:一种重启CMA-ES
  2. 关于重装系统后,电脑出现提示许可证过期的解决方案
  3. 使用Jep在Java中执行Python代码
  4. TOGAF9.2企业架构师考试小记
  5. C语言小案例_OA大典案例摘录【第1374篇】| 异常色块 规则 合集 | 爱普生喷墨打印机...
  6. 掘金 MySQL 小册的艰辛创作历程
  7. 嵌入式软件工程师经典面试题
  8. 免费中文Python电子书
  9. 机器学习的十大经典算法,面试必问
  10. Pycharm汉化包+操作步骤