第一个乘坐我们自动驾驶出租车的乘客是一位名叫 Bev 的盲人妇女。当被问及驾驶感受时,Bev 说她感觉很安全,驾驶过程比一些视力正常的人驾驶的车辆更加平稳。在驾驶过程中,我们希望每位乘客都能感受到同样的安全和舒适。
作为一家小型初创公司,我们要与许多致力于自动驾驶技术的大型组织竞争,我们希望尽可能快地进行迭代。
我们团队的目标之一是尽量缩短从白板上探索灵感到将其付诸实践的时间。
为了实现这个目标,我们专注于把第一个出租车服务范围确定为在小型社区进行运营(图 1),并通过多次迭代来完善我们的设计。我们使用 Docker 容器来管理系统依赖项,并将机器人操作系统 (ROS) 作为感知、运动规划和控制的中间件。我们使用 MATLAB 和 Simulink 以及基于模型的设计,而不是手动编写纵向控制系统的模型预测控制 (MPC) 算法。
由三个工程师组成的团队仅在两个月内便完成了初始制动和加速控制系统。
图1. 一辆在佛罗里达州乡村社区的道路上执行自动驾驶的 Voyage 出租车。
限制自动驾驶汽车的复杂性
自动驾驶汽车会将多个复杂的系统整合在一起,来感知周围的环境、规划驶达目的地的路线,以及控制转向和速度(图 2)。设计和实现这些系统面临的其他挑战是环境中的物体和危险因素,包括十字路口、人行横道、环形路、建筑工地、行人、调头、单行道、动物和限速,更不用说其他车辆不可预测的驾驶模式。
图2. Voyage 自动驾驶出租车的系统概览。
为了简化控制设计的挑战,我们决定在战略合作伙伴的退休社区中部署我们的第一个自动驾驶出租车(图 3)。这些社区不仅有绘制精良的地图和明确的界定,还设置了限速,通常为 25 英里/小时(40 公里/小时)。
图3.乡村退休社区鸟瞰图。
通过自适应巡航控制系统快速启动开发的示例
首先,我们的团队研究如何以最快速度安全地实施纵向控制。我们决定从 MATLAB 自适应巡航控制 (ACC) 系统示例开始。这个例子包括一个 Simulink 模型,它使用 MPC 实现 ACC 系统,其中 ACC 系统能够保持设定速度或与前车的设定距离(图 4)。
图4. 自适应巡航控制系统的 Simulink 模型。
下载该模型并在 Simulink 中运行一些初步仿真后,我使用 Robotics System Toolbox™ 和 Simulink Coder™ 通过一个独立 ROS 节点生成 C++ 代码。我们自动驾驶出租车的所有软件都采用模块化设计,每个子系统(包括感知、路径规划和纵向控制等)都作为 ROS 节点运行。三天之内,我们便在车上成功运行 ACC 生成的代码。
重新创建我们的模型预测控制器
虽然 ACC Simulink 模型具有应用潜力,但不能完全满足我们的需求。例如,车辆在启动和停止时过于顿挫,我们发现乘客对这种模式特别敏感。(出租车里的乘客不一定会感觉到检测和感知算法多么好,但他们会立刻感觉到纵向控制的效果如何。)
我们回到绘图板上,重新开始设计了一种系统。毫不夸张地说,我们在白板上创建了一种运动学模型,根据基本原理绘制出租车的运动。我们在 Simulink 中实现了这个运动学模型,作为控制器设计的基础。然后,我们修改了 MPC 模型的参数,以满足我们的需求,并加入额外的逻辑来处理一些原始 MPC 模型处理不佳的罕见情况和场景,比如走走停停的驾驶。
在开发的早期阶段,我们使用 Robotics System Toolbox 将千兆字节的数据从 rosbag 日志文件导入 MATLAB 环境,并过滤与纵向控制器无关的所有 ROS 主题。一旦导入数据,我们就可以像访问其他任何 MATLAB 变量一样访问它,这使得分析和操作变得很容易。
我们在 Simulink 中仿真了控制模型,以确保其输出、油门踏板位置和刹车踏板位置设计合理,模型的行为与我们对目标输入集的预期一致。
进行车载测试
仿真让我们对控制设计有足够的信心,可以在车上进行试验,我们的团队是第一批乘客。我们通过 ROS 节点重新设计的控制模型生成 C++ 代码,并将节点部署到 Docker 容器内的车辆。Docker 使我们能够创建一个具有所有必要依赖项的生产环境的镜像,然后在整个开发和测试过程中始终如一地维护和复制该镜像。
在初始车载测试中,我们的控制器在加速和刹车方面明显过于激进。虽然我们在模拟过程中绘制的图表显示了速度的平滑变化,但实际驾乘体验绝不是平滑的。这种实现突显了使用基于模型的设计从概念快速过渡到路上测试的重要性。在实验室里,我们根本无法很好地判断设计的质量;我们必须像车上的乘客一样去体验。
我们完成了几个设计迭代、调优参数和约束,包括对加速和顿挫的限制,以及时间常数和 MPC 输出更新的速率。我们在Simulink模型中设置了ROS参数,以便我们的同事轻松地通过 ROS 直接校准参数。即使他们从未有过使用 Simulink 的经验,也可以快速更新参数值。
创建虚拟车辆以测试刹车场景
由于测试另一辆车突然转向进入我们车道的场景不安全,所以我们创建了一种新型 ROS 节点来模拟“鬼探头”——本质上是一种虚拟车辆,我们可以将它放置在离出租车不同距离的位置。我们在 Simulink 中创建了这个虚拟车辆并对其进行参数化,以便进行一些设置,诸如,让它从零速度开始,然后逐渐提速。我们使用 Simulink Coder 为 ROS 节点生成代码,然后使用该节点测试和调整控制器的制动性能。这个节点的开发只需要几个小时,通过此节点,我们可以在出租车前面生成虚拟障碍,看看它如何反应,然后调整其性能,直到它安全平稳地停下来。
在路上
我们使用基于模型的设计开发的纵向控制器已应用于 Voyage 所服务退休社区的自动驾驶出租车。我们看到需求在增加,使用量每周增长 10%。我们的工程团队正在从这些驾乘过程中收集的数据中学习,我们将通过整合所学内容继续完善控制器。