《Modern Robotics》阅读笔记6——前向运动学

2023-11-03 11:50

本文主要是介绍《Modern Robotics》阅读笔记6——前向运动学,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Modern Robotics》阅读笔记6——前向运动学

前向运动学(Forward Kinematics)是《Modern Robotics》一书的第三章,这章主要介绍的内容就是如何基于旋量理论使用PoE(Product of Exponentials)形式求解机器人的前向运动学。有了之前对于旋量理论的了解,这一章的内容非常简单。

前向运动学:描述的是从关节角(关节平移)到机器人末端位姿的映射关系。也就是从部分运动映射到整体运动的关系。

接下来,就以两个例子来介绍前向运动学的求解过程。第一个例子,旋量是表示在固定系{s}下的。第二个例子,旋量表示在末端坐标系{b}下。

例1:旋量轴表达在固定系下

在这里插入图片描述

这是一个具有3个旋转关节的在平面范围内运动的机械臂。图中,我们定义了坐标系{0},{1},{2},{3},{4}。其中,x轴沿着连杆方向,y轴与连杆方向垂直,z轴与转轴方向共线。

求解该机械臂的前向运动学,也就是求解每个关节角度 [ θ 1 , θ 2 , θ 3 ] [\theta_1,\theta_2,\theta_3] [θ1,θ2,θ3]与末端坐标系{4}的关系。

D-H方法

对于这个问题,首先,我们可以用经典的D-H方法做个示范。
T 04 = T 01 T 12 T 23 T 34 T_{04}=T_{01} T_{12} T_{23} T_{34} T04=T01T12T23T34
其中:
T 01 = [ cos ⁡ θ 1 − sin ⁡ θ 1 0 0 sin ⁡ θ 1 cos ⁡ θ 1 0 0 0 0 1 0 0 0 0 1 ] , T 12 = [ cos ⁡ θ 2 − sin ⁡ θ 2 0 L 1 sin ⁡ θ 2 cos ⁡ θ 2 0 0 0 0 1 0 0 0 0 1 ] T_{01}=\left[\begin{array}{cccc}{\cos \theta_{1}} & {-\sin \theta_{1}} & {0} & {0} \\ {\sin \theta_{1}} & {\cos \theta_{1}} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right], \quad T_{12}=\left[\begin{array}{ccc}{\cos \theta_{2}} & {-\sin \theta_{2}} & {0} & {L_{1}} \\ {\sin \theta_{2}} & {\cos \theta_{2}} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right] T01=cosθ1sinθ100sinθ1cosθ10000100001,T12=cosθ2sinθ200sinθ2cosθ2000010L1001
T 23 = [ cos ⁡ θ 3 − sin ⁡ θ 3 0 L 2 sin ⁡ θ 3 cos ⁡ θ 3 0 0 0 0 1 0 0 0 0 1 ] , T 34 = [ 1 0 0 L 3 0 1 0 0 0 0 1 0 0 0 0 1 ] T_{23}=\left[\begin{array}{ccc}{\cos \theta_{3}} & {-\sin \theta_{3}} & {0} & {L_{2}} \\ {\sin \theta_{3}} & {\cos \theta_{3}} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right], \quad T_{34}=\left[\begin{array}{cccc}{1} & {0} & {0} & {L_{3}} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right] T23=cosθ3sinθ300sinθ3cosθ3000010L2001,T34=100001000010L3001
可以看到, T 04 T_{04} T04是一个与 [ θ 1 , θ 2 , θ 3 ] [\theta_1,\theta_2,\theta_3] [θ1,θ2,θ3]有关的函数。

基于旋量理论的PoE方法

基于旋量的PoE方法,最大的特点就是无需对于每一根连杆建立复杂的坐标系,只需要建立固定坐标系和末端坐标系就可以对运动进行表示了。下面对这个方法进行介绍:

第一步,我们需要定义机械臂的初始位置,这里将 [ θ 1 , θ 2 , θ 3 ] [\theta_1,\theta_2,\theta_3] [θ1,θ2,θ3]全为0,作为机械臂的初始姿态,也就相当于将图中的机械臂完全放平。

