【论文阅读】Pylot: A Modular Platform for Exploring Latency-Accuracy Tradeoffs in Autonomous Vehicles
-
参考与前言 resource
代码:https://github.com/erdos-project/pylot
论文地址:https://www.ionelgog.org/data/papers/2021-icra-pylot.pdf
这篇是系统层面的,就是融合了已有的方法,搭建了一个开源的AV研究平台(python),基本涵盖了整个无人驾驶的所有模块,正好拿来练一下熟悉程度
1. Motivation
近况:一般大家都把整个自动驾驶进行拆分成几个模块,以便进行错误分析 (problem-specific evaluation metrics),而本文也正是由此出发给大家提供一种便于进行模块化测试的框架
整个自动驾驶大框架
问题提出
问题提出:端到端的自动驾驶行为不太好进行错误分析,比如基于驾驶数据的KITTI和Cityspaces的数据集,只是静态结果比如准确率但是没法考虑整个模型的运行时间
所以,如何平衡 模块的延迟 与 其在离线数据集上的准确性之间对于安全关键应用程序(例如 AV)至关重要,其中 correctness function 与 算法准确性 及 其端到端运行时间 有关
问题解决:Pylot就是这样一个模块化的平台 供大家去评估自己的自身的模块latency and accurarcy,同时也可以关注下游的整个表现。
Contribution 贡献
一句话总结就是:提出了一个 模块化 开源 的自动驾驶平台,供大家使用,同时CARLA HD map的排名证明了 我们的平台效果很不错
截图至原文
这篇可以看成是怎么去写一篇比较系统级的论文的参考用语
2. Method
整个系统需要满足三个关键要求:模块化(modularity)、可移植(portability)、便于调试(debuggability)
2.1 系统要求
模块化 modularity
细节上都是在讨论pylot这个的通信方式和ROS Cyber有什么不同:
- ROS获得传感器消息后需要一个固定频率的Publisher,在Pub和Sub的模型中交换具有不同运行时的组件需要微调下游运算符调用其计算的频率
- Dataflow system允许开发人员在跨请求的流中同步数据到达时就callback进行调用。Pylot dataflow system 通过要求在这些流上发布的操作员在特定时间戳 [37]-[40] 的传出数据完成后发送特殊水印消息,来无缝地跨多个流同步数据。 dataflow system 对此类运行时可变性具有鲁棒性,并支持高度模块化的应用程序。
可移植 portability
不同仿真器:只需要修改相关传感器数据的接口和车辆控制指令即可
仿真与实车:
-
必须支持高吞吐量的数据的接收 → highthroughput processing of the data
- pylot 的高吞吐量、低延迟 dataflow系统,比ROS更好
-
底层系统根据它们的资源需求透明地调度这些算子跨机器的并行执行,并通过共享内存队列为并置模块提供零拷贝通信
此外,这种透明的调度和通信不需要任何代码更改,再加上用于遗留 ROS 代码的 shim 层,允许 Pylot 无缝和零碎地移植到不同的硬件平台。
便于调试 debuggability
这一点的申明主要是因为集成了carla leaderboard的scenario runner,也就是在carla里进行场景测试的功能包
而基于pylot的dataflow system 允许用户重播放相关场景,更偏于调试。这点挺棒的,因为carla官方只给出一个json文件,不给出具体整个画面记录 除非自己写...,json文件又特别简略,例如:
-
展开查看
"meta": { "exceptions": [ [ "RouteScenario_16", 0, "Failed - Agent got blocked" ], [ "RouteScenario_17", 1, "Failed - Agent got blocked" ], [ "RouteScenario_18", 2, "Failed - Agent got blocked" ], [ "RouteScenario_20", 4, "Failed - Agent got blocked" ], [ "RouteScenario_21", 5, "Failed - Agent got blocked" ], [ "RouteScenario_22", 6, "Failed - Agent got blocked" ], [ "RouteScenario_23", 7, "Failed - Agent got blocked" ], [ "RouteScenario_24", 8, "Failed - Agent got blocked" ], [ "RouteScenario_25", 9, "Failed - Agent got blocked" ] ] },
同时这种确定性执行是通过对 watermark message 的接收执行计算来实现的 [38]、[39]、[45]。 这将整个 AV pipeline 的执行减少到 Kahn Process Network [46],从而保证了确定性。
另外,因为仿真世界里可以提供某些真实的数据,所以pylot也可以单独进行 单元测试检查等,体现便于调试这点
2.2 模块实现
以下主要是介绍其无人驾驶系统的各个模块有什么样的方法
目标检测 Object Dectection
使用相机、激光雷达数据进行检测、定位目标等、车道线、红绿灯等。输出的消息由 ObstacleMessage定义:bounding box 和 由ML方法返回的 confidence score
主要用的Tensorflow object detection [28]:
- Faster-RCNN
- SSD
- EfficientDet,这是一个family models
对应代码位置:https://github.com/erdos-project/pylot/tree/master/pylot/perception/detection
目标追踪 Object Tracking
跟踪:estimates the bouding boxes of object over time,主要方案两种:
- tracking by detection,也就是使用检测的jieg
- detection-free tracking,只跟踪设定好的数量的物体
集成的库:
-
SORT [49]
轻量化,使用tracking by detection方案,假设是跟踪的物体是恒定速度的线性模型,然后用卡尔曼滤波来估计物体位置,随之基于检测的更新,用hungraian算法进行匹配bounding box
但是呢 这种方法虽然速度快,精度较低特别是在object occlusions or camera motion的情况
-
DeepSORT [50]
改进了前者的缺点,但是因为用到了CNN 所以实时性更新上 可能跟不上
-
DaSiamRPN [51]
detection-free tracking方案,通过incorporating 跟踪物体的外在apperance信息来改进了相关缺点,但是在执行CNN特征提取模型的运行时间还是比较大
它利用 siamese feature extraction network 来学习干扰器感知特征。 跟踪器依靠神经网络推理来跟踪对象,以检测时提供更准确的估计。
但是,“最佳”选择取决于具体情况。 例如,当运行时间很重要时,SORT 在紧急情况下表现最佳,而 DeepSORT 在常规驾驶情况下表现最佳,而 DaSiamRPN 在对少量对象(例如城市驾驶)要求高精度的场景中表现出色。
预测 Prediction
预测模块主要依赖于跟踪模块的结果,然后使用LiDAR扫描到的信息来进行预测。细节点就是收到boundingbox 然后从ObstacleTrajectoryMessage得到物体的id,然后再输出包含有过去和未来的物体轨迹信息的ObstaclePredictionMessage
实现了的方法:
-
线性规划模型 假定大家是恒定速度线性模型
-
R2P2 [10]
a state-of-the-art single-agent trajectory forecasting model which learns a distribution over potential future trajectories that is parameterized by a one-step policy using a gated recurrent unit, and attempts to optimize for both quality and diversity of samples.
为了将 R2P2 扩展到多agent设置,Pylot 通过将场景上下文和其他agent的过去轨迹旋转到自我车辆坐标系,在每个agent上都运行 R2P2
-
Multipath [52]
使用轻量级神经网络来获得场景的有用表示,然后为每个agent应用较小的网络特征来输出预测。 由于每个agent的计算可以分批进行,因此 Multipath 速度快但准确度较低,因为它无法明确考虑agent交互。 相比之下,Multiple Futures Prediction (MFP) [53] 联合建模agent行为,导致运行时间增加但预测更准确。
规划 Planning
规划模块的目标是产生一个安全、舒适和可行的轨迹,以解释当前和未来可能的环境状态。 为了实现这一点,Pylot 中的规划模块同步所有其他模块的输出以构建一个 World 表示,其中包含场景中所有agent的过去和未来轨迹,以及静态对象(如交通灯)的位置和状态, 交通标志等。 至关重要的是,这允许 Pylot 有选择地利用任何先前组件或模块的地面实况信息,并确定一组选定组件的准确性和系统整体运行时间。
规划模块由三个组件组成:路线规划器、行为规划器和运动规划器 (route, behavioral, and motion planners),后者对 AV 的舒适度 和 系统整体运行时间 较为重要。 因此,Pylot 为三大类运动规划器中的每一个提供了实现:
-
Graph-based search planners [5]
Hybrid A*,把整个configuration space 离散化成 graph,这样在低离散分辨率的情况下 可以非常快速的得到结果;但也正因为如此 对于分辨率的选择就变得至关重要了
-
Incremental search planners
RRT* [4],通过对 configuration space 进行采样而不是预先计算一组固定的 configuration node 来逐步构建路径。 它们不受初始 graph 构造的限制,因此能够在任何给定的计算时间内微调结果的准确性。
-
Trajectory generation planners
Frenet Optimal Trajectory [6], [57],构建一组候选路径,计算它们 碰撞、物理约束及相关cost。 虽然生成的路径通常比对应的路径更平滑,但如果在低离散分辨率,轨迹生成可能会生成不出可行的方案
控制 Control
当接收到planning模块的路径点和目标速度后,由控制模块来跟随这些路径点和保持目标速度,pylot实现了以下两个控制器
- PID
- MPC
当然开发者也可以在 motion planning and control 使用MPC来实现两者,同时也可以替换掉这些 使用端到端的方法去验证算法。