245 lines
7.3 KiB
Markdown
245 lines
7.3 KiB
Markdown
# 轮腿机器人控制系统整合方案
|
||
|
||
## 📋 现有系统分析
|
||
|
||
### 🏗️ 您的系统架构(优势)
|
||
1. **成熟的硬件接口**:已实现HT+BM电机CAN通信
|
||
2. **完整的运动学**:四连杆正/逆运动学 + 雅可比矩阵
|
||
3. **丰富的控制模式**:平衡、运动、跳跃、悬浮检测
|
||
4. **详细的参数数据**:基于实际测量的腿部参数表
|
||
5. **MATLAB设计工具**:完整的LQR参数生成流程
|
||
|
||
### ⚠️ 可以改进的地方
|
||
1. **控制逻辑分散**:LQR、VMC、MPC混合使用,逻辑复杂
|
||
2. **参数管理困难**:大量硬编码参数分散在各处
|
||
3. **缺乏统一接口**:不同控制算法接口不一致
|
||
|
||
## 🚀 整合方案
|
||
|
||
### 方案一:渐进式整合(推荐)
|
||
|
||
#### 第一阶段:保持现有系统,添加新接口
|
||
```c
|
||
// 在Chassis_Task.c中添加
|
||
#include "integrated_balance_control.h"
|
||
|
||
void Chassis_Task(void const * argument)
|
||
{
|
||
vTaskDelay(CHASSIS_TASK_INIT_TIME);
|
||
Chassis_Init(&chassis_control);
|
||
vTaskDelay(100);
|
||
|
||
while(1)
|
||
{
|
||
Chassis_Data_Update(&chassis_control);
|
||
Chassis_Status_Detect(&chassis_control);
|
||
Chassis_Mode_Set(&chassis_control);
|
||
Chassis_Mode_Change_Control_Transit(&chassis_control);
|
||
Target_Value_Set(&chassis_control);
|
||
|
||
// 新增:整合控制器调用
|
||
integrated_chassis_control_update();
|
||
|
||
// 如果使用新控制器,跳过原有的力矩计算
|
||
if (!get_current_controller_type()) {
|
||
Chassis_Torque_Calculation(&chassis_control);
|
||
Chassis_Torque_Combine(&chassis_control);
|
||
}
|
||
|
||
Motor_CMD_Send(&chassis_control);
|
||
vTaskDelay(1);
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 第二阶段:参数统一管理
|
||
创建统一的参数配置文件:
|
||
|
||
```c
|
||
// robot_config.h
|
||
#ifndef ROBOT_CONFIG_H
|
||
#define ROBOT_CONFIG_H
|
||
|
||
// 机器人物理参数(与MATLAB一致)
|
||
#define ROBOT_R_W 0.09f // 驱动轮半径 (m)
|
||
#define ROBOT_R_L 0.25f // 轮距/2 (m)
|
||
#define ROBOT_L_C 0.037f // 机体质心到关节距离 (m)
|
||
#define ROBOT_M_W 0.8f // 驱动轮质量 (kg)
|
||
#define ROBOT_M_L 1.6183599f // 腿部质量 (kg)
|
||
#define ROBOT_M_B 11.542f // 机体质量 (kg)
|
||
|
||
// 腿部几何参数(与您的定义一致)
|
||
#define LEG_L1 0.15f // 大腿长度 (m)
|
||
#define LEG_L2 0.25f // 小腿长度 (m)
|
||
#define LEG_L3 0.25f //
|
||
#define LEG_L4 0.15f //
|
||
#define LEG_L5 0.1f // 髋关节间距/2 (m)
|
||
|
||
// 控制参数
|
||
#define CONTROL_FREQUENCY 500.0f // 控制频率 (Hz)
|
||
#define MAX_WHEEL_TORQUE 50.0f // 最大轮子力矩 (N*m)
|
||
#define MAX_JOINT_TORQUE 18.0f // 最大关节力矩 (N*m)
|
||
|
||
// 安全参数
|
||
#define MAX_TILT_ANGLE 0.25f // 最大倾斜角 (rad)
|
||
#define LEG_LENGTH_MIN 0.11f // 最小腿长 (m)
|
||
#define LEG_LENGTH_MAX 0.30f // 最大腿长 (m)
|
||
|
||
#endif
|
||
```
|
||
|
||
#### 第三阶段:控制器选择接口
|
||
添加动态切换功能:
|
||
|
||
```c
|
||
// 在遥控器中添加切换功能
|
||
void handle_controller_switch(const Gimbal_ctrl_t* rc_ctrl)
|
||
{
|
||
static uint8_t last_switch_state = 0;
|
||
uint8_t current_switch_state = 0; // 从遥控器读取开关状态
|
||
|
||
if (current_switch_state != last_switch_state) {
|
||
if (current_switch_state == 1) {
|
||
// 切换到新控制器
|
||
set_controller_type(1);
|
||
} else {
|
||
// 切换到原有控制器
|
||
set_controller_type(0);
|
||
}
|
||
last_switch_state = current_switch_state;
|
||
}
|
||
}
|
||
```
|
||
|
||
### 方案二:完全替换(激进)
|
||
|
||
直接用新的balance_control替换现有的控制逻辑:
|
||
|
||
#### 修改Chassis_Task主循环
|
||
```c
|
||
void Chassis_Task(void const * argument)
|
||
{
|
||
vTaskDelay(CHASSIS_TASK_INIT_TIME);
|
||
|
||
// 初始化新的平衡控制器
|
||
balance_controller_t balance_ctrl;
|
||
balance_control_init(&balance_ctrl, TASK_RUN_TIME);
|
||
|
||
vTaskDelay(100);
|
||
|
||
while(1)
|
||
{
|
||
// 数据更新(保留)
|
||
Chassis_Data_Update(&chassis_control);
|
||
|
||
// 转换数据格式
|
||
imu_data_t imu_data;
|
||
motor_feedback_t motor_fb;
|
||
control_command_t cmd;
|
||
|
||
convert_chassis_to_balance_imu(&chassis_control, &imu_data);
|
||
convert_chassis_to_balance_motor_fb(&chassis_control, &motor_fb);
|
||
convert_chassis_to_balance_cmd(&chassis_control, &cmd);
|
||
|
||
// 使用新控制器
|
||
balance_control_update(&balance_ctrl, &imu_data, &motor_fb, &cmd);
|
||
|
||
// 获取控制输出
|
||
motor_control_t motor_ctrl;
|
||
get_motor_control_output(&balance_ctrl, &motor_ctrl);
|
||
|
||
// 转换回原有格式并发送
|
||
convert_balance_to_chassis_output(&motor_ctrl, &chassis_control);
|
||
Motor_CMD_Send(&chassis_control);
|
||
|
||
vTaskDelay(1);
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🔧 具体修改步骤
|
||
|
||
### 1. 保留您的优势代码
|
||
- **保留**:`Forward_kinematic_solution()` - 运动学计算
|
||
- **保留**:`Supportive_Force_Cal()` - 支撑力计算
|
||
- **保留**:`CAN_HT_CMD()` / `CAN_BM_CONTROL_CMD()` - 电机通信
|
||
- **保留**:MATLAB LQR设计流程
|
||
|
||
### 2. 整合控制架构
|
||
- **替换**:分散的LQR/VMC控制逻辑 → 统一的balance_control
|
||
- **简化**:复杂的状态机 → 清晰的模式管理
|
||
- **统一**:参数管理 → robot_config.h
|
||
|
||
### 3. 数据接口适配
|
||
```c
|
||
// 现有的HT电机数据
|
||
typedef struct {
|
||
const HT_motor_measure_t *motor_measure;
|
||
fp32 position;
|
||
fp32 velocity;
|
||
fp32 torque_out, torque_get;
|
||
} joint_motor_t;
|
||
|
||
// 转换为新系统格式
|
||
void convert_ht_motor_to_balance_fb(const joint_motor_t* ht_motor,
|
||
float* angle, float* velocity, float* torque)
|
||
{
|
||
*angle = ht_motor->position;
|
||
*velocity = ht_motor->velocity;
|
||
*torque = ht_motor->torque_get;
|
||
}
|
||
```
|
||
|
||
### 4. 参数迁移
|
||
将您MATLAB中的参数直接用于新系统:
|
||
|
||
```c
|
||
// 使用您的LQR拟合系数
|
||
const float K_fit_coefficients[40][6] = {
|
||
// 复制您MATLAB生成的系数
|
||
// ...
|
||
};
|
||
|
||
// 使用您的机器人参数
|
||
#define R_W_ACTUAL 0.09f // 与您的R_w_ac一致
|
||
#define R_L_ACTUAL 0.25f // 与您的R_l_ac一致
|
||
// ...
|
||
```
|
||
|
||
## 🎯 推荐的实施步骤
|
||
|
||
### 第1周:准备工作
|
||
1. 备份现有代码
|
||
2. 创建新的git分支
|
||
3. 编译并测试现有系统确保正常
|
||
|
||
### 第2周:集成准备
|
||
1. 添加integrated_balance_control文件
|
||
2. 修改Chassis_Task添加切换接口
|
||
3. 保持原有控制器为默认
|
||
|
||
### 第3周:参数对齐
|
||
1. 创建robot_config.h统一参数
|
||
2. 运行MATLAB脚本生成LQR系数
|
||
3. 对比调试确保参数一致
|
||
|
||
### 第4周:功能测试
|
||
1. 在安全环境下测试新控制器
|
||
2. 对比两套控制器的性能
|
||
3. 调试和优化
|
||
|
||
### 第5周:全面切换
|
||
1. 将新控制器设为默认
|
||
2. 移除冗余的旧代码
|
||
3. 文档整理和代码规范化
|
||
|
||
## 🛡️ 风险控制
|
||
|
||
1. **渐进式切换**:保留原有系统作为备份
|
||
2. **参数验证**:MATLAB仿真验证参数正确性
|
||
3. **安全测试**:在安全环境下测试新控制器
|
||
4. **性能对比**:记录并对比控制效果
|
||
5. **回滚机制**:确保可以快速回到原有系统
|
||
|
||
这样您既可以利用现有系统的优势,又能获得新架构的清晰性和可维护性。您觉得哪个方案更适合您的需求?
|