递归牛顿-欧拉方法(Recursive Newton-Euler Method)是一种高效的动力学计算方法,尤其适用于串联多刚体系统,例如串联机械臂。递归牛顿-欧拉方法有正和逆两种形式,本文我们先来看正动力学。正动力学又称为前向动力学,如果给你机器人各关节的力矩后,通过正动力学可以求出机器人的运动。在这里,机器人的运动指各个关节(或者各连杆)的位置、速度和加速度。

  下面的算法来自于论文《Lie Group Formulation of Articulated Rigid Body Dynamics》,我们更正了原文中的一处小错误。该算法使用了李群和李代数表示机器人连杆的坐标、速度和受力,其优点是形式简洁、线速度和角速度可以合写在一块,力也是如此,并有清晰的数学含义。该算法适用于三维空间,每一步正动力学计算过程包含三个递归子过程:1. 前向计算连杆的位姿和速度;2. 反向计算连杆系的广义惯量和偏置力;3. 前向计算加速度。在定义连杆的记号时,通常将固定的基座记为 0,与基座相连的连杆记为1,与连杆1相连的下一个连杆记为2,依次类推。这里把从基座开始向机械臂末端的方向称为前向(ii+1),把机械臂末端到基座的方向称为反向(ii-1)。

具体实现(Mathematica代码)

    (*Initialization 部分参数初始化*)time = 2000; dt = 0.005;  Table[mass[i] = 1; Gravity[i] = grav*mass[i]*{0, 0, -1, 0, 0, 0}, {i, 0, n, 1}];  Table[g[i, i + 1, 0] = RPToH[Id[3], {0, 0, (La[i] + La[i + 1])/2}], {i, 0, n - 1, 1}];  q = dq = ddq = ConstantArray[0, n];  Table[V[i] = dV[i] = ConstantArray[0, 6], {i, 0, n, 1}];  Table[M[i] = Id[6]; \[Tau][i] = 0, {i, n}];  F[n + 1] = ConstantArray[0, 6];  g[n, n + 1] = g[0, 0] = Id[4];  q = ConstantArray[Pi/2, n];  \[CapitalPi][n + 1] = Id[6]*0.0;  \[Beta][n + 1] = ConstantArray[0, 6];  Table[  qList = {qList, q};  gList = {gList, g[0, 4]};  (*Forward 前向递归*)  dq = dq + ddq*dt;   (*欧拉积分*)q = q + dq*dt;  For[i = 1, i <= n, i++,  g[i - 1, i] = TwistExp[\[Xi]r[i], q[[i]]].g[i - 1, i, 0];  g[0, i] = g[0, i - 1].g[i - 1, i];  V[i] = Ad[Iv[g[i - 1, i]]].V[i - 1] + \[Xi]s[i]*dq[[i]];  \[Eta][i] = ad[V[i] - \[Xi]s[i]*dq[[i]]].\[Xi]s[i]*dq[[i]];  ];  (*Backward 反向递归*)  For[i = n, i >= 1, i--,  \[Tau][i] = 0;  Mh[i] = M[i] + T[Ad[Iv[g[i, i + 1]]]].\[CapitalPi][i + 1].Ad[Iv[g[i, i + 1]]];  Fext[i] = T[Ad[RPToH[R[g[0, i]], {0, 0, 0}]]].Gravity[i];  \[ScriptCapitalB][i] = -T[ad[V[i]]].M[i].V[i] - Fext[i] + T[Ad[Iv[g[i, i + 1]]]].\[Beta][i + 1];  \[CapitalPsi][i] = 1/(\[Xi]s[i].Mh[i].\[Xi]s[i]);  \[CapitalPi][i] = Mh[i] - \[CapitalPsi][i]*KroneckerProduct[Mh[i].\[Xi]s[i], \[Xi]s[i].Mh[i]];  \[Beta][i] = \[ScriptCapitalB][i] + Mh[i].(\[Eta][i] + \[Xi]s[i]*\[CapitalPsi][i]*(\[Tau][i] - \[Xi]s[i].(Mh[i].\[Eta][i] + \[ScriptCapitalB][i])));  ];  (*Forward 前向递归*)  For[i = 1, i <= n, i++,  ddq[[i]] = \[CapitalPsi][i]*(\[Tau][i] - \[Xi]s[i].Mh[i].(Ad[Iv[g[i - 1, i]]].dV[i - 1] + \[Eta][i]) - \[Xi]s[i].\[ScriptCapitalB][i]);  dV[i] = Ad[Iv[g[i - 1, i]]].dV[i - 1] + \[Xi]s[i]*ddq[[i]] + \[Eta][i]];  , {t, time}]; 

