[release] 发布8DOF串联足中期检查版本

This commit is contained in:
2026-07-21 12:18:00 +08:00
commit 0b91dfffe6
265 changed files with 170023 additions and 0 deletions
+362
View File
@@ -0,0 +1,362 @@
# 四足机器人从位控转为力控的建议与实施方案
## 1. 当前系统本质上是什么控制
你现在这套程序不是“纯位控”,而是**位置主导 + 力矩辅助**。
从代码上看:
- `User/app/lingzu_task.c` 负责状态机、站立/趴下/行走切换
- `User/driver/Movement.c` 负责步态、IK、VMC 力矩计算
- `User/driver/leg.c` 已经有正逆运动学、Jacobian 对应关系
- `User/driver/lingzu_motor.c` 发送给 RS02 的指令包含:
- `position`
- `speed`
- `kp`
- `kd`
- `torque`
这说明你当前已经具备了向力控过渡的基础,不是从零开始。
---
## 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` 到底是什么:
1. 真正关节输出力矩?
2. 电流等效量?
3. 只是内部位置环的前馈项?
### 你必须验证的问题
当你设置:
- `kp = 0`
- `kd = 0`
- `speed = 0`
- `position = 0`
- `torque = 非0`
电机是否仍能稳定输出可控力矩?
如果答案是否定的,那么就不能做真正纯 torque 控制,只能做力位混合。
---
## 4.2 torque 反馈是否可信
你还要确认:
- `current_torque_f` 单位是不是 Nm
- 是估算值还是直接测得
- 噪声有多大
- 延迟有多大
- 正负号是否一致
如果反馈不可靠,闭环力控会很难做。
---
## 4.3 机械参数是否足够准确
力控对模型更敏感,所以要重新确认:
1. `L1``L2`
2. 大腿/小腿零点
3. 左右腿符号方向
4. 同步带耦合关系
5. 力矩正方向对应真实腿部运动方向
6. 机械摩擦、死区、间隙
---
## 4.4 控制频率和总延迟
力控对频率要求更高。
必须明确:
- 控制循环周期是多少
- 电机反馈周期是多少
- CAN 总线延迟是多少
- 从“采样反馈”到“发出新 torque”总共延迟多少
如果实际闭环频率偏低,纯力控会很难稳定。
---
## 4.5 接触判断能力
四足做支撑腿力控时,需要知道哪条腿真正接地。
你现在没有足底力传感器,所以至少要有估计方法:
- 关节力矩突变
- 足端速度突然降低
- 足端高度达到接地阈值
- IMU 机身姿态/加速度辅助判断
---
## 5. 我建议你按什么路线做
## 第一阶段:低刚度位控 + 力矩前馈
这是最稳的第一步。
### 核心思路
保留:
- 步态规划
- IK 目标角
但降低位置刚度:
- `kp` 下降
- `kd` 下降
- `torque` 增强
### 目标
把机器人从“硬跟随”变成“柔顺跟随”。
### 先做什么
1. 静站重力补偿
2. 支撑腿附加支撑力矩
3. 落地缓冲 torque
4. 摆动腿保持较轻位置跟踪
这是最适合你现阶段的方案。
---
## 第二阶段:关节阻抗控制
公式通常是:
\[
\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
\]
映射成关节力矩。
### 你的代码现状
这一步你已经有雏形了,只需要系统化:
- 摆动腿:位置/轨迹主导
- 支撑腿:足端阻抗主导
这是我最推荐的中期目标。
---
## 第四阶段:纯关节力矩控制
只有在下面条件都满足时才建议:
1. torque 通道已验证可靠
2. torque 反馈可信
3. 控制频率足够高
4. 急停保护很完善
5. 标定很准确
否则风险很大,可能出现:
- 塌腿
- 高速震荡
- 落地冲击失控
- 电机发热严重
---
## 6. 你现在应该收集的数据清单
## 6.1 单电机实验
每个关节都做。
### 实验配置
设置:
- `kp = 0`
- `kd = 0`
- `speed = 0`
- `position = 0`
- 扫描 `torque`
### 记录内容
- 最小起转 torque
- 正负方向是否正确
- 是否平稳
- 空载下速度变化
- `current_torque_f` 与指令是否一致
- 温升情况
---
## 6.2 单腿实验
一条腿悬空测试。
### 要看什么
- 同样 torque 下,不同姿态响应是否一致
- 大腿和小腿耦合程度
- Jacobian 算出来的足端力方向是否正确
---
## 6.3 单腿接地实验
一条腿轻触地面。
### 记录
- 落地瞬间 torque 反馈变化
- 落地前后足端速度变化
- 同一支撑高度下保持力矩需求
- 推腿时柔顺性
---
## 6.4 整机实验顺序
必须按顺序推进:
1. 单电机
2. 单腿悬空
3. 单腿接地
4. 整机架空
5. 整机吊挂半承重
6. 全承重静站
7. 小幅步态
8. 连续步行
不要直接全承重纯力控。
---
## 7. 软件上建议你补的能力
## 7.1 完整日志
建议每个关节记录:
- 目标位置
- 实际位置
- 目标速度
- 实际速度
- 指令 torque
- 反馈 torque
- 温度
- 故障码
建议每条腿记录:
- 足端目标位置
- 足端实际位置
- 足端速度
- 当前步态相位
- 支撑/摆动状态
- 估算足端力
没有日志,后面很难调。
---
## 7.2 安全保护
建议补充:
- torque 限幅
- 速度限幅
- 位置工作空间限幅
- 通信超时保护
- 温度保护
- 姿态异常保护
- 落地冲击保护
- 一键 limp 模式
---
## 7.3 控制模式枚举
建议明确分模式,不要混在一起:
```c
typedef enum {
CTRL_MODE_POSITION = 0,
CTRL_MODE_MIXED,
CTRL_MODE_VMC,
CTRL_MODE_TORQUE
} control_mode_e;