ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

六自由度机械臂动力学建模与MATLAB仿真:牛顿-欧拉法与扭矩分析

六自由度机械臂动力学建模与MATLAB仿真:牛顿-欧拉法与扭矩分析 简介这份资源提供了一套完整的六自由度机械臂动力学MATLAB实现包含刚体建模、关节力矩计算与运动学-动力学耦合仿真适合机器人控制算法开发、课程设计与动力学教学演示等场景。压缩包共11个文件以三个核心M脚本为主辅以Python脚本、可视化结果PNG图像和说明文档整体仅1.8MB结构清晰易于上手。已有57人学习下载。代码基于标准DH参数搭建支持自定义连杆质量、惯量、质心位置及关节轨迹可直接输出各关节驱动力矩曲线与系统能量变化趋势方便用户验证算法正确性并开展参数调试。配套图像展示了典型仿真结果脚本注释完整可作为动力学分析入门或二次开发的实用工具。1. 为什么我决定把这套动力学仿真代码整理成集做六自由度机械臂的都知道一个尴尬的现状运动学教程满网都是正解逆解、轨迹规划随便一搜就是一大把但一进入动力学资料就断崖式变少。我这套代码集的起因很实在——之前做一个带完整3D数模的六轴机械臂项目运动学部分几天就通了结果到了关节电机选型、动态抓取这步发现不看动力学根本没法往下走。手算六自由度的拉格朗日方程想都不要想翻遍国内外博客能找到的也多半是两三个自由度的教学案例真正能直接搬到六自由度上用的几乎没有。所以那段时间我就自己动手把六自由度机械臂的动力学建模与仿真在MATLAB里完整走了一遍从DH参数、正运动学、雅可比矩阵一路写到牛顿-欧拉逆动力学、重力补偿、轨迹跟踪和关节扭矩输出最后沉淀成一套结构清晰的代码集。现在单独拿出来整理是因为后面好几个做毕业设计和实际项目的朋友都问我要这套东西有人要拿它验证3D打印机械臂的电机选型有人想对比自己用商业软件算出来的扭矩也有人只是想把动力学这个知识点彻底吃透。这套代码集能做的事情一句话概括就是给出一条关节角度轨迹它能算出每个时刻各关节需要施加多大扭矩、机械臂各连杆的受力情况也能用来验证某个姿态下保持静止需要的重力补偿力矩。对做机械臂毕业设计的人、想自己拼装机械臂的硬件爱好者、以及刚接触机器人学的研究生来说它都能当按图索骥的参考骨架——你只需要把自己的DH参数和质量属性替换进去就能得到属于你自己的动力学仿真结果。我要先说清楚这套代码不是那种打包给你就完事的黑盒工具箱。它包含的每个函数我都是分步写的你打开就能看到每一行在算什么。这个设计思路是刻意的动力学建模的坑非常多如果只丢一个封装好的函数给你参数一错你根本不知道错在哪更别提改成自己的机械臂。所以我更愿意把它定位成一套有完整推导注释的参考实现而不是一个只追求运行效率的优化库。2. 拉格朗日法和牛顿-欧拉法我为什么选了后者2.1 两种方法的适用边界机械臂动力学建模有两条经典路线一条是拉格朗日法一条是牛顿-欧拉法。拉格朗日法从系统总能量出发定义拉格朗日量 L K - P然后代入欧拉-拉格朗日方程得到动力学方程最终形式能写成τ M(q)q̈ C(q, q̇)q̇ G(q)这个方程特别漂亮M是惯性矩阵C是科氏力和离心力项G是重力项。如果是两三自由度的机械臂我强烈建议用拉格朗日法手推一遍因为你能从展开的方程里直观感受到质量分布和速度耦合怎么影响关节力矩。但到了六自由度方程展开后每一项都长到让人头皮发麻光是科氏力系数矩阵就复杂得不行。我见过有人用符号计算工具硬推六自由度拉格朗日方程跑出来的表达式有几页长最后根本没法用来做实时仿真。牛顿-欧拉法走的是另一条路它把每个连杆单独拆开利用牛顿第二定律和欧拉方程建立力和力矩的平衡关系然后用递归的方式从基座往末端递推速度与加速度再从末端往基座递推力与力矩。整个过程不需要写出全局矩阵只需要按关节顺序循环两遍计算量是 O(n) 级别很多工业机器人控制器里的实时动力学就是用它做的。对MATLAB实现来说递归循环天然比符号化简友好得多。2.2 我实际采用的递推计算流程我最终选牛顿-欧拉法还有一个很重要的原因是它的物理意义特别清楚外推循环里每个连杆的角速度、角加速度、线加速度都由前一个连杆传递而来你很清楚一个转动关节的角速度会让后面的连杆产生多大的线加速度内推循环里每个连杆受到的力和力矩从末端负载开始往回累计最后投影到关节转轴上就得到关节驱动力矩。这套代码里的核心逆动力学函数大致长这样function tau rnea(q, qd, qdd, dh, link_params) % 输入关节位置q、速度qd、加速度qdd、DH参数表、连杆惯性参数 % 输出各关节所需驱动力矩 tau n size(q,1); % 外推从基座到末端递推每个连杆的角速度、角加速度、线加速度 w zeros(3,n); wd zeros(3,n); vd zeros(3,n); R cell(1,n); p cell(1,n); for i 1:n % 根据DH参数计算旋转矩阵R{i}和连杆间偏移p{i} % 递推公式w{i} R{i-1}*w{i-1} qd(i)*z_i % wd{i} R{i-1}*wd{i-1} qdd(i)*z_i ... end % 内推从末端到基座递推每个连杆的合外力f和合外力矩n f zeros(3,n1); n_ zeros(3,n1); for i n:-1:1 % 递推公式f{i} R{i}*f{i1} m_i*vd_i % n_{i} R{i}*n_{i1} ... % 关节力矩 内推力矩在关节转轴方向的投影 关节摩擦力矩 tau(i) ...; end end只看框架可能觉得没什么但里面的细节很磨人。比如基座固定在地面上基座的线加速度要设为重力加速度的反方向才能让算出来的力矩包含重力补偿项。这个细节入门时非常容易忽略一忽略你就会发现仿真里的机械臂像在失重环境下工作每个关节的力矩都明显偏小。我建议你自己写代码时先用一个两连杆平面机械臂做验证手推它的动力学方程再和递归牛顿-欧拉的结果逐项对比。这个验证步骤花不了多少时间但能让你对递归流程里的每个中间量都有把握后面换成六自由度才不会心虚。3. 建模前必须卡死的第一个门槛DH参数与惯性参数从哪来3.1 DH参数的测量与转换很多人在动力学仿真前栽跟头不是栽在公式上而是栽在参数上——DH参数不准后面无论动力学多精确都白搭。DH参数一共有四列关节转角θ、连杆偏距d、连杆长度a、连杆扭角α。这里第一个坑是标准DH和改进DH的坐标系构造规则不一样z轴和x轴的选取顺序不同导致同一台机械臂的两套DH表数值完全不同。我见过有人把标准DH的表格直接塞进改进DH的代码里仿真结果自然是天方夜谭。如果你的机械臂有现成3D数模获取DH参数最可靠的方法是直接量数模里的相邻关节轴线关系。具体做法在SolidWorks、Creo或者Onshape里把每个关节的旋转轴画成一条三维草图线然后测量相邻轴线之间的公垂线长度就是a、沿当前z轴的偏移就是d、两条轴线在空间中的夹角就是α。θ在零位时通常设置为0如果你的机械臂有零位偏移就在那一个关节的θ初值里补上。注意测量时要用相邻轴线而不是相邻连杆表面否则参数会带上一个莫名其妙的平移误差。3.2 惯性参数怎么估算DH参数解决了几何关系动力学还需要每个连杆的质量、质心位置和惯性张量。这三个参数我在网上搜的时候发现被说得特别玄乎其实办法就两个第一如果3D数模是完整的装配体用三维软件的质量属性工具直接导出通常几秒钟就能出结果第二如果你只有二维图纸或者已经3D打印出来了就用近似法——把每个连杆拆成圆柱、长方体、薄板等基本几何体分别计算质量再加权求和质心位置也按组合体计算。惯性张量是这里面最容易出错的地方。首先是单位三维软件里默认可能是 g·mm²而MATLAB代码如果按 kg·m² 计算差着 10⁶ 倍算出来的扭矩自然是天文数字。其次是参考坐标系惯性张量必须相对于连杆坐标系也就是DH表对应的坐标系给出而不是三维软件的世界坐标系。这个问题我在后面还会专门说因为它在导出数据时几乎是必然踩中的。第三是惯性张量的物理意义对角线项是绕三个轴的转动惯量非对角线项是惯性积对机械臂这种细长连杆来说非对角线项通常很小可以近似填0但如果你用软件导出就不要手动约掉直接原样填进去最稳妥。我自己用的是一套带1kg负载能力的六自由度关节臂臂展大约800mmDH参数表大概长这样这里只给前两个关节示意关节 iθ 初始d (mm)a (mm)α (deg)103400-902-9003700...............我强烈建议把DH参数表单独抽成一个配置文件不要散落在各个函数里。这样后面要换机械臂型号、要分析某个关节参数对动力学影响的时候只需要改一张表而不是翻遍整个代码库。4. 代码集核心函数拆解从正解到逆动力学一条路走通4.1 正运动学与雅可比矩阵动力学仿真的基础是运动学这套代码集里第一个核心函数是正运动学。它做的事情很朴素给定六个关节角度返回末端执行器相对于基座的齐次变换矩阵。代码实现就是把六个DH变换矩阵连乘起来核心逻辑就是下面这几行function T fkine(q, dh) T eye(4); for i 1:size(q,1) % 根据第i个DH参数构造连杆变换矩阵 Ti [cos(q(i)), -sin(q(i))*cos(dh.alpha(i)), sin(q(i))*sin(dh.alpha(i)), dh.a(i)*cos(q(i)); sin(q(i)), cos(q(i))*cos(dh.alpha(i)), -cos(q(i))*sin(dh.alpha(i)), dh.a(i)*sin(q(i)); 0, sin(dh.alpha(i)), cos(dh.alpha(i)), dh.d(i); 0, 0, 0, 1]; T T * Ti; end end别觉得这段简单它就是整个动力学的地基。雅可比矩阵我提供了两种求解方式解析法和数值法。解析法需要自己推导各个关节角速度对末端线速度和角速度的映射关系六自由度推导起来挺费事数值法就简单粗暴直接对正运动学求偏导把每个关节角度加一个小扰动观察末端位姿的变化量。代码集里我默认用解析法因为它的计算精度更高关键是在奇异位形附近不会像数值微分那样产生很大的误差。4.2 完整的MATLAB仿真主循环运动学函数到位之后动力学仿真主循环就顺理成章了。仿真的基本思路是先生成一条关节空间轨迹这可以是五次多项式插值或者梯形速度曲线然后对轨迹做微分得到速度和加速度最后把位置、速度、加速度送给逆动力学函数算出每个时刻的关节力矩。轨迹发生这块我也单独做了函数。工程上最常用的是五次多项式插值因为它能保证位置、速度、加速度的连续性让机械臂运动过程中没有冲击。给定初始位置和末端位置、初始速度和末端速度五次多项式系数可以用简单的线性方程解出来function q_traj quintic_trajectory(q0, qf, tf, dt) % 位置、速度均设初末为0 t 0:dt:tf; a0 q0; a1 0; a2 0; a3 (20*(qf-q0)) / (2*tf^3); a4 (-30*(qf-q0)) / (2*tf^4); a5 (12*(qf-q0)) / (2*tf^5); q_traj a0 a1*t a2*t.^2 a3*t.^3 a4*t.^4 a5*t.^5; end主循环里我会保存每个采样时刻的关节位置、速度、加速度和力矩最后统一绘图。绘图这部分别小看MJ的关节力矩曲线用subplot排成6张小图一眼就能看出哪个关节在哪个阶段最吃力这是后面做电机选型和轨迹优化的重要依据。4.3 重力补偿是一个独立函数整套代码集里我单独拆了一个重力补偿函数出来因为它在实际项目中太常用了。安全起见工业机械臂调试的时候经常要开重力补偿模式——让机械臂在没有外部负载的情况下悬浮在某个位形哪怕抱闸松开它也不会往下掉。这个功能对应的就是让逆动力学算一个只在重力作用下的前馈力矩。实现上只需要把关节速度和加速度全部置零只保留重力项得到的就是某个姿态下的重力补偿力矩。这个函数单独拆出来的好处是你可以用它做静态验证把机械臂固定在几个已知姿态手算某个关节的重力矩再和函数输出对比。比如肩关节在机械臂水平伸展时重力矩最大这个值可以用每段连杆的质量乘质心到关节轴的水平距离简单估算如果代码算出来和手算量级不对那基本可以断定惯性参数或者坐标系有问题。5. 仿真跑完不算完扭矩曲线才是电机选型的底气5.1 从仿真结果到选电机很多人跑完动力学仿真看到关节力矩曲线出来就停了以为大功告成。但对我来说扭矩曲线只是半成品把它转化成电机选型数据才算是真正的落地。电机选型不是看某个瞬间的峰值扭矩就完事要看三个指标峰值扭矩、持续扭矩和峰值转速。峰值扭矩决定了电机能不能带动机器人摆脱卡死和急停场景持续扭矩对应的是电机长时间运行时的发热情况峰值转速则直接关系到机械臂的末端速度是否够快。这套代码集里我专门写了一个after_process函数对每条扭矩曲线做数据分析输出每个关节的峰值扭矩、均方根扭矩、平均扭矩以及对应的机械臂位形。均方根扭矩尤其重要因为它和电机发热直接相关你可以用它与电机额定扭矩做对比判断减速比是否合适。举个例子我的这台六轴机械臂在走一段典型工作轨迹时各关节的仿真结果是这样的减速比已折算到电机侧关节峰值扭矩 (N·m)均方根扭矩 (N·m)对应姿态1429.5大力加速28823.1水平伸展35517.8水平伸展4122.6高速回转581.9末端翻转640.8末端旋转这里明显能看到关节2最吃力它在水平伸展时几乎承担了全部手臂的重力矩所以它的减速比和电机功率都要重点考虑。如果闭着眼睛直接按峰值扭矩选电机会发现每个关节都要大电机成本和重量都不可接受但配合均方根扭矩看就能发现关节4到6其实可以选小很多号的电机。这种轻重搭配在机械臂设计里特别关键。5.2 和仿真软件交叉验证扭矩曲线出来以后我建议你至少做一次交叉验证再拿它当设计依据。最直接的办法是把同一组DH参数和质量属性导入商用仿真软件或者开源的三维仿真环境里让它跑同一条轨迹然后对比两者的关节扭矩曲线。商业软件的好处是它的刚体动力学求解器经过大量工程验证如果你手写代码的结果和它的结果在形状和量级上高度吻合那你这套代码基本就稳了。我当时对比的结果是关节1到3的扭矩曲线几乎重合关节4到6在动态段有小幅差异追查下来发现是我代码里没有考虑关节摩擦。关节摩擦这个事我提一句。很多入门级的MATLAB动力学教程都不会写摩擦项因为纯刚体动力学就不包含它。但实际电机选型时摩擦是一个不可忽略的阻力来源尤其对带减速器的关节摩擦扭矩可能占额定扭矩的10%到30%。代码集里我预留了库仑摩擦和粘性摩擦的参数接口你需要根据减速器手册或者实测值填上去否则选完电机装到机器上你会发现低速运动时扭矩比仿真的大不少。6. 容易翻车的地方我都替你踩过了6.1 惯性张量坐标系不统一结果差到天际这个坑我必须放在第一个说因为它的隐蔽性最强。三维软件导出的惯性张量默认是相对于质心坐标系而且坐标系的朝向随软件不同而不同。你在MATLAB里做逆动力学计算时输入给代码的惯性张量必须是相对于每个连杆坐标系也就是DH表定义的坐标系的。如果直接拿质心坐标系的结果填进去机械臂绕某个轴旋转的转动惯量投影就全错了。规避方法也不复杂在三维软件里导出惯性张量时选相对于输出坐标系然后在软件里建立一个与连杆坐标系对齐的参考坐标系再导出如果软件不支持就在MATLAB里用平行轴定理和旋转矩阵把惯性张量变换过去。这个变换代码集合里面我写成了一个独立的函数你只要知道自己机械臂的质心在连杆坐标系里的坐标就能一键转换。6.2 重力加速度的方向放错听上去很蠢但我真的见过好几个人在牛顿-欧拉的外推循环里把重力加速度方向搞反。这里的关键是基座固定在地面上我们算的是基座坐标系下的运动重力作用下基座的惯性加速度应该等于重力加速度的反方向也就是如果z轴竖直向上基座线加速度要设成 (0, 0, 9.81)这时机械臂相当于向上加速产生的惯性力恰好抵消重力。反过来说如果你设成 (0, 0, -9.81)重力矩方向就反了仿真结果里机械臂不但不往下沉反而会向外飞。这个错误通常表现为某几个关节的力矩特别大而且符号完全反了。排查技巧很简单让所有关节速度和加速度为零只留重力项看输出是不是纯重力补偿力矩再用静力学手算验证。6.3 仿真步长和轨迹生成之间的隐形矛盾动力学仿真还容易在数值积分和轨迹生成之间翻车。比如轨迹生成时 dt 取了 1ms但仿真的控制周期是 10ms两者插值没对齐扭矩曲线就会出现高频振荡。更隐蔽的是五次多项式轨迹虽然加速度连续但加速度导数加加速度并不受约束在某些高速段加加速度峰值特别大反映到扭矩曲线上就是突然的尖峰。如果发现扭矩曲线出现周期性的尖刺先检查轨迹生成的时间步再检查加加速度约束。我在代码集里提供了重采样函数可以把任意轨迹插值到指定控制周期这个函数在联调实物时也有用。另外提醒一句做实时仿真时尽量用小步长跑第一批数据比如 0.1ms虽然慢但能确认整个系统没有数值不稳定问题之后再逐步放大到 1ms节省计算时间。6.4 验证动力学代码的三个降维方法最后一个建议也是我每次确认代码正确性时必做的一套动作。第一把机械臂固定在几个特殊位形比如完全竖直、完全水平、肘部折叠分别用手算静力学验证重力补偿力矩这个能迅速暴露DH参数和质心位置的错误。第二把关节速度置零、加速度置零只加单个关节很小的加速度观察对应关节的力矩变化检查惯性矩阵对角线是否正确。第三跑一个简单的末端直线运动轨迹看关节2和关节3的扭矩变化是否符合直觉——比如水平伸到最远处时扭矩最大缩回来时扭矩减小。这三步全部通过我对这套代码的信心就基本能到90%以上了。我个人的体会是整套六自由度机械臂动力学建模与仿真真正难的不是写代码那一步而是建立对你手上这台机械臂的参数自信。DH参数测准了惯性张量坐标系对齐了重力方向摆正了牛顿-欧拉递归写出来就是水到渠成的事。你要是正在做机械臂毕业设计或者手头有一台3D打印的六轴机械臂想认真做动力学验证建议从这段扭矩曲线对比开始入手——先跑到这一步你就能底气十足地跟别人说这机械臂的电机选型我是用动力学仿真算过的不是拍脑袋定的。本文还有配套的精品资源点击获取
返回列表