【现代机器人学】学习笔记二:刚体运动

news2024/12/26 10:43:01

这一节内容最开始在学之前是有些不屑的,这些坐标变换的内容天天都在玩,有什么复杂的?高翔博士的14讲貌似讲这些内容只用了几页。 不过认真一读才发现自己自大肤浅了。

之前我在北大研究院的时候,有一个实验室双聘的浙农林的老师,讲机器人尤其是机械臂相关内容的时候,经常提到旋量这一概念。不过我当时主要做机器人导航,主要做一些避障规划定位的事情,讲实话他讲的内容我听不太懂。只知道这个内容基本就是slam里面的齐次变换的李代数,但为什么有旋量这个名字,又具体怎么用它,我自己不是很清楚。当时其实我也尝试着自己网上搜索过,网上的资料太散了,看的云里雾里,不明就里。后来因为跳槽等其他琐事,就没再继续下去。

不过学完这一章,也算是把包括旋量在内的整个刚体运动的不同表示形式了然于心了,而不仅仅是两个矩阵下标相同就合并这么简单。

接下来我会主要着重写一些我在学习时认为的“新东西”,如果有也是做过SLAM,目前希望在机械臂控制上进行一些学习深入的朋友,相信这篇文章能带给你一些参考。


目录

旋转运动

矩阵约束

简单的旋转直接手写旋转矩阵

有两点非常重要的内容:

 角速度

指数坐标表示

其他旋转表示:

欧拉角(Euler angles ):

Roll-pitch-yaw Angles :

四元数:

齐次变换

简单的齐次变换直接手写齐次矩阵:

左乘右乘:

运动旋量定义

​编辑 力旋量

运动旋量的螺旋释义

 指数坐标与矩阵对数


旋转运动

矩阵约束

熟悉的表示形式,用矩阵R来表示,R的行列式为1,还是正交矩阵。R本身是有9个参数的,但是实际上它却只有3个参数是独立的,这是因为有六个约束:分别是每一列的元素平方和为1(3个),列向量两两正交(3个),因此就是6个约束。

有些人可能会讲了,行列式为1这个约束还没用到呢?这是因为行列式其实可以是正负1,这6个约束可以推导出行列式为正负一。而限制了行列式为1,是人为设定的,这样满足右手坐标系。实际上-1也可以,满足的是左手坐标系。所以不会影响它有3个参数是独立的这个条件。

简单的旋转直接手写旋转矩阵

slam的初学者容易忘记R中元素的含义,误以为这就是一个黑盒子矩阵,那么放两个简单的旋转让他写一个旋转矩阵,他就写不出来。(面试的时候遇到过这样的同学)

 上图如果把a坐标系当作固定坐标系,那么b在a下面的表示就是:

这主要按列来看,xb和a坐标系的y轴正方向一致,所以Rb的第一列就是(0,1,0),多出的那个1就代表了a坐标系的y轴。yb和a坐标系的x轴正方向相反,所以Rb的第二列就是(-1,0,0),-1出现在第一位对应a坐标系的x轴,-1代表反向。z轴同理。

 3.R可以表示姿态,也可以表示对参考坐标系的变换,也可以表示旋转某一个向量或者坐标系。

有两点非常重要的内容:

(1)对于一个Rsb,如果再来一个R左乘,R*Rsb代表在s系下进行旋转。如果R是右乘,Rsb*R代表在body系下进行旋转。

(2)绕单轴旋转,对应的矩阵:绕x轴,则R_{00}位是1,绕y轴则是R_{11}位是1,绕z轴则是R_{12}位是1。那么以它为中心画十字,十字的其他地方是0。

那么剩下的地方,填cos和sin。

但这里有一个不一样的!就是绕y的运动:

看起来绕y的运动,从对角线元素变号了。

这点我记得有个新来的学弟问我,不就绕轴旋转吗,难道绕的x还是y,有什么分别?

很多地方没写,也没讲为什么绕y轴的旋转矩阵公式不一样。

这当然是有分别的 ,随手画一个坐标系:

绕某个轴旋转意味着剩下的那两个轴构成一个平面,这里遵守右手坐标系,即横坐标向右,纵坐标向上。

另外我们再限制一下,假如xyz有个优先级,横坐标的优先级要低于纵坐标优先级。

