ubuntu20.04 运行Apollo

一、安装依赖软件

docker推荐19.03+,Ubuntu推荐18.04+(此步骤提前自己完成)

nvidia-docker2安装链接如下

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker

二、下载Apollo

Apollo6.0和7.0编译基本一样,这里以6.0为例。Apollo3.0使用的是改进后的ros,后续版本改为Cyber

可以下载压缩包也可以git clone源码

注意:Apollo安装很简单,但是对电脑性能要求高,内存至少16G,硬盘预留100G。

#1、下载源码,进入工作空间
git clone https://gitee.com/ApolloAuto/apollo.git -b v7.0.0
cd apollo/

#2、下载镜像,创建容器
./docker/scripts/dev_start.sh #功能:下载镜像并创建容器的脚本。只在第一次运行时需要

#3、进入容器
./docker/scripts/dev_into.sh #进入容器脚本。仿真结束后,关闭停止容器,如果需要再次仿真,只需再次启动容器,然后利用该脚本进入容器

#4、编译源码
./apollo.sh --help #查看可以使用的编译指令的含义
./apollo.sh clean #清理编译的文件。初次编译前要先清理,以后就不要清理了,全部编译整个系统还是比较慢的。

#修改默认使用的线程数和内存,不然很容易编译卡死,
#在脚本scripts/apollo_base.sh,修改jobs和local_ram_resources
#job_args="--copt=-mavx2 --host_copt=-mavx2 --jobs=${count} --local_ram_resources=HOST_RAM*0.5

./apollo.sh build_opt_gpu #在容器内编译源码脚本,使用gpu
./apollo.sh build_opt #只使用cpu

注意:Apollo6.0编译会出现出现以下错误

1. ERROR: An error occurred during the fetch of repository 'zlib'

参考链接:https://blog.csdn.net/robinvista/article/details/124056108

2. 如果是英伟达30系显卡,还会出现  Unsupported gpu architecture ‘compute_86‘

解决办法:

修改文件:third_party/gpus/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc.tpl

三、启动并测试Apollo

./scripts/bootstrap.sh #启动dreamview监视器的后端

2.在浏览器中打开

http://localhost:8888/

3. 下载演示bag包

cd docs/demo_guide/
python3 record_helper.py demo_3.5.record

4.回放数据

cd /apollo
source /apollo/cyber/setup.bash  
cyber_recorder play -f docs/demo_guide/demo_3.5.record -l

注意:切换分支到3.0编译,不会出现6.0的问题,奇怪

四、再次使用Apollo

docker start apollo_dev
./docker/scripts/dev_into.sh #进入容器脚本
./scripts/bootstrap.sh #启动dreamview的监视器 此模块中可以勾选启动规划、控制等模块,重复勾选就是重启

五、编译Apollo中的某一个模块

直接用docker exec进入docker,默认为root用户,编译某个包可能出现如下问题。所以使用apollo时,不要在root用户下使用。

六、使用技巧

1、Apollo的Glog环境变量定义在cyber/setup.bash中

2、各模块可以手动用cyber_launch启动,也可以在dreamviewer启动

七、导入外部地图

1、地图规格说明

 Apollo支持的地图标准是百度自定义的Opendrive格式,该标准的地图可以从RoadRunner或Lgsvl中获得。

从RoadRunner中导出的Apollo Opendrive文件一般是aabb.xml类型。从Lgsvl中下载的格式一般为aabb.bin类型。xml格式的文件是以Apollo Opendrive格式组织的,.bin是序列化为百度定义的protobuf格式后的数据。

apollo Opendrive地图点建议的存储单位是经纬度,当然也可以存储其他坐标系。

2、apollo运行所需地图

Apollo运行所需要的地图文件有如下三种:

base_map 是基础地图(base_map.bin|base_map.xml|base_map.txt,这三种格式都可以),基础地图必须命名为base_map.xx;

routing_map是routing模块所需的。Apollo提供是预处理脚本,根据 base_map 计算得到(routing_map.bin|routing_map.txt);

sim_map是simulation模块所需的(DreamView显示所用map)、对 base_map 降采样以提高传输和渲染效率(sim_map.bin|sim_map.txt)

3、apollo地图投影

apollo在解析base_map.xml时(.bin和.txt是xml读取、解析后,序列化的数据,已经投影过了),首先解析Header,会读取"geoReference",作为原始数据的坐标系,再读取"projection"中的utm的zoneID,如果没有"projection",则会根据header中的west和east自动计算一个带号。

最终定义如下坐标投影,后面解析道路时都会将数据进行投影为目的坐标系的XY坐标。

 std::string to_coordinate =
     absl::StrCat("+proj=utm +zone=", zone_id,
                  " +ellps=WGS84 +datum=WGS84 +units=m +no_defs");
 CoordinateConvertTool::GetInstance()->SetConvertParam(from_coordinate,
                                                        to_coordinate);

注意:这种目的坐标系写死了为UTM,不太好,不方便和其他软件联合仿真,我们可以修改代码,适配自己的投影方式。

步骤一:在base_map.xml中增加字段"targetReference",表示期望的投影坐标系

步骤二:修改modules/map/hdmap/adapter/xml_parser/header_xml_parser.cc,118行左右

增加解析targetReference,并将值赋值给to_coordinate

  // 如果指定了投影坐标系,则使用指定的坐标系
  auto target_reference_node = header_node->FirstChildElement("targetReference");
  if (!target_reference_node) {
    std::string warning_msg = "Warning parsing header target_reference_node attributes";
  } else {
    auto taregt_geo_text = target_reference_node->FirstChild()->ToText();
    if (!taregt_geo_text) {
      std::string err_msg = "Error parsing header targetReference text";
      return Status(apollo::common::ErrorCode::HDMAP_DATA_ERROR, err_msg);
    } else {
      to_coordinate = taregt_geo_text->Value();
    }
  }

 

另外:惯导的经纬度也会投影为xy,规则定义在modules/drivers/gnss/conf/gnss_conf.pb.txt中


RoadRunner2023支持导出Apollo3.0和5.0版本的Opendrive,经测试。在Apollo8.0上也可使用。

接下来进行地图处理:

1、将RoadRunner导出的xml地图放在指定位置,地图需要放在modules/map/data下,不同地图创建不同文件夹。

本次测试的地图放在tzh文件夹下,并改名为base_map.xml

2、进入容器中(不要是root用户)

cd apollo
./docker/scripts/dev_into.sh 

3、生成routing_map.bin

脚本需要在apollo根目录下执行,因为会根据相对路径去routing目录下读取东西

./scripts/generate_routing_topo_graph.sh --map_dir modules/map/data/tzh

生出的routing_map.bin在基础地图的相同目录,

4、生成sim_map.bin

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

5、启动dreamviewer测试地图

 

 

posted @ 2022-08-01 23:19  chenjian688  阅读(1173)  评论(0编辑  收藏  举报