前言
本文主要关注相对地图模块的代码分析,有关相对地图的介绍和相关程序的使用方法可参考另一篇文章。
Apollo详解之高精地图模块——相对地图模块
navigator
navigator
的作用是按一定规则解析路径文件里的内容,并将解析后得到的NavigationInfo
发布至/apollo/navigation
话题。可在modules/map/relative_map/proto/navigation.proto
文件中查看发布消息NavigationInfo
的定义
message NavigationPath {
optional apollo.common.Path path = 1;
// highest = 0 which can directly reach destination; change lane indicator
optional uint32 path_priority = 2; // 根据navigator中命令行参数的顺序分配优先级,第一个是0,然后递增
}
message NavigationInfo {
optional apollo.common.Header header = 1;
repeated NavigationPath navigation_path = 2; ///< 导航路径,其个数由navigator中命令行参数的解析文件的个数决定
}
可以看出navigator
发布的消息即为对应路径文件的导航路径。
Navigator
理论上只需要发布一次即可,但是为了保证消息被正确接收,Navigator通常会发布多次。
由于navigator
可以解析多个路径文件,因此NavigationInfo
会有相应个数的navigation_path
,并且其path_priority
有命令行参数顺序指定。
relative_map_component
RelativeMapComponent::Init
relative_map_component
是相对地图模块的主程序,在初始化函数RelativeMapComponent::Init
当中,可以发现,其订阅了以下话题:
- /apollo/navigation
获取navigator
发布的导航路径 - /apollo/canbus/chassis
获取车辆的底盘信息 - /apollo/localization/pose
获取车辆的定位信息 - /apollo/perception/obstacles
获取行驶环境的车道线信息
此外,该模块还有一个发布者,其向/apollo/relative_map
话题发布MapMsg
消息
// The map message in transmission format.
message MapMsg {
optional apollo.common.Header header = 1;
// Coordination: FLU
// x: Forward
// y: Left
// z: Up
optional apollo.hdmap.Map hdmap = 2;
// key: type string; the lane id in Map
// value: Navigation path; the reference line of the lane
map<string, NavigationPath> navigation_path = 3;
// lane marker info from perception
optional apollo.perception.LaneMarkers lane_marker = 4;
// localization
optional apollo.localization.LocalizationEstimate localization = 5;
}
容易看出,这就是该模块计算得到的相对地图。
RelativeMapComponent::Proc
该函数会以一定的频率得到调用,其调用了RelativeMap::Process
函数,计算得到了相对地图,并将其进行发布
RelativeMap
根据官方文档中的描述,我们可以通过navigator
提供的导航路径或者感知模块获得的车道线信息得到相对地图,也可以两种方式一起使用,在配置文件modules/map/relative_map/conf/relative_map_config.pb.txt
当中,可以看到
lane_source: OFFLINE_GENERATED
存在两种模式OFFLINE_GENERATED
和PERCEPTION
,前者会使用navigator
提供的导航路径,并结合感知得到的车道线共同计算相对地图,后者则只会使用感知得到的车道线计算相对地图。
感知模块作用:
- 填充相对地图中的车道线信息
- 当不使用navigator提供的导航路径时,制作相对地图
- 当使用navigator提供的导航路径时,对导航路径产的车道线进行修正
- 填充车道线的类型
- 获取车道线宽度信息
若不使用感知模块或感知模块无法感知车道线,则无法实现以上的功能,但不影响OFFLINE_GENERATED
模式的正常工作。
CreateMapFromNavigationLane
在RelativeMap::CreateMapFromNavigationLane
函数会不断得到调用,计算出相对地图,首先会通过NavigationLane::GeneratePath
生成导航路径。
NavigationLane::GeneratePath
该函数会计算得到制作相对地图的导航路径。
若使用的是OFFLINE_GENERATED
,则该函数会
- 对
navigator
提供的导航路径进行坐标转换,得到FLU坐标系下的导航路径 - 对导航路径按照y轴坐标从小到大的顺序进行排序
- 得到车辆所在的导航路径
current_navi_path_tuple_
- 设置车道线宽度
- 根据感知模块提供的车道线对路径进行修正
- 设置各个导航路径之间的宽度
若使用PERCEPTION
模式,则会根据感知得到的车道线计算出一条导航路径,并设置为车辆所在的导航路径current_navi_path_tuple_
总之,该函数最终会得到车辆所在的导航路径current_navi_path_tuple_
NavigationLane::CreateMap
该函数会根据车辆所在的导航路径current_navi_path_tuple_
,通过调用CreateSingleLaneMap
函数得到高精地图中,为每个导航路径生成对应的一个车道信息,并根据各个车道,生成道路信息。
高精地图hdmap::Map得到了以下信息:
- hdmap.lane: id、type、turn、speed_limit、central_curve、left_boundary、right_boundary、left_sample、right_sample、left_neighbor_forward_lane_id、right_neighbor_forward_lane_id
- hdmap.road: id、section、boundary