基于PID算法的两轮差速小车沿墙行驶控制策略

张开发
2026/4/17 20:57:19 15 分钟阅读

分享文章

基于PID算法的两轮差速小车沿墙行驶控制策略
1. 两轮差速小车沿墙行驶的核心原理两轮差速小车实现沿墙行驶的关键在于实时感知环境和精准控制转向。想象一下你闭着眼睛靠墙走路——你会用手轻触墙壁当感觉距离变远时朝墙的方向调整步伐距离太近时则向外侧移动。小车的超声波传感器就是它的触觉而PID算法则相当于大脑的调节机制。实际项目中我们常用左右两侧各安装两个超声波传感器的布局前后错开。这种设计有三大优势通过前后传感器的数据对比可以计算出车身与墙体的夹角双传感器互为冗余避免单个传感器失效导致失控测量数据可相互校验提高测距准确性传感器安装位置直接影响控制效果。以16cm长的车身为例建议将左侧传感器安装在距车头4cm和12cm处即前后各预留4cm空间。这个间距既能保证测量基线足够长又能避免传感器过于靠近车头车尾导致碰撞风险。2. 位姿解算从传感器数据到车辆状态拿到超声波测距值后第一步是解算车辆当前位姿。假设测得前传感器距离f_dist15cm后传感器b_dist13cm车身长度length16cmimport math f_dist 0.15 # 前传感器测距值(m) b_dist 0.13 # 后传感器测距值(m) length 0.16 # 车身长度(m) # 计算车身与墙体的夹角θ弧度 theta math.atan((b_dist - f_dist)/length) # 计算实际距离dist dist f_dist * math.cos(theta)这里有个新手常踩的坑直接使用f_dist作为距离值。实测发现当车身存在夹角时这样会导致系统持续存在稳态误差。我曾在一个项目中因此调试了整整两天后来加上角度补偿才解决问题。3. 运动学模型车轮转速与车辆运动的关系差速小车的运动控制本质是通过左右轮速差实现转向。设左轮转速omega_l5rad/s右轮omega_r4rad/s车轮半径r0.03m轮距wd0.1momega_l 5 # 左轮转速(rad/s) omega_r 4 # 右轮转速(rad/s) r 0.03 # 车轮半径(m) wd 0.1 # 轮距(m) # 计算线速度和角速度 v_l omega_l * r # 左轮线速度 v_r omega_r * r # 右轮线速度 v (v_l v_r)/2 # 车体中心线速度 omega (v_l - v_r)/wd # 车体角速度实际调试时要注意电机响应特性。某次使用廉价电机时发现PWM占空比与转速并非线性关系后来通过实验测得实际转换曲线并做了补偿PWM占空比(%)实测转速(rad/s)201.8403.5604.9806.01006.84. PID控制器的设计与调参沿墙行驶需要同时控制两个变量与墙的距离偏差d_err和航向角偏差phi_err。建议采用串级PID结构——外环控制距离内环控制角度。具体参数设置流程先调距离环比例项d_K设其他参数为0给小车初始偏差观察振荡情况加入积分项d_I消除稳态误差最后加入角度环参数phi_K和phi_I典型参数范围参考d_K: 0.5~2.0d_I: 0.01~0.1phi_K: 0.3~1.0phi_I: 0.005~0.05调试时遇到过积分饱和问题小车长时间贴墙导致积分项过大。后来加入积分限幅解决# PID计算示例 d_err dist - target_dist phi_err theta # 积分项累计 d_I_err d_err * delta_t phi_I_err phi_err * delta_t # 积分限幅 d_I_err max(min(d_I_err, 0.5), -0.5) phi_I_err max(min(phi_I_err, 0.3), -0.3) # 计算控制量 omega d_K*d_err d_I*d_I_err phi_K*phi_err phi_I*phi_I_err5. 系统稳定性优化技巧经过多个项目实践总结出这些稳定性优化方法传感器滤波采用移动平均滤波消除突发干扰设置有效距离范围如5cm~50cm异常值检测连续3次突变视为无效控制周期优化超声波采样周期50ms20Hz控制周期建议20-50ms注意控制周期与通信延迟的匹配抗干扰设计当检测到距离突变超过10cm时保持上一控制量增加死区控制±1cm内不响应动态调整PID参数根据速度变化某次比赛现场就遇到强光干扰超声波传感器导致测距值跳变。紧急加入以下处理逻辑后恢复正常valid_ranges [(0.05, 0.5)] # 有效距离范围 def validate_distance(raw_dist): if not all(min_val raw_dist max_val for min_val, max_val in valid_ranges): return None if abs(raw_dist - last_dist) 0.1: # 突变检测 error_count 1 if error_count 3: return None else: error_count 0 return raw_dist6. 实车调试经验分享调试时建议按这个流程进行先静态测试传感器读数准确性让小车直线行驶观察偏差趋势手动干扰测试系统响应最后进行沿墙全程测试常见问题排查表现象可能原因解决方法小车持续远离墙壁d_K极性错误取反比例系数出现持续振荡比例系数过大逐步减小d_K和phi_K稳态误差大积分项不足适当增加d_I响应迟缓控制周期过长优化代码提高执行频率突发性偏离传感器干扰增加滤波算法记得第一次调试时小车像喝醉一样左右摇摆后来发现是控制周期100ms与传感器更新周期50ms不同步。统一调整为50ms后立即改善。

更多文章