查看原文
其他

Apollo问答丨请问在Planning层的曲率约束方程怎么实现的?

阿波君 Apollo开发者社区 2022-07-29


我们每一天都会在开发者技术交流群和小程序问答版块收到许多开发者的技术提问。

每周,可爱的Apollo小哥哥都会精选出被采纳的社区问答进行整理汇总。

让我们一起看看本周的精选问答吧~~若你有更好的回答或建议,欢迎留言或加入开发者交流社群一起讨论分享!各位技术大牛也可以直接在开发者交流群或者小程序回答问题获得相应积分,参加社区布道师评选。
  
  ENJOY THE FOLLOWING  



Q:

我想问的是在Planning层的曲率约束方程怎么实现的,就是不是Controller层。

——@Bye Kobe

A:

Apollo中分为多Scenario,每个Scenario包含多个Stage,每个Stage包含多个Task,每个Task包含Decider和Optimizer,Decider和Optimizer里又分为Path和Speed两部分。而题主所说的问题,应该在Piecewise Jerk Path Optimizer这个Task中。

代码实现主要在:

\modules\planning\tasks\optimizers\piecewise_jerk_path目录下,

\modules\planning\tasks\optimizers\piecewise_jerk_path\piecewise_jerk_path_optimizer.cc文件中310行左右bool success = piecewise_jerk_problem.Optimize(max_iter)语句,

为逻辑调用接口,跳进去发现实现在

\modules\planning\math\piecewise_jerk\piecewise_jerk_problem.cc文件中,这是个基类,会衍生速度与路径的二次规划相关逻辑,也就是说,速度路径优化一定程度上,是相通的代码逻辑。

基类实现了约束,派生类分别实现了代价构造函数。根据题主意思,我们回到Optimize(const int max_iter) 函数主体,发现出现了OSQP字样。这里调用FormulateProblem构造出二次规划,最后调用OSQP库进行求解,从而求出最优Path。进入FormulateProblem 这个函数用于构造最优化问题具体矩阵。FormulateProblem()调用CalculateKernel(&P_data, &P_indices, &P_indptr)构造P矩阵(代价函数),调用CalculateAffineConstraint(&A_data, &A_indices, &A_indptr, &lower_bounds,&upper_bounds)构造A矩阵(约束矩阵),这是两个优化相关度的核心,构造完后将矩阵都存储进OSQPData这个结构体里,后续直接调用OSQP库进行求解。OSQPData这个结构在这里:\modules\planning\math\piecewise_jerk\piecewise_jerk_problem.cc文件341行左右,感兴趣可以去看看。关于这两个函数细节公式,直接跳进去看就行了,网上也有大把解释,微信群里也不方便写公式,自己看就行了。处理后的结果,丢给下游控制模块,也有OSQP相关内容,MPC相关联的。希望能给你提供思路,谢谢——@礼拜天


Q:

老师们,我用的是Velodyne激光雷达和Ros系统,我想实现订阅Velodyne_points话题,因为阿波罗以前用的就是Ros系统,那么阿波罗的源码我可以用得上么?

——@咖啡

A:

A1:应该可以,不过Ros本身就有Velodyne的驱动了。

——@王方浩


A2:感觉不如自己用Ros写。

——@咚咚


A3:Ros本来就有呀,一划拉一堆呢。

——@礼拜天



Q:

有大佬可以帮忙解释一下这两个函数具体是表达什么意思吗?


——@张世义

A:

以lane_follow场景为例,配置在\planning\conf\scenario\lane_follow_config.pb.txt,文件中Task中,有相关速度优化的定义,主要为“SPEED_HEURISTIC_OPTIMIZER”字段,大约在16行附近,这个Task作用大致就是利用动态规划和回溯的方法。

在ST图中搜索出一系列可行的速度点集。回到题主问题,Cost2为一分割路段(整条路径分割的基本单位)内采样点间关系,也就是规划点与目标点的代价计算方式。Cost3就是前面提到的“回溯”,当前路段的代价总会依赖前一时刻最小代价,定义为最优,这样一直追溯到整条路径开始,采用链表遍历方法。最后交给其他Task进行进一步优化平滑。

