一款基于树莓派 5 的自动驾驶遥控汽车,通过内核编码器驱动器控制车速,并在遇到红灯时自动停车
扫描二维码
随时随地手机看文章
该项目利用计算机视觉技术实现自动驾驶遥控车的车道保持功能,采用定制的内核空间光学编码器驱动程序进行速度控制,并使用 PD 控制器实现平稳的模拟转向。
PID/PD 调整
我们使用了 PD 控制器来进行转向操作,将检测到的路面中心与图像中心之间的像素误差映射为伺服值。我们起初将比例增益(Kp = 0.025)设置为较低值,并将导数增益设为零,然后逐步增加 Kp 直至汽车开始出现振荡,之后再添加导数增益(Kd = 0.005)以抑制这种振荡。摄像机的分辨率设置为 160×120——这个分辨率足够低,能够快速处理帧图像而不牺牲车道检测质量。我们通过绘制误差和转向占空比与帧数的关系图,并观察汽车在赛道上的实际行为,来确定这些增益值。由于 PD 控制单独就能在我们的目标速度下实现稳定的车道跟随,所以积分项未被采用。
停止箱体检测
我们每隔一帧使用 HSV 颜色掩码来检测红色停止标志,以减轻车道保持循环的计算负荷。将两个红色的 HSV 范围进行“或”运算以应对光照变化,并且任何面积超过 1000 像素的红色轮廓都会触发停止事件。一个简单的状态机会跟踪汽车是否已经看到了一个或两个停止标志:在第一个停止标志之后,汽车会停顿约 3 秒钟,然后在冷却时间内恢复行驶以避免再次触发;在第二个停止标志之后,汽车会永久停止。每隔一帧的这种方法避免了停止检测影响转向响应性。
通过光学编码器实现速度控制
我们编写了一个适用于 Linux 平台的驱动程序(encoder_driver.c),该程序与设备树节点(光学编码器)进行绑定,并使用 gpiod API 在编码器的 GPIO 上注册上升沿中断。每次中断都会记录自上一次脉冲以来经过的纳秒数;小于 5 毫秒的脉冲被视为抖动噪声而被拒绝,如果在 500 毫秒内没有脉冲到达,则速度将被报告为 0。转速每分钟(RPM)通过公式 60 亿/(间隔纳秒数 x 转数每圈) 计算得出,其中编码器轮上有 20 个孔,并通过 /sys/module/encoder_driver/parameters/speed_rpm 与用户空间进行交互。Python 脚本每帧读取这个 sysfs 文件,并使用比例控制器(Kp_speed = 0.001)调整 ESC 节流阀,目标转速为 300 RPM,节流阀的范围被限制在 0.20 到 0.22 之间,每帧的最大变化为 0.0005 以防止突然晃动。
本文编译自hackster.io





