1. 项目背景与核心挑战
两轮自平衡小车作为典型的欠驱动系统,在平坦路面已能实现稳定控制。但当遇到复杂地形时(如斜坡、台阶、碎石路面),传统PID控制算法往往会出现剧烈震荡甚至翻车。这个项目要解决的正是如何在复杂地形环境下实现小车的动态平衡与智能路径规划。
去年我在参与某仓储机器人项目时,就遇到过类似问题——当AGV小车遇到仓库地面的电缆沟槽时,传统控制方式会导致货物跌落。这促使我开始研究复杂地形下的自适应控制方案。经过半年多的实验验证,总结出这套融合多传感器数据与AI决策的控制系统。
2. 系统架构设计
2.1 硬件组成方案
核心硬件配置经过多次迭代优化:
- 主控:STM32H743(400MHz主频,满足实时控制需求)
- 惯性测量:MPU6050+ICM20602双IMU冗余设计
- 地形感知:VL53L1X激光测距阵列(前/左/右三向)
- 动力系统:直流无刷电机+2048线编码器
- 通讯模块:ESP32实现远程监控
关键经验:IMU安装位置要尽量靠近车辆重心,我们的实测数据显示,安装位置偏差5cm会导致俯仰角测量误差达2.3°
2.2 软件控制框架
采用分层式架构:
code复制[感知层] → [融合层] → [决策层] → [执行层]
│ │ │ │
激光数据 卡尔曼滤波 深度强化学习 PWM输出
IMU数据 地形建模 路径规划 电机控制
特别在决策层引入双策略网络:
- 快速响应网络:处理突发地形变化(10ms周期)
- 全局优化网络:进行长周期路径规划(100ms周期)
3. 核心算法实现
3.1 动态平衡控制算法
在传统LQR控制基础上改进:
c复制// 状态空间方程修正项
void terrain_compensation(float *u){
float slope = get_terrain_slope();
float roughness = get_terrain_roughness();
*u += 0.12 * slope + 0.08 * sin(roughness*PI);
}
实测参数调节要点:
- 斜坡补偿系数建议0.1-0.15
- 粗糙度补偿系数不超过0.1
- 更新周期控制在5ms以内
3.2 强化学习训练方案
使用PPO算法训练时,我们设计了特殊的奖励函数:
code复制奖励 = 平衡奖励 × (1 - 颠簸惩罚) + 进度奖励
具体参数设置:
- 平衡奖励:10/(1+abs(倾角))
- 颠簸惩罚:0.3×加速度方差
- 进度奖励:0.01×移动距离
训练环境搭建技巧:
- 在Gazebo中构建包含15种地形的训练场
- 使用域随机化技术增强泛化能力
- 关键参数:γ=0.99,λ=0.95,KL阈值0.01
4. 实际部署优化
4.1 传感器数据融合
开发了三级滤波方案:
- 硬件级:IMU自带低通滤波(截止频率30Hz)
- 数据级:改进的移动加权平均滤波
- 算法级:自适应卡尔曼滤波
避坑指南:激光测距数据在雨天会出现异常值,我们通过设置置信度阈值(<30cm或>300cm的数据丢弃)解决了这个问题
4.2 实时性保障措施
关键时序优化方法:
- 中断优先级设置:
- IMU数据读取(最高)
- 电机控制(次高)
- 路径规划(普通)
- 内存管理:
- 为决策网络预留128KB专用RAM
- 使用内存池管理激光数据
5. 典型问题解决方案
5.1 斜坡启动打滑
解决方案:
- 增加静态摩擦检测
- 启动阶段采用斜坡模式:
- 初始PWM缓升(0→30%耗时0.5s)
- 倾角补偿量×1.5系数
5.2 连续颠簸路面震荡
处理流程:
- 识别为颠簸模式(加速度方差>0.5g)
- 切换为保守控制策略:
- 降低目标速度50%
- 增大阻尼系数30%
- 持续监测3秒无改善则停车
6. 性能测试数据
在四种典型地形下的对比测试:
| 地形类型 | 传统PID | 本方案 | 提升幅度 |
|---|---|---|---|
| 15°斜坡 | 62%成功率 | 98% | +36% |
| 碎石路 | 45% | 89% | +44% |
| 2cm台阶 | 33% | 82% | +49% |
| 湿滑瓷砖 | 71% | 95% | +24% |
测试中发现一个有趣现象:在坡度超过20°时,主动侧倾策略比垂直平衡策略能耗降低27%
7. 扩展应用方向
这套系统经适当修改后可应用于:
- 山地救援机器人
- 农业巡检小车
- 特种环境作业平台
最近我们正在尝试将地形识别模块替换为RGB-D相机,初步测试显示在识别不规则障碍物方面有显著提升,但需要解决日光干扰问题。另一个改进方向是加入多车协作路径规划,这对仓储物流应用特别有价值。
