机器人运动控制20个核心技术:从PID整定到多轴同步的工程实践

发布时间:2026/9/24 11:20:18
机器人运动控制20个核心技术:从PID整定到多轴同步的工程实践
1. 机器人运动控制到底在控什么1.1 从“让关节动起来”到“让末端走对路”很多人第一次接触机器人运动控制脑子里想的都是“给个指令电机转起来”这么简单。但真到项目里你会发现让电机转只是最底层的一步真正难的是让机械臂的末端按照你想要的轨迹、速度、姿态去走而且走的过程中不能抖、不能丢步、不能撞。我习惯把机器人运动控制分成三层来看。最底层是伺服驱动层负责电流环、速度环让电机听话地转中间层是运动控制层负责多轴插补、轨迹规划、加减速处理最上层是任务规划层负责路径决策、避障、抓取策略。这三层里中间层是最容易被低估的也是20个核心技术里占大头的地方。举个实际例子。你让一个六轴机械臂从A点走到B点如果只做关节空间的点到点运动末端轨迹可能是一条乱七八糟的曲线中间还可能撞到工作台上的夹具。这时候就需要笛卡尔空间轨迹规划把末端路径约束成直线或圆弧再反解到每个关节的角度序列。这个反解过程就是逆运动学而反解出来的角度序列能不能平滑执行又取决于加减速规划和插补算法。所以运动控制的核心不是“转”而是“协调”。多轴之间要有时间上的同步位置上的配合速度上的匹配。任何一个轴快了或慢了末端轨迹就会偏。这也是为什么多轴运动控制在工业机器人里是硬骨头不是随便找个PLC发脉冲就能搞定的。1.2 20个核心技术的大致分布我把这20个核心技术按功能模块分了一下方便你建立整体认知模块涉及技术典型应用伺服驱动电流环、速度环、位置环、抱闸控制单轴精准定位控制算法PID、级联PID、前馈补偿、鲁棒控制轨迹跟踪轨迹规划关节空间规划、笛卡尔空间规划、圆弧插补机械臂末端路径通信协议CANopen、EtherCAT、Modbus多轴同步系统实现裸机PID、STM32实现、开源运动控制框架低成本方案这张表不是让你背的而是让你知道遇到问题时该往哪个方向查。比如末端抖动可能是轨迹规划的问题也可能是速度环PID没调好还可能是CANopen同步周期设得太长。排查的时候要一层一层往下剥。2. 伺服控制与PID从单轴到多轴的基石2.1 电流环、速度环、位置环到底怎么套伺服控制最经典的结构就是三环嵌套。很多人调伺服的时候只知道调位置环增益其实真正决定响应品质的是内环。电流环是最内层响应最快通常在微秒级。它的作用是让电机电流快速跟踪指令电流从而控制转矩。电流环一般由驱动器厂商固化好了你不需要动但你要知道它的存在。如果电流环带宽不够速度环怎么调都会觉得“软”。速度环在中间响应在毫秒级。它接收速度指令输出电流指令。速度环的PID参数决定了电机对抗负载扰动的能力。速度环积分作用太强容易产生低频振荡比例作用太强容易产生高频啸叫。位置环在最外层响应最慢。它接收位置指令输出速度指令。位置环通常只用比例控制因为积分会带来相位滞后容易导致超调。注意三环的带宽必须逐层递减一般电流环带宽是速度环的5到10倍速度环带宽是位置环的5到10倍。如果你把位置环调得比速度环还快系统必振。2.2 级联PID和普通PID的区别在哪普通PID就是单环输入误差输出控制量。级联PID是把多个PID串起来外环的输出作为内环的输入。伺服三环就是典型的级联PID。级联的好处是扰动抑制能力更强。比如负载突然变化速度环会先感受到通过电流环快速补偿等到位置环感受到误差时速度环已经把大部分扰动吃掉了。如果只用单环位置PID负载一变位置误差会很大恢复也慢。但级联PID调参更麻烦。你不能单独调一个环因为外环的性能依赖内环。我一般的调参顺序是先调电流环如果可调再调速度环最后调位置环。速度环调的时候把位置环设成纯比例且增益很低让电机先能稳定转起来再逐步加位置环增益。2.3 PID参数Kp、Ki、Kd的物理意义和整定口诀Kp是比例增益决定“误差多大就出多大力”。Kp越大响应越快但太大就振荡。Ki是积分增益决定“误差持续多久就累积多大力”。Ki的作用是消除稳态误差但太大会导致积分饱和系统超调甚至发散。Kd是微分增益决定“误差变化多快就提前刹车”。Kd能抑制超调但对噪声敏感实际伺服里经常只加很小的Kd或者干脆不加。我常用的整定口诀是先P后I再D先快后慢再微调。具体步骤把Ki和Kd设0Kp从小往大加直到系统开始等幅振荡记下此时的Kp为临界增益Ku振荡周期为Tu。按Ziegler-Nichols经验公式设参数Kp0.6KuKi2Kp/TuKdKp*Tu/8。在这个基础上微调如果超调大就减Kp或加Kd如果稳态误差消不掉就加Ki。但Z-N法整出来的参数通常比较激进实际项目里我会把Kp再降20%左右牺牲一点响应速度换稳定性。2.4 裸机PID和STM32上的实现要点很多低成本项目用STM32做运动控制跑裸机PID。这时候有几个坑必须注意。第一采样周期必须固定。PID计算依赖固定的dt如果你用while循环里随便调用dt会飘积分项和微分项都会算错。正确做法是用定时器中断固定周期触发PID计算。第二积分限幅。电机堵转时误差一直存在积分项会累积到很大等堵转解除后系统会猛冲。所以积分项要设上下限或者用积分分离误差大时不积分。第三微分项对噪声敏感。编码器信号如果有毛刺微分项会放大成剧烈抖动。解决办法是对微分项加低通滤波或者用不完全微分。// STM32裸机PID简化示例 typedef struct { float Kp, Ki, Kd; float integral; float prev_error; float integral_limit; float output_limit; } PID; float PID_Calc(PID *pid, float setpoint, float feedback, float dt) { float error setpoint - feedback; pid-integral error * dt; // 积分限幅 if (pid-integral pid-integral_limit) pid-integral pid-integral_limit; if (pid-integral -pid-integral_limit) pid-integral -pid-integral_limit; float derivative (error - pid-prev_error) / dt; pid-prev_error error; float output pid-Kp * error pid-Ki * pid-integral pid-Kd * derivative; // 输出限幅 if (output pid-output_limit) output pid-output_limit; if (output -pid-output_limit) output -pid-output_limit; return output; }这段代码里dt必须是常数如果你在main循环里调用dt就是变化的积分和微分都不准。我一般用1kHz的定时器中断dt0.001秒。3. 轨迹规划让机械臂走得像人一样顺3.1 关节空间规划和笛卡尔空间规划怎么选关节空间规划是直接对每个关节的角度做插值优点是计算简单、不会遇到奇异点缺点是末端轨迹不可控。笛卡尔空间规划是先规划末端位姿再逆解到关节角度优点是末端轨迹精确缺点是计算量大、可能遇到奇异点。实际项目里怎么选如果只是抓取放置中间路径没有严格要求用关节空间规划就够了速度快、稳定。如果需要涂胶、焊接、切割末端必须走直线或圆弧那就必须用笛卡尔空间规划。我做过一个码垛项目一开始用笛卡尔空间规划结果在靠近奇异点时关节速度飙到极限只能降速运行。后来改成关节空间规划节拍直接快了30%。所以不是越精确越好要看工艺需求。3.2 梯形加减速和S型加减速的取舍梯形加减速是加速度恒定速度曲线像梯形。优点是计算简单缺点是加速度突变会对机械结构产生冲击。S型加减速是加速度也做平滑过渡速度曲线像S形。优点是冲击小、运行平稳缺点是计算复杂参数多。我一般这样选低速轻载用梯形高速重载用S型。如果机械臂末端有视觉相机或者精密传感器必须用S型否则振动会影响测量。S型加减速的关键参数是加加速度Jerk也就是加速度的变化率。Jerk越大冲击越大但响应越快Jerk越小越平稳但越慢。实际调的时候从大往小试直到振动消失。3.3 机械臂轨迹规划算法的实操流程以六轴机械臂走直线为例完整流程是这样的确定起点和终点位姿包括位置(x,y,z)和姿态(roll,pitch,yaw)。规划末端路径在笛卡尔空间做直线插补按固定距离步长生成一系列中间点。逆运动学求解对每个中间点求关节角度。这里要注意多解问题要选与上一组解最接近的那组避免关节突变。关节空间插值对逆解出来的角度序列做S型加减速规划生成每个控制周期的关节角度指令。下发到伺服通过CANopen或EtherCAT把角度指令发给各轴驱动器。这里面第3步最容易出问题。逆运动学有多解如果选解策略不对机械臂会在两个构型之间跳变非常危险。我的做法是维护一个“当前关节角”变量每次逆解后选与当前角距离最小的解并限制单周期最大角度变化量。3.4 圆弧插补和姿态插补的细节圆弧插补比直线插补麻烦因为要确定圆心和半径。三点确定一个圆但机械臂末端走圆弧时姿态也要同步变化。如果只插补位置不插补姿态末端工具的方向会乱转。姿态插补一般用四元数球面线性插值Slerp比欧拉角插值更平滑不会出现万向锁。四元数插值的公式不复杂但要注意单位化和符号一致性否则会出现“翻转”。实操心得圆弧插补时如果圆弧角度超过180度要拆成两段否则圆心计算会出错。这个坑我在一个打磨项目里踩过机械臂走到一半突然反向差点撞机。4. 通信协议与多轴同步CANopen和EtherCAT怎么用4.1 CANopen协议在伺服驱动控制中的核心对象CANopen是工业机器人里最常见的伺服通信协议之一尤其是中小型机械臂。它的核心是对象字典每个参数都有一个索引和子索引。控制伺服最常用的几个对象对象索引作用控制字0x6040使能、启动、停止状态字0x6041读取驱动器状态目标位置0x607A位置指令实际位置0x6064位置反馈目标速度0x60FF速度指令插补周期0x60C2同步周期CANopen有两种模式周期同步位置模式CSP和周期同步速度模式CSV。机械臂轨迹跟踪一般用CSP每个同步周期下发一次目标位置驱动器内部做插补。同步周期很关键。周期太长轨迹会抖周期太短总线负载高。我一般设1ms到4ms具体看轴数和总线波特率。六轴机械臂用1Mbps波特率1ms周期基本能跑满。4.2 汇川Easy521手轮控制伺服轴的跟随运动汇川Easy521是小型PLC支持手轮输入。手轮控制伺服轴跟随本质是把手轮脉冲当作位置指令源通过PLC的高速计数器和脉冲输出功能实现。配置步骤大致如下手轮A/B相接到PLC的高速计数输入点。在PLC里配置高速计数器为4倍频模式提高分辨率。把计数器当前值映射到伺服轴的目标位置。伺服轴设为位置模式接收PLC的脉冲指令。调整电子齿轮比让手轮转一圈对应伺服轴走想要的位移。这里的关键是电子齿轮比。比如手轮转一圈1000脉冲你希望伺服轴走10mm丝杠导程5mm编码器10000脉冲/圈那电子齿轮比就是(10000/5)*10/100020。这个计算必须准确否则手轮和实际位移对不上。注意手轮控制时PLC的扫描周期会影响跟随响应。如果扫描周期太长手轮快速转动时伺服轴会滞后。建议把高速计数和脉冲输出放在中断里处理不要放在主循环。4.3 台达A2伺服抱闸控制的时序问题台达A2伺服带抱闸的电机抱闸控制时序不对会导致电机堵转或者溜车。正确时序是上电时先给伺服使能等电机励磁建立后再打开抱闸。如果先开抱闸再使能电机可能因为重力负载溜车。下电时先关闭抱闸等抱闸完全吸合后再断使能。如果先断使能再关抱闸电机会瞬间失去力矩垂直轴会下坠。台达A2的抱闸输出可以通过CN1端子的BK和BK-控制也可以用伺服内部的抱闸控制功能。我一般用内部功能设置抱闸动作延时确保时序正确。延时时间怎么定抱闸吸合时间一般100ms到200ms释放时间50ms到100ms。具体看电机型号手册里有。我习惯设200ms宁可慢一点也不要溜车。4.4 多轴同步的时钟对齐和抖动处理多轴同步的核心是时钟对齐。EtherCAT用分布式时钟DC实现纳秒级同步CANopen用SYNC报文实现毫秒级同步。EtherCAT的DC同步需要配置参考时钟和从站时钟偏移一般主站会自动计算。但如果你用的主站不支持DC同步精度会差很多。CANopen的SYNC周期就是同步周期所有从站在收到SYNC后开始执行上一周期收到的位置指令。如果某个从站处理慢就会产生抖动。减少抖动的办法提高总线波特率减少传输时间。减少每个周期的数据量只发必要对象。用PDO映射把需要同步的数据放在同一个PDO里保证原子性。我实测过六轴CANopen机械臂1Mbps波特率1ms同步周期末端抖动大概在0.1mm左右。如果降到2ms周期抖动会到0.3mm。所以高速高精场景还是得上EtherCAT。5. 常见问题与排查技巧实录5.1 电机啸叫、抖动、丢步的排查顺序遇到电机异常我一般按这个顺序查现象可能原因排查方法高频啸叫速度环Kp太大降低速度环增益低频振荡积分太强或机械共振减小Ki加陷波滤波器抖动编码器干扰或微分噪声检查屏蔽线加微分滤波丢步加速度太大或转矩不足降低加速度检查电流限幅发热持续过载或增益过高检查负载降低增益这个表是我自己总结的不一定全面但能覆盖80%的常见问题。5.2 轨迹跟踪误差大的几个隐藏原因轨迹跟踪误差大很多人第一反应是PID没调好。但实际项目里PID往往不是主因。我遇到过几次逆运动学选解跳变机械臂在两个构型间切换导致关节角度突变。解决办法是加选解连续性约束。同步周期不匹配规划周期1ms通信周期2ms指令下发的节奏乱了。解决办法是统一周期。加减速规划没考虑关节速度限制末端走直线时某个关节速度超限驱动器内部限幅导致跟踪不上。解决办法是在规划阶段就做关节速度校验。编码器分辨率不够低速时位置反馈量化误差大速度环算出来的速度噪声大。解决办法是提高编码器分辨率或用速度观测器。5.3 开源运动控制项目怎么选和怎么改开源运动控制项目不少但能直接用在工业场景的不多。我试过几个说下感受。LinuxCNC功能全支持多轴插补、逆运动学但实时性依赖RT内核配置复杂。适合做实验平台不适合量产。Odrive主打低压伺服社区活跃但只支持单轴或双轴多轴同步要自己搭。适合小型机械臂或移动机器人。STM32运动控制库比如SimpleFOC适合BLDC电机FOC算法成熟但轨迹规划功能弱要自己补。我的建议是如果只是学习原理用SimpleFOC或Odrive入门很快。如果要做六轴机械臂LinuxCNC或者自己基于STM32写更可控。开源项目最大的价值是参考它的架构和算法实现不要指望直接拿来就用。5.4 从裸机PID到多轴联动的进阶路线如果你现在只会裸机PID控制单轴想进阶到多轴联动我建议这个路线单轴位置闭环用STM32编码器电机实现位置PID能稳定定位。单轴轨迹跟踪加梯形或S型加减速让电机按规划曲线走。双轴插补用两个轴走直线或圆弧理解插补原理。多轴CANopen通信用CANopen控制多个伺服理解PDO和SYNC。逆运动学学六轴逆解理解关节空间和笛卡尔空间的转换。完整轨迹规划把逆解、插补、加减速串起来实现末端走直线。每一步都要动手做光看论文没用。我在第3步卡了很久因为双轴插补的同步问题在裸机上很难调后来上了CANopen才解决。6. 一些没人告诉你的实操细节6.1 伺服使能顺序和抱闸时序的坑前面提过抱闸时序这里再强调一个细节多轴系统的使能顺序。如果机械臂有重力负载比如大臂和小臂使能顺序不对会导致机械臂突然下坠。正确顺序是先使能承受重力最大的轴再使能其他轴。下电时反过来先断其他轴最后断重力轴。这个顺序在六轴机械臂上尤其重要。我见过一个项目上电时所有轴同时使能结果小臂因为重力下坠撞到了限位。后来改成从大臂到小臂依次使能问题解决。6.2 编码器分辨率和电子齿轮比的匹配编码器分辨率决定了位置反馈的精度电子齿轮比决定了指令和实际位移的对应关系。两者不匹配会导致定位精度差或者速度上不去。举个例子编码器17位也就是131072脉冲/圈。丝杠导程10mm。如果电子齿轮比设1:1那一个脉冲对应10/1310720.000076mm精度很高。但如果PLC发脉冲频率只有200kHz那最大速度就是200000*0.00007615.2mm/s太慢了。这时候就要调电子齿轮比比如设成4:1一个指令脉冲对应4个编码器脉冲速度提高4倍精度降到0.0003mm仍然够用。所以电子齿轮比是在速度和精度之间找平衡。6.3 轨迹规划中的奇异点规避奇异点是逆运动学无解或解不稳定的位姿。六轴机械臂的奇异点一般出现在腕部关节共线或者手臂完全伸展时。规避方法有两种一是路径规划时避开奇异点在笛卡尔空间规划时检测是否接近奇异点如果接近就绕路。二是阻尼最小二乘法在奇异点附近用阻尼逆代替普通逆牺牲一点精度换稳定。我一般用第一种因为简单可靠。检测方法是用雅可比矩阵的条件数条件数大于阈值就认为接近奇异点。阈值设多少我一般设100具体看机械臂构型。6.4 实时性和抖动对跟踪精度的影响运动控制的实时性不是“越快越好”而是“越稳越好”。抖动比延迟更致命。延迟是固定的可以通过前馈补偿。抖动是随机的没法补偿。减少抖动的办法用实时操作系统比如RT-Linux或FreeRTOS保证控制周期稳定。中断优先级要合理控制中断优先级最高。避免在控制中断里做浮点运算以外的事情比如打印、内存分配。通信用DMA不要用查询。我实测过同样的PID参数在裸机while循环里跑和用定时器中断跑跟踪误差能差3倍。所以实时性不是玄学是实打实影响精度的。6.5 从项目经验看哪些技术最值得先学如果时间有限我建议优先学这三个PID整定这是基础不管什么控制算法PID调不好都白搭。轨迹规划这是机器人运动控制区别于普通伺服控制的核心。CANopen或EtherCAT这是多轴同步的必经之路。逆运动学可以后面再学因为很多场景用关节空间规划就够了。但如果你要做笛卡尔空间应用逆运动学必须会。最后分享一个小技巧调伺服的时候先用示波器看指令和反馈的波形比盯着参数猜有用得多。波形能告诉你振荡频率、相位滞后、超调量这些都是调参的依据。我刚开始学的时候没有示波器全靠试效率很低。后来用了伺服调试软件自带的波形功能调参速度快了一倍。这个领域没有捷径但有很多坑可以避开。希望这些经验能帮你少走点弯路。