从现在这个视角看过去,如果去掉x轴,剩下的y和z,看起来是横坐标是y,纵坐标是z。

去掉z轴,那么横坐标是x,纵坐标是y。

但是去掉y就不一样了,剩下一个x和z,x是向左的,z是向上的。那么这里变成一个左手坐标系了,所以y比较独特,不能按照原先的公式来算。

 角速度

 

这个图比较关键,后续的一切推导均是从此图而来。

内容其实比较简单,绕轴w的运动叉乘xyz坐标轴,可以得到xyz轴的瞬时变化速度。那么这个东西其实就是旋转矩阵的导数。

 然后分别套用叉乘的反对称写法w \times R=[w]R,然后再套用伴随性质R[w]R^T=[Rw],最后就合并出两个公式:

这个公式看起来有点难记,实际上也简单,就是一个R的导数和R的逆矩阵乘起来得到一个角速度的反对称表示。和R_{sb} 一样,表示导数的\dot{R}在左边,就是得到ws,在右边就是wbody,以此辅助记忆。

指数坐标表示

指数坐标的推出还是从上面那个式子\dot{R}=[w]R得到,这个公式无形之中就长得像一个线性常微分方程这个内容我记得是大一上学期高等数学(上)最后一章的基础内容,当时印象里学的是云里雾里的,算了一堆特解通解的,也不晓得有什么用。这下派上用场了。

这个方程的含义就是,告诉你一个函数和它的导数的关系,你就可以把函数的表达式写出来。

那么这个方程的通解是:x(t)=e^{At}x_0,其中x0是初始条件。(顺便提一嘴,只要x(t)是这个表达式的样子,解就是这个形式。但是不同的x(t),事实上x0不是同一个数,所以有的地方这里也用常数C来代替,但不意味着任何C都可以,不同的x(t)对应的C是不同的)

那么在 \dot{R}=[w]R 这里呢,A就是那个[w],x就是R,因此可以得到一个R的表达式:R=e^{[w]t},至于x0这个初始条件,对于旋转初始当然是单位阵,所以就是矩阵I,那么就这样得到了旋转矩阵的坐标表示形式。

R=e^{[w]t}, 书里为什么不用t,而是用的是\theta? 即R=e^{[w]\theta} ?

这就涉及到w和theta的含义了。可以理解为绕w轴转theta,也可以理解理解为在单位时间运动w*theta,也可以理解为在theta时间运动w,所以theta虽然是个绕\hat{w}转动的角度,也可以代入到公式里当作时间看。

这个东西怎么计算呢?这里套用了高等数学中的矩阵指数,一顿化简,最后得到罗德里格斯公式:

 

有的地方不这样写,比如在高翔博士的slam书里:

其实到底这个公式长什么样我完全不在意,因为平时我也压根不会自己写轮子去变换。所以我在面试的时候不会去问求职者,罗德里格斯公式怎么写,但是我会问他,罗德里格斯公式描述了谁和谁之间的变换?他需要答出来这个是旋转轴、角度 与 旋转矩阵的变换。

那么相反的过程,就是矩阵对数了:

这就不太唯一了,我把它列在这里以供查询,我不会尝试去记忆这个公式: 

如果R是单位阵,θ是0,旋转轴w可以任意。

否则:

 

 我只会记住R是单位阵,则w无所谓,R的迹是-1是多解的特殊情况。


其他旋转表示:

欧拉角(Euler angles ):

绕各个轴的运动,是在body系下的。所以是按照顺序右乘。(即按照转完以后的坐标系来转)

转的方式有两种,一种是三个转轴都不同,有六种,代表性的是ZYX转。另一种是第一个轴和第三个轴相同,同样也是六种,代表性的是ZYZ转。

不同的转法,和旋转矩阵R的变换关系也不一样,所以这里略过,反正平时也用不到。现用现查好了。

奇异性问题(万向锁):

当β是90度的时候,左边那个机构的X轴实际上和Z轴共线了,转来转去也不会多一个自由度,这时候一个3自由度的机构就坍缩为了二自由度的结构,会导致奇异问题。

实际上轴角表示法都有这样的问题,只有旋转矩阵和四元数表示法不会有这样的问题。

Roll-pitch-yaw Angles

这个是在space系下转的,每次沿着space固定系的X,Y,Z轴旋转。

