orin下一文带你构建Apollo9.0运行环境基于天准orin避坑版
- 前言
- 准备
- 安装基础软件
- 下载Apollo源码(笔者下载的是releases下9.0.0版本,大家可以参考)
- 编译Apollo9.0
- 编译过程中可能出现的问题
- 出现Socket closed导致编译未完成
- 出现c++: error: unrecognized command line option ‘-mavx2’ c++: error: unrecognized command line option ‘-mfma’导致编译失败
- 出现WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested88c842dcbb5249485ddeb48ececb1c502aa0a4484ba4d4f401be48b0038a4
- 总结
前言
书接上文,笔者历经重重磨难之后终于在x86上成功将apollo部署成功后,又需要在orin上部署apollo,本以为直接移植过来就行,然而非也,又是一段痛苦且难忘的时光,现在终于可以在orin上成功部署apollo,现在分享给诸位道友们,愿诸位少走点弯路,快速的进入到apollo的世界
准备
- 一台已经安装ubuntu系统的orin设备(Ubuntu系统的版本可以参考Apollo官方文档里面的配置表适配安装,orin原装的是Ubuntu20.04)
安装基础软件
1.安装Docker19.03+
- 查看本机当前的docker版本
docker version
- 安装docker(如果已有docker且版本 > 19.03请忽略,否则需重新安装(如果docker版本小于19.03,则需先卸载当前版本再重新安装))
sudo apt-get update
sudo apt-get install docker.io
- 安装完成之后可以通过下述命令查看是否安装成功
docker version
- docker配置
sudo systemctl start docker
sudo systemctl enable docker
通过上述命令对docker进行配置
安装Nvidia驱动
- 打开Ubuntu自带的软件更新界面
- 选择合适的显卡驱动安装显卡驱动(第一个即可)
安装配置Nvidia container toolkit
- 安装Nvidia container toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get -y update
sudo apt-get install -y nvidia-docker2
- 确认Nvidia container toolkit是否安装成功:检测出版本号即为安装成功
- 重启docker
sudo systemctl restart docker
下载Apollo源码(笔者下载的是releases下9.0.0版本,大家可以参考)
- 执行以下命令克隆 Apollo 源码
# SSH 方式
git clone git@github.com:ApolloAuto/apollo.git
# HTTPS 方式
git clone https://github.com/ApolloAuto/apollo.git
- 切换到最新分支:
cd apollo
git checkout master
git branch -a
- 切换到最新分支:
cd apollo
git checkout master
git branch -a
如上图所示*号在master前面即表示当前已切换到master分支
编译Apollo9.0
下载资源包 (基于天准orin)
链接: https://pan.baidu.com/s/1kfgsXVGjOsMGlDeN-RleHQ
提取码: hicu
使用上述链接下载资源包
启动Apollo环境容器(基于天准orin)
- 更换docker/scripts/dev_start.sh文件(非40系显卡可以忽略)
更换刚才所下载的资源包里面的dev_start.sh
- 更换scripts/apollo_base.sh文件
更换刚才所下载的资源包里面的apollo_base.sh
- 更换scripts/apollo.bashrc文件
更换刚才所下载的资源包里面的apollo.bashrc
- 更换docker源
修改/etc/docker/daemon.json文件:添加以下源
"registry-mirrors": ["https://dockerproxy.cn"]
然后再执行下面命令
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
- 在 apollo 目录下输入以下命令来启动环境容器
bash docker/scripts/dev_start.sh
操作成功后将会有如下提示输出
进入Apollo环境容器
- 执行如下的命令进入到apollo容器
bash docker/scripts/dev_into.sh
如上图所示即为成功进入Apollo环境容器
编译
- 在容器内的 /apollo 目录下输出以下命令编译整个工程
./apollo.sh build
出现如上图所示即为编译成功
编译过程中可能出现的问题
出现Socket closed导致编译未完成
14, error message: 'Socket closed', log file: '/apollo/.cache/bazel/540135163923dd7d5820f3ee4b306b32/server/jvm.out')
- 解决方案
这是硬件资源耗尽导致OOM,可以自行修改脚本来控制编译使用的硬件资源:
在scripts/apollo_base.sh中第755和757行做如下修改,然后重新编译
--jobs=${count} --local_ram_resources=HOST_RAM*0.7"
改为
--jobs=2 --local_ram_resources=HOST_RAM*0.5"
如下图所示
出现c++: error: unrecognized command line option ‘-mavx2’ c++: error: unrecognized command line option ‘-mfma’导致编译失败
-
问题原因:
天准GEACX1-Orin设备是基于aarch64架构的,aarch64上不支持-mavx2以及-mavx2的配置选项 -
解决方案:
- 1.打开apollo/scripts/apollo_base.sh
- 2.找到job_args=“–copt=-mavx2 --host_copt=-mavx2 --jobs=${count} --local_ram_resources=HOST_RAM*0.7”
- 3.将2修改成如下
if [[ $(uname -m) == "x86_64" ]]; then
job_args="--copt=-mavx2 --host_copt=-mavx2 --jobs=${count} --local_ram_resources=HOST_RAM*0.7"
else
job_args="--copt=-march=native --host_copt=-march=native --jobs=${count} --local_ram_resources=HOST_RAM*0.7 --copt=-fPIC --host_copt=-fPIC"
fi
-
- 4.进入docker
- 5.重新编译
出现WARNING: The requested image’s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested88c842dcbb5249485ddeb48ececb1c502aa0a4484ba4d4f401be48b0038a4
- 问题原因:
主机平台(linux/arm64/v8
)与请求的镜像平台不一致,执行‘docker build -t kubia .’命令默认(linux/amd64)cpu; - 解决方案:
- 1.打开docker/scripts/dev_start.sh
- 2.找到docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes > /dev/null 和 docker run -v “ v o l u m e " : " {volume}":" volume":"{path}” --rm “${image}” true > /dev/null
- 3.将2修改成如下
docker run --platform linux/arm64/v8 --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes > /dev/null
docker run --platform linux/arm64/v8 -v "${volume}":"${path}" --rm "${image}" true > /dev/null
-
- 4.进入docker
- 5.重新编译
总结
以上就是笔者在天准orin上的踩坑避坑经验之享,愿能帮到诸位道友!