OpenAI] Python:基于健身房赛车的自动驾驶项目 (1) | 前期知识介绍 | 项目环境准备 | 逐步动手实施
???? 写在前面: 本篇是关于多伦多大学自动驾驶专业项目 Gym-CarRacing 的博客。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车在赛道上行驶的物理过程。由于内容比较多所以分多次更新,本篇是关于前置知识介绍,以及项目环境准备的。具体如下:
- 自动驾驶的背景知识介绍。
- 然后会讲解本项目可能所需的知识点,需要用到图像处理算法和基础车道线检测算法,这里的讲解并不会太细,读者如果对不熟悉可以在单独搜索,C站上也有不少介绍这些算法的博客。
- 项目所需的环境安装教程(这个部分是我在博客审阅阶段临时增添的),因为该项目需要 Conda 和 gym 环境和一堆必不可少的软件包(少一个都跑不了)。我看了网上有不少朋友在做该项目时,在环境安装上踩了不少坑。所以为了方便需要做该项目的同学、对该项目感兴趣的朋友,我这里准备了环境安装的教程。
???? 多伦多大学自动驾驶专项课程:Motion Planning for Self-Driving Cars | Coursera
???? Gym Car Racing 文档:Car Racing - Gym Documentation
Ⅰ. 背景知识介绍
0x00 引入: 什么是自动驾驶?
" Autonomous(自动)+ driving(驾驶) "
Self-driving car, autonomous vehicle, driver-less car, or robotic car……
0x01 自动驾驶的基本组件
- 汽车(Car):实际移动的车辆,代理人应该控制它
- 传感器(Sensors):探测周围环境的设备
- 代理人(Agent):一个在给定的周围环境中安全地驱动 var 的物体
传感器(Sensors on self-driving cars):
- 460 个激光雷达摄像机、RGB 摄像机
自动驾驶的目标(Goal of Autonomous Driving):
- 在给定的情况下的安全驾驶
- 根据给定的情况 (state) 安全驾驶汽车
映射函数:Sensor Input → Action
- 模块化管线(modular Pipelines)
- 端到端训练(End-to-End Learning)
- 直接感知(Direct Perception)
0x02 模块化组件(Modular Pipeline)
每个模块连接下一个模块的输入:低级感知、场景解析、路径训练、车辆控制。
❓ 需要思考的问题:为遵循选定的路径,我们应将手柄转多少度?我们应该以什么速度前进?
Ⅱ. 前置知识
0x00 车道标记与车道检测(Lane marking & Lane detection)
- 使用梯度图或边缘过滤的图像,我们可以通过阈值处理来检测车道标记。
- 考虑在附近存在相反梯度的点。
0x01 边缘检测(Edge Detection)
- 通过用边缘过滤器对图像进行卷积,得到两个方向的梯度图。
-
这里也可以使用其他的边缘核进行边缘检测。 网络异常,图片无法展示|
边缘检测是图像处理的一种常见技术,用于检测图像中的边缘和边界。这对于自动驾驶系统来说是非常重要的,因为边缘检测可以帮助系统识别道路、车辆、行人等重要物体。
通常边缘检测是通过使用边缘过滤器对图像进行卷积来实现的,边缘过滤器是一种特殊的卷积核,其中包含了两个方向的梯度图,可以检测出图像中的垂直和水平边缘。比如图中显示的 Sobel 过滤器,就可以得到一张图像的
除了 Sobel 过滤器之外,还有许多其他的边缘核可以用于边缘检测。比如 Canny 边缘检测算法,这是一种非常流行的边缘检测算法,它可以有效地消除噪声并提供清晰的边缘检测结果。
Canny 边缘检测是由 John F. Canny 在 1986 年提出的一种边缘检测算法。
它是一种多步骤的边缘检测算法,包括以下几个步骤:
- 图像高斯滤波:使用高斯滤波器对图像进行模糊处理,以减少噪声并使边缘更加明显。
- 计算图像梯度:使用 Sobel 过滤器或其他方法计算图像的梯度,并使用梯度的方向和大小来表示图像中的边缘。
- 非极大值抑制:使用非极大值抑制算法来去除图像中的假边缘。
- 双阈值检测:使用两个阈值来区分真正的边缘和假边缘。
- 边缘连接:将检测到的边缘连接起来,以形成完整的边缘。
Canny 边缘检测算法的优点是它能够有效地消除噪声,并提供清晰的边缘检测结果。但是,由于它是一种多步骤的算法,所以它的计算复杂度较高,不太适用于实时边缘检测场景。
0x02 IPM 逆透视变换(Inverse Perspective Mapping)
IPM(Inverse Perspective Mapping)是一种图像处理技术,它可以将一张透视变换后的图像进行逆变换,使其看起来像是从俯视角度拍摄的。这对于自动驾驶系统来说非常重要,因为它可以帮助系统更准确地识别道路、车辆、行人等物体。
- 在通常情况下,道路是在平面上的。
- 如果三维变换是已知的,我们就可以将道路图像投射到地面平面上。
0x03 车道线检测:参数化车道标线估算(Parametric Lane Marking Estimation)
为了给汽车导航,我们需要将检测到的标记像素与一个更有语义的曲线模型与之相匹。
0x04 贝塞尔曲线(Bezier Curve)
贝塞尔曲线(Bézier curve)是一种数学曲线,贝塞尔曲线常用于计算机图形学中,因为它们可以用于创建平滑的曲线和图形。贝塞尔曲线是通过控制点来描述曲线形状的,其中一个或多个控制点用于指定曲线的形状。
贝塞尔曲线可以通过控制点的位置来控制曲线的形状,并可以通过改变控制点的位置来改变曲线的形状。这使得贝塞尔曲线非常适用于创建复杂的曲线和图形。
- 一个由控制点定义的多项式曲线
0x05 线性贝塞尔曲线(Linear Bezier Curve)
线性贝塞尔曲线是一种特殊的贝塞尔曲线,它由两个控制点和一个起始点和一个终止点组成。线性贝塞尔曲线是最简单的贝塞尔曲线之一,它可以用来描述直线。线性贝塞尔曲线的方程:
其中, 是贝塞尔曲线上的点, 是参数, 和 是控制点。
- 类似线性插值法(linear interpolation)
0x06 二次贝塞尔曲线(Quadratic Bezier Curve)
由一个起始点、一个终止点和两个控制点组成。二次贝塞尔曲线是一种二次方程,可用来描述曲线和复杂的形状。二次贝塞尔曲线的方程:
其中, 是贝塞尔曲线上的点, 是参数, 是控制点。
- 两个线性内插点的内插
推荐阅读
-
实用的 Chrome 命令
-
时间格式器:Swift 开发中不可或缺的技巧,让日期处理更精彩!
-
如何更改ngx-daterangepicker-material 下拉日历的样式
-
string to instant_string to instant_string to instant- 在 Android 中使用 Java 日期格式的正确方法是什么?
-
ERA5全球气象小时、日和月数据:手动和 Python 批量下载
-
围棋子测试和子基准的使用
-
欧洲中心主义与世界历史的分期
-
最完整的全球城市 ZoneId 和 UTC 时间偏移对照表
-
在 lua 中使用 string.gsub 的详细说明
-
Python 时间序列分析