————@礼拜天



Q:

如果只是自己学习学习代码,做做仿真不做部署的话,也是需要容器安装吗,还是源码编译安装?

——@新宇

A:

容器是必须的。

——@王方浩


Q:

明白啦,看来还是必须得学习容器这一关。

——@新宇

A:

容器只要会用就可以了,不需要专门学习。

——@王方浩



Q:

用虚拟机好多模块功能打不开是啥原因?和lgsvl联合仿真的时候,打开后自动又关掉了?

——@Sam

A:

是不是和lgsvl之间消息没连接上,看下是不是收到lgsvl消息了。

——@窦子优

Q:

已经桥接上了,手动控制车辆在DreamView里是可以看到车辆运动的,但是Routing模块什么的都打不开,在考虑是不是因为用的是虚拟机的原因?

——@Sam

A:

有可能的,没有显卡,感知模块跑不了。

——@王方浩


Q:

虚拟机安装不了显卡驱动,不是安不了,安装了好像也启动不了加速,显卡运算?

——@Sam

A:

别用虚拟机,虚拟机不能用显卡,一些需要GPU加速的地方就不好办。

——@新宇



自社区推出问答积分赛活动以来,Apollo小哥哥每天在社区交流群和小程序收集提问,并收到了很多热心的解答,大家互帮互助的精神非常赞!


为了奖励为社区作出贡献的开发者,Apollo小哥哥每周将选出积分榜前三名,送出Apollo定制周边一份~

本周积分榜新鲜出炉,快看看自己有没有上榜吧,前三名记得找小哥哥领奖哦~


 问答积分榜 

微信昵称

提问积分

回答积分

总积分

礼拜天


_

70

70

王方浩


_

60

60

太阳好大啊!

10

40

50

李可

10

40

50

牛肉咖喱饭

5

40

45

后天

5

40

45

钦星

10

10

20

向尚007

20


_

20

一大群蜗牛


_

20

20

朗拓科技


_

20

20

Sam

5

10

15

pumbaa

15


_

15

新宇

5

10

15

见龙在田

5

15

15

bye kobe

10


_

10

che.

10


_

10

天洋行空


_

10

10

gluon

10


_

10

pxl


_

10

10

窦子优


_

10

10

齐翔


_

10

10

冯升

10


_

10

鲁班八号

10


_

10

11...

10


_

10

远方

10


_

10

清风、腾云

10


_

10

邱一丁


_

10

10

Rolin

5


_

5

向北

5


_

5

少年

5


_

5

江间鱼

5


_

5

Andy

5


_

5

小佚名

5


_

5

径卫视觉-李工

5


_

5

魔笛

5


_

5

冰咖啡

5


_

5

焦学健

5


_

5

oxygen

5


_

5

咖啡

5


_

5

jon

5


_

5

梁锋辽宁交通运输

5


_

5

俟雨亭

5


_

5

王冰

5


_

5

jemmy-孙

5


_

5

librarian

5


_

5

Colin_Existentialism

5


_

5

刘军政

5


_

5

无压空间

5


_

5

万象天引

5


_

5

寻天涯

5


_

5

feizaiQ

5


_

5

KL

5


_

5

任杰

5


_

5

小治

5


_

5

阿贵

5


_

5

在鹿上

5


_

5

汪全伍

5


_

5

arclly

5


_

5

王悦宏

5


_

5

刘铠睿

5


_

5

风林火山

5


_

5

李果果

5


_

5

言五

5


_

5

陈婧

5


_

5

过风

5


_

5

唐超

5


_

5

张世义

5


_

5



各位技术大牛也可以直接在开发者技术交流群或者小程序问答版块回答问题获得相应积分,参加社区布道师评选,为开发者答疑解惑,更有机会获得小灶辅导~


报名可戳:社区布道师参与评选。

©️著作权归作者所有,如需转载,请注明出处,否则将追究法律责任。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存