7.0 KiB
四足机器人从位控转为力控的建议与实施方案
1. 当前系统本质上是什么控制
你现在这套程序不是“纯位控”,而是位置主导 + 力矩辅助。
从代码上看:
User/app/lingzu_task.c负责状态机、站立/趴下/行走切换User/driver/Movement.c负责步态、IK、VMC 力矩计算User/driver/leg.c已经有正逆运动学、Jacobian 对应关系User/driver/lingzu_motor.c发送给 RS02 的指令包含:positionspeedkpkdtorque
这说明你当前已经具备了向力控过渡的基础,不是从零开始。
2. 你说的“力控”要先明确是哪一种
建议先区分三类目标:
2.1 关节力矩控制
直接控制每个关节输出的力矩 tau。
特点:
- 最底层
- 柔顺性强
- 最难调
- 风险最大
2.2 足端力控制
控制足端对地的作用力,例如支撑力、推进力。
特点:
- 更适合四足
- 需要 Jacobian:
[ \tau = J^T F ]
2.3 力位混合 / 阻抗控制 / VMC
仍然保留目标位置,但不再靠高刚度死跟位置,而是通过虚拟弹簧阻尼计算力,再映射成关节力矩。
特点:
- 最适合你当前项目
- 最稳妥
- 最容易逐步落地
结论
建议优先做“力位混合控制”,而不是一步切到纯力矩控制。
3. 你现在已经有的基础
3.1 电机接口已经支持 torque
User/driver/lingzu_motor.c 中,发送控制时已经把 torque 编码进 CAN 指令。
3.2 已有反馈量
你已经能读到:
- 位置
current_position_f - 速度
current_speed_f - 力矩
current_torque_f - 温度
current_temp_f
3.3 已有运动学模型
User/driver/leg.c 已经提供:
Inverse_Calculation()FK_LegPosition()FK_LegVelocity()
3.4 已有初步 VMC 框架
User/driver/Movement.c 中已经有:
vmc_legacy_torque()vmc_full_torque()
也就是说,你已经有:
- 电机力矩入口
- 状态反馈
- Jacobian 所需模型
- 初步足端力控制框架
4. 真正切换前必须收集的信息
4.1 电机 torque 通道真实性
这是最重要的。
你必须确认 RS02 的 torque 到底是什么:
- 真正关节输出力矩?
- 电流等效量?
- 只是内部位置环的前馈项?
你必须验证的问题
当你设置:
kp = 0kd = 0speed = 0position = 0torque = 非0
电机是否仍能稳定输出可控力矩?
如果答案是否定的,那么就不能做真正纯 torque 控制,只能做力位混合。
4.2 torque 反馈是否可信
你还要确认:
current_torque_f单位是不是 Nm- 是估算值还是直接测得
- 噪声有多大
- 延迟有多大
- 正负号是否一致
如果反馈不可靠,闭环力控会很难做。
4.3 机械参数是否足够准确
力控对模型更敏感,所以要重新确认:
L1、L2- 大腿/小腿零点
- 左右腿符号方向
- 同步带耦合关系
- 力矩正方向对应真实腿部运动方向
- 机械摩擦、死区、间隙
4.4 控制频率和总延迟
力控对频率要求更高。
必须明确:
- 控制循环周期是多少
- 电机反馈周期是多少
- CAN 总线延迟是多少
- 从“采样反馈”到“发出新 torque”总共延迟多少
如果实际闭环频率偏低,纯力控会很难稳定。
4.5 接触判断能力
四足做支撑腿力控时,需要知道哪条腿真正接地。
你现在没有足底力传感器,所以至少要有估计方法:
- 关节力矩突变
- 足端速度突然降低
- 足端高度达到接地阈值
- IMU 机身姿态/加速度辅助判断
5. 我建议你按什么路线做
第一阶段:低刚度位控 + 力矩前馈
这是最稳的第一步。
核心思路
保留:
- 步态规划
- IK 目标角
但降低位置刚度:
kp下降kd下降torque增强
目标
把机器人从“硬跟随”变成“柔顺跟随”。
先做什么
- 静站重力补偿
- 支撑腿附加支撑力矩
- 落地缓冲 torque
- 摆动腿保持较轻位置跟踪
这是最适合你现阶段的方案。
第二阶段:关节阻抗控制
公式通常是:
[ \tau = K_p(q_d - q) + K_d(\dot q_d - \dot q) + \tau_{ff} ]
如果 RS02 的 torque 通道足够可靠,可以把更多控制量放到主控里自己算,而不是完全依赖电机内部位置环。
但就你当前项目而言,更现实的做法是:
- 电机仍保留较小
kp/kd - 主控侧逐步增加
tau_ff
第三阶段:足端阻抗 / VMC
这是四足机器人最值得做的一步。
足端空间定义虚拟力:
[ F_x = -K_x(x - x_d) - B_x \dot x ]
[ F_z = -K_z(z - z_d) - B_z \dot z + F_g ]
再用:
[ \tau = J^T F ]
映射成关节力矩。
你的代码现状
这一步你已经有雏形了,只需要系统化:
- 摆动腿:位置/轨迹主导
- 支撑腿:足端阻抗主导
这是我最推荐的中期目标。
第四阶段:纯关节力矩控制
只有在下面条件都满足时才建议:
- torque 通道已验证可靠
- torque 反馈可信
- 控制频率足够高
- 急停保护很完善
- 标定很准确
否则风险很大,可能出现:
- 塌腿
- 高速震荡
- 落地冲击失控
- 电机发热严重
6. 你现在应该收集的数据清单
6.1 单电机实验
每个关节都做。
实验配置
设置:
kp = 0kd = 0speed = 0position = 0- 扫描
torque
记录内容
- 最小起转 torque
- 正负方向是否正确
- 是否平稳
- 空载下速度变化
current_torque_f与指令是否一致- 温升情况
6.2 单腿实验
一条腿悬空测试。
要看什么
- 同样 torque 下,不同姿态响应是否一致
- 大腿和小腿耦合程度
- Jacobian 算出来的足端力方向是否正确
6.3 单腿接地实验
一条腿轻触地面。
记录
- 落地瞬间 torque 反馈变化
- 落地前后足端速度变化
- 同一支撑高度下保持力矩需求
- 推腿时柔顺性
6.4 整机实验顺序
必须按顺序推进:
- 单电机
- 单腿悬空
- 单腿接地
- 整机架空
- 整机吊挂半承重
- 全承重静站
- 小幅步态
- 连续步行
不要直接全承重纯力控。
7. 软件上建议你补的能力
7.1 完整日志
建议每个关节记录:
- 目标位置
- 实际位置
- 目标速度
- 实际速度
- 指令 torque
- 反馈 torque
- 温度
- 故障码
建议每条腿记录:
- 足端目标位置
- 足端实际位置
- 足端速度
- 当前步态相位
- 支撑/摆动状态
- 估算足端力
没有日志,后面很难调。
7.2 安全保护
建议补充:
- torque 限幅
- 速度限幅
- 位置工作空间限幅
- 通信超时保护
- 温度保护
- 姿态异常保护
- 落地冲击保护
- 一键 limp 模式
7.3 控制模式枚举
建议明确分模式,不要混在一起:
typedef enum {
CTRL_MODE_POSITION = 0,
CTRL_MODE_MIXED,
CTRL_MODE_VMC,
CTRL_MODE_TORQUE
} control_mode_e;