第二步,我们定义末端坐标系和固定坐标系,并且计算初始姿态下末端坐标系相对于固定坐标系的位姿M。这里末端坐标系就是{4}系,固定坐标系就是{1}系。初始姿态下,有:

M = [ 1 0 0 L 1 + L 2 + L 3 0 1 0 0 0 0 1 0 0 0 0 1 ] M=\left[\begin{array}{cccc}{1} & {0} & {0} & {L_{1}+L_{2}+L_{3}} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right] M=100001000010L1+L2+L3001

第三步,计算旋量轴。需要注意,这里计算的旋量轴是表示在{1}系固定系下的。因此,我们从3号关节开始。假设 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2都等于0,对应于3号关节,其旋量轴的表示为:
S 3 = [ ω 3 v 3 ] = [ 0 0 1 0 − ( L 1 + L 2 ) 0 ] \mathcal{S}_{3}=\left[\begin{array}{c}{\omega_{3}} \\ {v_{3}}\end{array}\right]=\left[\begin{array}{c}{0} \\ {0} \\ {1} \\ {0} \\ {-\left(L_{1}+L_{2}\right)} \\ {0}\end{array}\right] S3=[ω3v3]=0010(L1+L2)0

这是怎么来的呢?

前文说到,旋量轴的六个量中,前三个量定义了旋转轴矢量的方向,而后三个量和前三个量则共同定义了旋转轴的位置。另外,旋量轴也可以理解为,固定系的原点在当前的刚体运动下的角速度和线速度。(这里主要说的是旋转关节,移动关节会有一些不同)

对于3号关节,旋转轴的方向显然指向z轴,另外我们定义角速度的模为1 rad/s,结合二者,所以 ω 3 = [ 0 , 0 , 1 ] T \omega_{3}=[0,0,1]^T ω3=[0,0,1]T。对于固定系{1}的原点而言,当机械臂末端绕3号关节以 ω 3 = [ 0 , 0 , 1 ] T \omega_{3}=[0,0,1]^T ω3=[0,0,1]T的角速度运动时,该点产生的线速度为 v 3 = [ 0 , − ( L 1 + L 2 ) , 0 ] T v_{3}=[0,-\left(L_{1}+L_{2}\right),0]^T v3=[0,(L1+L2),0]T。由此,就得到了旋量轴的表示。

