哈Ha! 我在柏林的一家小型初创公司工作,该公司开发汽车自动驾驶仪。 我们正在为一家德国大型汽车制造商的加油站完成一个项目,我想谈一谈:我们如何做到的,遇到的困难和发现的新事物。 在这一部分中,我将讨论感知模块以及整个解决方案的体系结构。 关于其余模块,也许我们将在以下部分中讲述。 我很高兴收到外界的反馈和对我们方法的看法。
客户的项目新闻稿可以在
这里找到。
首先,我将告诉您该汽车制造商为何向我们求助,却没有自己做这个项目。 对于德国人来说,改变流程非常困难,而且汽车开发格式很少适合于软件-迭代时间长且需要良好的计划。 在我看来,德国汽车制造商很了解这一点,因此,您可以遇到由他们创建的,但作为独立公司工作的初创公司(例如,奥迪的AID和沃尔沃的Zenuity)。 其他汽车制造商正在组织诸如“启动高速公路”之类的活动,他们正在寻找潜在的承包商来完成任务和提出新的想法。 他们可以订购产品或原型,并在短时间内获得最终结果。 事实证明,这可能比尝试自己做同样的事情要快,而且就成本而言,它的花费不超过其自身的开发成本。 开始对客户进行自动驾驶汽车测试所需的权限数量很好地证明了流程更改的复杂性:同意对人员进行视频记录(即使我们不保存数据,并且我们仅以匿名形式使用流式视频而不标识特定人员),同意进行视频记录地区,工会的同意以及测试这些技术的工作领事,安全服务的同意,IT服务的同意-这还不是全部。
挑战赛
在当前项目中,客户希望了解是否可以使用“ AI”在服务中心驾驶汽车。 用户脚本为:
- 技术人员希望开始使用位于测试区域之外停车场内某处的机器。
- 他在平板电脑上选择汽车,选择服务框,然后单击“驶入”。
- 轿厢向内行驶并停在终点(电梯,坡道或其他物体)。
- 当技术人员完成对汽车的工作时,他按了数位板上的按钮,汽车驶出并停在了外面的一些空白处。
特点:并非所有的汽车都有摄像头。 在它们所在的计算机上,我们无权访问它们。 我们可以访问的机器上唯一的数据是声纳和里程表
声纳和里程表声纳是安装在汽车上的圆圈中的距离传感器,通常看起来像圆点,它们使您可以估计到物体的距离,但只能接近并且精度较低。 里程表-有关汽车实际速度和方向的数据。 了解了这些数据和初始位置后,您就可以非常准确地确定机器的当前位置。
因此,必须通过安装在维修区域内的外部传感器来控制汽车。
解决方案
最终产品的体系结构如下:
- 在服务区域中,我们安装了外部摄像机,激光雷达和其他物品(您好,特斯拉)。
- 来自摄像机的数据发送到Jetson TX2(每个三台摄像机),Jetson TX2负责查找机器并预处理摄像机中的图像。
- 此外,摄像机数据会到达中央服务器,该服务器被自豪地称为“控制塔”,并在其上落入感知,跟踪和路径规划模块。 分析的结果是,决定了轿厢的进一步运动方向并将其发送到轿厢。
- 在项目的此阶段,另一辆Jetson TX2放入了汽车,该卡车使用我们的驾驶员连接到Vector,Vector解密汽车数据并发送命令。 TX2从中央服务器接收控制命令,并将其广播到汽车。
对于基础结构级别,使用
ROS 。
这是技术人员选择汽车并单击“驶入”后发生的情况:
- 系统正在寻找汽车:我们向汽车发送命令以使警报闪烁,然后我们可以确定技术人员选择了停车场中的哪些汽车。 在开发的初始阶段,我们还考虑了通过车号牌确定机器的选项,但是在停放的汽车的某些区域中,该号码可能不可见。 另外,如果我们通过注册号确定汽车,那么照片的分辨率将必须大大提高,这会对性能产生负面影响,并且我们使用相同的图像进行搜索和驾驶。 该阶段仅发生一次,并且仅在由于某种原因我们丢失了汽车以进行跟踪时才重复进行。
- 一旦找到汽车,我们就将汽车撞到的摄像机中的图片拖放到感知模块中,该模块会分割空间并提供所有对象的坐标,它们的方向和大小。 此过程正在进行中,以每秒30帧的速度运行。 随后的过程也是恒定的,并且一直运行到机器到达终点为止。
- 跟踪模块从感知,声纳和里程表接收输入,将所有找到的对象存储在内存中,将它们组合起来,优化位置,预测对象的位置和速度。
- 接下来,路径规划器分为两部分:全局路径的全局路径规划器和局部路径的局部路径规划器(负责避开障碍物),构建路径并确定前往我们的汽车的位置,并发送命令。
- Jetson乘汽车接受命令并将其广播到汽车。
出发与到达的方式相同。
知觉
我认为,最有趣的主要模块之一是感知。 该模块以一种可以准确确定运动方向的方式描述来自传感器的数据。 在我们的项目中,它给出了相机上所有物体的坐标,方向和尺寸。 在设计此模块时,我们决定从允许我们一次分析图像的算法开始。 我们尝试过:
- 解开VAE 。 对β-VAE进行的小修改使我们可以训练网络,以便潜在矢量以示意性的自顶向下视图存储图像信息。
- 条件GAN(最著名的实现是pix2pix )。 该网络可用于构建地图。 我们还使用它从上方构建示意图,将来自一个或所有摄像机的数据同时放入其中,并在输出端等待上方的示意图。
从左到右,一台相机的条件GAN迭代之一:输入图像,网络预测,预期结果
实际上,这些方法的想法是确保最终网络可以通过一次查看输入的照片来了解掉落在相机上的所有汽车和其他移动物体的位置和方向。 在这种情况下,有关对象的数据将存储在潜在向量中。 对网络的训练是根据来自模拟器的数据进行的,该数据是进行演示的时间点的精确副本。 我们设法取得了某些结果,但是出于以下几个原因,我们决定不使用这些方法:
- 在指定的时间内,我们无法学习如何使用来自潜在向量的数据来描述图像。 网络的结果始终是一张图片-带有对象示意图的俯视图。 这不太准确,我们担心这样的准确性不足以驾驶汽车。
- 该解决方案是不可扩展的:对于所有后续安装以及需要更改某些摄像机方向的情况,都需要重新配置模拟器并反复进行全面培训。
但是,我们有兴趣了解这些方法的可能性,并且在将来的任务中将牢记这些。
之后,另一方面,我们通过常规搜索对象+网络来确定找到的对象的空间位置(例如
this或
that ),从而完成了
该任务 。 在我们看来,此选项是最准确的。 唯一的缺点是,它比以前提出的方法要慢,但由于服务区域内的汽车速度不超过5 km / h,因此它适合我们可能的延迟框架。 在我们看来,预测对象的3D位置领域中最有趣的工作就是这项工作,它在
KITTI上显示了相当不错的效果。 我们构建了一个类似的网络,但进行了一些更改,并编写了自己的算法来确定周围的盒子,更准确地说,是一种用于估计物体在地面上的投影中心的坐标的算法-做出关于移动方向的决策,我们不需要关于物体高度的数据。 对象的图像及其类型(汽车,行人等)被馈送到网络输入,并输出其尺寸和空间方向。 接下来,模块评估投影中心并提供所有对象的数据:中心的坐标,方向和尺寸(宽度和长度)。
在最终产品中,每张图片首先通过网络运行以搜索对象,然后将所有对象发送到3D网络以预测方向和尺寸,然后我们估计每个对象的投影中心并将其以及方向和尺寸数据进一步发送。 该方法的一个特点是,它与对象搜索网络的边界框边界的准确性紧密相关。 因此,像YOLO这样的网络并不适合我们。 我们在RetinaNet网络上找到了性能和边界框精度的最佳平衡。
值得一提的是,我们在这个项目上很幸运:土地平坦。 嗯,这并不像一个知名社区那样平坦,但是在我们的领土上没有任何弯路。 这允许使用固定的单筒摄像机将物体投射到地球平面的坐标中,而无需有关到物体距离的信息。 未来的计划包括引入单眼深度预测。 关于这个主题有很多作品,例如,我们正在为将来的项目尝试的最后一件非常有趣的作品之一。 深度预测不仅可以让您在平坦的地面上工作,还可以潜在地提高确定障碍物的准确性,简化配置新摄像机的过程并消除标记每个物体的需要-如果它是某种障碍,我们不在乎它是哪种物体。
就这样,谢谢您的阅读,我很乐意回答问题。 另外,我想谈谈一个意想不到的负面影响:自动驾驶仪并不关心汽车的方向,对他而言,无论走还是走都无关紧要。 最主要的是要以最佳状态行驶,而不会撞到任何人。 因此,汽车很有可能会部分倒退行驶,特别是在需要高机动性的小区域。 但是,人们已经习惯了汽车通常在向前行驶,并且经常期望自动驾驶仪具有相同的行为。 如果业务人员看到的汽车不是前排而是后排,那么他可能会认为该产品尚未准备就绪且包含错误。
附
言:很抱歉,没有经过实际测试的图像和视频,但是由于法律原因我无法发布它们。