设计一款自主式自动驾驶遥控汽车
扫描二维码
随时随地手机看文章
在我们 ELEC 424 期末项目中,我们编写程序让一辆 RC 车能够自主行驶。整个设计很简单,它使用了一台 Raspberry Pi 5、一个 USB 摄像头以及一个小型轮式编码器,以跟随位于莱斯大学 PCF3 地面的蓝色胶带轨道行驶,途中会在两个红色方块处停下,并能知道何时到达终点。
作为一项挑战,尽管我们是本科生,但我们还是让 YOLOv5 在 Pi 5 上运行起来了,这样一来,汽车就能通过摄像头实时识别物体了。
首先,我们基于用户 raja_961 的“使用树莓派和 OpenCV 自动保持车道行驶的汽车”这一教程进行了改进(但为了能在 Pi 5 上运行,我们不得不对内容进行了大量修改:将旧的 GPIO 库替换为 lgpio,并使用 gpiod 为编码器构建自定义内核驱动程序)。
“分辨率与 PID 调整”
最终,我们选择了 160×120 的捕获分辨率,因为这一分辨率能最大程度地减少处理延迟,使得控制循环能够持续以每秒 25 帧以上的速度运行,同时还能为可靠的中心点检测提供足够的视频宽度。
对于转向控制器,我们通过实验确定了比例增益值为 Kp = 0.020,以确保有足够的转向能力,并引入了一个较小的微分增益 Kd = 0.004,以减少振荡并使车辆的转向响应更加平稳。
整体增益被认为没有必要;该车辆没有出现持续的机械转向偏差(使得我们的硬件转向调节保持在 0.0),这意味着不存在需要通过 I 项来修正的稳态误差。
停止按钮
通过使用两个范围的 HSV 警戒框(在 HSV 中,红色范围在 0°处结束,因此我们需要同时使用 [0, 100, 100]–[10, 255, 255] 和 [160, 100, 100]–[180, 255, 255])来检测红色停止标志,然后使用 cv2.findContours 函数,并设置面积阈值为 1000 平方像素以剔除像胶带边缘或背景噪声这样的小红色斑点。
为了保持车道保持环路的响应性,我们每隔三帧才运行红框检测。汽车采用了一个简单的状态机:
驾驶 → 停车_CD → 停车1 → 驾驶 → 停车_CD → 停车2 。
“STOP_CD”状态的存在是因为单个噪声帧绝不会触发停止操作。相反,在首次检测到异常后,我们会先连续检测 10 个帧,然后再决定停止,这样可以避免由短暂的红色闪光引起的误报。
在第一次停车后,我们保持油门处于中立状态 3 秒钟,然后在红色探测器重新启动前再等待 4 秒钟,以防止同一个停车区域再次触发。在检测到第二个停车区域后,状态机进入 STOP2 状态,并且此后每一帧都会调用 neutral() 函数。
图 1:误差、转向周期和速度周期与帧数的关系
图 2:误差、比例响应和微分响应与帧数的关系
嵌入式汽车硬件的图像
本文编译自hackster.io





