Apollo中Lattice规划器结构梳理
目录
参考源
刚接触Apollo,代码看的实在头疼,自己之前一直用C,一开始感觉烦的一批(自己水平太菜)…直到现在逐渐体会到其奥妙之处,果然体会到了逼近大佬的快乐~关于planning代码部分,参考了几个前辈的,如下
阿波罗3.5的Cyber planning任务调度:https://blog.csdn.net/davidhopper/article/details/89360385
个人感觉最清晰的Planning解释:https://www.cnblogs.com/liuzubing/p/11058612.html
以及很容易就能搜到的其他资源:https://zhuanlan.zhihu.com/p/61982682https://zhuanlan.zhihu.com/p/103317794?utm_source=wechat_session
关于ST、SL图的构建、五次多项式以及OSQP求解原理,后续搞清楚后再更新…
Planning的Proc执行结构
Apollo启动完成初始化后,执行其主要部分proc:通过调用planning_base_->RunOnce()函数来开启决策规划之旅,目前含有两个大的规划器:navi_planning和on_lane_planning,至于选取那个,在程序初始化的时候被配置了,详情可以参考参考源中的介绍~目前学习lattice,位于on_lane_planning中
Planning搞起:RunOnce 结构
在这里,主要做了下图中的事:
RunOnce中使用的planner
在RunOnce执行中,调用了planner_->Plan,whose内部包含了:lattice、navi、public_road、rtk_replay四种规划器,找到了我们的lattice
默默展开lattice
主要七个步骤:
1.将参考线转变为离散地图点
2.计算参考线上初始规划点的匹配点
3.根据匹配点计算Frenet帧的初始状态
4.解析决策,得到规划目标
5.分别生成纵向和横向一维轨迹束
6.评价:首先,根据动态约束条件对一维轨迹的可行性进行评价;其次,评估可行的纵向和横向轨迹对,并根据成本进行排序。
7.返回无碰撞的、符合条件的轨迹
如下图所示:
ST、SL图
在采用Frenet坐标系后,ST和SL图极为便捷,位于第4部分实现
横纵向轨迹束的生成
位于第5部分,分为纵向轨迹、横向轨迹两个实现
纵向轨迹的生成
主要使用了四次和五次多项式,五次多项式可保证一阶导v、二阶导a、三阶导jerk等连续性(这块理解有误么…)
横向轨迹的生成
横向轨迹生成用了五次多项式和二次规划两套方法,就像图中的一样…二次规划求解我没看懂,等闲下来搞定它,只知道大致原理不能算懂~额额
轨迹的评价
对于lattice第6部分,看到很多介绍的材料里都有解释,集火在cost函数上,cost函数形式在很多论文里可以直接看到了
轨迹的挑选
在对轨迹进行筛选时,一开始没有看到对轨迹的剔除,后来才看到while循环时,不满足直接continue了…直接保证凡是执行到reference_line_info->SetTrajectory时,就意味着是成功符合的轨迹了,是在下村儿了
下一阶段
1.对ST、SL详细过程进行学习
2.OSQP实际应用求解学习
come on