因为是绕space转,因此左乘。那么乘下来的结果,和body系下的ZYX是一样的。

即:ZYXI  =  I ZYX。

四元数:

这里借鉴加州大学滕瀚哲老师的课件。

一个实部,三个虚部。

有一些性质,重点如下:

1.q和-q代表相同的旋转。

2.和w与θ方便转换:

那这里为什么是θ/2呢?

这是因为,想尽量避免奇异性的问题。我们根据上面的公式可以看出来,如果绕的w轴只有两个数。例如(1,1,0),即沿着xy平面的一条直线转,那么q的最后一维q3就没有数字。

那么把q0,q1,q2画出来,对于180度的情况(南极,对应q是(180,0,0,0)),如果沿着q1走到南极,和沿着q2走到南极,到达的是相同的点。但是实际上沿着x轴转180和沿着y轴转180完全是不一样的。

所以把q0的单位设置为θ/2,那么南极是360度,所以绕x或者y都是一样的。


齐次变换

 齐次变换是在旋转的基础上加了平移。它和旋转的知识点基本上是很像的,可以对应学习。

简单的齐次变换直接手写齐次矩阵:

旋转部分按照上面的方法手写,平移部分看新坐标系原点在旧坐标系下的位置。

值得注意:对于齐次变换,求逆矩阵,可以通过如下方式快速求逆,节省计算时间:

左乘右乘:\dot{T}

和旋转部分一样,有一个Tsb,左乘T,即T*Tsb代表在s系下的变换,右乘即Tsb*T代表在body系下的变换。

运动旋量定义

和上面旋转部分的一样:

R_{sb} 一样,表示导数的\dot{R}在左边,就是得到ws,在右边就是wbody,以此辅助记忆。

 那么这里的\dot{T} 和 T 相乘,也是同样的规矩:

T^{-1}\dot{T}=\begin{pmatrix}[w_b]=R^{T}\dot{R} &v_b=R^T\dot{p} \\ 0 &0 \end{pmatrix}

\dot{T}T^{-1}=\begin{pmatrix}[w_s]=\dot{R}R^{T} &v_s=\dot{p}-\dot{R}R^Tp \\ 0 &0 \end{pmatrix}

如果\dot{T}在左边,就是[\mathcal{V}_s]\dot{T}在右边则是[\mathcal{V}_b]。这就是旋量的矩阵表示形式。

值得一提的是:

vb表示在body坐标系下,刚体上过body坐标原点的那个位置的线速度。

vs表示:如果运动的刚体足够大,那么刚体上过固定坐标系s原点的那个位置在固定坐标系下的瞬时速度。

上面的表述挺拗口,大家理解意思即可。这本书的世界观里,所有的坐标系都是不动的,因此一有这种表述就很麻烦,要强调不是坐标系原点的速度,而是"刚体上恰好过坐标系原点的那个位置处的速度",哈哈。大家理解即可。

 

上式表示了两个旋量之间的变换,通过伴随变换矩阵Ad进行连接。

这个伴随变换矩阵有几个性质,罗列一下(我不想手打公式直接截图了,见谅):

 力旋量

 这里我直接跳到力旋量这里,因为我认为这里内容更加相关:

 这块的内容实际上是动力学的内容,后续会用到,列出介绍:

半径向量r叉乘力f,可以得到力矩:

 (力矩的变换仍然遵循用旋转矩阵可以变换:)

力旋量就是把力矩和力合在一起:

所以就有了空间力旋量\mathcal{F}_s 以及物体力旋量 \mathcal{F}_b,它俩之间可以通过上面提到的伴随变换矩阵建立联系:

我们可以注意到:

内反外转置。比如左边是b,右边是a,那么中间就是ab,然后ad外面用T给它翻过来。

为什么有这个性质呢?这个是通过推导得到的:

同一系统功率相等。再根据正常这种旋量联立公式得到。

需要记住Ad本身是没有转置特性的!!!它是需要求逆的。

力旋量这里可以用转置不是因为Ad可以转置,而是经过推导得到,且需要遵循“内反外转置”原则。

运动旋量的螺旋释义

这部分的内容初看比较抽象,记得当时看了好几次才理解。

s表示螺旋轴的朝向,\dot{\theta}则表示绕轴转动的角速度大小。(注意这里是dot,上面是有一点的,表示角度的导数,角速度)。h表示节距,即线速度/角速度。q为轴上任意一点,用于配合s定位这根轴。

