298 lines
8.0 KiB
Markdown
298 lines
8.0 KiB
Markdown
# 轮腿机器人LQR平衡控制系统
|
||
|
||
这是一个完整的轮腿机器人LQR+VMC平衡控制系统,支持6个电机(2个轮电机+4个关节电机)的协调控制。
|
||
|
||
## 系统架构
|
||
|
||
```
|
||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
||
│ 传感器输入 │ │ 平衡控制器 │ │ 电机控制输出 │
|
||
│ │ │ │ │ │
|
||
│ • IMU姿态数据 │────▶│ LQR控制器 │────▶│ • 轮电机力矩 │
|
||
│ • 电机反馈数据 │ │ VMC控制器 │ │ • 关节电机力矩 │
|
||
│ • 遥控器命令 │ │ 状态估计器 │ │ • MIT控制参数 │
|
||
└─────────────────┘ └──────────────────┘ └─────────────────┘
|
||
```
|
||
|
||
## 文件结构
|
||
|
||
### 核心控制文件
|
||
- `balance_control.h/c` - 主控制器,整合LQR和VMC
|
||
- `lqr.h/c` - LQR控制器实现
|
||
- `vmc.h/c` - 虚拟模型控制器
|
||
- `kinematics.h/c` - 运动学计算
|
||
|
||
### 使用示例
|
||
- `balance_control_example.c` - 完整的使用示例
|
||
|
||
### MATLAB工具
|
||
- `lqr_design_optimized.m` - LQR参数设计和系数生成
|
||
- `vmc.m` - VMC控制器设计参考
|
||
|
||
## 快速开始
|
||
|
||
### 1. 硬件连接
|
||
确保以下硬件正确连接:
|
||
- IMU传感器(提供机体姿态)
|
||
- 2个轮电机(支持转矩电流控制)
|
||
- 4个关节电机(支持MIT控制模式)
|
||
- CAN总线通信
|
||
|
||
### 2. 参数配置
|
||
|
||
#### 2.1 运行MATLAB脚本生成LQR参数
|
||
```matlab
|
||
% 在MATLAB中运行
|
||
run('utils/lqr_design_optimized.m');
|
||
```
|
||
这将生成K矩阵的拟合系数,复制到`lqr.c`中的`K_fit_coefficients`数组。
|
||
|
||
#### 2.2 修改机器人物理参数
|
||
在`lqr.h`中修改您的机器人参数:
|
||
```c
|
||
#define R_W 0.09f // 驱动轮半径 (m)
|
||
#define R_L 0.25f // 两个驱动轮之间距离/2 (m)
|
||
#define M_W 0.8f // 驱动轮质量 (kg)
|
||
#define M_L 1.6183599f // 腿部质量 (kg)
|
||
#define M_B 11.542f // 机体质量 (kg)
|
||
// ... 其他参数
|
||
```
|
||
|
||
#### 2.3 配置电机ID和CAN接口
|
||
在`balance_control_example.c`中修改电机ID:
|
||
```c
|
||
#define WHEEL_LEFT_ID 0x01
|
||
#define WHEEL_RIGHT_ID 0x02
|
||
#define HIP_LEFT_ID 0x03
|
||
#define HIP_RIGHT_ID 0x04
|
||
#define KNEE_LEFT_ID 0x05
|
||
#define KNEE_RIGHT_ID 0x06
|
||
```
|
||
|
||
### 3. 代码集成
|
||
|
||
#### 3.1 在main函数中初始化
|
||
```c
|
||
#include "balance_control.h"
|
||
|
||
int main(void)
|
||
{
|
||
// HAL初始化
|
||
HAL_Init();
|
||
SystemClock_Config();
|
||
|
||
// 初始化外设
|
||
MX_CAN1_Init();
|
||
MX_TIM1_Init();
|
||
|
||
// 初始化平衡控制系统
|
||
balance_system_init();
|
||
|
||
// 启动控制循环
|
||
HAL_TIM_Base_Start_IT(&htim1); // 1kHz控制频率
|
||
|
||
while(1)
|
||
{
|
||
// 主循环处理其他任务
|
||
HAL_Delay(100);
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 3.2 定时器中断处理
|
||
```c
|
||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||
{
|
||
if (htim->Instance == TIM1) {
|
||
balance_control_task(); // 1kHz控制任务
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4. 传感器数据接口
|
||
|
||
#### 4.1 实现IMU数据读取
|
||
在`balance_control_example.c`中实现`read_imu_data()`函数:
|
||
```c
|
||
void read_imu_data(imu_data_t* imu)
|
||
{
|
||
// 从您的IMU传感器读取数据
|
||
imu->pitch = get_imu_pitch();
|
||
imu->roll = get_imu_roll();
|
||
imu->yaw = get_imu_yaw();
|
||
imu->pitch_rate = get_imu_pitch_rate();
|
||
imu->roll_rate = get_imu_roll_rate();
|
||
imu->yaw_rate = get_imu_yaw_rate();
|
||
// ... 其他数据
|
||
}
|
||
```
|
||
|
||
#### 4.2 实现电机反馈读取
|
||
```c
|
||
void read_motor_feedback(motor_feedback_t* motor_fb)
|
||
{
|
||
// 从CAN总线读取电机反馈
|
||
motor_fb->wheel_left_angle = get_motor_angle(WHEEL_LEFT_ID);
|
||
motor_fb->wheel_right_angle = get_motor_angle(WHEEL_RIGHT_ID);
|
||
motor_fb->hip_left_angle = get_motor_angle(HIP_LEFT_ID);
|
||
// ... 其他电机数据
|
||
}
|
||
```
|
||
|
||
#### 4.3 实现电机控制输出
|
||
```c
|
||
void send_motor_control(const motor_control_t* motor_ctrl)
|
||
{
|
||
// 发送轮电机转矩控制指令
|
||
send_wheel_torque_cmd(WHEEL_LEFT_ID, motor_ctrl->wheel_left_torque_cmd);
|
||
send_wheel_torque_cmd(WHEEL_RIGHT_ID, motor_ctrl->wheel_right_torque_cmd);
|
||
|
||
// 发送关节电机MIT控制指令
|
||
send_mit_control_cmd(HIP_LEFT_ID,
|
||
0, // 位置指令
|
||
0, // 速度指令
|
||
motor_ctrl->hip_left_kp,
|
||
motor_ctrl->hip_left_kd,
|
||
motor_ctrl->hip_left_torque_cmd);
|
||
// ... 其他关节电机
|
||
}
|
||
```
|
||
|
||
## 控制模式
|
||
|
||
### 1. 平衡模式 (ROBOT_STATE_BALANCE)
|
||
- 自动保持机体平衡
|
||
- 响应遥控器前进/转向命令
|
||
- 自动调节腿长以适应地形
|
||
|
||
### 2. 运动模式 (ROBOT_STATE_MOVE)
|
||
- 在平衡基础上执行运动控制
|
||
- 支持前进、后退、转向
|
||
- 支持高度调节
|
||
|
||
### 3. 紧急停止 (ROBOT_STATE_EMERGENCY)
|
||
- 立即停止所有电机输出
|
||
- 安全保护机制
|
||
|
||
## 控制参数调节
|
||
|
||
### LQR参数调节
|
||
在MATLAB脚本`lqr_design_optimized.m`中修改Q和R矩阵:
|
||
```matlab
|
||
% 状态权重矩阵Q - 增大数值提高控制精度
|
||
Q = diag([
|
||
10, % s - 水平位移
|
||
5, % ds - 水平速度
|
||
20, % phi - 偏航角
|
||
10, % dphi - 偏航角速度
|
||
100, % theta_ll - 左腿角
|
||
50, % dtheta_ll - 左腿角速度
|
||
100, % theta_lr - 右腿角
|
||
50, % dtheta_lr - 右腿角速度
|
||
200, % theta_b - 机体倾斜角 (最重要)
|
||
100 % dtheta_b - 机体角速度
|
||
]);
|
||
|
||
% 控制权重矩阵R - 增大数值降低控制量
|
||
R = diag([
|
||
0.1, % T_wl - 左轮力矩
|
||
0.1, % T_wr - 右轮力矩
|
||
1.0, % T_bl - 左腿力矩
|
||
1.0 % T_br - 右腿力矩
|
||
]);
|
||
```
|
||
|
||
### VMC参数调节
|
||
在`balance_control.c`中修改VMC参数:
|
||
```c
|
||
vmc_params_t vmc_params = {
|
||
.K_spring = 800.0f, // 径向弹簧刚度 - 控制腿长刚度
|
||
.K_damper = 80.0f, // 径向阻尼系数 - 控制腿长阻尼
|
||
.K_theta = 150.0f, // 角度刚度 - 控制腿角刚度
|
||
.K_dtheta = 15.0f, // 角速度阻尼 - 控制腿角阻尼
|
||
.max_radial_force = 1000.0f, // 最大径向力
|
||
.max_tangential_force = 500.0f, // 最大切向力
|
||
};
|
||
```
|
||
|
||
## 安全机制
|
||
|
||
### 1. 倾斜角保护
|
||
```c
|
||
#define MAX_TILT_ANGLE 0.5f // 最大倾斜角 (rad)
|
||
```
|
||
|
||
### 2. 腿长保护
|
||
```c
|
||
#define LEG_MIN_REACH 0.05f // 最小腿长 (m)
|
||
#define LEG_MAX_REACH 0.28f // 最大腿长 (m)
|
||
```
|
||
|
||
### 3. 力矩限制
|
||
```c
|
||
#define MAX_WHEEL_TORQUE 50.0f // 最大轮子力矩 (N*m)
|
||
#define MAX_JOINT_TORQUE 100.0f // 最大关节力矩 (N*m)
|
||
```
|
||
|
||
## 调试和监控
|
||
|
||
### 1. 串口调试输出
|
||
系统会定期输出关键状态信息:
|
||
```
|
||
=== Balance Control Status ===
|
||
Task Count: 1000
|
||
Robot State: 1
|
||
Safety Flag: 1
|
||
IMU Pitch: 0.050 rad (2.9 deg)
|
||
Left Leg Length: 0.200 m
|
||
Right Leg Length: 0.200 m
|
||
==============================
|
||
```
|
||
|
||
### 2. 状态监控
|
||
可以通过以下变量监控系统状态:
|
||
- `g_balance_ctrl.state` - 机器人状态
|
||
- `g_balance_ctrl.safety_flag` - 安全标志
|
||
- `g_balance_ctrl.robot_state` - 完整机器人状态
|
||
|
||
## 常见问题
|
||
|
||
### Q: 机器人启动后不稳定?
|
||
A:
|
||
1. 检查IMU标定是否正确
|
||
2. 调整LQR的Q矩阵,增大机体角度权重
|
||
3. 检查电机正负方向是否正确
|
||
|
||
### Q: 腿部抖动?
|
||
A:
|
||
1. 降低VMC的刚度参数
|
||
2. 增加VMC的阻尼参数
|
||
3. 检查关节电机的刚度设置
|
||
|
||
### Q: 轮子打滑?
|
||
A:
|
||
1. 降低LQR的轮子力矩输出
|
||
2. 增加R矩阵中轮子力矩的权重
|
||
3. 检查地面摩擦条件
|
||
|
||
### Q: 系统响应慢?
|
||
A:
|
||
1. 增加控制频率(目前为1kHz)
|
||
2. 调整LQR的Q矩阵权重
|
||
3. 检查CAN通信延迟
|
||
|
||
## 技术支持
|
||
|
||
如需技术支持或有疑问,请:
|
||
1. 检查上述常见问题
|
||
2. 确认硬件连接正确
|
||
3. 验证参数配置无误
|
||
4. 查看串口调试输出
|
||
|
||
## 更新日志
|
||
|
||
- v1.0 (2025-08-30): 初始版本,支持LQR+VMC协调控制
|
||
- 完整的6电机控制接口
|
||
- MATLAB参数设计工具
|
||
- 完善的安全保护机制
|