仿真结果

  我们首先以简单的 4 个连杆组成的机械臂为例进行仿真试验,连杆之间用转动关节连接,机器人初始时刻处于水平的静止状态,所有关节的力矩设为0。理论上机器人应该在重力作用下自由下落,我们看看用正向动力学步骤计算得到的仿真结果是什么样的。结果如下动画所示(只显示了Y-Z平面)。从结果看好像是对的,但是我还不敢100%保证。

正确性验证

  为了验证算法的正确性,我和第三方的仿真软件进行对比。这里我选取了Working Model软件(是一款商业的二维动力学仿真软件)。在Working Model中设置相同的参数和初始状态,仿真过程如下图所示。

  我们选择末端连杆(也就是第4个连杆)质心的Y坐标(重力加速度的反方向)进行对比,结果如下图左所示。二者的误差(下图右)在-0.001m~0.001m之间。考虑到每个连杆的长度为10cm,误差<1mm 说明我们算法基本是正确的。因为都是数值计算,有误差应该是正常的。至于为什么误差在0.5mm这个量级,这可能和我们采用的积分方法有关。在上面的算法中,我们采用了最简单的欧拉积分。而在Working Model中,因为这个软件不是开源的,我们也看不到它的积分方法是怎样实现的。不过我们倒是可以设置,在Edit菜单下的Accuracy选项中即可选择积分方法并设置积分步长。

  

  下图中的例子是10自由度的连杆同样只在重力作用下(关节力矩为0)的运动,只是初始状态不同,而且每相邻的两个关节旋转轴相互垂直。有没有闻到一丝混沌(Chaos)的味道

这时要对比验证可以借助三维动力学仿真软件,例如MSC Adams。但是太繁琐,我懒得做了。机械臂是怎么画的呢?其它类型的关节怎么定义呢?这些我会随后在另外的博客中给出来。

  上面我们介绍了正动力学的计算过程,也就是给定力矩后计算机械臂的运动。本文介绍逆动力学,也就是在机器人的运动已知的情况下反求所需的关节力矩。算法同样来自于论文《Lie Group Formulation of Articulated Rigid Body Dynamics》(下图中画红线的是错误的地方)。这篇论文使用了李群等高等数学知识,如果你感到陌生可以阅读《A Mathematical Introduction to Robotic Manipulation》,该书恰好缺少递归牛顿欧拉动力学的介绍。如果有了前面的数学基础知识,读懂下面的公式其实并不难。

  每步逆动力学计算过程包含两个递归子过程:1. 前向计算速度和加速度;2. 反向计算力矩。这要比正动力学相对简单一些。你是不是好奇:为什么逆动力学包含这两步,为什么不是反过来:反向计算速度及加速度和前向计算力矩?其实仔细一思考你就能理解,原因很简单(需要一点点理论力学的知识):逆动力学的输入是机械臂的运动(包括关节的速度和加速度)。由于基座的速度和加速度是已知的(永远是零),而后一个连杆的速度显然依赖前一个连杆的速度,这是因为机械臂的关节角度是相对于上一个连杆定义的,所以,从基座出发一直向前,直到机械臂末端的连杆,所有连杆质心的速度和加速度都可以算出来。至于力矩嘛,如果我们选择中间任何一个连杆,它两侧的受力(也就是和它相连的连杆对它的反作用力)都是未知的。唯独末端的连杆,它一侧的受力是已知的(为零或者给定)。前向过程已经计算出来了加速度,我们可以借助单刚体的牛顿-欧拉方程求出它另一侧的受力。因为每两个相邻的连杆受到大小相等,方向相反的相互作用力,我们就知道了它前一个连杆一侧的受力。依次向基座的方向(反向)计算,我们可以求出后面所有连杆的受力。所以,力矩的递归是反向的。

