[release] 发布8DOF串联足中期检查版本
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user