这里其实也好理解,主要费解的是下面的v。v是由两项构成的,-\hat{s}\dot{\theta} \times q表示绕螺旋轴的移动。这个需要看图,配合右手螺旋定则才能理解,我这里就不写了。另一项h\hat{s}\dot{\theta}是沿着轴的移动,这两项方向是正交的。

这里容易混淆的是,它多了一个螺旋轴的概念:\mathcal{S}

那么\mathcal{V}也是[w,v],\mathcal{S}也是[w,v],让人看了迷糊不已。其实S是V的一个正则化。

正则化的原则是:有w,用w正则化:

没有w,用v正则化:

 也就是说,这样也是对的:

 即满足条件:\mathcal{V}=\mathcal{S}\dot{\theta}

虽然都用[w,v]表示,但是S中的w和v必须满足两个条件之一:

第一个:w模长为1

第二个:w=0,v的模长为1,即节距无限大。

 

 都算出来以后,q为s轴上任意一点,根据上述公式反解即可。(可以应用向量a叉乘向量b等于a的反对称矩阵乘以b)

另外S和V一样,都可以用伴随变换矩阵Ad建立联系:


 指数坐标与矩阵对数:

Chasles-Mozzi定理(查理-莫兹定理):任何刚体运动都可以通过绕空间某一固定螺旋轴S的运动描述。

 

 注意上面用的是螺旋轴S,即旋量的正则化形式。w的模长为1,或w=0,v的模长为1。

 从螺旋轴S到齐次矩阵T的公式就长这样了,带入算就是了。

但是从T到S的,还是有些麻烦。

这里需要回顾上面讲的,从R到w和θ的过程。(即分为R是单位阵,以及R的迹是-1或不是-1的情况),所以认为w和θ已经可以求出来了。那么其实就差一个v了,v可以通过一个公式得到:

 注意p在这里是齐次矩阵T里面的那个平移向量。


书的最后放了一张表格,我觉得这个表格实在整理的太好了,实在舍不得精简和删除,把它放在这里,以供查询。这张表格就基本代表了这节的所有内容了:

 

 最后再强调一下,旋量\mathcal{V}=\mathcal{S}\dot{\theta}中的\dot{\theta}是沿轴的速度,指数表示中的e^{[w]\theta}\theta,是沿轴转过的角度,这二者可是不一样的,不要记混淆。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天一个面试题:ThreadLocal底层原理和实现Demo

ThreadLocal底层原理和实现Demo每天一个面试题:ThreadLocal实现ThreadLocal的DemoThreadLocal底层原理为什么ThreadLocalMap的key设计为弱引用今天开始一个新专栏:每天一个面试题系列 也没有拿到令人心动的offer,看来自己学习方式和能力还是差…

fastapi_No.25_获取配置项

文章目录方式1:隐藏在环境变量中配置环境变量Windows中配置环境变量Linux中配置环境变量在代码中获取环境变量方式2:隐藏在配置文件中装包在代码中获取配置文件内容在之前的代码中,像数据库连接信息等敏感信息,都直接写在代码中&a…

每日一题 —— 882. 细分图中的可到达节点

882. 细分图中的可到达节点 给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。 图用由边组成的二维数组 edgesedgesedges 表示&…

182:vue+openlayers 使用d3实现地图区块呈现不同颜色的效果

第182个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载解析geojson文件,同时利用d3的颜色功能,使得美国每个州呈现出不同的颜色区块,方便识别。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,…

UNIX环境高级编程_文件IO_文件描述符

这篇文章记录文件描述符,下一篇文章记录文件描述表。 1 文件描述符 先说说什么是文件IO。文件的IO就是文件的输入输出,也就是文件的读写。读和写是以CPU为参考的,从CPU向文件中写入数据,就是写操作;从文件中读取数据…

Aviation turbofan starting model

Aviation turbofan starting model 涡扇发动机(Turbofan)即涡轮风扇发动机,来源于涡轮喷气发动机,主要是为了解决涡轮喷气发动机耗油率过高的问题。其结构特点是流过风扇的空气一部分进入压气机(内涵道),一部分进入由压气机外部通道(外涵道)流过,这部分气流不经过燃烧…

01 - Linux系统概要(再论计算机系统)