于是,根据前文中介绍的刚体运动知识,我们知道当 θ 1 = 0 \theta_1=0 θ1=0 θ 2 = 0 \theta_2=0 θ2=0时,有:
T 04 = e [ S 3 ] θ 3 M ( for  θ 1 = θ 2 = 0 ) T_{04}=e^{\left[S_{3}\right] \theta_{3}} M\left(\text { for } \theta_{1}=\theta_{2}=0\right) T04=e[S3]θ3M( for θ1=θ2=0)
值得注意,这里指数表达式乘在了M的左边。(左乘是因为旋量轴表达在固定系{1}系下!)
其中:
[ S 3 ] = [ [ ω ] v 0 0 ] = [ 0 − 1 0 0 1 0 0 − ( L 1 + L 2 ) 0 0 0 0 0 0 0 0 ] \left[\mathcal{S}_{3}\right]=\left[\begin{array}{cc}{[\omega]} & {v} \\ {0} & {0}\end{array}\right]=\left[\begin{array}{rrrr}{0} & {-1} & {0} & {0} \\ {1} & {0} & {0} & {-\left(L_{1}+L_{2}\right)} \\ {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right] [S3]=[[ω]0v0]=0100100000000(L1+L2)00

以此类推,我们计算2号关节和1号关节的旋量轴,如下:
S 2 = [ ω 2 v 2 ] = [ 0 0 1 0 − L 1 0 ] , S 1 = [ ω 1 v 1 ] = [ 0 0 1 0 0 0 ] \mathcal{S}_{2}=\left[\begin{array}{c}{\omega_{2}} \\ {v_{2}}\end{array}\right]=\left[\begin{array}{c}{0} \\ {0} \\ {1} \\ {0} \\ {-L_{1}} \\ {0}\end{array}\right], \mathcal{S}_{1}=\left[\begin{array}{c}{\omega_{1}} \\ {v_{1}}\end{array}\right]=\left[\begin{array}{c}{0} \\ {0} \\ {1} \\ {0} \\ {0} \\ {0}\end{array}\right] S2=[ω2v2]=0010L10S1=[ω1v1]=001000
有:
T 04 = e [ S 1 ] θ 1 e [ S 2 ] θ 2 e [ S 3 ] θ 3 M T_{04}=e^{\left[\mathcal{S}_{1}\right] \theta_{1}} e^{\left[\mathcal{S}_{2}\right] \theta_{2}} e^{\left[\mathcal{S}_{3}\right] \theta_{3}} M T04=e[S1]θ1e[S2]θ2e[S3]θ3M
读者可以验证,PoE方法计算得到 T 04 T_{04} T04与D-H方法得到的完全一样。

值得注意的是,在这里我们是从3号关节一直算到1号关节,为什么要这么做呢?顺序倒过来可以吗?

答案是否定的,必须从3号关节算到1号关节。由于旋量轴是定义在固定系{1}系下的,假如我们首先旋转1号关节,那么2号关节和3号关节的也会运动,这样2号关节和3号关节的旋量轴的表达就与1号关节的角度有关了,这是旋量轴就不好求了,需要建立坐标系,这样也就违背了我们使用旋量计算运动学的初衷。
而当我们先计算3号关节,然后是2号,最后是1号,这样就不会有这种麻烦。因为旋转3号关节,2号和1号相对于固定系都没有任何运动,旋量轴非常直观。

例2:旋量轴表达在末端系下

还是上文中的同一个例子,现在我们把旋量轴表达在末端系下。

依然是定义初始位置,以及末端系在固定系下的表达M:
M = [ 1 0 0 L 1 + L 2 + L 3 0 1 0 0 0 0 1 0 0 0 0 1 ] M=\left[\begin{array}{cccc}{1} & {0} & {0} & {L_{1}+L_{2}+L_{3}} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right] M=100001000010L1+L2+L3001

把旋量轴表达在末端系下,那么我们的计算顺序需要改变成:首先1号关节,其次2号关节,最后3号关节。

B 1 = [ ω 1 v 1 ] = [ 0 0 1 0 L 1 + L 2 + L 3 0 ] , B 2 = [ ω 2 v 2 ] = [ 0 0 1 0 L 2 + L 3 0 ] , B 3 = [ ω 3 v 3 ] = [ 0 0 1 0 L 3 0 ] \mathcal{B}_{1}=\left[\begin{array}{c}{\omega_{1}} \\ {v_{1}}\end{array}\right]=\left[\begin{array}{c}{0} \\ {0} \\ {1} \\ {0} \\ {L_{1}+L_{2}+L_{3}} \\ {0}\end{array}\right], \mathcal{B}_{2}=\left[\begin{array}{c}{\omega_{2}} \\ {v_{2}}\end{array}\right]=\left[\begin{array}{c}{0} \\ {0} \\ {1} \\ {0} \\ {L_{2}+L_{3}} \\ {0}\end{array}\right], \mathcal{B}_{3}=\left[\begin{array}{c}{\omega_{3}} \\ {v_{3}}\end{array}\right]=\left[\begin{array}{c}{0} \\ {0} \\ {1} \\ {0} \\ {L_3} \\ {0}\end{array}\right] B1=[ω1v1]=0010L1+L2+L30B2=[ω2v2]=0010L2+L30B3=[ω3v3]=0010L30

最终有:
T 04 = M e [ B 1 ] θ 1 e [ B 2 ] θ 2 e [ B 3 ] θ 3 T_{04}=M e^{\left[\mathcal{B}_{1}\right] \theta_{1}} e^{\left[\mathcal{B}_{2}\right] \theta_{2}} e^{\left[\mathcal{B}_{3}\right] \theta_{3}} T04=Me[B1]θ1e[B2]θ2e[B3]θ3

过程都与例1类似,只不过左乘换做了右乘,这也是由于旋量轴表达在末端系下的原因。

总结

前向运动学这一章内容,总体来说比较简单。大家需要掌握的就是如何计算旋量轴,然后需要特别注意旋量轴表达在哪一个坐标系下。这就足够了。

这篇关于《Modern Robotics》阅读笔记6——前向运动学的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337966

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个