导读:自动驾驶重卡本身系统模型复杂,高速场景对系统的实时,安全和稳定性有更高的要求。在有限感知,定位以及计算能力情况下,如何在动态变化的环境中,满足安全,舒适,节油等多种目标条件,规划和控制重型卡车的运动,是一个巨大的挑战,同时带来了很多有趣的问题值得研究和探索。今天分享题目是自动驾驶重卡在规划和控制上的技术难点与挑战。
分享的内容包括:
概述
挑战
尝试
一、 概述
相信浏览本文的读者都是自动驾驶领域的,或是对自动驾驶感兴趣的爱好者,对自动驾驶领域已经有了一定的了解,前面我们的同事也分享了很多自动驾驶基本的概念、软件架构、硬件架构,这里主要聚焦在 Planning 和 Control 方面。Planning 在学界不同的领域有着不同的视角,比如:
在机器人学领域,Planning问题可以定义为:在机器人的位形空间内寻找一个满足约束条件的,从起点到终点的一条最优路径;
在人工智能领域,Planning问题又可以定义为:给定系统的state action寻找最优的policy;
在自动驾驶领域,规划和控制问题,相当于一个人的脑和身体,在给定感知和定位的情况下,自动驾驶车辆需要知道如何地实现安全和舒适的自主运动。
传统规划框架:
典型的自动驾驶规划模块一般采用分层结构,主要层级分为 global 级和 local 级。
Global级和目前的导航软件一样,主要提供全局路由的规划,属于路级别的规划信息;
Local级的规划又可以分为Behavioral Layer和Motion Planning。
Behavioral Layer的等级比较高一点,主要提供一些描述性的策略,比如向左转还是向右转,亦或加速减速,它并不提供具体的像Motion级别车的state描述。
Motion Planning,提供的是车当前的状态序列,比如车在t刻要以速度v和加速度a到达s位置,最后,Planning生成的动作序列发给Control模块,Control再对Planning的序列进行跟踪。
行为规划方法:
接下来,简单介绍下,比较常用的 Behavioral Planning 和 Motion Planning 方法:
① Rule based method
现在最常用的 Behavioral Planning 方法是有限状态机 ( FSM,Finite State Machine ),就是有限状态机模型的 Rule based method,它为什么是最常用的呢?因为其简单、有效、明确,主要通过定义一些状态,以及定义一些状态之间的转移条件和状态之间相互约束的条件,最后,通过有限状态的模型来处理我们面对的未知的复杂的环境,可以使机器人在没有遇到过的环境中做出比较正确的决策。如上图,DARPA 挑战赛的时候,斯坦福团队的 Junior 就采用了有限状态机模型防止交通拥堵;另外在 Apollo 代码中,也通过有限的 scenario 以及 stage 之间的 transform 来实现在道路上不同的运动之间的决策。这种方法的好处是简单明确,缺点是很难通过定义有限的状态来处理一个很复杂的事情。因为实际道路上,可能会遇到很多很复杂的情况,很多都没有遇到过,只是采用有限的状态和有限的行为,很难把它处理的很好。
② POMDP
另一个比较常用的方法是 POMDP,是一个将 uncertainty 考虑到 decision making 过程中的框架。所谓 uncertainty,对于有规划经验的人,经常会抱怨,因为我们的上游是感知组,感知可不可以准点,不要有那么多噪音,感知的同学又说到,传感器能不能给准点,大家都有抱怨。但实际情况是,世界肯定是不确定的,所有感知的结果,包括感知的类型、位置,(如左图,可以看到左边的来车,它的位置在这个区域内是服从一定的概率分布的,并不是一个确定的结果,包括它未来的行为,有可能左转、右转或者直行,它的 intention 和轨迹都是不确定的。我们在规划时,怎样把这种不确定性考虑到规划中?
对于左图的场景,一个典型人类驾驶员的行为,会边开边看,边看边动,然后再根据当前情况再去行动。POMDP 也采用了同样的方法,POMDP 将每个状态表示成一个 belief,然后通过观察来 update belief,最终通过一些方法来求得一个在当前 belief 下的最优的 Policy。[3][4]是一些 Online/Offline POMDP 求解方法,POMDP 很好地解决了 uncertainty 问题,但是它主要的问题是计算量比较大,实际应用过程中需要很多的工程优化,才能取得比较好的成果。
③ Learning based methods
Learning based methods,前面我们的很多专家已经介绍过了,包括 Deep Learning、Deep Q-Learning、MCTS 这些方法,这里不在详细介绍。这里提一点,Deep Learning 的效果非常好,比前面两种方法效果都好,它的问题是 Data Collection 和 Pipeline 要求非常高。首先要有足够多的数据,然后整个 Pipeline 上要有足够完善的工具,包括仿真工具的完善程度,对系统的依赖程度比较高,并不是简单的写几行代码,制定一个规则就可以快速应用的。当然你可以得到一个很初步的版本,但是实际效果 Input,背后训练的代价还是很大的。所以需要有很多的车辆配合来获取数据,得到数据的过程和处理数据的过程比写一套代码的工作量还是要大很多的。
④ 传统的 Motion Planning methods
接下来,介绍一些传统的 Motion Planning methods,主要分为:search based、sample based、optimization based。
1. Search based:把规划问题转化成图搜索问题,首先将规划问题建立成图,如 Dijkstra、Lattices、A*都是将规划问题建立成图,然后采用一些 search method 在图中寻找一个从起点到终点的最优路径。Search based 的好处是可以得到一个全局层面的最优解,只要将规划问题建立成图,图上就存在着唯一的最优解,它的问题是只适用于比较低维数的规划问题,当规划问题 state 的维数比较高之后,search 起来就比较耗时,面临着指数爆炸的问题。对于我们正常的纵向规划,需要同时规划车辆的位置、速度、加速度以及时间,一般在 4~5 维以上就用不了这种 search method。
2. Sample based:面对高维的运动规划问题,我们一般采用 sample based 方法,就会在 state space 进行 sample,然后对这些 sample 的点进行 cost 等连接方法,比较常用的是 RRT、PRM 的一些方法,或者是 RRT 的改进方法,图(e)是 MIT 做的一个 RRT 方法。Sample based 的优点是可以同时处理比较高维数的运动规划,然后可以将 dynamic model 也放在规划过程中;缺点是只能得到一个概率层面上的最优,只要有足够多的求解时间,就会得到一个接近于概率 1 的最优解,显然实际过程中不可能给出足够多的时间,或者一会儿就要重新规划了。在有限时间内,得到的就不是一个最优解,导致规划之后的结果可能比较粗糙,还需要一些后优化的方法和后处理的方法。
3. Optimization based:对于自动驾驶车辆,optimization based 会将规划的结果通过曲线的形式来表示,比如 Polynomial、Bezier、Spline,通过多段的具有解析解的曲线形式来表示,从而将规划问题转化成求解曲线的参数问题,这样比较好处理加一些想要的约束,转化成优化问题,对于优化问题,我们有很多的求解方法,比如 NLP、QP 等。optimization based 方法的好处是可以有很多不同的 function,可以满足不同的目标,并且很直观求解速度也很快;它的问题是多个目标的权重如何加?求解的最优解一般都比较贴近约束的边界,如何来处理这些问题?而且并不能把所有的问题都很好地转化成一个优化问题,也不是所有的优化问题都有解,比如非线性优化求解起来比较麻烦,是不是凸的、非凸的,这都是一些问题。
二、挑战
刚刚介绍了常用的规划方法,接下来介绍下重卡(重型卡车)自动驾驶,给我带来哪些新的特性和挑战。
重卡自动驾驶是什么样的体验:
我们可以想象下,这种重型卡车的乘坐体验。面对这种重型卡车,第一反应就是车特别高,然后跟小车相比它的视角也不太一样,比如当前面有辆车,重卡在刹车的时候给你的感觉就像你要从前面车碾过去一样。当重卡带挂之后,如上图,这是我们在美国机场的测试,带了挂之后,整体看起来特别庞大、笨重。
无人重卡规划控制算法的目标:
安全:如何能做到比人类司机更安全?例如大于164000miles才出一次事故
效率:如何能做到与人类司机相当的驾驶效率?
节能:如何可以做到比人类司机平均水平更高的燃油经济性?
这些对无人重卡规划控制算法提出了很高的要求。
更加复杂的动力学模型:
另外,无人重卡的动力学模型会更加复杂,可以理解成这个人比较胖,跑起来比较费劲,没有那么灵活。我们一般对重卡建模会把它拆分成几个系统,动力系统、刹车系统、转向系统和轮胎模型来分别建模。这些系统的动态响应特性比乘用车的响应特性是差很多的,也就是它的动力学特性比较复杂,响应没有那么好,不是想让它停就停。
挂车带来的挑战:
当重卡带挂运行时,挂车本身会对卡车带来很大的影响,会导致很多的失稳状态。主要的影响因素有:
重卡与挂车铰链连接
大车重的惯性
负载的不同质量和物质特性差异
带载情况不同加速度阶跃响应曲线:
上图是挂不同的载重,对系统的动力学特性影响也比较多。比如同样的阶跃响应,不同的质量下,可以看到曲线的差异很大。直观说,同样踩刹车,载重大的可能就刹不住,当然在我们控制过程中,可能会引入更多的问题。
如何省油,这是从一个文献中截取的如何省油的可能措施。比如可以利用道路的坡度信息,上坡提前减档、提前加速,下坡可以让它溜一溜,提前感知道路前面车流的速度,提前减速,或者是信号灯提前委托等等。通过经济性驾驶,采用不同的自动驾驶策略,可以节能 15%,看起来这些技术还是比较可观的。不过,节油的一些策略,会带来一些安全性上的隐患,比如最常用的溜坡,能不能溜?这对我们的要求还是很高的。
三、尝试
最后给大家展示一下我们在自动驾驶上的一些尝试:
自主变道:因为前车的车速比较低,我们尝试自主变到左道上去,先是超车,然后再自主变回来。
汇入:我们在汇入主道时,左后方车辆提前进入,进来之后,从我们左侧超了过去,这时我们会主动进行避让。
考虑带挂规划:
这里展示的是在规划过程中如何考虑带挂的规划,小框是实际的车头,大框是挂车的车尾,假设路边有一个长条形障碍,需要我们去避让,如何把挂车模型加进来,考虑避让。这个做法跟 MPC 类似,我们把挂车的模型加到整个路径规划的模型中,然后做一个向前的 Prediction,然后选一个 best trajectory,说起来比较容易,实际上,因为挂车加了挂之后,它的模型就变得比较复杂,做 Prediction 时,整个的运算量就比较大,如何能选一个最好的 policy,还需要一些工程的手段。
这就是我们在上匝道时,可以看到挂车随着匝道有一定的摆动。挂车在匝道上开的时候跟小车开是不太一样的,需要考虑后边的长长的挂载,不能拐弯的时候撞到路肩上,这需要我们做一些带挂的规划。
今天的分享就到这里,谢谢大家。
作者介绍:
杨帆,智加科技技术专家
本文来自 DataFunTalk
原文链接:
评论