
前阵子一个做毕设的同学拿着一张3D打印六轴机械臂的图纸来找我说舵机老是抖末端还会慢慢垂下来。我问他“你算过每个关节的力矩吗”他愣了一下说“我选的是网上评价很好的20kg·cm总线舵机啊。”——这大概是我见过最典型的机械臂项目翻车现场。机械臂电机力矩计算这件事说难不难说简单也不简单。它本质上就是回答一个问题在每个关节的每个位置上电机到底需要出多大的力才能扛住、动起来、停下来。算清楚了电机选型、结构设计、控制参数全都有据可依算不清楚后面就是无穷无尽的抖动、下垂、丢步、烧舵机。这篇文章就是来聊这件事的。我会从最基本的静力学入手带着你完整算一遍六轴机械臂在最恶劣位姿下的关节力矩再把力矩值换算成电机选型需要的指标最后说说动态力矩、重力补偿和实测验证。无论你是做3D打印机械臂毕业设计还是在ROS2里搭UR5e仿真或者自己搞OpenARM、AR3这类开源项目这套思路都适用。1. 先搞清楚你算的是静力矩还是动力矩两者差一个“加速度”很多第一次做机械臂的人容易把力矩计算想得太玄乎一上来就翻机器人学教材找Lagrange方程、Newton-Euler递推。我不是说动力学没用而是说你要先分清楚你现在要解决的是“保持得住”的问题还是“动得起来”的问题。这两个问题的难度完全不一样。1.1 为什么静力矩是选型的起点机械臂的关节力矩可以用一条动力学方程概括τ M(q)q̈ C(q,q̇)q̇ G(q) τ_f左边是电机需要输出的关节力矩右边四项分别是惯性力矩、科氏力和向心力、重力矩、摩擦力矩。当机械臂静止不动或者做匀速运动时q̈和q̇都接近零惯性项和速度相关项基本消失剩下的就是G(q)加摩擦——这就是静力学范畴。我习惯用一个特别朴素的类比你提着一袋5公斤的米站着不动手臂肌肉出的力就是“静力矩”你要把这袋米从地上快速甩到桌上额外的那股爆发力就是“动力矩”。对于大多数桌面级机械臂、3D打印机械臂、教学演示机械臂来说运动速度不快、加减速不猛选型时以静力矩为基准乘以一个安全系数基本就够了。这也是为什么我说静力矩是选型的起点。1.2 动力矩什么时候必须算如果你的机械臂要高速运动、频繁启停、末端要干重活比如打磨、铣削或者要用强化学习去跑一些激进策略那静力矩就不够看了。加速度一大惯性项M(q)q̈可能会比重力矩大好几倍。这时候你再去翻机器人学教材才不亏——完整的多刚体动力学、Newton-Euler递推、Lagrange方法都是为这个场景准备的。一个反直觉但又十分重要的结论机械臂“水平伸得最直”的时候重力力矩最大因为重力力臂最长。很多人以为机械臂转得最快、甩得最猛的时候才是最危险的实际上对于静力选型最恶劣位姿永远是所有关节水平伸展、末端负载处于最大臂展的那一刻。本节后面的算例全程围绕这个位姿展开。2. 手把手算一遍六轴机械臂在最恶劣位姿下的关节力矩推导现在我拿一台典型的桌面级六轴机械臂来实操一遍。这类结构在AR3、OpenARM以及各种3D打印机械臂上都非常常见腰部旋转关节J1肩部俯仰关节J2肘部俯仰关节J3后面是腕部的三个旋转关节J4/J5/J6。计算前先准备好每个杆件的长度、质量和质心位置——这些数据可以从CAD模型直接导出也可以自己称。2.1 最恶劣位姿怎么找水平伸展才是极限工况所谓“最恶劣位姿”就是让重力力臂最大化的位姿。对于大多数转动关节肩、肘力臂等于质心在水平方向上的投影距离。当大臂、小臂水平伸直时末端负载离肩关节的水平距离最远肩关节的重力矩最大。注意这里有个容易被忽略的点腰部旋转关节J1绕竖直轴旋转重力方向与旋转轴平行理论上重力矩为零。但实际情况中J1要承担整条手臂的重量产生的轴向力还要克服启动时整条手臂的转动惯量——这部分我留到第四章讲。现在先把J2和J3算明白。2.2 一个可复现的数值算例从负载到肩/肘/腰逐关节推算假设机械臂参数如下末端负载含夹爪工件m_load 0.5 kg大臂长度 L2 0.25 m质量 m_upper 1.0 kg质心在大臂中点距肩关节0.125 m小臂长度 L3 0.25 m质量 m_fore 0.8 kg质心在小臂中点距肘关节0.125 m距肩关节0.375 m腕部到末端抓手中心距离 0.1 m重力加速度 g 9.8 m/s²先算肘关节J3。J3要扛的是小臂自身的重力矩加上末端负载的重力矩。末端负载质心距离肘关节的水平距离是0.25 0.1 0.35 m小臂自身质心距离肘关节0.125 m。于是τ_J3 m_load × g × 0.35 m_fore × g × 0.125代入数字τ_J3 0.5×9.8×0.35 0.8×9.8×0.125 1.715 0.98 2.695 Nm再算肩关节J2。J2要扛的不仅是小臂和负载还包括大臂自己。它们距离肩关节的力臂分别是末端负载0.25 0.25 0.1 0.6 m小臂质心0.25 0.125 0.375 m大臂质心0.125 mτ_J2 0.5×9.8×0.6 0.8×9.8×0.375 1.0×9.8×0.125代入数字τ_J2 2.94 2.94 1.225 7.105 Nm看到这个数字你就能明白为什么很多3D打印机械臂用普通舵机带不动单肩关节就需要7Nm级别的力矩这还只是水平静止保持。换算成舵机圈常用的单位1 Nm ≈ 10.2 kg·cm所以7.105 Nm约等于72.5 kg·cm。市面上常见的20kg·cm总线舵机来带差了三倍多末端不垂下来才怪。2.3 用表格收拢结果每个关节该留多少余量把刚才算出来的数据整理成一张表看起来就很清晰关节承受对象最恶劣位姿力矩Nm换算kg·cm选型建议余量J3肘关节小臂末端负载2.69527.51.5-2倍J2肩关节大臂小臂末端负载7.10572.52倍J1腰部静力矩接近0但启动惯量大按动态计算—2-3倍J4/J5/J6腕部关节在这里没单列它们的力矩主要来自夹爪和工件的偏置重量通常不会超过1 Nm。但如果你的夹爪很重、工件离腕关节中心很远一定要单独算别想当然。这张表就是后续所有工作的基础。带着这个数值去选电机、选减速比才能实现“按需索骥”而不是“往大里买”。3. 从力矩值到电机选型减速比、效率和额定扭矩怎么映射算出关节需要的输出力矩之后真正的选型才刚刚开始。因为电机直接输出的扭矩通常很小大量机械臂会在电机和关节之间加一级减速器。选型时要顺着传动链从负载侧反推回电机侧才算得准。3.1 减速比和效率“大力士”是怎么炼成的减速器的作用是放大扭矩、降低转速。它们之间的关系是τ_out τ_motor × i × η其中i是减速比η是传动效率。我见过很多新手直接拿这个公式算但把η当成1——这是个大坑。不同减速器的效率差别很大行星减速箱效率约70%-90%看级数谐波减速器效率约80%-85%蜗轮蜗杆效率可能只有40%-70%但自锁性好舵机内置塑料齿轮组效率也就在60%-80%以肩关节为例目标输出力矩我们按2倍安全系数取14 Nm假设用一个1:10的行星减速箱效率取0.8那么电机端需要输出的扭矩是τ_motor 14 / (10 × 0.8) 1.75 Nm这个数字就很有参考意义了。42步进电机的保持扭矩通常在0.4-0.9 Nm显然不够57步进电机的保持扭矩在1.2-2.5 Nm勉强够用。如果你用的是无刷电机加谐波减速器那1.75 Nm的电机侧要求不算高很多无刷电机加10倍谐波的方案都能覆盖。3.2 舵机、步进电机还是无刷谐波按力矩需求对号入座机械臂DIY圈常见的驱动方案大致分三类我把它们的适用区间整理一下方案适用关节输出力矩优点注意点舵机含总线舵机0.1-30 kg·cm级别集成减速箱驱动控制器简单标称力矩往往有水分连续工作会发热步进电机行星减速箱1-30 Nm级别成本低控制简单开环也能定位高速会丢步需要电流余量无刷电机谐波减速器5-200 Nm级别精度高可力矩控制适合协作臂成本高控制系统复杂回到刚才的算例肩关节输出要7.105 Nm也就是约72.5 kg·cm。如果你铁了心用舵机至少要选峰值扭矩80 kg·cm以上的型号而且最好关注它的“连续工作扭矩”而不是“堵转扭矩”。如果你用步进电机方案57步进加1:10行星减速箱是一个比较稳妥的起点。3.3 别忘了转速和功率力矩不是唯一指标只算力矩不看转速机械臂会变成“大力士但慢吞吞的乌龟”。机械臂的关键指标里有一个叫做“峰值速度”的东西比如你希望肩关节能以60°/s的速度转动换算成弧度就是约1.05 rad/s。这时肩关节的机械功率需求大约是P τ × ω 7.105 × 1.05 ≈ 7.5 W再考虑2倍余量和传动效率电机侧需要约18-20 W的机械功率。所以你去看电机参数时别只看扭矩还要看额定转速和额定功率。很多42步进电机额定转速只有几百转/分钟但通过减速器变速之后关节速度完全够用。对小型机械臂来说几十瓦的电机功率绰绰有余难点永远在“扭矩够不够”而不是“功率够不够”。4. 动态力矩、关节惯量与重力补偿只算静态会出大事静态力矩解决的是“保持姿势”的问题但机械臂的日常是“动”。你让它快速伸展去抓东西、急停、又或者末端顶着一个工件去打磨这些场景都会在重力矩之上叠加明显的动力矩。如果你只算静态力矩选出来的电机很可能在动作高潮时突然饱和——哪怕只是一瞬间。4.1 惯量折算与负载惯量比为什么电机一装上去就“带不动”机械臂运动时不仅负载有惯性电机转子、减速器本身也有惯量。在选型时有个概念叫“负载惯量比”一般建议折算到电机侧的负载惯量与电机转子惯量的比值不要超过10否则系统动态响应会很差容易出现振荡。这里需要区分清楚折算方向。设在负载侧的转动惯量是J_L减速比是i那么折算到电机侧的负载惯量是J_motor_side J_L / i²公式表明减速比越大负载惯量折算到电机侧就越小电机越容易驱动负载。但从负载侧往回看电机转子惯量J_m折算到负载侧后会变成J_m × i²看起来就像一个“巨大的飞轮”。这就是为什么有些机械臂装了高减速比电机后感觉“刹车刹不住”——电机虽然力矩够但负载侧的等效惯量太大急停时需要的反向力矩会非常惊人。回到2.2节的算例粗略估算整条手臂绕腰部竖直轴Z的转动惯量J_Z ≈ m_upper × 0.125² m_fore × 0.375² m_load × 0.6² 1.0×0.0156 0.8×0.1406 0.5×0.36 0.0156 0.1125 0.18 0.308 kg·m²如果希望腰部在0.5秒内从静止加速到60°/s角加速度约2.1 rad/s²J1关节需要额外输出的启动力矩就是τ J_Z × α 0.308 × 2.1 ≈ 0.65 Nm这个数字看起来不大但别忘了它是在重力矩之外叠加的而且实际整臂绕Z轴的转动惯量通常比这个质点估算大——尤其是当手臂姿态变化时J_Z差异很大。J1选型只看静力矩、不看惯量和峰值力矩就会被这个“看不到的扭矩”坑到。4.2 雅可比与末端接触力抓取和打磨时力矩怎么变机械臂抓取重物、用末端顶住工件打磨时末端接触力也会映射到各个关节力矩。它们的关系用雅可比矩阵表达τ J^T F末端在某个方向施加力F所有相关关节都会产生对应的力矩。一个简单例子末端在水平伸展位姿下、离肩关节0.6 m处向下压10 N的力肩关节需要额外提供约6 Nm的力矩——这比分摊给肘关节的还要多。手眼标定、力控打磨这类应用里这个额外力矩经常被忽略结果就是末端力没达到预期位置还出现了明显偏差。4.3 重力补偿ROS和舵机机械臂里都在解决同一个问题重力矩是随位形变化的。机械臂水平伸展时重力矩最大竖直下垂时接近零。想在运动中让电机始终给出“适当”的力矩就需要实时补偿重力项G(q)。在ROS生态里MoveIt和ros2_control都支持从URDF读取各连杆的惯性参数和质心位置实时计算重力矩并在力矩控制接口里做前馈补偿。舵机机械臂没有力矩前馈接口但问题同样存在。很多总线舵机静态保持时发烫本质就是重力矩在持续压迫位置环控制板不得不输出很大的PWM来维持位置。这时候做“重力补偿”本质上是在算法层面针对关节角度预设一个额外的PWM偏置缓解位置环的压力。效果有但要小心补偿过大会引起振荡补偿过小等于没有。5. 算完力矩之后的实测与仿真验证手算只是起点手算模型再好和实际样机之间总会有偏差3D打印件的填充率不同会导致重量不对轴承和齿轮的摩擦系数很难精确建模线缆的拖拽也会贡献额外阻力。所以我不建议把手算结果当成终点而是把它作为一条“基准线”再用仿真和实测去交叉验证。5.1 从SolidWorks到URDF把质量属性查准查全很多人在SolidWorks里建模机械臂时零件默认材料是普通钢密度和3D打印用的PLA完全不是一回事。PLA密度大约1.24 g/cm³ABS约1.05 g/cm³铝合金约2.7 g/cm³。建模完成后第一步就是给每个零件指定正确的材料然后在“质量属性”里查看质量、质心坐标和惯性张量。如果你用的是SolidWorks的机械臂模型要导URDF的话最方便的是用SolidWorks to URDF插件它能按你配置的关节和连杆自动导出包含inertial标签的URDF。注意在导出前检查每个link的惯性张量单位是kg·m²而不是g·mm²——这个单位坑我见过不止一次。5.2 在Gazebo和ros2_control里读关节力矩URDF导好之后在Gazebo里仿真验证是很划算的一步。把机械臂摆成水平伸展位姿给所有关节发位置保持指令然后通过ros2 topic echo /joint_states查看effort字段对比手算的7.1 Nm附近。偏差在30%以内算正常如果差太多优先检查惯量参数、摩擦系数和质心位置。用ros2_control的时候如果你配的是EffortJointInterface就能直接对关节发送力矩指令。这在测试重力补偿算法时非常有用先只发重力补偿项看机械臂能否悬浮在某个位姿再叠加PD控制观察跟踪效果。你会发现有了重力补偿这个“基础力”PD控制器的负担小很多调参也快很多。5.3 实机验证用电流反馈反推真实力矩真机验证时最直接的手段是看驱动器或舵机控制板反馈的电流值。电机输出扭矩与电流近似成正比很多伺服驱动器和总线舵机都能实时反馈电流或力矩值。做法是让机械臂保持几个不同姿态比如0°、45°、90°水平伸展记录每个位姿下各关节的电流再根据电机的扭矩常数反推实际输出力矩和手算值对比。这套数据除了验证计算还能顺便标定摩擦力。比如你在空载、低速情况下测得某关节需要额外0.3 Nm才能启动这个值就可以作为静摩擦力矩补充到模型里。机械臂控制里所谓的“力矩前馈”通常就包含了重力和摩擦两项一点点标动作会越来越顺。6. 我踩过的几个力矩计算大坑希望你绕开最后这部分不按教材来全是我这几年在机械臂项目里真实踩过的坑写出来给你当路标。6.1 末端负载在最远端会翻倍别只算“裸机”很多3D打印机械臂刚装好时空载运行一切正常一旦加上夹爪和工件就开始呻吟。原因就是空载和满载的肩关节力矩差太多了——还是2.2节那个算例空载肩关节力矩只有大臂加小臂的4.165 Nm加上0.5 kg末端负载后直接变成7.105 Nm多了70%。那些标称“500g负载”的机械臂实际能稳定工作的负载往往得打个对折因为标称值通常只算了保持没算运动过程中的动态增量。6.2 标称扭矩 vs 连续扭矩舵机参数里的文字游戏舵机标注的扭矩到底是“堵转扭矩”还是“连续工作扭矩”这是最大的坑。堵转扭矩是电机在堵转瞬间能输出的极限值持续几秒钟没问题但保持几分钟就会过热甚至烧毁。选择总线舵机时我习惯按“连续扭矩是标称值的1/2到1/3”来估算。标称20kg·cm的舵机我最多按10kg·cm去用这样长期工作才稳。6.3 效率、摩擦、温升理论值到实际值之间至少打7折全齿轮传动、轴承润滑良好、结构刚度高的情况下理论力矩乘以1.5倍安全系数够用。但对于3D打印件、打印轴套、皮带传动这些组合理论值到实际值之间打7折甚至5折都不奇怪。我通常的做法是静态力矩乘2倍余量选电机但如果是频繁启停、长时间工作再往上加50%。6.4 一个通用脚本思路让Python替你反复算改一个臂长就要重算一遍所有力矩纯手算会让人崩溃。我用Python写过一个几十行的小脚本输入各段质量、质心距离、末端负载输出各关节在最恶劣位姿下的力矩。配合SolidWorks导出的质心数据改尺寸后几秒钟就能得到新力矩值。更进一步直接把URDF里的inertial和link长度解析出来用现成的Python机械臂库做正运动学在任意位姿下求重力矩整个流程就完全自动化了。这几年我做过不少机械臂项目从3D打印的小玩具到接近工业级的六轴样机都有。我越来越觉得力矩计算是机械臂全流程里投入产出比最高的一件事花一天时间把关节力矩算清楚后面几个月的选型、结构、调试都会变得非常顺反过来说跳过这一步后面迎接你的就是舵机发烫、末端下垂、丢步震荡这些永远调不完的问题。希望这篇文章能帮你把这一步走稳。