---- 整理自狄泰软件唐佐林老师课程 1. 再论计算机系统 计算机系统由躯体和灵魂两部分组成 – 躯体:构成计算机系统的电子设备(硬件) – 灵魂:指挥躯体完成动作的指令序列(软件) 躯体核心:中央…

2022-12-05 优化el-tree懒加载选人树

今后就都拼抵抗力了嗷 需求描述 此处有一棵懒加载树(可选人),右侧展示已选中的人。且父子关联,可以通过选中一个部门勾选所有子节点。问题是,选中父节点,当子节点未加载时,是获取不到勾选的子…

Redis配置、持久化以及相命令

Redis 什么是Redis Redis(远程字典服务器)是一个开源的、使用C语言编写的NoSQL数据库 Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。 Redis服务…

新来的性能测试工程师工资25K,看了他做的性能测试,那才真叫牛

一直深耕于互联网行业的测试工作,前期测试主要以项目为主,也就是 一个人负责2-3个项目 的测试工作,当然包括项目上功能、自动化和性能等一切测试工作。 我有几个朋友也在互联网大厂工作,从他们当中了解到其实真正的互联网大厂&…

【前端CSS】网站都变成灰色了,它是怎么实现的?(含源代码解析)

目录:网站都变成灰色了,它是怎么实现的?一、前言二、如何实现的三、代码的理解3.1 CSS3 filter(滤镜) 属性3.2 定义和使用3.2.1 CSS动画演示3.2.2 JS语法演示3.3 浏览器支持3.4 CSS 语法3.5 Filter 函数四、实例展示4.1 模糊实例4.2 Brightne…

3、JSP——Servlet、IDEA创建Web项目、IDEA创建JSP页面

目录 一、Servlet的概念 二、Servlet的作用 三、IDEA中创建Web项目 四、手动部署 五、自动部署 1、IDEA部署Tomcat服务器 2、IDEA部署JavaWeb项目 3、JSP页面 一、Servlet的概念 (1)Servlet:Server Applet的简称,是运…

云服务器配置Code-Server环境并运行Python和C++

目录1、前言2、部署流程2.1 前置准备2.2 运行docker安装Code-Server3、运行Code-Server3.1 配置运行环境3.2 运行Python3.3 运行C1、前言 云服务器需要配置C开发环境,了解到有code-server这个VsCode提供的云端服务,因此选择在云服务器上部署。 2、部署流…

D3--FPGA IIC接口通信2022-12-05

1.IIC简介 1.1 IIC概述 IIC即 Inter-Integrated Circuit(集成电路总线),是由 Philips 半导体公司在八十年代初设计出来的一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线,并产…

[附源码]计算机毕业设计少儿节目智能推荐系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Android 基础知识4-2.2常用控件提示(Toast)

效果图: 介绍: Toast是Android提供的“快显讯息”类,Toast类的使用非常简单,而且用途很多。比如,当退出应用程序时,可以用它来提示用户“需要更新”,或者当在输入框中输入文本时,可以…

含有双硫键的交联剂NHS-PEG1-SS-PEG1-NHS,NHS-SS-NHS,活性酯-双硫键-活性酯

基础产品数据(Basic Product Data): 中文名:活性酯-双硫键-活性酯 英文名:NHS-SS-NHS,NHS-PEG1-SS-PEG1-NHS 结构式(Structural): 详细产品数据(Detailed Pro…

批量查询谷歌PR权重的方法有哪些?是什么影响着谷歌PR值?

批量查询谷歌PR权重的方法有哪些? 查询谷歌PR权重最简单最最直接的方法就是使用站长工具查询,具体操作如下: 首先打开站长工具,在域名输入框输入网站的域名(一行一个); 然后勾选需要查询的功能&…

NumPy模块使用介绍

NumPy使用介绍1.NumPy科学计算库介绍和环境准备 ​ NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对象(如掩码数组和矩阵),这种⼯具可⽤来存储和处理⼤型矩阵&…

Qt下多线程的四种使用方法总结及代码示例

文章目录前言一、继承QThread,重写run()函数二、继承QObject,使用moveToThread()函数三、继承QRunnable,重写run()函数,使用QThreadPool线程池四、使用QtConcurrent的run()函数五、示例代码六、下载链接总结前言 在之前的Qt开发工…