具体实现(Mathematica代码)

time = 2000; dt = 0.001;
Table[mass[i] = 1; Gravity[i] = grav*mass[i]*{0, 0, -1, 0, 0, 0}, {i, 0, n, 1}];
Table[g[i, i + 1, 0] = RPToH[Id[3], {0, 0, (La[i] + La[i + 1])/2}], {i, 0, n - 1, 1}];
q = dq = ddq = ConstantArray[0, n];
q[[1]] = -3 Pi/4;
Table[V[i] = dV[i] = ConstantArray[0, 6], {i, 0, n, 1}];
Table[M[i] = Id[6]; \[Tau][i] = 0, {i, n}];
F[n + 1] = ConstantArray[0, 6];
g[n, n + 1] = g[0, 0] = Id[4];
qList = gList = \[Tau]List = {};
dq = ConstantArray[-0.6, n];
Table[qList = {qList, q};gList = {gList, g[0, n]};\[Tau]List = {\[Tau]List, Array[\[Tau], n]};q = q + dq*dt;(*Forward*)For[i = 1, i <= n, i++,g[i - 1, i] = TwistExp[\[Xi]r[i], q[[i]]].g[i - 1, i, 0];g[0, i] = g[0, i - 1].g[i - 1, i];V[i] = Ad[Iv[g[i - 1, i]]].V[i - 1] + \[Xi]s[i]*dq[[i]];dV[i] = Ad[Iv[g[i - 1, i]]].dV[i - 1] + ad[V[i] - \[Xi]s[i]*dq[[i]]].\[Xi]s[i]*dq[[i]] + \[Xi]s[i]*ddq[[i]];];(*Backward*)For[i = n, i >= 1, i--,Fext[i] = T[Ad[RPToH[R[g[0, i]], {0, 0, 0}]]].Gravity[i];F[i] = M[i].dV[i] - T[ad[V[i]]].M[i].V[i] + T[Ad[Iv[g[i, i + 1]]]].F[i + 1] - Fext[i];\[Tau][i] = \[Xi]s[i].F[i];];, {t, time}];

仿真结果

  我们选择6个连杆进行仿真试验,连杆之间用转动关节连接,所有关节的速度都设为常数-0.6 rad/s。给定关节速度下,机器人的运动如下图左所示(显示了Y-Z平面)。逆动力学求得的关节力矩如下图右所示。

  

正确性验证

  为了验证逆动力学算法的正确性,我们借助前面得到的正动力学:将逆动力学求得的力矩带入正动力学进行仿真,看看机器人的运动与我们设定的运动是否相同,整个过程就是一个闭环,如下图:

  正动力学仿真的结果如下图所示。可以看到结果与我们给定的运动一模一样,这证明我们的逆动力学是正确的。

