本项目基于BestRyze开源项目修改 参考项目mithi
1.使用bmi088并可回滚为mpu6050
项目中可能有多个地方使用了 mpu6050 对象,例如:
-
mpu6050.Init()
-
mpu6050.get_angle()
-
mpu6050.dmp_get_data()
如果直接删除这些文件,需要:
-
搜索所有使用 mpu6050 的代码
-
逐一替换为 BMI088 的接口
-
可能引入错误
保留适配层后,这些调用无需修改,适配层内部会转发到 BMI088。
2.接口映射关系
旧接口(MPU6050) → 新实现(BMI088)
─────────────────────────────────────────────
mpu6050.Init() → 空实现(BMI088在MPU_task中初始化)
mpu6050.get_angle() → 从INS结构体获取角度(度转弧度)
mpu6050.dmp_get_data() → 从INS结构体更新角度数据
3.保持部分6050原始定义(便于代码回滚)
在 mpu6050.h 中保留了 MPU6050 的寄存器定义(如 MPU6050_RA_WHO_AM_I 等),原因:
-
可能有其他代码引用了这些宏
-
保留它们不会影响功能
4.数据流向图
┌─────────────────┐
│ MPU_Task任务 │ ← FreeRTOS任务,初始化BMI088
│ (MPU_task.cpp) │
└────────┬────────┘
│ 更新INS结构体
↓
┌─────────────────┐
│ INS_t INS │ ← BMI088的角度数据(度)
│ (全局变量) │
└────────┬────────┘
│ get_imu_control_point()
↓
┌─────────────────┐
│ mpu6050.get_ │ ← 适配层:度转弧度
│ angle() │
└────────┬────────┘
│ 返回Position3(弧度)
↓
┌─────────────────┐
│ 原有业务代码 │ ← 完全不需要修改
└─────────────────┘
5.硬件修改
(1)开启spi接口
- 选择 Full-Duplex Master(全双工主机模式)。
CS_GYRO (陀螺仪片选) 连接的是:PA3
CS_ACCEL (加速度计片选) 连接的是:PA4
PA5 -> SPI1_SCK
PA6 -> SPI1_MISO
PA7 -> SPI1_MOSI
(2)修改传感器数据带宽
- BMI088 传感器必须用 8 位数据通信,选 4 位读出来全是乱码。
(3)修改波特率
- 选择一个分频系数,观察下方的
Baud Rate(波特率),让它在 2.0 MBits/s 到 5.0 MBits/s 之间最好。太高(超过 10M)可能会不稳定,太低会影响读取速度。这是因为 STM32H750 的主频非常高(通常 400MHz 或 480MHz),如果不修改分频系数(Prescaler),默认生成的 SPI 波特率往往高达 25 MBits/s 甚至 50 MBits/s,这远远超过了 BMI088 传感器的承受极限。
6.工作流程
遥控器输入
↓
解析控制指令(速度、模式切换)
↓
步态规划模块
├─ 计算6条腿的轨迹点(N_POINTS=100个点)
├─ 根据速度指令生成步态
└─ 计算每条腿的关节角度
↓
逆运动学解算
├─ 末端位置 → 关节角度
└─ 考虑腿的偏移角度
↓
舵机控制(UART通信)
├─ 6条腿 × 3关节 = 18个舵机
└─ 机械臂3个关节 + 1个夹爪
↓
机器人执行动作
↓
IMU反馈(可选)
├─ 读取姿态角度
└─ PID控制保持稳定
6.主循环工作流程(未作修改)
void MX_FREERTOS_Init(void) {
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);//协调
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
osThreadDef(LED_task, LED_Task, osPriorityIdle, 0, 128);
LED_taskHandle = osThreadCreate(osThread(LED_task), NULL);//闲置
osThreadDef(LegControl_task, LegControl_Task, osPriorityRealtime, 0, 1024);//核心控制最高级堆栈极大
LegControl_taskHandle = osThreadCreate(osThread(LegControl_task), NULL);
osThreadDef(MPU_task, MPU_Task, osPriorityRealtime, 0, 512);//核心控制最高级
MPU_taskHandle = osThreadCreate(osThread(MPU_task), NULL);
}
7.bmi088
bmi088/
├── IMU/ # IMU核心功能模块
│ ├── BMI088driver.* # BMI088传感器底层驱动
│ ├── BMI088Middleware.* # SPI通信中间层
│ ├── BMI088reg.h # BMI088寄存器定义
│ ├── QuaternionEKF.* # 四元数扩展卡尔曼滤波(姿态解算核心)
│ ├── kalman_filter.* # 卡尔曼滤波器基础实现
│ ├── pid.* # PID控制器(用于温度控制等)
│ ├── eeprom.* # EEPROM存储(校准数据)
│ ├── bsp_dwt.* # 精确计时(微秒级)
│ └── user_lib.* # 用户库函数
└── MPU_task.* # FreeRTOS任务 + INS姿态解算
8.算法流程
陀螺仪数据(角速度)
↓
四元数积分(预测)
↓
加速度计数据(重力方向)
↓
EKF更新(修正)
↓
输出:Roll, Pitch, Yaw(度)
9.总结
这是一个完整的六足机器人控制系统,包含:
-
六足行走(步态规划与控制)
-
姿态感知(IMU传感器)
-
遥控控制(多模式切换)
-
实时控制(FreeRTOS多任务)
适用于需要复杂运动控制的六足机器人应用场景。