很多开发者从机械臂、舵机或者普通电机转入行走机器人领域后,最先劝退自己的往往不是步态算法,而是最底层的关节执行器。关节空载响应很好,一带负载就发抖、发热,甚至一受冲击就扫齿,这类现象在四足、双足机器人项目里非常普遍。行走机器人对执行器的要求,和传统工业机械臂完全不同,如果把机械臂那套高减速比方案直接搬过来,通常会被落地冲击、力控带宽和散热问题反复折磨。
这篇文章会从“行走机器人为什么难造”讲起,拆解执行器的核心技术难点,然后给出一条适合实验室或个人工作室复制的自制准直驱执行器路线。内容覆盖技术选型、硬件组成、控制框架、调试步骤和常见坑点,代码示例可以直接作为入门固件的骨架。无论你是刚开始做四足机器人,还是已经在调试双足机器人但被关节扭矩不足卡住,这篇内容都值得存下来慢慢看。
1. 为什么行走机器人这么难造
1.1 行走机器人的“特殊之处”
行走机器人本质上是移动机器人里最难分支之一。它不像轮式机器人那样可以靠地面连续支撑,也不像机械臂那样固定在基座上。整个机身处于“不断失衡又不断恢复平衡”的动态过程中,需要实时感知自身姿态、地面接触力,并快速调节每个关节的输出力矩。
如果把问题拆开,行走机器人主要有三座大山:
- 感知层:判断机身姿态、地面摩擦、足端受力。
- 决策层:规划步态、选择落脚点、调整重心轨迹。
- 执行层:让每个关节按照期望力矩/位置快速响应。
很多项目卡住的地方,不在感知和决策,而在执行层。因为感知算法和步态规划都有大量开源资料可以参考,但执行器一旦物理性能不达标,上层算法再聪明也发挥不出来。比如你的控制频率已经到 1kHz,但执行器本身响应带宽只有十几赫兹,那关节力就永远跟不上指令。
这也是为什么很多团队从“算法仿真”走向“真机实验”时,体验会断崖式下降。仿真里你可以假设关节力矩瞬间输出,但真实电机有电流限制、有摩擦、有背隙、有温升,这些都会被上层算法放大成抖动和失控。
1.2 执行器难点的本质:自重比、冲击与带宽
行走机器人执行器难造的根源,可以从三个维度理解。
第一个维度是自重比。机器人要自己扛着电池、主控板、结构件和传感器行走,所以执行器越轻越好,同时输出扭矩又要尽可能大。比如一个髋关节执行器要输出几十牛米的峰值扭矩,但本身质量还要控制在几百克到一两千克级别,这对电机材料、减速器结构和散热设计都提出了极高要求。如果直接买工业伺服电机,扭矩是够了,但重量可能占到整机的一半,机器人根本走不动。
第二个维度是冲击鲁棒性。落地瞬间足端会承受数倍于自身体重的冲击力,这个冲击会通过腿部连杆直接传递到关节减速器。如果减速比很高,外界的冲击力会通过减速器放大并反传到电机端,导致减速器扫齿、电机轴变形、编码器错位。高减速比方案在固定基座的机械臂上没问题,但在行走机器人上,冲击是最致命的杀手。
第三个维度是力控带宽。行走机器人为了实现稳定行走,必须快速输出和调节关节力矩。高频力矩控制需要电机电流环、机械结构刚性和减速器背隙协同配合。只要其中一个环节有延迟,机器人的“腿”就会像踩在棉花上一样软,或者像痉挛一样抖。
综合来看,行走机器人执行器本质上是“高扭矩密度 + 低背隙 + 高力控带宽 + 抗冲击 + 可散热”五维问题的交集,这也是为什么简单买一台舵机拼一条腿永远走不起来的真正原因。
1.3 行走机器人执行器 vs 工业机械臂执行器
很多人不理解为什么不能直接拿工业机械臂的关节模块来做机器人腿。下面这张表可以直观说明两者的差异:
| 对比项 | 工业机械臂执行器 | 行走机器人执行器 |
|---|---|---|
| 负载特征 | 基座固定,负载明确,冲击小 | 自重即负载,落地冲击大 |
| 减速比 | 通常 50~200,定位精度优先 | 通常 5~15,力控与柔顺优先 |
| 控制方式 | 位置控制为主,末端力传感器辅助 | 电流估矩 + 阻抗/力控为主 |
| 能耗管理 | 插电运行,对能耗不敏感 | 电池供电,能耗直接影响续航 |
| 安全机制 | 外部围栏 + 停机保护 | 本体物理柔顺 + 电流受限 |
| 损坏模式 | 长时间磨损,故障可控 | 冲击扫齿、堵转高温,容易瞬间损坏 |
从这个对比能看出来,行走机器人执行器不是“扭矩更大”就更好,而是要在“力控透明性”和“抗冲击能力”之间找到平衡。这也是下文介绍准直驱执行器的关键背景。
2. 执行器技术路线对比:为什么自制执行器更有价值
2.1 主流的执行器技术路线
行走机器人执行器目前主要有液压、气动和电驱动三类路线。
液压驱动的代表是波士顿动力早期的 BigDog 和 Atlas。液压执行器的特点是力量大、带宽极高、抗冲击能力强,但系统复杂度也非常高:需要液压泵站、伺服阀、密封管路和专门的液压油冷却系统。这套方案对普通开发者来说基本不可行,光是一个高性能伺服阀的采购、选型和维护就足够劝退。
气动驱动的特点是天然柔顺,比如很多软体机器人研究项目会使用气动人工肌肉。但气动系统的精度和带宽都很差,气体可压缩导致力控响应慢,很难用于需要精确落地控制的动态行走机器人。
电驱动是当前最主流、也是最适合自制者入门的路线。电驱动的形态又可以分为:
- 传统高减速比电机:类似工业伺服,扭矩大但背隙和冲击问题明显。
- 直驱电机(DD):无减速器,零背隙、力控线性度极好,但为了输出足够扭矩需要把电机做得很大很重。
- 准直驱电机(QDD):用低减速比搭配高扭矩密度电机,兼顾力控透明性和扭矩输出。
- 串联弹性执行器(SEA):电机通过弹簧驱动负载,力控精确但带宽受限。
- 直线执行器:电机 + 行星滚柱丝杠或滚珠丝杠,把旋转运动变成直线推杆,常用于人形机器人的线性关节。
2.2 准直驱执行器为何成为主流
准直驱执行器(Quasi-Direct Drive,QDD)是近几年腿足机器人中最受关注的技术路线,代表性项目包括 MIT 的 Mini Cheetah、不少开源四足项目和一部分人形机器人关节方案。
它的核心思路很简单:用低减速比(通常在 10 以内)搭配扭矩密度较高的无框电机或外转子电机,让电机电流与输出力矩保持近似线性关系。
这个设计有几个关键收益:
- 输出端反射惯量小。减速比低,电机转子惯量经减速比平方折算到输出端后仍然较小,机器人腿部更轻盈,控制响应更快。
- 落地冲击可以通过反驱缓冲。受到外界冲击时,低减速比允许外力反推动电机转子,避免减速器承受全部冲击。
- 力矩估计简单。准直驱系统中,输出力矩约等于减速比乘以电机力矩常数再乘以 q 轴电流,不需要昂贵的关节力矩传感器。
- 成本可控。电机、减速器、编码器和驱动器都可以分开采购,非常适合自制。
当然,准直驱也有短板。低减速比意味着电机必须本身就能输出足够扭矩,对电机磁材、线圈设计和散热要求更高。同时,由于没有高减速比放大扭矩,驱动器需要有较高的峰值电流输出能力。
2.3 自制执行器适合谁、不适合谁
自制执行器并不是所有场景的最优解。如果你只是想尽快做出一台能走路的机器人,且预算充足,直接采购成熟的商业腿足关节模块会更省心;如果你的目标是研究算法,而不是研究硬件,购买现成执行器也可以避免大量调试时间。
但如果你是以下情况,自制执行器非常值得:
- 预算有限,买不起整套商业关节模块。
- 希望深入理解电机控制、机械传动和力控原理。
- 需要定制特定扭矩、尺寸或接口的关节。
- 后续想把执行器作为自己的技术积累或产品原型。
自制执行器的本质是“把执行器从黑盒变成白盒”。这个过程虽然辛苦,但收获非常大,尤其是对后续调试步态算法和排查故障非常有帮助。建议刚开始做的人从“单关节平台”开始,而不是直接做整机腿。这样可以把电气、机械、固件三个环节分别调通,再逐步集成。
3. 自制执行器核心原理拆解
3.1 执行器的硬件组成
一个完整的旋转型关节执行器,通常由以下几大部分组成:
| 模块 | 作用 | 说明 |
|---|---|---|
| 电机 | 把电能转换成旋转力矩 | 自制常用外转子无刷电机或无框电机 |
| 减速器 | 放大扭矩、降低转速 | 准直驱常用低减速比行星减速器 |
| 电机编码器 | 测量电机转子角度 | 用于换相、速度和电流控制 |
| 输出编码器 | 测量输出端角度 | 用于位置闭环和关节角度读取 |
| 驱动器 | 驱动电机三相电流 | 可选用 ODrive、VESC 或自研 FOC 板 |
| 主控 | 运行控制算法 | 常用 STM32、Arduino 或更高算力芯片 |
| 电源 | 提供电机母线电压 | 常见 24V、48V 电池或稳压电源 |
自制执行器的关键,是把这些模块组合成一个机械刚性好、电气可靠、控制带宽高的整体。很多自制项目失败的原因,并不是单个模块参数不够,而是模块之间的机械装配精度和电气干扰没有处理好。
3.2 关键参数与选型公式
在自制执行器之前,先理解几个核心参数。
扭矩常数 Kt:表示每安培电流能产生多少扭矩,单位是 Nm/A。准直驱执行器通常希望 Kt 尽量大,这样用较小的电流就能获得目标扭矩,对驱动器峰值电流要求也更低。
减速比 n:电机转速与输出转速的比值。减速比放大了扭矩,也把电机惯量按 n 的平方折算到输出端。准直驱的减速比一般选 5~10,太低不够力矩,太高则失去力控透明性。
输出力矩与电流的关系近似为:
τ_out = n * Kt * Iq其中 τ_out 是输出力矩,Iq 是电机 q 轴电流。这个公式是准直驱执行器做力矩控制的基础。只要电流环响应够快,输出力矩就能快速跟随指令。
背隙:减速器输入轴反向转动时,输出轴不跟随的空转角度。背隙会产生控制死区,导致力矩/位置切换时出现振荡。自制项目推荐选用低背隙行星减速器,或者干脆接受一定背隙并用控制算法补偿。
力控带宽:执行器力矩环能做到的有效响应频率。通常电流环运行频率在 20kHz 以上,速度环 1~5kHz,位置环 1kHz 左右,实际力控带宽还会受机械共振频率影响。
3.3 控制层级:从电流到关节力矩
行走机器人关节控制是一个层层嵌套的结构。最底层是电流环,也就是力矩环;往上是速度环、位置环;最上层是步态规划和平衡控制器。
用一个倒立摆示意图来理解:你想让机器人保持平衡,本质上要控制躯干重心。重心偏移会产生期望的关节角度和关节力矩,关节执行器再把这个期望力矩转换成三相电流指令。电流环越快、越准,上层算法就越能指望“力矩指令 = 实际力矩”这个假设成立。
在准直驱执行器里,力矩控制通常不额外用力矩传感器,而是直接用 q 轴电流作为力矩指令。所以电流环性能直接决定了整机的力控质量。这也是自制执行器时,最值得投入精力的部分。
4. 环境准备与硬件选型说明
4.1 硬件清单
下面给出一个中等预算的自制准直驱执行器硬件清单,以实际可购买、可替换为原则:
| 部件 | 推荐类型 | 说明 |
|---|---|---|
| 电机 | 外转子无刷电机或无框力矩电机 | 扭矩密度高,KV 值不需要太高 |
| 减速器 | 行星减速器 5:1~8:1 | 优先选低背隙版本 |
| 编码器 | AS5047P 或其他 14 位磁编码器 | 电机端使用,SPI 输出 |
| 输出编码器 | AS5600 或磁编码器 | 输出端测绝对角度 |
| 驱动器 | ODrive / VESC / SimpleFOC 方案 | 可根据预算选择 |
| 主控 | STM32F405 或 Arduino Due | 跑控制算法 |
| 电源 | 24V~48V 稳压电源或电池 | 注意峰值电流能力 |
| 结构件 | 铝合金轴承座、联轴器、法兰 | 保证装配精度 |
具体型号会因市场供应和项目需求变化,这里不锁死品牌。初学自制建议用“电机 + 行星减速器 + 简单FOC驱动器”起步,先把单关节转台跑通,再考虑优化体积和重量。
4.2 软件工具链
软件部分建议如下组合:
- 嵌入式固件:STM32CubeIDE 或 Arduino IDE,本文示例以 Arduino 风格代码演示,实际工程可迁移到 STM32 HAL 工程。
- 上位机调试:Python + pyserial + matplotlib,用于读取日志、绘制曲线。
- 仿真验证:先在一自由度关节模型上用 Python 跑通 PID 和力矩阶跃,再移植到硬件固件。
- AI辅助开发:现在很多 AI 编程助手自带代码执行器,可以直接在对话里运行 Python 仿真脚本验证控制算法,快速缩小参数范围,然后再到真机调试。
版本需要根据你的实际板卡调整,本文示例重点展示配置思路。对于用 ODrive 作为驱动器的方案,可以在 odrive 官方配置工具里完成电流环/速度环/位置环参数整定,固件部分则负责上层逻辑。
4.3 示例项目结构
一个基础的自制执行器固件项目,建议按以下结构组织:
joint_actuator/ ├── src/ │ ├── main.cpp // 主循环 │ ├── motor_encoder.cpp // 电机编码器驱动 │ ├── foc_control.cpp // FOC 电流环流程 │ ├── joint_controller.cpp // 关节位置/力矩控制 │ ├── debug_cli.cpp // 串口调试命令 │ └── utils.cpp // 滤波、数学工具 ├── scripts/ │ ├── plot_log.py // 上位机绘图 │ └── tune_param.py // 参数扫描 └── README.md这样的结构有两个好处:一是每个模块都可以单独测试,二是后续扩展到四足机器人时,每个关节复用同一套关节控制接口,主控只需要管理多个关节实例即可。
5. 完整实战:自制一台准直驱旋转执行器
5.1 机械结构设计与装配顺序
自制执行器建议先做单关节转台:电机一端的输出带一个大质量负载盘,用来模拟腿部关节的惯量和负载。
机械装配顺序如下:
- 把电机定子固定到关节外壳或轴承座上。
- 电机转子输出轴连接行星减速器输入轴,使用合适的联轴器。
- 行星减速器输出端连接输出法兰。
- 电机背面安装磁编码器,用于测量电机转子角度。
- 输出端另一侧安装绝对编码器,用于测量输出端真实角度。
装配过程中最重要的一件事是“同轴度”。电机轴、减速器输入轴、编码器轴心必须尽量保证在同一直线上。如果存在明显偏心,轻则编码器读数波动,重则轴承异常受力、减速器扫齿。建议装配后用百分表打表检查跳动。
如果是用外转子电机改制,注意转子旋转时不能碰到固定外壳或线束,要留出安全间隙。
5.2 电气接线
电气接线分强电和弱电两部分。强电指电机驱动器的母线电源和三相输出,弱电指编码器 SPI/I2C 信号、主控和驱动器的控制信号。
推荐接线拓扑:
24V~48V电源 | +--- 驱动器电源正负 +--- 主控电源(低压隔离) | 电机三相线 A/B/C --- 驱动器三相输出 电机端磁编码器 --- 主控 SPI(或驱动器直连编码器输入) 输出端绝对编码器 --- 主控 I2C/SPI 主控 PWM/模拟输出 --- 驱动器速度/力矩指令调试初期务必使用稳压电源并设置电流上限,不要直接上高倍率电池。高压和大电流配合电机堵转,轻则烧驱动器,重则引发危险。
如果使用 ODrive 这类智能驱动器,可以让驱动器直接读电机编码器,主控通过 UART/CAN 给驱动器发力矩指令,这样固件会更简单。本文示例按“主控直接负责控制算法”的方式演示,方便理解底层原理。
5.3 固件代码:编码器读取与 FOC 框架
下面给出一段磁编码器读取的示例,以 AS5047P 为例。需要注意的是,不同板卡的 SPI 引脚不同,实际使用时请按你的硬件修改引脚编号和 SPI 外设配置。
// 文件路径:src/motor_encoder.cpp // 以 AS5047P 14 位磁编码器为例,通过 SPI 读取电机电角度/机械角度 #include <SPI.h> #define ENC_CSN 10 // 片选引脚,按实际板卡调整 #define ENC_SCK 13 #define ENC_MISO 12 #define ENC_MOSI 11 void encoder_init() { pinMode(ENC_CSN, OUTPUT); digitalWrite(ENC_CSN, HIGH); SPI.begin(); SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1)); } // 读取 14 位原始角度 uint16_t encoder_read_raw() { uint16_t cmd = 0x7FFE; // AS5047P 读角度寄存器 ANGLECOM 的示意命令 digitalWrite(ENC_CSN, LOW); SPI.transfer16(cmd); uint16_t data = SPI.transfer16(0x0000); digitalWrite(ENC_CSN, HIGH); return data & 0x3FFF; // 取低 14 位 } float encoder_read_angle_rad() { uint16_t raw = encoder_read_raw(); return (float)raw / 16384.0f * 2.0f * PI; }接下来是 FOC 电流环的简化流程。实际工程中,相电流采样需要在 PWM 定时器下溢中断中同步触发,以保证采样时刻的电流值准确。这里重点展示 Clarke 变换、Park 变换和 PI 调节器的核心逻辑:
// 文件路径:src/foc_control.cpp // FOC 电流环核心流程示意 // 需要在 PWM 周期中断中循环调用,通常 10kHz~30kHz float elecAngle; // 当前电角度,由电机机械角度乘以极对数得到 float iqRef; // q 轴电流指令,即力矩指令 void foc_current_loop() { // 1. 采样三相电流(实际只需采样两相) int16_t ia_adc = adc_read(CH_A); int16_t ib_adc = adc_read(CH_B); float ia = current_scale(ia_adc); float ib = current_scale(ib_adc); float ic = -(ia + ib); // 2. Clarke 变换:abc -> αβ float iAlpha = (2.0f * ia - ib - ic) / 3.0f; float iBeta = (ib - ic) * 0.57735f; // 3. Park 变换:αβ -> dq float cosA = cosf(elecAngle); float sinA = sinf(elecAngle); float id = iAlpha * cosA + iBeta * sinA; float iq = -iAlpha * sinA + iBeta * cosA; // 4. PI 调节器,d 轴目标为 0,q 轴目标为 iqRef float ud = pi_update(&pi_id, 0.0f, id); float uq = pi_update(&pi_iq, iqRef, iq); // 5. 逆 Park 变换 + SVPWM 生成 float uAlpha = ud * cosA - uq * sinA; float uBeta = ud * sinA + uq * cosA; svpwm_set_voltage(uAlpha, uBeta); }需要注意,PID 参数、电流采样系数和 SVPWM 实现都会影响效果。第一次调通时不要追求高性能,先用“开环电压”验证电机能转,再逐步切到闭环。
5.4 上位机调试与力矩标定
关节执行器要真正用于行走机器人,必须在固件里实现位置环和力矩估计。下面给出一段关节控制示例,演示位置环、速度环到电流指令的映射:
// 文件路径:src/joint_controller.cpp // 准直驱关节的位置控制与力矩估算 #define REDUCTION_RATIO 6.0f // 减速比,按实际减速器修改 #define Kt 0.08f // 电机力矩常数 Nm/A,按电机规格修改 typedef struct { float outputAngle; // 输出端角度 rad float outputVel; // 输出端速度 rad/s float motorVel; // 电机端电角速度 rad/s float iqRef; // 当前 q 轴电流指令 float torqueEst; // 估算输出力矩 } JointState; JointState joint; void joint_position_control(float targetAngle) { float posErr = targetAngle - joint.outputAngle; // 位置环输出速度指令 float velRef = pos_kp * posErr; // 速度环输出力矩指令 float torqueRef = vel_kp * (velRef - joint.outputVel); // 低通滤波平滑力矩指令 torqueRef = lpf_apply(&torque_lpf, torqueRef, 0.01f); // 准直驱核心:电流指令正比于输出力矩 joint.iqRef = torqueRef / (REDUCTION_RATIO * Kt); // 估算实际输出力矩 joint.torqueEst = REDUCTION_RATIO * Kt * joint.iqRef; }上位机调试时,可以在串口中断中处理命令行指令,方便动态改参数、切换开环/闭环:
// 文件路径:src/debug_cli.cpp // 简化的串口命令解析,用于真机调试 void debug_cli_process(char *cmd) { if (strncmp(cmd, "IQ ", 3) == 0) { sscanf(&cmd[3], "%f", &iqRefSetpoint); ctrl_mode = MODE_CURRENT; } else if (strncmp(cmd, "POS ", 4) == 0) { sscanf(&cmd[4], "%f", &targetAngle); ctrl_mode = MODE_POSITION; } else if (strncmp(cmd, "KP ", 3) == 0) { sscanf(&cmd[3], "%f", &pos_kp); } else if (strncmp(cmd, "LOOP", 4) == 0) { loop_enabled = !loop_enabled; } }力矩标定步骤如下:
- 把执行器固定在刚性支架上,输出端水平。
- 在输出法兰上挂一个已知质量的砝码,使输出端承受重力力矩。
- 在电流环模式下缓慢增大 Iq 指令,直到执行器刚好能托起砝码,记录此时 Iq 值。
- 根据公式 τ = n * Kt * Iq 推算实际力矩,并和砝码产生的重力力矩对比。
- 多测几个点,绘制“指令电流-实测力矩”曲线,可以得到执行器的真实力矩系数。
如果你习惯用 AI 辅助开发,现在不少编程工具自带代码执行器,可以把参数扫描、曲线拟合这类脚本直接交给工具去跑,省去本地搭环境的麻烦。不过固件代码最终还是要在真机上验证,仿真通过只能代表逻辑正确,不能代表电机硬件正常。
5.5 运行验证与预期输出
在完成装配和固件编写后,建议按以下顺序验证:
| 测试项 | 操作 | 预期现象 |
|---|---|---|
| 编码器读取 | 手动缓慢转动输出端,打印角度 | 角度连续变化,无跳变 |
| 开环输出 | 发固定占空比/电压 | 电机缓慢持续旋转,无异响 |
| 电流闭环 | 依次给 Iq 0.5A、1A | 电流稳定,输出力矩随 Iq 增大 |
| 位置闭环 | 给定位置阶跃 30° | 快速到达目标,超调可控 |
| 力矩标定 | 挂砝码测试 | 标定误差在 10% 以内 |
预期输出只是一种参考,不同电机、驱动器和装配条件下会存在差异。关键是每一步都要有日志,方便定位问题。日志可以按下面的格式输出:
LOG,<时间>,<角度>,<速度>,<Iq>,<估算力矩>再用 Python 脚本读取并绘图:
# 文件路径:scripts/plot_log.py import serial import matplotlib.pyplot as plt ser = serial.Serial('/dev/ttyUSB0', 921600, timeout=1) ts, pos, torq = [], [], [] try: while True: line = ser.readline().decode(errors="ignore").strip() if line.startswith("LOG"): _, t, p, q = line.split(",") ts.append(float(t)) pos.append(float(p)) torq.append(float(q)) except KeyboardInterrupt: pass finally: ser.close() plt.plot(ts, pos, label="position") plt.plot(ts, torq, label="torque") plt.legend() plt.show()有了这条日志链路,后面整机调试时会轻松很多。否则一旦机器人出现异响或失控,你会发现很难判断是控制算法问题还是执行器硬件问题。
6. 常见问题与排查思路
6.1 典型问题速查表
下面整理自制执行器过程中最常见的几类问题,按“现象-原因-解决思路”列出:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 电机不转或只抖动 | 编码器安装偏心、换相顺序错误、PWM 频率不当 | 检查编码器角度是否连续;确认电机相序;降低 PWM 频率测试 |
| 编码器读数跳变 | 磁铁距离太远/太近、磁场干扰、SPI 时序不稳 | 调整磁铁高度;远离电机强磁场;降低 SPI 速率并加滤波 |
| 关节输出力矩不足 | 减速比太小、电机峰值电流不够、驱动器限流 | 提高母线电压;增大驱动器电流上限;更换低 KV 高扭矩电机 |
| 发热严重 | 连续电流超过额定、散热不足、PWM 损耗过高 | 增加散热片/风冷;降低连续负载;调整 PWM 开关频率 |
| 位置超调振荡 | PID 参数不当、速度环带宽低、机械背隙 | 先调 P 再调 D;用陷波器处理共振峰;检查减速器背隙 |
| 共振啸叫 | 机械刚度不足、电流环带宽过高、结构共振 | 加筋/加固结构;降低电流环带宽;使用陷波滤波器 |
| 减速器异响 | 润滑不足、装配预紧不当、齿面磨损 | 补润滑脂;重新调整预紧;检查齿面磨损状态 |
| 驱动器过流报警 | 电机堵转、短路、相线接反 | 先断开动力电检查接线;降低电流限制;确认电机正常后再上电 |
6.2 高频问题详细排查
电机一上电就抖动是最常见的问题。通常原因是编码器安装偏心导致换相角度不准,或者电机三相相序与驱动器默认顺序不一致。排查时先把电流环目标设为 0,手动缓慢转动电机,观察打印出来的电角度是否连续线性变化。如果电角度在某个位置跳变,优先检查编码器磁铁是否装在转轴正中、是否有轴向窜动。之后再尝试电机相序的 6 种组合,找到换相最平稳的一组。
编码器读数跳变往往不是编码器本身坏掉,而是安装距离和磁场干扰。磁编码器对磁铁的高度和同轴度非常敏感,磁铁离芯片太近或太远都会导致角度非线性。同时电机运转时会产生较强磁场,磁编码器要尽量远离电机线圈,或者增加磁屏蔽。SPI 线缆也要使用双绞屏蔽线,并降低通信速率。
执行器发热严重需要区分是连续工况还是瞬间工况。如果连续运行一分钟后温度快速上升,说明电机额定扭矩不够或者散热不足。准直驱方案对散热要求高,最好把电机外壳直接与铝合金结构件接触,通过整个机架散热。如果只能在低负载下短时运行,说明选型余量不足,需要换更大扭矩电机或更高散热能力的方案。
7. 最佳实践与工程建议
7.1 安全调试顺序
自制执行器的调试顺序非常重要,直接决定你是在愉快地调参还是在反复维修硬件。推荐顺序如下:
- 先用低压、限流电源供电,不接减速器和负载,验证电机转动。
- 只做开环输出测试,确认三相接线和换相顺序。
- 再切换电流环,设置一个极小的 Iq 目标,比如 0.1A,观察电流是否稳定。
- 依次叠加速度环、位置环。
- 最后再装配减速器、输出法兰和真实负载。
每一步都要设置电流上限、机械限位和急停开关。尤其是第一次上电时,手要放在急停上,不要站在电机输出轴的正前方。旋转变速器或电机堵转时可能造成机械飞出伤害,这不是危言耸听。
7.2 机械装配细节
自制执行器质量的上限,往往由机械装配精度决定。以下几点是反复踩坑后的经验:
- 电机轴与减速器输入轴使用弹性联轴器,但弹性联轴器只能补偿较小的不对中,不能弥补严重的装配偏心。
- 编码器磁铁粘贴位置必须与转轴同心,推荐使用带定位孔的磁铁座。
- 减速器输出端尽量加轴承支撑,不要只靠减速器自带轴承承受弯矩。
- 所有螺丝使用螺纹胶,机器人运行时的振动会让螺丝逐渐松脱。
- 输出法兰要留出力矩标定用的固定孔,方便后续挂载砝码。
装配完成后,用手转动输出端,感受是否顺滑。如果某个位置有明显“卡顿”或“死点”,说明机械装配有问题,不要急着跑控制算法。
7.3 固件工程架构建议
固件架构上建议从一开始就区分“驱动层”和“应用层”。驱动层只负责编码器读取、电流环、PWM 输出,应用层负责位置控制、步态接口、日志输出。这样后续做整机时,每个关节独立跑一个控制实例,主控通过 CAN 或 EtherCAT 总线统一调度。
关节状态结构体建议至少包含:
typedef struct { uint32_t id; float position; float velocity; float current; float torque_est; float temperature; uint8_t fault_code; } JointState;日志输出统一格式化,便于上位机解析。所有 PID 参数和机械参数建议集中放在一个配置结构体中,不要散落在各个函数里。
7.4 性能优化方向
当单关节转台已经稳定运行后,可以从以下方向继续优化:
- 电流环频率提升到 20kHz 以上,并启用 SVPWM 替代纯正弦波。
- 增加陷波滤波器,抑制机械共振。
- 使用低背隙谐波减速器替代行星减速器,提升力控精度。
- 增加热管理:外壳散热、风道设计、温度传感器降额控制。
- 把控制主频提升到 1kHz 以上,为上层步态控制留出余量。
这些优化每一项都会影响整机性能,但前提是前面的基础已经扎实。不要一开始就追求高指标,先做出一台能稳定转动的执行器,比参数好看更重要。
8. 总结与学习路线
走过一遍自制执行器的完整流程后,你实际上已经掌握了行走机器人最核心的硬件基础:电机选型、减速器设计、编码器读取、FOC 电流环、关节位置环和力矩标定。这些能力比单纯会写步态算法更稀缺,因为真正的整机问题,最终都会落到执行器上。
接下来建议按下面的路线继续深入:
- 把单关节扩展成一条完整的腿部结构,测试髋、膝两个关节的协同运动。
- 在单腿结构上做阻抗控制实验,感受关节柔顺性和落地的缓冲效果。
- 引入仿真环境,比如 MuJoCo、Isaac Gym,先在虚拟机器人上验证步态算法,再用自制执行器迁移到真机。
- 学习 FOC 的数学细节和磁场定向控制,尝试自己绘制驱动板,进一步提升能量效率和带宽。
如果你正准备开始做自己的四足或双足机器人,不要急着买成品关节模块。花两周时间先做一个单关节执行器转台,把电流环、位置环、力矩标定全部跑通,再开始设计整机。这段时间的投入,会在你后续一年多调试过程中持续回报给你。工具已经就绪,剩下的就是反复调参和实验了。