树莓派自动驾驶汽车设计

AI助手已提取文章相关产品:

基于树莓派的自动驾驶汽车设计与实现

1. 引言

忙碌奔波,试图完成各种琐事,想着从最近的杂货店购买所需物品,已成为我们日常安排的一部分。驾驶员失误是导致交通事故最常见的原因之一,而随着手机、车载娱乐系统、日益增加的交通流量以及更加复杂的道路系统的普及,这一问题不太可能消失。

随着事故数量日益增加,消除人为错误并帮助人类变得尤为重要。自动驾驶汽车有望终结这一现状,它们只需知道目的地,便可让乘客继续工作。这不仅能够避免事故,还能为日常驾驶中的琐事带来便利。

2. 硬件设计

2.1 硬件清单

使用一个预构建的四轮驱动(4WD)底盘作为基础,安装以下硬件组件:

  • 用于GPU和CPU计算的树莓派(B型)
  • Wi‐Fi 802.11n 无线网卡,用于远程连接树莓派
  • 可控制两个电机的电机驱动集成电路L293D
  • 8 AAA电池,用于提供电源
  • 跳线,用于连接各个组件
  • L形铝条,用于支撑摄像头
  • Pi摄像头
  • 超声波传感器,用于检测障碍物
  • 伺服电机,使头部(摄像头)可灵活旋转

2.2 硬件和软件描述

2.2.1 树莓派

树莓派是一款信用卡大小的单板计算机。目前市场上有五种树莓派型号,即B型号+、A型号+、B型号、A型号和计算模块(目前仅作为计算模块开发套件的一部分提供)。所有型号均采用相同的片上系统(SoC,即集成CPU和GPU的芯片)BCM2835,但其他硬件特性有所不同。

A 和 B 使用相同的印刷电路板,而 B+ 和 A+ 是一种新设计,但外形尺寸非常相似。计算模块是完全不同的外形尺寸,不能单独使用。

在本项目中,我们使用了B型号Rev 2。它配备了一个512 MB RAM的模型,包含两个USB端口和一个10/100以太网控制器。
示意图0

2.2.2 Pi摄像头

它是随树莓派一起附带的摄像头。Pi摄像头模块也可单独使用,可用于拍摄高清视频以及静态照片。

2.2.3 超声波传感器

超声波传感器(当其同时发送和接收时也称为收发器,但更普遍地称为换能器)通过解释来自无线电波或声波的回波来评估目标的属性。在本项目中,它们用于检测汽车与障碍物之间的距离。

2.2.4 Raspbian操作系统

在所有适用于树莓派的操作系统(Arch、Risc OS、Plan 9 或 Raspbian)中,Raspbian 因其最友好的用户界面、最佳外观、最丰富的默认软件以及针对树莓派硬件的优化而脱颖而出。Raspbian 是一种基于 Debian(Linux),可从树莓派网站免费获取。

2.2.5 Python

Python 是一种广泛使用的通用高级编程语言。与其他语言(如 C、C++ 或 Java)相比,它的语法使程序员能够用更少的代码行表达概念。

2.2.6 RPi.GPIO Python库

树莓派.GPIO Python库允许您在Python脚本中轻松配置和读写树莓派的GPIO接口上的输入/输出引脚。此软件包未随Raspbian一起提供。

2.2.7 OpenCV

它(开源计算机视觉)是一个主要面向实时计算机视觉的编程函数库。它拥有超过2500种优化的算法,包括一系列经典算法和计算机视觉领域的前沿算法,可用于图像处理、检测与人脸识别、物体识别、分类动作、追踪及其他功能。该库使得这些功能能够在计算机上相对容易地实现,并提供简单的计算机视觉基础设施,以便快速原型化复杂的应用程序。

该库被谷歌、雅虎、微软、英特尔、IBM、索尼、本田、丰田以及Applied Minds、Video Surf和Zeitera等初创企业广泛使用。此外,许多研究团队和政府也在使用它。

