ARTICLE DETAIL

资讯详情

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

机器人动力学与控制学习笔记:从建模到控制的全景地图

机器人动力学与控制学习笔记:从建模到控制的全景地图 做机器人动力学与控制的学习笔记是我这段时间一直想认真梳理的事情。这行看起来门槛高公式多、概念杂但真正上手之后会发现只要把“动力学”和“控制”这两条主线捋清楚后面无论是做工业机械臂、移动机器人还是人形机器人底层逻辑都是通的。这篇笔记定位为系列第一篇先把机器人控制这件事的整体框架聊明白后面几篇再逐个深入动力学建模、控制算法推导和落地调试。写这个系列的主要目的是帮自己沉淀也顺便给刚入坑或者被各种教材劝退的朋友一条相对平滑的学习路径。很多人一上来就啃《机器人学导论》或者《机器人建模与控制》读了两章就卡在拉格朗日方程和雅可比矩阵里出不来其实问题不在于数学而是脑子里缺一张地图不知道每个知识点将来用在哪里。这篇文章就是那张地图。适合谁来读刚接触机器人方向的研究生、准备转行做机器人控制的工程师、还有一些在做嵌入式或自动化但想往机器人方向扩展的同学。我会尽量少堆公式多用“这东西到底是干嘛的”的视角来拆解让概念先落地公式留到后续笔记慢慢展开。1. 机器人控制到底在干什么先搞清楚目标再谈算法1.1 控制器的本质让机器人按你想要的轨迹运动先说个最直觉的理解。机器人控制的核心任务就是让机器人的各个关节角度、角速度以及末端的位姿尽量精确地去跟踪一条期望轨迹。比如工业机械臂要沿着一条焊缝匀速走或者移动机器人要从A点走到B点避开障碍本质上都是在做“状态跟踪”这件事。这个逻辑跟经典控制理论里的反馈控制一脉相承。你给系统一个期望输入传感器反馈当前状态控制器算出偏差再输出指令去修正偏差。但机器人控制系统跟普通的电机调速系统有一个根本性的不同它是一个强耦合、非线性的多输入多输出系统。一个六轴机械臂六个关节之间互相影响一个关节动了其他关节会因为重力、惯量耦合、科氏力等因素受到扰动而且这种耦合关系随姿态变化而变化。你没法像调一个直流电机那样把六个关节当成六个独立的PID去调完事。所以机器人控制的第一步不是上来就调PID参数而是先搞清楚你的控制对象长什么样。不同的机器人构型、不同的任务类型对控制器的要求完全不同。一个SCARA机器人和一个六自由度串联机械臂动力学特性差异巨大做点位搬运的任务和做曲面打磨的任务前者关心定位精度和快速性后者更关心接触力和轨迹平滑度。我个人的学习顺序建议是先把控制目标分类搞清楚再去看每种目标需要什么样的模型和算法最后才是公式推导和代码实现。这样你学每个算法的时候都会知道它在整个大图里处于什么位置。1.2 控制问题的三种典型分层从运动控制到力控制机器人控制问题按照任务性质大体可以分成三个层次。第一个层次是运动控制也就是让机器人的位置、速度、加速度跟踪期望值。这是最常见的控制需求比如码垛、搬运、喷涂、焊接等这些任务不需要跟环境发生太多力交互控制目标集中在轨迹精度上。第二个层次是力控制。当机器人末端需要与环境持续接触时比如打磨、抛光、装配纯粹的位姿控制就不够了。这时候如果还按照位置控制去硬顶机器人会产生很大的接触力轻则划伤工件重则损坏机器人或伤到人。力控制的思路是把接触力作为控制目标让机器人保持一个期望的压力同时适应工件表面的形状误差。第三个层次是柔顺控制介于运动和力控制之间它的核心思想不是直接控制力而是控制机器人末端的动态刚度。机器人被外力推动时应该像弹簧阻尼系统一样顺从地让位而不是僵硬地抵抗。这个在协作机器人和人机交互场景里尤为关键。搞清楚这三层你就明白为什么有些机器人项目用个简单的PD控制就能跑得很好有些项目则需要复杂的阻抗控制或力位混合控制。不是说算法越高级越好而是看任务的物理本质逼不逼你上复杂方案。这也是很多初学者容易走偏的地方一上来就学各种高级算法结果发现工程现场一个PID就搞定了反而忽略了模型和需求的分析。2. 动力学与控制的关系为什么控制绕不开动力学模型2.1 两套动力学建模方法拉格朗日法和牛顿-欧拉法聊到机器人控制绕不开的话题就是动力学建模。我在学习过程中最深的一个体会是动力学方程不是用来考试的它就是被控对象的“物理说明书”。你连对象的行为都描述不准后面的控制器设计只能是空中楼阁。机器人动力学建模主要有两大主流方法。第一种是拉格朗日法它的思路是从能量角度出发把机器人的动能和势能写出来构造拉格朗日函数然后通过求偏导得到动力学方程。好处是整个过程系统化不需要逐个关节分析受力适合手工推导和理解结构坏处是方程推导过程计算量大尤其是自由度一多符号推演极其繁琐。第二种是牛顿-欧拉法它的思路是从每个连杆的受力分析出发用递推的方式逐步算出速度、加速度、力得到关节力矩。这个方法计算效率高特别适合计算机编程实现也是很多实时控制系统的底层选择。很多商业机器人控制器内部跑的就是牛顿-欧拉递推算法。不管用哪种方法最终得到的动力学方程都可以整理成同一个标准形式M(q)q̈ C(q, q̇)q̇ g(q) F_friction(q̇) τ在这个式子里M(q)是惯性矩阵描述各关节之间的惯量耦合C(q, q̇)项是科氏力和离心力描述运动中的非线性效应g(q)是重力项F_friction是摩擦力τ是关节驱动力矩。看到这个形式你就要建立起一个条件反射控制器的设计本质上就是在跟这几项做斗争。2.2 逆动力学与正动力学控制用逆解仿真用正解动力学建模分两个方向这是初学者特别容易混淆的地方。正动力学是给定关节力矩τ去求机器人的运动状态q、q̇、q̈。它的典型应用是仿真——你在仿真环境里给机器人施加力矩看它怎么动通过不断积分推进状态量。Gazebo、MuJoCo这类物理仿真器的核心底层就是正动力学求解。逆动力学反过来给定期望的运动轨迹q、q̇、q̈去求需要施加的关节力矩τ。这个方向在控制里是主角因为控制器的任务就是算出该让电机输出多少力矩才能让机器人沿着期望轨迹运动。很多前馈控制的思路就是基于逆动力学模型提前算好需要多少力矩来克服惯量、重力、科氏力再用反馈环去补偿模型误差和外部扰动。理解这两个方向的区别你就明白了为什么很多高级控制算法都需要一个准确的动力学模型。模型准了前馈部分就能承担90%以上的控制力反馈部分只需要做微调模型不准或者干脆没有模型控制器就只能全靠反馈硬扛这时不是PID参数难调而是动态性能天花板很低一快就抖一慢就废。这里补充一个我踩过的坑。早期我在仿真里做算法验证用的模型是理想化模型摩擦、柔性一概忽略控制器跑得很漂亮。后来拿到实体机器人上一测发现完全不是一回事光是重力项标定不准就让静态误差大得离谱。所以说动力学建模这一步千万不要觉得只是推推公式它直接决定你后面所有控制算法的上限。3. 机器人控制方法全景图从经典到现代的演进路径3.1 PID控制工程界永远的老黄牛聊机器人控制方法必须从PID讲起。不是因为它简单就轻视它恰恰是因为它在工程里太管用了。PID控制的思想很简单比例项处理当前误差积分项消除稳态误差微分项抑制超调和振荡。但对一个六轴机械臂来说六个关节各自一套PID每套参数还得协调调起来绝对不是套公式那么简单。实际工程里关节空间的PID通常先调PD再视情况加I项。原因在于D项能提供阻尼让系统稳定I项用来消除重力引起的稳态误差。如果你有动力学模型做重力补偿I项甚至可以不加大重力项由模型前馈补偿掉了这样系统的相位裕度会更好动态响应也更利索。还有一个工程细节值得注意PID的微分项对噪声极其敏感尤其是用编码器差分算角速度的时候高频噪声会被D项放大导致力矩指令抖动。工程上通常的做法是把纯微分换成带低通滤波的“实际微分”或者把D项改成只作用在反馈量上而不作用在期望值上避免期望轨迹突变时产生微分尖峰。这些细节教材里很少写但你在实际调参时几乎一定会遇到。PID的优势是模型依赖低、实现简单、鲁棒性不错劣势是性能上限受限于增益对于快速运动和大惯量变化的场景单靠PID很难把跟踪误差压到理想水平。所以PID在工业机器人里依然大量存在但做高性能控制的人通常会把PID作为底层反馈环上面再叠加模型前馈。3.2 计算力矩控制用动力学模型做前馈的经典思路当PID的性能不够用时下一步就是引入动力学模型。计算力矩控制也叫逆动力学控制是教科书里最标准的“模型反馈”结合方案。它的核心思路分两步。第一步用逆动力学模型算出期望轨迹所需的标称力矩即前馈量第二步把轨迹跟踪误差通过PD反馈转化为修正量加在前馈量上面。合并起来的控制律可以写成τ M(q)(q̈_d K_p e K_d ė) C(q, q̇)q̇ g(q)其中e是位置误差ė是速度误差。这个控制律的妙处在于如果动力学模型完全准确代入之后可以把非线性系统精确线性化变成一个解耦的线性二阶系统这时候Kp和Kd就成了线性系统里的刚度系数和阻尼系数调参变得非常直觉。我第一次看到这个公式的时候其实没觉得有什么高明直到我做仿真对比才真正理解。同样的轨迹跟踪任务纯PD控制在高速大范围运动时跟踪误差可能达到好几度而计算力矩控制可以把误差压到一个数量级以下前提是模型得准。计算力矩控制的局限也很明显它极度依赖模型精度。模型里一个连杆质量标定错了一个惯性参数不准确控制器的性能就会显著下降。而且当系统存在未建模动态、摩擦突变、外部扰动时纯计算力矩控制的鲁棒性并不好。所以实际应用中计算力矩控制经常作为内环外面再套一个外环去补偿残余误差。3.3 鲁棒控制与自适应控制应对模型不确定性的两条路线既然模型不可能绝对准确那就得想招对付不确定性。两条典型路线是鲁棒控制和自适应控制。鲁棒控制的思路是我承认模型有误差但我给这个误差设一个界然后设计一个控制器保证在误差界内系统性能依然稳定。滑模控制就是最典型的鲁棒控制方法它通过设计一个滑模面让系统状态被“拽”到滑模面上并沿其滑动从而对匹配的不确定性具有不变性。滑模控制的工程问题也很有名抖振。因为控制律里通常含有符号函数项会让控制输入在高频切换激发机械结构的高频模态产生让人头疼的振动。工程上通常用饱和函数或准滑模来缓解但也会牺牲一部分鲁棒性。我自己的实践感受是滑模控制适合那些不确定性大且对误差容忍度较低的场合但调试起来比较费劲不是第一选择。自适应控制走的是另一条路我不回避模型有不确定性但我在线估计和更新模型参数让模型越用越准。典型的应用场景是机器人末端负载变化——比如机械臂搬的东西重量每次不一样如果模型中负载质量固定那控制器就不准了。自适应控制可以实时估计负载质量更新到模型里。这种方法的优点是不需要知道不确定性的确切范围缺点是需要设计参数更新律并且要保证稳定性和收敛性的理论条件实现复杂度比鲁棒控制高。而且自适应参数在实测中如果激励不足收敛会很慢甚至发散。所以它在学术研究里很常见工程落地时大家更愿意用鲁棒一点的方法或者干脆定期做一次辨识更新参数而不是在线实时自适应。3.4 力控制与柔顺控制机器人与人共事的关键前面说的都是位置层面的控制但当机器人要打磨、装配、跟人协作时必须考虑力。力控制领域有两个主流流派力位混合控制和阻抗控制。力位混合控制的思路很直接把任务空间分成两个正交的子空间一个子空间做位置控制另一个子空间做力控制然后通过选择矩阵把两种控制合成一路输出。听起来很清晰但实现起来对模型要求高而且在接触状态切换时容易不稳定工程上用得不如阻抗控制多。阻抗控制的思路更有意思它不直接控制力而是控制机器人末端表现出来的“阻抗”也就是位置偏差和接触力之间的动态关系。通过调整阻抗参数你可以让机器人末端变得很“软”——被外力推一下会让位也可以变得很“硬”——顶着外力保持位置。这个思路非常契合人机协作场景人在前面推着机械臂做示教机械臂顺着人的力走还不摇晃。实现阻抗控制有个前提需要把关节空间控制转换到任务空间或者直接基于关节空间做阻抗。前者涉及到动力学模型和雅可比矩阵的运算后者相对简单但物理意义没那么直观。我的经验是如果控制频率不够高比如低于1kHz阻抗控制很容易发硬或者抖动所以底层控制器最好跑在实时系统上别用Windows跑时延抖动会让你怀疑人生。4. 学习路径与实操建议从公式到代码之间的那些坑4.1 仿真工具选型先跑通流程再折腾算法理论学习之外动手实践是必须的。仿真工具的选择直接影响你的学习效率和调试体验。我整理了一个工具选型参照表给不同需求的朋友做参考。工具优势劣势适用场景MATLAB Robotics Toolbox上手快教程多符号推导友好实时性差代码效率低入门学习、算法验证Simulink Simscape Multibody建模仿真可视化好可与控制逻辑联合仿真模型解算速度一般动力学与控制联合仿真Python Pinocchio/NumPy开源免费接口灵活需要自己搭框架学术研究、快速原型Gazebo ROS 2生态完善传感器仿真全动力学精度一般调参麻烦机器人整体系统验证MuJoCo物理精度高速度快商业授权需注意强化学习、高保真仿真如果你刚入门我推荐先走MATLAB类工具把概念跑通别一上来就上ROS 2加Gazebo那个组合的复杂度会让你没精力关注算法本身的逻辑。等原理清楚后再迁到Python或者C环境做实时控制。4.2 参数调试与工程避坑三条实操心得压箱底仿真跑通了真正到实物调试又是另一个世界。这里分享三个我反复踩过的坑和对应的解决办法。第一个坑是忽略采样周期和控制频率的影响。很多算法在连续时间域推导时很完美但一数字化就出问题。比如计算力矩控制里的加速度前馈项对噪声极其敏感连续域看不出来离散化后如果控制频率不够高前馈项会引入明显的高频抖动。我的做法是先把控制频率提上去至少1kHz再考虑算法优化频率上不去时优先去掉前馈加速度项别硬扛。第二个坑是重力补偿的标定问题。很多人在仿真里重力项是精确已知的到了实物上直接用模型里的质量算结果发现机械臂静止时依然有静态误差。后来我在现场排查发现是负载参数和质心位置没标准。解决办法是做一个简单的离线辨识实验让每个关节单独运动记录稳态力矩反算重力和摩擦力参数。这一步做到位PD控制的稳态性能直接上一个台阶。第三个坑是安全保护一定要放在最前面。做控制实验之前先设好关节位置限位、速度限位、力矩限位再搞什么高级算法。我在实验室见过不止一次一个参数调猛了机械臂直接摆过去打到设备上还好有力矩保护没损坏结构。这个属于老生常谈但每次说都不多余。关于学习路径我给一个比较朴素的建议第一遍学的时候不要追求每个公式都会推先建立直觉地图第二遍过公式推导和技术细节结合代码实现去理解算法第三遍带着真实项目做哪块卡住了回来看哪块。三遍下来机器人动力学与控制的基本盘就非常扎实了。这个系列的第一篇先写到这里控制领域还有大量内容可以展开比如力控制里更细节的阻抗参数整定、机器人辨识技术、基于学习的方法等后续笔记再逐个拆开细聊。
返回列表