Skip to content

本项目基于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多任务)

适用于需要复杂运动控制的六足机器人应用场景。