基于PID控制原理的车道保持系统(LKA)研究与应用:学习篇
基于PID控制的车道保持系统LKA 该商品只是学习用途不适用于商业哦车道保持这事儿听起来挺玄乎实际拆开来看就是个不断纠偏的过程。咱们拿PID控制来玩这个就跟新手司机扶着方向盘总在微调差不多。先别急着搞复杂模型用Python写个玩具级的仿真环境感受下三个参数是怎么折腾转向角度的。先给方向盘安个灵魂——PID控制器。核心代码也就十几行关键是理解误差怎么来的class PIDController: def __init__(self, kp, ki, kd, dt): self.kp kp self.ki ki self.kd kd self.dt dt self.integral 0 self.prev_error 0 def update(self, error): self.integral error * self.dt derivative (error - self.prev_error) / self.dt output self.kp * error self.ki * self.integral self.kd * derivative self.prev_error error return output这里的积分项像不像开车走神时积累的偏差微分项就是突然发现快压线了赶紧猛打方向。实际调试时遇到过积分饱和的坑吗比如长时间偏离导致积分爆炸这时候加个积分限幅就实在了。给车子建个动力学模型别整什么轮胎动力学用自行车模型足够演示class CarSim: def __init__(self, wheelbase2.5): self.x 0.0 self.y 0.0 self.yaw 0.0 self.wheelbase wheelbase def update(self, steer_angle, speed, dt): self.yaw (speed * np.tan(steer_angle) / self.wheelbase) * dt self.x speed * np.cos(self.yaw) * dt self.y speed * np.sin(self.yaw) * dt return self.x, self.y这里的方向盘转角直接对应前轮转角注意正负号定义。仿真步长时间别设太大0.01秒比较稳不然车辆轨迹会抽风。基于PID控制的车道保持系统LKA 该商品只是学习用途不适用于商业哦实际跑起来的闭环控制大概长这样pid PIDController(kp0.8, ki0.001, kd0.2, dt0.01) car CarSim() desired_y 0.0 # 车道中心线 for _ in range(1000): error desired_y - car.y steer pid.update(error) car.update(steer, 10.0, 0.01)调试时记得先关掉积分和微分单用比例控制让车子在车道线之间画蛇。等比例系数调到能收敛了再慢慢加微分抑制超调。积分项要慎用道路有曲率的时候才需要。实测发现参数对速度敏感车速翻倍后原先的参数会让车子走猫步。这时候要么上自适应PID要么简单粗暴做速度映射。还有个骚操作是在误差计算里加入预瞄距离相当于人类司机看远处车道线。最后提醒下实际部署时要处理图像识别的延迟。在代码里加个低通滤波器试试class LowPassFilter: def __init__(self, tau, dt): self.alpha dt / (tau dt) self.prev_value 0 def update(self, value): filtered self.alpha * value (1 - self.alpha) * self.prev_value self.prev_value filtered return filtered把这个套在误差信号输入前能有效抑制摄像头抖动带来的噪声。PID参数得重新调不过至少方向盘不会抽筋了。玩到这儿应该能明白参数整定真是门玄学有时候加点if-else判断特殊情况比纯PID还好使。