1. 项目概述
在移动机器人定位领域,两轮差速驱动小车因其结构简单、控制方便而被广泛应用。然而,这类系统存在一个关键挑战:由于轮子打滑、地面摩擦不均等因素,仅依靠编码器(里程计)的航迹推算会产生累积误差,导致定位精度随时间急剧下降。我在实际项目中多次遇到这种情况——一个初始误差仅2cm的小车,运行5分钟后定位偏差可能达到30cm以上。
为解决这一问题,我们设计了一套基于扩展卡尔曼滤波(EKF)的多传感器融合定位系统。该系统创新性地将编码器数据与环境感知传感器(如激光雷达或视觉特征)相结合,通过EKF算法实现非线性状态估计。实测表明,这套方案能将定位误差控制在2%的行程距离以内,相比纯里程计定位有数量级的提升。
2. 系统设计与原理拆解
2.1 核心架构设计
系统采用分层式架构,分为以下三个核心模块:
-
感知层:包含编码器和环境传感器。编码器采样周期为10ms,提供左右轮速;激光雷达采用20Hz扫描频率,角度分辨率0.5°。
-
算法层:EKF作为核心处理器,设置状态向量为[x, y, θ]ᵀ,即二维位置和航向角。滤波器迭代频率与激光雷达同步(20Hz),确保实时性。
-
控制层:引入输入饱和(USAT)模块,限制最大角速度为1.5rad/s,防止剧烈转向导致的定位失准。
关键设计决策:选择EKF而非UKF(无迹卡尔曼滤波),主要考虑计算资源限制。在STM32F4平台上测试显示,EKF单次迭代仅需0.8ms,而UKF需要2.3ms。
2.2 传感器选型考量
在实际部署中,传感器选择直接影响系统性能:
-
编码器:选用500线光电编码器,配合4倍频技术,理论位移分辨率达0.1mm。需注意安装时要保证轴系同心度,我们曾因机械偏差导致周期性误差。
-
环境传感器:室内环境推荐2D激光雷达(如RPLIDAR A3),室外可考虑视觉-惯性组合。有个实用技巧:在激光雷达前方45°安装反光板作为人工路标,能显著提升特征提取稳定性。
3. 核心算法实现细节
3.1 运动学建模
两轮差速小车的非线性运动模型如下:
code复制ẋ = v·cosθ
ẏ = v·sinθ
θ̇ = ω
其中v=(v_R + v_L)/2,ω=(v_R - v_L)/L(L为轮距)。离散化后的状态转移方程:
matlab复制function x_pred = motion_model(x_prev, u, dt)
v = (u(1)+u(2))/2;
omega = (u(1)-u(2))/0.3; % 假设轮距L=0.3m
x_pred = x_prev + [
v*cos(x_prev(3))*dt;
v*sin(x_prev(3))*dt;
omega*dt
];
end
3.2 EKF实现关键步骤
3.2.1 雅可比矩阵计算
过程模型的雅可比矩阵F_k:
matlab复制F_k = [
1, 0, -v*sinθ*dt;
0, 1, v*cosθ*dt;
0, 0, 1
];
观测矩阵H_k取单位矩阵(直接观测位姿),对应代码:
matlab复制H_k = eye(3);
3.2.2 噪声协方差调整
通过实验数据标定噪声参数:
- 过程噪声Q:diag([0.01, 0.01, 0.001])
- 观测噪声R:激光雷达为diag([0.02, 0.02, 0.005])
有个重要经验:Q矩阵需要根据车速动态调整。我们采用以下启发式规则:
matlab复制Q(1:2,1:2) = Q(1:2,1:2) * (1 + 0.5*abs(v));
3.3 Simulink建模技巧
在搭建仿真模型时,有几个实用技巧:
-
延迟处理:使用Memory模块而非Transport Delay,避免代数环问题。设置初始状态为[0,0,0]ᵀ。
-
噪声注入:用Band-Limited White Noise模块模拟传感器噪声,关键参数:
- Noise Power:编码器设为1e-6,激光雷达设为2e-5
- Sample Time:与实际传感器一致
-
可视化调试:添加XY Graph模块实时显示轨迹,配置不同颜色区分真值、里程计和EKF估计。
4. 实测问题与解决方案
4.1 典型故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 定位突然发散 | 激光雷达特征丢失 | 增加EKF的Q矩阵,临时依赖里程计 |
| 角度估计漂移 | 轮距参数不准 | 在线校准:让小车转360°对比角度差 |
| 更新周期不稳定 | 传感器数据不同步 | 添加数据缓存队列,时间对齐 |
4.2 参数调试心得
-
协方差初始化:P0不宜过小,建议设为diag([0.1, 0.1, 0.05])。太小会导致滤波器"过于自信",难以修正初始误差。
-
传感器权重:通过调整R矩阵实现。当环境特征丰富时,降低激光雷达的R值;在长廊等场景则增大。
-
数值稳定性:采用Joseph形式更新协方差,避免负定问题。代码实现:
matlab复制P = (eye(3)-K*H)*P*(eye(3)-K*H)' + K*R*K';
5. 性能优化与扩展
5.1 计算效率提升
针对嵌入式平台,我们做了以下优化:
- 预计算三角函数:将sin/cos查表化,精度0.01rad时误差<0.1%
- 矩阵运算展开:手工展开3x3矩阵求逆,速度提升40%
- 定点数改造:Q15格式下保持毫米级精度
5.2 多传感器扩展方案
当前系统可平滑扩展其他传感器:
- IMU:增加状态向量到6维(含角速度/加速度)
- UWB:修改H矩阵为距离观测模型
- 视觉里程计:需增加外参标定模块
一个实用技巧:新传感器接入时,先单独验证观测模型正确性,再逐步调小其R矩阵权重。
6. 工程实现建议
在将算法部署到真实小车时,特别注意:
- 机械安装:编码器与轮轴必须刚性连接,我们曾因联轴器松动导致严重误差
- 电源滤波:电机启停会干扰传感器供电,建议添加LC滤波电路
- 温度补偿:编码器精度受温度影响,冬季需重新标定
对于想复现该项目的开发者,建议先从仿真开始,逐步过渡到实物。仿真阶段重点关注:
- 轨迹跟踪误差曲线
- 协方差矩阵收敛情况
- 不同噪声水平下的鲁棒性