1 背景

        前面已经整体介绍了Planning共有三大子模块:Routing,Behavioural Planning以及Motion Planning,虽然三个子模块的称呼在不同的公司有可能不同,但不影响大家理解。其实网上也有很多专业的解读,甚至深入到代码去解释,这可能不是笔者的风格,笔者在梳理/学习知识的时候,更多的是从外到内、从整体架构到细枝末节。如果对一个事物的整体有了一定的认识,再慢慢去了解内部构造是更容易的事情。

        因此,针对Planning模块,笔者的写作顺序大概是Routing--->Behavioural Planning--->Motion Planning,同时可能结合实际量产,会对某个子模块内比较重要的小模块再拿出来解读。这次就主要解读Routing模块,依然以Apollo为介质,会结合部分代码(尽量少一些)。

2 Routing模块

2.1 Apollo Routing模块

        本质上来说,Routing模块就类似手机上的导航软件,输入起点和终点,就能给你规划出一条最短路径(常用的算法有BFS---广度优先,DFS---深度优先,A*),基本的输入输出如下图所示。

        有了高精地图信息,如何去生成参考线呢?主要包括以下两个步骤:

(1)读取base_map(HD map)去生成的routing_map(导航 map),作为topo_graph

        首先来解释map中的一些概念,比如一条道路(road),可以包含多个车道(lane),在Apollo中通过Node来表示车道,通过Edge来表示车道之间的关系,具体的proto信息可参考如下:

message Node {

optional string lane_id = 1; //车道id

optional double length = 2; //长度

repeated CurveRange left_out = 3; //左出口

repeated CurveRange right_out = 4; //右出口

optional double cost = 5; //代价

optional apollo.hdmap.Curve central_curve = 6; //中心线

optional bool is_virtual = 7 [default = true];

optional string road_id = 8; //道路id

}

message Edge {

enum DirectionType {

FORWARD = 0;

LEFT = 1;

RIGHT = 2;

}

optional string from_lane_id = 1; // 起始lane_id

optional string to_lane_id = 2; //结束lane_id

optional double cost = 3; //代价

optional DirectionType direction_type = 4; //方向(因为不需要后退,所以没有后向)

}

        有了Node之间的关系,那么就可以建立拓扑关系了,比如下面左侧的

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: