5. 活动3:自动驾驶汽车仿真-运动规划和避障
活动3:自动驾驶汽车仿真-运动规划和避障
在此活动中,学生将与一个AI驱动的自动驾驶汽车模拟器进行交互,了解一个AI是如何表示和原因它感知到的信息。
1 .自动驾驶汽车是人工智能机器人的一个例子。理想情况下,自动驾驶汽车能够感知周围的世界,在很少或没有人力投入的情况下安全导航道路。
2 .项目一或两个视频展示了巡航自主驾驶汽车在涉及应急车辆、自行车和行人的困难场景中的摄像机视图和AI表示:"在旧金山观看巡航自主驾驶汽车在应急车辆周围的操纵"和"在旧金山观看巡航自主驾驶汽车在自行车和滑行者周围的安全操纵"。询问学生对视频中的传感器、感知和导航有何观察。向学生指出,自动驾驶汽车仅靠传感器感知是不够的;它必须能够解释和代表这种感知,以及理性,来决定如何对它所感知的事物采取行动。告诉学生,在这个活动中,他们将学习更多关于人工智能的表示和推理。
3 .运行并投射Car Lab自动驾驶汽车模拟器,供学生观看。解释以下内容:
- CarLab是一个模拟器,允许用户训练自动驾驶汽车的神经网络,通过避开墙壁和其他车辆安全地导航轨道。在模拟器中,自动驾驶汽车- -所谓的网络车- -代表了一辆跑车。有几个较小的汽车同时行驶在轨道上,用户无法控制或编程。
- 要让人工智能利用其感知的信息做出决策,它需要收集数据、表示数据以及对下一步最佳行动的理由。自动驾驶汽车通过传感器收集各种数据,并通过几种控制决策各个方面的算法处理数据。在这个活动中,学生将考虑汽车运动规划算法所需的感知、表示和推理。运动规划算法是机器人技术中支持从一个点到另一个点的运动和导航的序贯决策的一种形式。在运动规划中,机器人为了安全导航或执行其他任务,需要对移动什么和去哪里做一系列的小决策。
4 .问学生:汽车的运动规划算法需要感知、表示和推理什么数据?哪种类型的传感器会采集这些数据?
- 可能的答案是:汽车的运动规划算法会接收摄像机、激光雷达以及其他传感器关于车道和其他汽车所在地的输入。然后,它将使用传感器融合来合并这些输入数据,这些数据被表示为显示车辆周围自由空间的占用网格。
5 .引导学生打开CarLab自动驾驶汽车模拟器。引导学生通过以下步骤创建自己的仿真器副本。
- 点击repl . it编程环境顶部的‘Fork’按钮创建副本.
- 点击repl . it编程环境顶部的‘Run’按钮运行程序.
- 右击‘Car View’窗口的标题栏,选择‘Layer’然后选择‘Top,’,如图2所示.

图2 .在CarLab模拟器中设置CarView窗口
- 右击‘GridWorld’窗口的标题栏,选择‘Maximize,’,如图3所示.

图3 .在CarLab模拟器中最大化GridWorld窗口
- 适当启动时,模拟器应与图4相似。如果学生在上面的任何步骤中在任何时候出错,他们可以重新加载链接并重新开始。
图4 . Car Lab模拟器视窗视图
6 .帮助学生在前面讨论中提供的答案和CarLab模拟之间建立联系。向学生解释模拟器中的自动驾驶汽车如何表示其感知的数据:
- 网络汽车的感知数据在此模拟器中表示为汽车视图占用网格。网格将汽车的位置显示为灰色单元格。其他单元格描绘了汽车对每条边上车道的感知,以及它自己的前方和后方车道。未被占用的细胞用白色表示;占据的细胞用红色表示;并且汽车视野之外的单元格用黑色表示。实例如图5所示。
图5 . CarLab模拟器中的Car View占用网格
- 引导学生单击“运行”按钮下方的轨道(在GridWorld窗口内),查看网络车行驶时占用网格的变化。然后,让学生点击" Step "按钮,查看当网车导航轨迹时,占用网格是如何逐步变化的。在每一步中,帮助学生描述占用网格所描述的内容,并识别墙壁或汽车是否在每个占用单元中。
7 .告诉学生下一步他们将对构成网络汽车运动规划算法的神经网络进行测试和训练。
- 网络车的运动规划算法使用机器学习来确定在各种情况下如何移动和避开障碍物。三个神经网络对提供的训练数据进行分析,以识别模式,并创建一个机器学习模型,它可以用来确定何时前进、何时转向、何时换道。如果学生需要更多关于机器学习如何工作的背景信息,支持资源可以在附录A:解包人工智能中找到。(附录A在此文章最后)
- 将学生引导到左侧文件面板中的NetworkCarTrainer.java文件。Network Car Trainer是本次活动中他们唯一要编辑的文件。CarLab用于支持网络车运动规划算法的三个神经网络在程序中显示为转向网络、前进网络和换道网络。在上一步中,学生可能已经注意到网约车只是在一个很小的圆圈内行驶。这是因为,虽然所有的网络都提供了一些启动数据,但只有前方网络- -它告诉汽车在安全行驶时- -已经提供了足够的训练数据,以成功地导航轨道。在这项活动中,学生向转弯网络和车道变化网络提供额外的训练数据,以便网车更成功地导航。
- CarLab中的神经网络使用由三维阵列组成的训练数据。学生在内部两个数组中编辑数据。每一对内阵列都是代表特定场景的单个训练样本。例如,在ForwardData中,第一个数组表示直接在车前的三个单元格。0表示单元格未被占用;a1表示细胞被占据。第二个数组表示网络的目标输出,汽车是否应该前进。A0表示汽车应该向前行驶;a1表示不应该。例如,在小型车位于前面三个单元格的场景中,网络车应该向前移动( { { 0,0,1 } , { 0 } } ),但在小型车位于后两个单元格中的任意一个单元格的两个场景中,网络车被告知不要向前移动( { { 1,0,0 } , { 1 } }和 { { 0,1,1 } , { 1 } } )。神经网络从这个训练集中学习到,网络车只有在它和前面的汽车之间有两个打开的单元格时才安全前进。
8 .训练转向网络:为训练转向网络,学生输入表示占用网格的TurnData以及汽车是否应该转向. ·在编辑两个内部数组时,TurnData中的第一个数组表示占用网格中的位置。每个训练样本的索引依次从车的左侧、车前、车的右侧,如图6所示。A1表示单元被占用;a0表示细胞未被占据。例如,图6所描绘的场景将用数组{ 1,1,1,0,0,1,0,0,0 }表示。表示网络目标输出的第二个数组,即网络车是否应该转向,用a0表示应该转向,用a1表示不应该转向。考虑到图6中的场景,汽车不应该转向;因此,第二个数组应该读{ 1 }。这个训练场景的全三维数组将为{ { 1,1,1,0,0,1,0,0,0 },{ 1 }。
图6 .在CarLab模拟器中编辑TurnData数组
- 如果学生在没有机器学习的情况下编程汽车,他们需要提供汽车可能遇到的所有512 (即29 )种可能的场景以及它应该做什么运动。借助机器学习,学生可以使用代表各种可能场景的约20至25段训练数据训练网约车,以了解何时转向。
- 将学生引导至NetworkCarTrainer.java文件,在该文件中他们可以查看TurnData数据集。目前,网络车在7 - 9行的三个数据点上接受训练。该代码包括另外17个可用于训练数据的数据点,但目前在第10 ~ 27行注释出来。
- 让学生通过删除每个注释行开头的两个反斜杠( / / )向转向网络添加训练数据。他们可以选择使用所提供的一些数据、所提供的所有数据,甚至添加他们自己的额外数据。每次学生更改训练数据时,他们将需要重新运行整个程序,以查看网络汽车驱动方式的变化。学生可以按照与活动开始时类似的流程进行操作:点击编程环境顶部的" Run "按钮,右键点击" Car View "窗口的标题栏,选择" Layer "后选择" Top ",右键点击" Grid World "窗口的标题栏,选择" Maximize "。然后,他们可以点击轨道下面的"运行"按钮( Grid World窗口内部 )来启动自我驾驶的汽车模拟。学生们应该做出改变,直到网络车只有在安全的时候才能转弯。网络汽车可能还会崩溃,因为它需要改变车道,但他们将在下一步解决这个问题。
- 当学生调整训练数据时,让他们观察变化,然后作为课堂讨论额外的训练数据如何改变汽车的驾驶方式。
9 .车道变换网络的训练:接下来对学生进行车道变换网络的训练。这个自动驾驶汽车模拟器是编程的,这样当网络车在任何小区行驶时,如果网络车被告知不要转弯,也不要往前行驶,则会检查是否需要向左或向右换车道。
- 在现实世界中,自动驾驶汽车不仅必须决定行驶方向,还必须决定如何避免障碍。让学生在他们的轨道上增加3 - 5个岩石障碍。要添加岩石,学生点击轨道并选择info.gridworld.actor。岩( )。网约车必须能够应对这些情况,而不会崩溃或驾驶循环。让学生测试他们的汽车,看看它如何成功地在轨道上加上障碍物。
- 网约车需要学会适当改变车道以成功避开车辆和其他障碍物。让学生检查轨道和占用网格。问:在占用网格中的单元格中,网络车需要感知和推理哪些单元格的数据,以便知道它是否应该改变左边的车道?向右?让学生用具体的场景来解释他们的反应,使用这些数据的墙壁和汽车的位置。
- 说明这个特定的换道网络通过评估三个单元格到那边的状态,感知它们是否被占用,并决定是否安全地移动到那边,从而决定网络车是否可以安全地换到左或右车道。例如,为了决定是否向左换道,网络小车会直接向左分析小区的状态,将小区移入( 对角线向左前方 ),并将小区移入前的小区,判断这些小区是否被占用。这些细胞由图6中的指标0、1、2表示。由于网络不区分墙壁、岩石或小汽车,训练数据中提出的场景必须考虑到任何静止或移动物体占用的空间。然后,车道更改网络在做出向右更改车道的决策时反映了这个过程。
- 让学生利用三维数组格式{ { x,x,x },{ x }为车道变换网络创建自己的训练车道ChangeData。第一个内阵列的索引表示网络正在分析的边上三个小区的占有率。A1表示单元被占用;a0表示细胞未被占据。表示网络目标输出的第二个内部数组,即网络小车是否应该换道,用0表示应该换道,用1表示不应该换道。有23种或8种可能的占用组合。已经提供了一个训练数据:{ { 0,0,0 },{ 0 } },其中规定,如果该边的所有单元格都未被占用,那么更改车道是安全的。学生应该进入不超过5个额外的训练场景,试图让网车成功决定何时换道。
- 每次学生更改训练数据时,他们将需要重新运行整个程序,以查看网约车驱动方式的变化。学生可以通过类似于他们在活动开始时使用的一个过程来做到这一点:单击编程环境顶部的" Run "按钮,右键单击" Car View "窗口的标题栏并选择" Layer "然后选择" Top ",右键单击" Grid World "窗口的标题栏并选择" Maximize "。然后,他们可以点击轨道下面的"运行"按钮( Grid World窗口内部 )来启动自我驾驶的汽车模拟。学生应该做出改变,直到网络车只有在能够安全地改变车道。让学生用障碍物等小型车测试自己的网络车,并迭代改进训练数据,使其尽可能顺利地行驶。
10 .让学生测试对方的运动规划算法,在课程中添加新的岩石障碍,并观察网络车如何能够在轨道上航行。让学生提供关于什么做了什么没做得好的同伴反馈,然后根据需要迭代他们的数据来改进模型。
11 .以类讨论结束此活动。
- 此模拟将安全驾驶定义为绕道行驶时不发生碰撞。汽车需要多少数据才能安全地导航轨道?数据太少的影响可能是什么?数据过多可能会带来什么影响?安全驾驶的其他标准是什么?运动规划算法需要说明哪些才能被认为是成功的?
- 如何利用机器学习进行运动规划来改善自动驾驶汽车的导航?
- 根据你在这项活动中的经验,在开发各种人工智能驱动的机器人时,可能会出现感知和运动规划方面的问题?
附录A:开箱 人工智能
本节提供了 AI 动手实践项目中引用的基本 AI 概念的基本解释。课堂系列指南,以及支持教学的资源。
什么是人工智能?
根据首次创造该术语的约翰麦卡锡的说法,“人工智能是科学和工程制造智能机器,尤其是智能计算机程序”(McCarthy,2007 年)。一种技术驱动通过人工智能能够使用传感器有意义地感知周围的世界,分析和组织它感知到的数据,并自主使用这些数据进行预测和决策。人工智能技术有时被归类为狭义人工智能和通用人工智能。狭义的人工智能对一项专门的任务做出决定,有时甚至基于特定的预编程动作数据集。打败人类的深蓝国际象棋程序1996 年的世界冠军、苹果的 Siri 和自动驾驶汽车都是狭义 AI 的例子。相比之下,通用人工智能可以假设学习并适应执行任何任务并解决人类可以解决的任何问题。通用人工智能不目前存在,但在小说中有很多例子,例如“WallE”和“Big Hero 6”中的Baymax。
了解更多
什么是人工智能,存在哪些类型的人工智能,以及如何识别周围世界中的人工智能。