查看原文
其他

技术文档|Apollo Release Build 简介

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


从开发套件出发,手把手教你如何实践Apollo自动驾驶技术,给对自动驾驶研究感兴趣的开发者带来实质帮助,加速每一位开发者的研发进程。本文将介绍 Apollo Release Build,主要从以下几点为大家进行详细讲解。


  • 概览

  • Release Build实施原则

  • 如何运行Apollo Release Build

  • 如何使用Release Build输出运行Apollo

  • 如何使用Install规则安装自定义模块

  • Install-Bazel 规则的参数

  • 当前Release Build实现的局限性



在很长一段时间内,基于CyberRT的Apollo无法获得二进制分布。用户必须在Apollo Dev容器中自己构建整个项目,然后才能运行各种模块和工具。在某些情况下,这种无法部署的状况会产生麻烦。例如,使用SVL Simulator模拟器,所有Docker镜像、卷和Bazel缓存以及构建工件的总大小达到40+GB,这对于他们来说是相当不便的。



这种无法工作的根本原因是Bazel缺少与其他构建系统(例如,make install)中提供的类似的开箱即用的安装支持。


为了解决这个问题,我们借鉴了Drake项目的思路install,用Starlark语言实现了扩展,可以用来安装二进制文件、共享库、资源文件(配置、数据、启动文件、dags等)和文档。


独立二进制文件的安装相当简单。目前我们已知,CyberRT框架的核心概念是以libX_component.so的形式动态加载每个模块(如感知、预测、规划等)。主板二进制程序和libX_component.so本身链接了数千个其他共享库。例如,ldd使用以下命令在Planning模块上运行:


ldd bazel-bin/modules/planning/libplanning_component.so


将显示以下输出:

linux-vdso.so.1 (0x00007ffc8a77c000)libmodules_Splanning_Slibplanning_Ucomponent_Ulib.so => /apollo/bazel-bin/modules/planning/../../_solib_local/libmodules_Splanning_Slibplanning_Ucomponent_Ulib.so (0x00007fe8a7f9f000)libmodules_Splanning_Slibnavi_Uplanning.so => /apollo/bazel-bin/modules/planning/../../_solib_local/libmodules_Splanning_Slibnavi_Uplanning.so (0x00007fe8a7d81000)libmodules_Splanning_Slibon_Ulane_Uplanning.so => /apollo/bazel-bin/modules/planning/../../_solib_local/libmodules_Splanning_Slibon_Ulane_Uplanning.so (0x00007fe8a7b53000)libmodules_Splanning_Slibplanning_Ubase.so => /apollo/bazel-bin/modules/planning/../../_solib_local/libmodules_Splanning_Slibplanning_Ubase.so (0x00007fe8a7945000)libmodules_Splanning_Scommon_Ssmoothers_Slibsmoother.so => /apollo/bazel-bin/modules/planning/../../_solib_local/libmodules_Splanning_Scommon_Ssmoothers_Slibsmoother.so (0x00007fe8a7739000)libmodules_Splanning_Splanner_Slibplanner_Udispatcher.so => /apollo/bazel-bin/modules/planning/../../_solib_local/libmodules_Splanning_Splanner_Slibplanner_Udispatcher.so (0x00007fe8a752e000)...

如何将 libplanning_component.so 与它链接的所有共享对象(即“*.so”文件)一起安装成为实现install规则最难解决的问题。

patchelf来救援,所有共享对象都可以从runfiles_data中检索,同时patchelf --force-rpath --set-rpath可用于更改RPATH设置。

请使用浏览器打开链接tools/install/install.bzl了解更多内容。


要为Apollo生成二进制输出,只需运行:

./apollo.sh release -c


其中 -c 是用于预清洗的可选参数。输出位于Apollo Dev容器中的/apollo/output


上述命令大致相当于以下命令:

bazel run --config=opt --config=gpu //:install \-- --pre_clean /apollo/output


请键入./apollo.sh release-h以了解apollo.sh release的更多用法。



要使用Release Build输出运行Apollo Runtime Docker请在Apollo Dev Docker外部新架构输出目录的根目录中键入以下命令:

bash docker/scripts/runtime_start.sh


对于中国用户,使用 -g cn 来加速Docker镜像/卷的拉取:
bash docker/scripts/runtime_start.sh -g cn

通过运行以下命令登录Apollo Runtime Docker:
bash docker/scripts/runtime_into.sh

通过运行以下命令启动Dreamview:
./scripts/bootstrap.sh

Apollo Runtime容器内部。


要安装自定义模块,可以先按照从Apollo存储库安装其他模块的示例进行操作。

以Planning模块为例,这是最顶层Build文件的一部分:
install( name = "install", deps = [ "//cyber:install", # ... "//modules/planning:install", # ... ],)

这是来自Modules/Planning/BUILD中的一个片段:
filegroup( name = "planning_conf", srcs = glob([ "conf/**", ]),)
filegroup( name = "runtime_data", srcs = glob([ "dag/*.dag", "launch/*.launch", ]) + [":planning_conf"],)
install( name = "install", data = [ ":runtime_data", ], targets = [ ":libplanning_component.so", ], deps = [ "//cyber:install", ],)



从tools/install/install.bzl:

install = rule( attrs = { "deps": attr.label_list(providers = [InstallInfo]), "data": attr.label_list(allow_files = True), "data_dest": attr.string(default = "@PACKAGE@"), "data_strip_prefix": attr.string_list(), "targets": attr.label_list(), "library_dest": attr.string(default = "@PACKAGE@"), "library_strip_prefix": attr.string_list(), "mangled_library_dest": attr.string(default = "lib"), "mangled_library_strip_prefix": attr.string_list(), "runtime_dest": attr.string(default = "bin"), "runtime_strip_prefix": attr.string_list(), "rename": attr.string_dict(), "install_script_template": attr.label( allow_files = True, executable = True, cfg = "target", default = Label("//tools/install:install.py.in"), ), }, executable = True, implementation = _install_impl,)


Install规则的详细属性如下所示:


主题
注释
deps
此规则应包括的其他安装规则的列表
data
要安装的(独立于平台的)资源文件列表
data_dest
资源文件的目标(默认值 = "@PACKAGE@")
data_strip_prefix
要从资源路径中删除的前缀列表
targets
要安装的目标列表
runtime_dest
可执行目标的目的地(默认值= "bin")
runtime_strip_prefix
要从可执行路径中删除的前缀列表
rename
将安装路径映射到备用文件名,用于在安装时重命名文件



  • 仅支持 C++,Python 安装尚未准备就绪。

  • 仅支持 x86_64,ARM64 支持目前尚未准备就绪。



*《Apollo Release Build 简介

https://github.com/ApolloAuto/apollo/blob/master/docs/technical_tutorial/intro_to_apollo_release_build.md


以上就是“Apollo Release Build 简介的全部内容,如果大家对Apollo开放平台和套件感兴趣,可以添加『Apollo小哥哥』(微信号:apollo_xzs)为好友,进入技术交流群,跟开发者们一起讨论哦。


©️原创归作者所有,如需转载,请注明出处,另有法律责任。



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

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