在2.5的文章中我们已经写出了一版路径规划的完整代码,执行仿真后,会发现出现了很多问题:二次规划崩溃、车辆控制不稳定方向盘急剧抖动、决策不稳定朝令夕改,现在来讨论一下这几个问题该如何解决。
二次规划崩溃
直接原因:规划起点是车辆动力学外推或者通过上周期的的轨迹插值得到的,所以规划起点不一定在凸空间内。
再思考深入一点:只有在有障碍物的时候,可能出现程序崩溃的情况,车辆贴着凸空间的边界走,很容易出现规划起点在凸空间之外的情况。那为什么有障碍物的时候,车辆会贴着凸空间的边界走呢?这是由二次规划的性质决定的,二次规划的解不是在边界上就是在极小值点处,如果我们的凸空间中心代价的权重项很小,且考虑如下场景:
在不考虑障碍物时,满足二次规划的目标函数值最小的轨迹应该是完全贴合参考线的轨迹,如果考虑凸空间中心代价,且凸空间中心代价的权重项远小于边界参考线代价的权重项,那么轨迹离参考线越远,目标函数的值越大,在无障碍物的路段,贴着参考线走是最优解;在有障碍物的路段,在不超出边界的情况下尽量靠近参考线是最优解,所以我们的规划起点很容易超出凸空间的限制,从而导致二次规划求解的崩溃。 如何解决呢?
解决方案1
将障碍物的影响空间考虑的更大一点(偏于安全考虑),所以我们的凸空间会相应的变小,同时不考虑规划起点的边界约束,这样二次规划不会崩溃,规划起点与障碍物发生碰撞的概率也很小。
解决方案2
合理考虑凸空间中心代价。凸空间的中心线选取有两种选择:
方案一是使用凸空间的上下边界值的平均值:
方案二是使用动态规划路径作为凸空间的中心线:
若选用方案一,缺点:我们规划出来的路径会很接近中心线的形状,而凸空间的中心线是非常不平滑的,优点:线型稳定,不会变来变去。
若使用方案二,缺点:线型经常变化,不稳定,因为动态规划的路径的几何是不稳定的,优点:规划出来的线型较为平滑。
控制不稳定
根源是:由于轨迹贴着边界走,反复横跳,可以通过约束导数进行修正:
增加约束后,求解会变慢,因为约束越多,初值的寻找就越难,为了加快速度,我们需要降低二次规划的规模,本来是规划60个点,我们现在只规划20个点,然后再插值增密。
解决控制不稳定和二次规划崩溃的方案总结
1.减少二次规划点数量,降低计算规模,然后对轨迹进行插值增密;
2.增加的约束;
3.增加凸空间中心线的约束(方案1),合理分配代价项的权重;
所谓合理分配代价项的权重指的是,在有障碍物的路段将中心代价权重设置的大一些,而在没有静态障碍物的路段将中心代价权重设置的小一些,这样可以减缓规划轨迹的不平滑现象。
4.规划起点不做边界约束;
5.适当放大障碍物的影响空间。
决策不稳定
动态规划天生不稳定,上一帧决策往右边走,下一帧决策往左边走,朝令夕改,这样非常不好。
解决方案:对障碍物打标签,标记该障碍物是左绕还是右绕还是忽略。
速度规划如何影响路径规划
由于我们当前的路径规划只考虑了静态障碍物,没有考虑动态障碍物,设想这种场景,路上没有静态障碍物,上一帧规划出了一条直线,速度为7m/s的匀速,但是此刻有一个动态障碍物迎面而来,依据直线的轨迹,我们无论对速度进行怎样的规划都无法躲避动态障碍物(除非后退),速度规划此时是无解的。
正确的规划方法是:预测模块对动态障碍物的路径进行预测得到动态障碍物的路径,规划决策模块利用上一帧规划好的轨迹和速度计算车辆和动态障碍物的碰撞点,在碰撞点处考虑一个虚拟障碍物,然后基于该虚拟障碍物进行本帧(周期)的路径规划。
比如:阿波罗的EMPlanner中的SL路径规划、ST速度规划是相互影响的:
graph TD
上一帧SL/ST规划 --> 本帧SL规划 --> 本帧ST规划 --> 下一帧SL规划 --> 下一帧ST规划
图中的箭头代表影响。
航向角180°处车辆的突然抖动
有BUG,目前尚未理解该BUG的产生机制。