Apollo map详解

本文详细介绍了Apollo高精地图的生成流程、使用的map tool工具、地图格式、坐标系统、车道与路口区域的描述,以及高精地图在Apollo中的不同形式如base_map, routing_map和sim_map。同时,讲解了地图元素的获取方法和DreamView中地图的调用流程。" 138002376,22864057,Ubuntu上使用VS Code配置Java环境及首次编程,"['Ubuntu', 'Linux', 'Java开发', 'VS Code', '环境配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

map 生成流程

百度高精地图数据格式采用(XML)文件格式的数据组织方式,根据(XML)文件生成base_map.bin文件,进而生成routing_map和sin_map。工具的代码在modules/map/tools中,调用bazel-bin目录下的可执行文件。

  • base_map是最完整的地图,包含所有道路和车道几何形状和标识。其他版本的地图均基于base_map生成。
  • routing_map包含base_map中车道的拓扑结构,可以有以下命令生成:
dir_name=modules/map/data/demo # example map directory./scripts/generate_routing_topo_graph.sh --map_dir(src dir) ${
   
   dir_name}(des dir)
//该脚本是map模块中的tool工具的使用。在babel-bin下找到他的可执行文件

--------------------------------------应用举例
bash scripts/generate_routing_topo_graph.sh --map_dir=/apollo/modules/map/data/apollo_map /apollo/modules/map/data/apollo_map 

  • sim_map是一个适用于Dreamview视觉可视化,基于base_map的轻量版本。减少了数据密度,以获得更好的运行时性能。可以由以下命令生成:
dir_name=modules/map/data/demo # example map directory
bazel-bin/modules/map/tools/sim_map_generator --map_dir=${
   
   dir_name} --output_dir=${
   
   dir_name}

--------------------------------------应用举例

bazel-bin/modules/map/tools/sim_map_generator 
--map_dir=/apollo/modules/map/data/apollo_map 
--output_dir=/apollo/modules/map/data/apollo_map


map tool工具使用

modules/map/tools/proto_map_generator.cc由XML文件生成.bin和.txt文件。

bazel-bin/modules/map/tools/proto_map_generator 
--map_dir=/apollo/modules/map/data/apollo_map_test  
--output_dir=/apollo/modules/map/data/apollo_map_test

modules/map/tools/map_tool.cc由生成的bin或者txt文件进行地图偏移,生成新的bin和txt文件。

 bazel-bin/modules/map/tools/map_tool --map_dir=/apollo/modules/map/data/apollo_map_test  --output_dir=/apollo/modules/map/data/apollo_map_test/offset

modules/map/tools/sim_map_generator.cc用于生成由dreamview前端显示的下采样地图的地图工具,也就是生成sim_map

modules/map/tools/quaternion_euler.cc四元数转欧拉角

modules/map/tools/map_xysl.cc车道点之间的相互转换,xy->sl 、sl->xy 或者xy->lane 等

modules/map/tools/refresh_default_end_way_point.cc假设在我们的终点的绝对值(x,y,z)仍然正确的情况下改变了通道信息。 然后我们可以在新地图上找到最近的点作为新的终点。

modules/map/tools/map_datachecker该文件还不知道能干啥,编译的时候缺少一个grpc的文件,grpc是一个谷歌开源库,是一种(Remote Procedure Call Protocol),需要把这个库安装一下才能使用.

安装方法:

### Apollo 中 `map_util` 的使用说明与源码解析 #### 1. 功能概述 在 Apollo 自动驾驶框架中,`map_util` 是用于处理高精地图数据的核心工具之一。其主要功能包括但不限于加载、查询和操作 NDT 地图或其他类型的高精地图数据。这些功能通常被应用于定位模块(Localization)、感知模块(Perception)以及规划模块(Planning)。 通过调用 `ndt_map_creator` 工具可以生成 NDT 地图文件[^1],而 `map_util` 则提供了接口以便其他模块能够高效地访问和利用这些地图数据。具体来说: - **NDT 地图管理**:支持加载存储于指定路径下的 NDT 地图文件。 - **坐标转换**:提供从 GPS 坐标系到局部坐标系的转换能力。 - **障碍物检测辅助**:为感知模块中的目标识别提供地理上下文信息。 #### 2. 使用方法详解 ##### (1)初始化 Map Util 实例 为了开始使用 `map_util` 提供的功能,首先需要创建其实例对象。这一步骤通常会在各个子系统的启动阶段完成。 ```cpp #include "modules/map/hdmap/hdmap_util.h" // 初始化 HDMapUtil 单例模式实例 HDMapUtil* hdmap_util_ptr = HDMapUtil::Instance(); ``` 上述代码片段展示了如何获得单例模式下 `HDMapUtil` 类型的对象指针[^4]。注意这里假设读者已经熟悉 C++ 编程语言及其设计模式概念。 ##### (2)加载地图资源 一旦获得了 `hdmap_util_ptr` 后,就可以进一步执行地图加载动作了。下面是一个简单的例子展示怎样设置默认的地图目录并触发加载过程。 ```cpp std::string map_dir("/path/to/your/maps"); bool success = hdmap_util_ptr->LoadMapsFromDirectory(map_dir); if (!success) { AERROR << "Failed to load maps from directory: " << map_dir; } ``` 此部分逻辑可能存在于某些特定的服务初始化脚本或者配置文件当中[^3]。 ##### (3)检索兴趣区域内的道路元素 当完成了基本的地图准备工作之后,开发者往往还需要针对具体的业务需求提取感兴趣的信息项。比如获取某辆车前方一定范围内的车道线集合。 ```cpp const apollo::common::PointENU point_of_interest(enu_x, enu_y, enu_z); double search_radius_meters = 50.0; auto lane_info_list = hdmap_util_ptr->GetLanesWithinRadius(point_of_interest, search_radius_meters); for (const auto& lane : *lane_info_list) { // 对每条符合条件的道路做后续分析... } ``` 以上伪代码体现了基于地理位置筛选附近可用行车道的过程[^5]。 #### 3. 注意事项 尽管 `map_util` 提供了许多便利的方法帮助我们快速开发自动驾驶应用软件,但在实际运用过程中仍需留意以下几个方面: - 确保所提供的地图版本兼容当前使用的 SDK 或者 ROS 版本; - 定期验证地图精度是否满足项目预期标准; - 避免频繁重复加载相同内容造成不必要的性能开销。 ### 示例程序清单 以下是综合前面知识点编写的一个小型演示案例——判断当前位置是否存在可通行路段。 ```cpp #include <iostream> #include "modules/map/hdmap/hdmap_util.h" using namespace std; int main(int argc, char** argv){ if(argc != 4){ cerr<<"Usage:"<<argv[0]<<" ENU_X ENU_Y MAP_DIR"<<endl; return EXIT_FAILURE; } double enu_x = stod(argv[1]); double enu_y = stod(argv[2]); string map_directory_path = argv[3]; const common::PointENU query_point(enu_x, enu_y, /* z */ 0.); HDMapUtil* hdmap_util_inst = HDMapUtil::Instance(); bool loaded_okay = hdmap_util_inst->LoadMapsFromDirectory(map_directory_path); if(!loaded_okay){ cout<< "Error loading maps."<< endl; return EXIT_FAILURE; } vector<const LaneInfo*> near_lanes; hdmap_util_inst->GetLanesAroundPosition(query_point,&near_lanes); if(near_lanes.empty()){ cout<< "No drivable lanes found nearby!"<< endl; }else{ cout<< "Found "<<near_lanes.size()<<" possible driving lanes around you."<< endl; } return EXIT_SUCCESS; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值