它基于C++,但也提供了Python的封装。在我们的项目中,用于检测道路并在未知道路上引导汽车。

2.3 硬件组件连接

底盘的4个轮子连接到4个独立电机。电机驱动集成电路L293D能够同时驱动2个电机。车轮的旋转基于两侧同步,即左前和左后轮同步旋转,右前和右后轮同步旋转。

因此,在任何时刻,每侧的一对电机从L293D获得相同的数字输入。当两侧车轮以相同方向和速度旋转时,汽车实现前进和后退运动。当左侧车轮的旋转方向与右侧相反时,汽车实现转弯。

底盘在车轮上方有两层架子,相距约2英寸。集成电路通过两颗0.5英寸螺丝固定在下层架子上。电机导线已永久连接到集成电路,必要的跳线从L293D引出并连接到树莓派。下层架子的其余空间由8节AA电池占据,为电机运行提供电源。

通过跳线将连接至树莓派GPIO的引脚1、引脚2和引脚7,用于控制连接到引脚3(O1)和引脚6(O2)的电机。

表I 控制左电机的真值表

引脚1 引脚2 引脚7 功能
High High Low 逆时针
High Low High 顺时针
High High High Stop
High Low Low Stop
Low X X Stop

高 = +5V,低电平 = 0V,X = 高或低(无关项)

示意图1
示意图2

树莓派外壳与L形铝条一起粘在顶层架上。树莓派安装在外壳内,而铝条则用于支撑安装在伺服电机上的摄像头和超声波传感器。

Wi‐Fi适配器连接到树莓派的USB端口,以便实现无线连接。

树莓派与电机控制器L293D的完整连接如图2所示。

由于树莓派需要自己的IP地址,因此必须将其连接到 Wi‐Fi路由器或热点。为此,我们需要在指定位置进行一些修改,以便树莓派每次启动时都能识别路由器。请导航到“/etc/network/interfaces”文件,并添加以下行,以使树莓派在重启后能够连接到您的路由器。

iface wlan0 inet dhcp
wpa-ssid "您的网络SSID"
wpa-psk "您的密码"

3. 车道检测

3.1 车道检测算法

传统上,车道可以通过两种方法检测,即基于特征的技术和基于模型的技术。基于特征的技术通过组合低级特征(如标线或车道边缘等)来定位道路图像中的车道。因此,该技术需要道路具有清晰的标线或明显的车道边缘,否则将无法正常工作。此外,由于该方法未对车道边缘形状施加任何全局约束,可能会受到遮挡或噪声的影响。

另一方面,基于模型的方法仅使用少量参数来表示车道。假设车道的形状可以用直线或抛物线曲线表示,则车道检测过程就转化为计算这些模型参数的过程。因此,与基于特征的方法相比,基于模型的方法在噪声和缺失数据方面具有更强的鲁棒性。为了估计车道模型的参数,通常将似然函数、霍夫变换和卡方拟合等方法应用于车道检测。然而,由于大多数车道模型仅关注特定形状的道路,因此缺乏对任意形状道路建模的灵活性。

在所提出的用于检测车道的算法中,采用了特征与模型相结合的方法。总体而言,该算法适用于各种类型的道路(无论道路是否标有白色车道线)。

整个方法包含7个主要部分:

3.1.1 提取道路的颜色范围

提取合适的上下范围,以确定汽车所在区域的颜色。这是该算法的主要且最重要的部分。利用此范围,创建当前视图的二值图像。

3.1.2 定义感兴趣区域

从底部向上定义一个感兴趣区域。由于视图来自汽车上的摄像头,距离汽车最近的路面位于图像的底部。因此,通过在生成的图像中向上移动,感兴趣区域从近处区域延伸到远处区域。感兴趣区域的高度通常不超过图像高度的一半。这可以去除视野中的天空区域,避免不必要的计算,优于H.Dahlkamp提出的方法。当我们远离汽车时,道路的宽度似乎在变窄。因此,实际的感兴趣区域呈梯形。

示意图3

3.1.3 将复杂感兴趣区域转换为简单形状

这是确定道路边界的重要步骤。在感兴趣区域内,确定轮廓。由于汽车位于道路上,包含底部区域中心部分的最大轮廓即为道路。使用近似法简化此轮廓的形状。

3.1.4 确定道路形状

我们在处理后的轮廓上绘制霍夫直线。沿着道路的左右边缘获得多条霍夫直线。其中只有少数直线代表实际边缘,其余直线是由于边缘处的噪声(由路面不规则性引起)所致。

3.1.5 滤除噪声

道路左边缘的线条向右倾斜,反之亦然。因此,任何向左倾斜且完全位于图像左半部分的线条都将被舍弃。同样,位于右半部分的类似线条也会被舍弃。对于左边缘,选择角度最小或具有最小正x截距或y截距的线条作为道路的左边缘。同理,确定道路的右边缘。一般情况可如图5所示。

示意图4

3.1.6 增强鲁棒性并抗噪声

对于行驶中的汽车,道路方向的变化不会突变。道路边缘的角度不能以离散方式改变。因此,任何与前一帧中直线相差过远的直线都将被直接舍弃。

还考虑了另一个称为“容差”的因素。本质上,它是在上述整个过程中无法检测到边缘时,可接受的连续帧的数量,其最大值为3。如果我们无法确定道路的边缘,容差值将减1。当容差值降至0时,我们将尝试在运行时重新查找道路的新颜色范围。

3.1.7 确定道路转弯(若有),并给车辆提供方向指引

考虑了道路的不同情况(左转、右转、分叉、环岛等)。假设存在如图6所示的左转情况。将感兴趣区域按比例 2:3:5划分为三个部分。将在这三个部分中分别获得的线与道路可能的形状进行比较。图3.1中每个部分内的虚线表示在这些部分中分别应用霍夫直线后得到的线。

示意图5
示意图6

与x轴成相同角度且位于全部三个区域,或仅位于顶部和中部两个区域,或仅位于其中部或底部区域的线被选中,并被预测为图7所示的道路边缘。

根据同一条线在三个不同部分的延续或中断情况,最终的感兴趣区域(ROI)会被调整,从而进一步帮助判断道路上存在的转向。上述图6显示了一条前方有左转的道路。

应用上述步骤后,感兴趣区域被划分为所示的三个部分。通过在这些不同部分中查找左右边缘,可以确定道路的可能边缘,如连接感兴趣区域底部到顶部的两条虚线所示(图7)。

下一个挑战在于确定转弯并改变汽车的运动轨迹。如图7所示,从左到右在感兴趣区域(ROI)的顶部边缘上绘制一条临时线。同时,在临时线与轮廓的交点处绘制一条轮廓的切线。如果该交点位于感兴趣区域(ROI)之外,则调整ROI以将此点包含在内。这一点可以在图8中看到,其中道路左边缘的顶点原本在图7中位于ROI之外,而在图8中已被包含在ROI之内。

示意图7

在图8中,切线与感兴趣区域顶部的夹角为α,β是所确定的左边缘与感兴趣区域顶部之间的夹角。对于左车道,这两个角度不同。类似地,对右车道计算这些角度时发现它们相同。

利用这些参数可以得出结论:前方存在一个转向,且该转向为左转。在此步骤之后,汽车的运动轨迹将发生变化,具体取决于通过连接修改后的感兴趣区域顶部和底部线段中点所得的新直线。

4. 项目阶段

4.1 第一阶段:远程控制车辆

可以使用某种遥控界面来控制汽车的运动,这可能是网页界面或移动界面。由于在树莓派上设置Python和SSH非常容易且没有任何缺点,因此建议使用基于移动设备的用户界面来控制汽车的运动。人们常用的一种向树莓派发送指令以控制GPIO端口的方法是WebIOPI。使用 WebIOPI可以将树莓派的任意GPIO端口设置为输入或输出,并且只需发送GET和POST请求即可轻松地在指定端口上发送高电平和低电平信号。然而,这种方法存在的问题是“如何将延迟降到最低”,因为在通过网页界面使移动车辆停止时,每个操作(例如将端口设置为输出引脚,或将其设为高电平或低电平)都被视为一个独立操作,从而导致大量延迟。为解决此问题,人们通常利用 WebIOPI实现中提供的REST API,自行设计用于前进、停止和转向的功能函数。但如果你对REST API了解甚少,实现起来会比较困难。尽管这种方法对能够容忍延迟的用户可能有一定作用,但并不被认为是控制汽车运动的最佳方式。为解决这些问题,开发了一款安卓应用,该应用可通过一个TTL被设为高的开放通道进行通信,从而尽可能长时间保持通道连接。

示意图8

4.1.1 移动应用

选择安卓来设计用户界面,因为如今大多数人都使用安卓手机。此外,在安卓上开发、安装和调试示例应用程序非常简单。该应用程序的后端使用了用Java编写的知名JSch库,以连接运行在树莓派上的SSH服务器的SSH通道。由于两者移动设备和树莓派通过无线方式连接到同一个网络。移动应用程序的第一页用于选择分配给树莓派的IP地址,以便成功与其建立连接。第二页显示已连接通道的连接状态。

左、右、上和下按钮用于控制车辆向左、向右、前进和后退。截图如图9所示。

4.2 第二阶段:具有自主避障功能的汽车

在机器人技术中,避障是指在满足不相交或无碰撞位置约束的前提下实现控制目标的任务。通常,避障涉及预先计算一条无障碍路径,然后由控制器引导机器人沿该路径运动。

尽管逆透视映射有助于借助已知的相机参数生成模型来计算汽车与远处物体之间的距离,但它需要更多的计算。在这种情况下,使用超声波传感器是更好的选择,因为它不需要高 CPU计算,既能检测障碍物,又能帮助我们测量距离。

超声波传感器用于检测附近平面物体的距离,以避免障碍物。这是一种功耗非常低的设备,广泛应用于微型自主机器人和汽车中。

其工作原理是通过传感器向物体发射低频声波,经反射后由传感器的接收器接收。根据接收到反射信号所需的时间,可计算出距离附近车辆或其他检测到的障碍物的距离。这种方法的一个缺点是,如果反射表面与传感器成一定角度,则距离测量可能会不准确,因此在做出转向决策之前,必须辅以 OpenCV和图像处理等其他技术。

示意图9

超声波传感器安装在底盘前部的伺服电机上。该传感器周期性旋转,检查是否存在潜在威胁障碍物,这些障碍物可能不在运动轨迹上,但如果未采取预防措施,仍可能撞击汽车。

4.2.1 算法

每隔固定时间(即 300毫秒)观察周围环境。以下步骤将在每个时间间隔重复执行。

  1. 观察周围环境,以计算障碍物与汽车之间的距离。
  2. 对汽车而言安全的最小阈值距离为1米。如果计算出的距离小于阈值,则停止汽车并检查其他方向。
  3. 旋转汽车并向前移动。

4.3 第三阶段:具备自主导航功能的汽车

此阶段旨在使汽车实现自主化。行以下技术,实现汽车的自主行为。

4.3.1 算法