递归牛顿欧拉(正/逆)动力学仿真相关推荐

  1. 双盘转子动力学仿真c语言程序,递归牛顿欧拉(正)动力学仿真

    递归牛顿-欧拉动力学算法是一种高效的动力学计算方法,它有正和逆两种形式,我们先来看正动力学,也就是给定关节力矩求机器人的运动.下面的算法来自于论文<Lie Group Formulation o ...

  2. 机械臂动力学建模(3)- Newton Euler牛顿欧拉算法

    Newton Euler算法 参考 思路(参考丁教授第二讲ppt) 矢量在不同坐标系下的转换关系 速度的递推 重心处的力和力矩 力的递推 完整公式 代码 参考 北航丁希仑教授的机器人动力学课件: 检出 ...

  3. 机器人学之动力学笔记【9】—— 牛顿-欧拉 递推动力学方程

    机器人学之动力学笔记[9]-- 牛顿-欧拉 递推动力学方程 1. 定义线加速度 2. 定义角加速度 3. 推导线加速度 4. 推导角加速度 5. 质量分布(Mass Distribution) 6. ...

  4. 牛顿-欧拉迭代动力学算法

    牛顿-欧拉迭代动力学算法 (1)连杆之间角/线加速度变换方程(向外迭代法): (1)iω˙i→移动关节:式(6−33)式(6−32)i+1ω˙i+1{^i\dot{\omega}_i}\xrighta ...

  5. 5. 机器人动力学---串联机构牛顿欧拉方程

    1. 引言 这篇文章主要介绍了串联机构牛顿欧拉方程的基本原理,文章提到了惯性系平权性,速度叠加原理等对于理解机器人动力学十分关键的问题.具体内容请参考古月居

  6. 【机器人学】牛顿-欧拉动力学方程迭代形式

    1 牛顿方程和欧拉方程 作者推导了牛顿欧拉动力学方程的迭代形式和矩阵,本文重点描述动力学方程的迭代形式,动力学方程的矩阵形式见博文. 假定机械臂的连杆均为刚体,若连杆质心的位置和惯性张量已知,那么它的 ...

  7. 刚体质量分布与牛顿-欧拉方程

    惯性矩.惯性积.转动惯量.惯性张量 惯性矩是一个几何量,通常被用作描述截面抵抗弯曲的性质.惯性矩的国际单位为(m4).即面积二次矩,也称面积惯性矩,而这个概念与质量惯性矩(即转动惯量)是不同概念. 面 ...

  8. 机械臂的牛顿-欧拉动力学方程

    机械臂的牛顿-欧拉动力学方程 一般把机械臂的连杆看作刚体,如果知道了连杆质心的位置和惯性张量,那么它的质量分布特征就完全确定了.要使连杆运动,必须对连杆进行加速和减速.连杆运动所需的力是关于连杆期望加 ...

  9. 和ur的区别_UR机械臂simscape正逆解仿真

    最近在看相关的课程,把作业做一下,还是蛮有意思的.(课程代码所以涉及版权问题,经过同意后我上传代码) UR机械臂的物理模型文件是根据SolidWorks插件simscape导出的xml文件,课程直接提 ...

最新文章

  1. 【Android】SlidingMenu属性详解(转)
  2. python生成配置文件config_Python configparser模块封装及构造配置文件
  3. HttpUtility.UrlEncode 方法 (String) 对 URL 字符串进行编码 NET Framework 4.6 and 4.5
  4. 大数据批处理框架Spring Batch 的全面解析
  5. Oracle Assets Additions API--Sample Script(Invoices)
  6. Spring MVC 入门指南(二):@RequestMapping用法详解
  7. android实现简单进度条ProgressBar
  8. LTspice基础教程-004.系统自带仿真库介绍
  9. 关于RGB888和RGB565互转代码实现方案推荐
  10. 基于ROS2多机器人编程资料
  11. go 学习笔记之10 分钟简要理解 go 语言闭包技术
  12. Cocos Creator 3D使用腾讯云游戏联机对战引擎(MGOBE)
  13. Exception in thread “main“ java.time.DateTimeException: Unable to extract ZoneId from temporal
  14. C语言第二课,分支语句和循环语句
  15. 02384计算机原理2019真题,全国2002年10月自考02384计算机原理试卷
  16. 艾伟:ASP.NET 2.0的编译模型
  17. 赛尔102S助力云南开展2020年白马雪山国家级自然保护区低空无人机生态监测
  18. 电脑摄像头阅卷软件在教学各环节中的实践应用
  19. mysql 四种分区方式
  20. 对32位单片机串口的理解

热门文章

  1. 令人头疼的优化问题——多目标规划问题matlab求解
  2. 中国三大港进入全球最高效港口排名前十,新兴市场物流竞争力中国第一,印度和南亚或继续充当西方买家采购替代市场 | 美通社头条...
  3. JDBC(powernode CD2206)详尽版(内含教学视频、源代码、SQL文件)
  4. word图片另存为变黑色_别处复制过来的 图像在word中粘贴后变黑怎么处理?
  5. php网页全屏背景图代码,HTML5 body设置全屏背景图片的示例代码
  6. 自我管理五维度,遇见更好的自己
  7. c语言编写五子棋报告,c语言报告五子棋.pdf
  8. ROOT(a Data analysis Framework)-Note5: iSTEP day2-TH1::Fit()
  9. 数学速算法_小学初中高中 数学奥数教材及习题讲解(共42册PDF)
  10. 【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within(已附源码)