在HSV色彩空间中提取道路的颜色范围需要在初期进行手动数据收集。同一段道路在一天中的不同时间和不同的天气条件下被记录下来。考虑到颜色变化和光照强度的变化,生成一组特定的HSV值的上下限。

  1. 定义算法所需的数据结构。即一个包含可能的上下阈值颜色值集合的标量二维数组,以及左右两侧的容差,默认值为3。
  2. 根据条件选择阈值,并将图像帧转换为二值图像。
  3. 将感兴趣区域从整个画面缩小为一个底边与底部接触的梯形。该感兴趣区域从上到下被分为三个部分,高度分别为50%、30%和20%。步骤4到11将应用于感兴趣区域的这三个部分。
  4. 在感兴趣区域中查找轮廓。
  5. 确定包含感兴趣区域中所选部分底部水平中心部分的最大轮廓。
  6. 将轮廓近似为更简单的多边形曲线。该曲线(基本上是一个轮廓)表示潜在道路。
  7. 在可能的道路曲线上找到霍夫直线。
  8. 位于左半部分的负斜率线(当我们向上移动时从右向左延伸的线)和位于右半部分的正斜率线(当我们向上移动时从左向右延伸的线)将被忽略。
  9. 分别选择在左半部分和右半部分中具有最小正x轴截距或y轴截距的线作为左边线和右边线。
  10. 如果未能获得相应的左边线或右边线,则对应的容差减1。
  11. 如果左容差和右容差均小于1,则需要更改HSV色彩空间中道路颜色的阈值。
  12. 如果表示感兴趣区域三个部分中边缘的三条线位于同一条直线上(通过检查它们形成的角度)判断道路为直线。如果在中间和底部区域检测到线,则说明道路正在转向。遇到转向时,相应地调整感兴趣区域。
  13. 一条垂直平分左右边缘之间区域的线为汽车提供了运动轨迹。
  14. 沿着定义的运动轨迹行进时,使用超声波传感器检测障碍物。

使用以下算法,并结合第二阶段的避障功能,实现一辆完全自主的汽车。

5. 结果

大多数实验都集中在检测不同条件下各种道路的任务上。为此,在不同道路图像上进行了不同的测试。

示意图10
示意图11
示意图12

)

图11和图15显示了不同道路的原始图像以及修改后的假设感兴趣区域。图12和图16显示了使用预计算的HSV阈值得到的二值图像。图13和图17显示了将道路近似为最接近的多边形形状后获得的轮廓。

图14和图18显示了所获得的最终图像,有助于计算道路的新运动轨迹。在图14中,左车道和右车道都被准确检测到,因此蓝线从第1部分延伸至第2部分和第3部分。在图18中,仅在第1部分检测到右车道,因此该部分被标记为蓝色。

此外,由于左车道向左转向,因此计算了角度 α和 β(见图8),经过必要的计算后得出运动轨迹向左转向的结果,从而相应地调整了感兴趣区域。由于已经收集了大量数据以确定不同条件下道路的阈值,道路上的阴影不再构成问题。无需考虑特殊情况来去除阴影。

6. 结论与未来工作

6.1 结论

本文提出了一种实现自动驾驶机器人汽车的方法。详细描述了不同的硬件组件及其组装过程。基于OpenCV,解释了一种确定不平整、有标记或无标记道路边缘的新方法。通过使用超声波传感器,避免了与障碍物的碰撞。文中提到的算法已成功应用于一辆小型自动驾驶汽车上。

6.2 未来工作

通过改进算法并引入机器学习,可以进一步提升该工作。当前的算法会对所有帧执行操作,虽然准确,但如果能够实现自主学习,避免对已知或熟悉的区域进行不必要的计算,则其效率可进一步提高。当汽车在道路上行驶时,会识别途中的障碍物(主要是静态障碍物)并记录其特征。

每次汽车行驶时都会生成一个XML文件,用于存储以下信息:

  • 两个节点之间的距离。
  • 从特定节点分出的道路数量。
  • 连接两个节点的道路上的减速带及其他静态障碍物的数量。
  • 减速带及其他静态障碍物距离特定节点的距离。
  • 障碍物的高度和宽度。

XML中存储的信息有助于汽车理解和记住下次要遵循的路径。

您可能感兴趣的与本文相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值