最近一段时间一直在研究怎么把apollo移植到nvidia jetson agx orin上,最后除了perception以及localization模块没有编译成功,其他的模块都编译成功并且可以运行了,在这里先简单记录下我做的工作。

一、环境

1. Nvidia jetson agx orin:

cuda11.4.1

libtorch 1.12.0

r35.1

ubuntu20.04

python3.8

2. apollo:

8.0.0

二、移植过程

1. 改动dev_start.sh

用nvidia-l4t-base镜像代替apollo的aarch64的镜像,即

DEV_IMAGE="nvcr.io/nvidia/l4t-base:r35.1.0"

2. 创建容器

./apollo/docker/scripts/dev_start.sh

如果遇到报错:

docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/moby/d72fc1c3f26d44b3e50ab163968859acf86c07cf1811f3549701b4ec72d53788/log.json: no such file or directory): exec: "nvidia-container-runtime": executable file not found in $PATH: <nil>: unknown.

在orin终端中输入

sudo apt -f install

会自动修复nvidia-docker缺失的依赖

3. 进入容器

./apollo/docker/scripts/dev_into.sh

4. 编译一些cyber以及modules的依赖

在编译依赖之前先设置一下下载源,编辑 apollo/docker/rcfiles/sources.list.cn.aatch64,替换成20.04的focal版本

deb [arch=arm64] http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse
deb [arch=arm64] http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb [arch=arm64] http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse
deb [arch=arm64] http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse

然后把rcfiles文件夹复制到/opt/apollo下;

然后是在docker内安装cuda,直接去官网下载cuda11.4的sh文件,然后在docker内运行就可以。这里贴一下命令行获取cuda11.4的命令:

wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda_11.4.1_470.57.02_linux_sbsa.run

(后续编译perception模块时发现boost缺好多定义,检查了一下发现apollo脚本内写的boost版本是1.74.0,但实际上使用的是1.71.0,所以直接使用1.71.0版本的boost库,可以吧install_boost.sh内的boost版本改为1_71_0)

此外在apollo/docker/build/installers里面有很多自带的依赖脚本,我整理了一下顺序写成了一个.sh文件,这个文件需要在容器内运行。

#!/usr/bin/env bash###############################################################################
#
# Author: Scott Deng
# This file is used to install dependences for apollo running on orin.
# Email: dengx@turing.cc
#
################################################################################ Fail on first error.
set -eMY_MODE="${1:-download}"cd "$(dirname "${BASH_SOURCE[0]}")"
. ./installer_base.shARCH="$(uname -m)"cp -r ../rcfiles /opt/apollo/bash ${CURR_DIR}/install_minimal_environment.sh cn
# bazel
cp -f bazel-3.7.1-linux-arm64 "${SYSROOT_DIR}/bin/bazel"
cp /opt/apollo/rcfiles/bazel_completion.bash /etc/bash_completion.d/bazel
PKG_NAME="buildifier-${BUILDTOOLS_VERSION}-linux-arm64"
CHECKSUM="19d5b358cb099e264086b26091661fd7548df0a2400e47fd98238cfe0a3e67f9"
DOWNLOAD_LINK="https://apollo-system.cdn.bcebos.com/archive/6.0/${PKG_NAME}"
download_if_not_cached "${PKG_NAME}" "${CHECKSUM}" "${DOWNLOAD_LINK}"
cp -f ${PKG_NAME} "${SYSROOT_DIR}/bin/buildifier"
chmod a+x "${SYSROOT_DIR}/bin/buildifier"
rm -rf ${PKG_NAME}
info "Done installing bazel ${BAZEL_VERSION} with buildifier ${BUILDTOOLS_VERSION}"
# Note(storypku):
# Used by `apollo.sh config` to determine native cuda compute capability.
bash ${CURR_DIR}/install_deviceQuery.shbash ${CURR_DIR}/install_cmake.sh
bash ${CURR_DIR}/install_llvm_clang.sh
bash ${CURR_DIR}/install_cyber_deps.sh
bash ${CURR_DIR}/install_qa_tools.sh
bash ${CURR_DIR}/install_visualizer_deps.sh
bash ${CURR_DIR}/install_modules_base.sh#gpu support
apt_get_update_and_install \libopenblas-dev \libatlas-base-dev \liblapack-dev
# Note(infra): build magma before mkl
info "Install Magma ..."
bash ${CURR_DIR}/install_magma.sh
##============================================================##
# libtorch_gpu
bash ${CURR_DIR}/install_mkl.sh
unzip libtorch_gpu.zip
mv libtorch_gpu /usr/local/
mv libcudnn.so.8.0.0 /usr/lib/aarch64-linux-gnu/
ln -s /usr/lib/aarch64-linux-gnu/libcudnn.so.8.0.0 /usr/lib/aarch64-linux-gnu/libcudnn.so.8bash ${CURR_DIR}/install_ordinary_modules.sh
bash ${CURR_DIR}/install_drivers_deps.sh
bash ${CURR_DIR}/install_dreamview_deps.sh
bash ${CURR_DIR}/install_contrib_deps.sh
bash ${CURR_DIR}/install_release_deps.sh

其中libtorch_gpu.zip是我在orin上本地编译的,1.12.0版本,编译参考:

https://zhuanlan.zhihu.com/p/585468425

bazel-3.7.1建议自己在其他地方下载好然后移动到docker里,脚本下载可能会因为网络问题失败

另外编译完boost1.74.0后,在编译apollo的一些模块时候会出现undefined reference to boost::filesystem::detail::directory_iterator_construct(xxx的错误,我看了下好像是缺少一个重载,于是这边我重新从源码编译了boost,修改boost_1_74_0/libs/filesystem/src/directory.cpp文件,;在里面找到friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct然后在他下面添加声明

friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct(directory_iterator& it, const path& p, unsigned int opts, system::error_code* ec);

定义就是复制一份原来的friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct,并在里面令opts=0;

(后续编译perception模块时发现boost缺好多定义,检查了一下发现apollo脚本内写的boost版本是1.74.0,但实际上使用的是1.71.0,所以直接使用1.71.0版本的boost库)

补充:

还需要将cuda的一些头文件如cudnn.h、cudnn_version.h以及Nv开头的一些头文件放到容器内;

另外还有arm架构下的libcu60的一些库文件可以从Index of /ubuntu/pool/main/i/icu下载,找到libicu60_60.2-6ubuntu1_arm64.deb下载,然后在docker内用dpkg安装即可。

5. 开始编译

首先编译cyber,在编译cyber之前同样需要修改一些文件:

由于aarch64不支持-mavx以及-mavx2选项,所以需要删除apollo/scripts/apollo_build.sh中的这两个选项。

另外如果编译时将warning视为了error导致编译失败,可以通过注释apollo/tools/bazel.rc的35~40行进行解决

编译cyber:

./apollo.sh build cyber

然后用类似下面的命令编译apollo除了perception、localization的其他模块,

./apollo.sh build v2x prediction control

现在应该没问题了。

运行dreamview可以用simcontrol简单的跑个仿真。(用火狐浏览器打开localhost:8888,会显示黑屏,我是用另一台x86的电脑的chrome连接到orin的dreamiew的)

写文的时候已经编译完挺久了,可能会有遗漏,如果编译中遇到其他问题可以评论一下,大家一起交流一下。

三、关于perception和localization的编译

localization模块由于apollo官方并没有给出arm64的msf_localization.so,我也没找到源码来编译,所以编译localization会报错。

perception编译不起来是因为apollo只支cuda10+tensorrt7,支持orin的apollo版本还在开发中,最早在2023年7月会发布,所以编译的时候回报错诸如“DimsCHW” in Nvinfer1 does not  name a type,因为DimsCHW这些接口在tensorrt8里被废弃了,如果想要给apollo升级到tensorrt8,那么就要自己定义一些wrapper来改写接口,工作量挺大的;可以参考

https://github.com/ApolloAuto/apollo/issues/14858

然后为什么不让orin的cuda和tensorrt版本降级呢,因为我没有找到适用于orin的cuda10,nvidia官网上适合orin使用的最早的版本也只到11.4.0而11.4必须搭配rensorrt8;如果使用11.3会报错不支持“compute_86"

关于perception的编译可以参考(未完成):

running Apollo on orin(arm64/aarch64) Perception 编译记录_Scott_D_的博客-CSDN博客

running Apollo on orin(arm64/aarch64) 移植记录相关推荐

  1. android touch screen keyboard input移植记录

    android touch screen keyboard input移植记录  仅仅是作为记录: Andorid 的 touchscreen 事件必须要有  BTN_TOUCH 才可以. 所以初始化 ...

  2. 关于x86、x86_64/x64、amd64和arm64/aarch64

    关于x86.x86_64/x64.amd64和arm64/aarch64 转自:https://www.jianshu.com/p/2753c45af9bf 为什么叫x86和x86_64和AMD64? ...

  3. 安卓平台下的GPS架构介绍及驱动移植记录

    一.前言 我的工作是关于汽车车机BSP部分. 汽车车机,其实基本和人们日常所用的手机一样,也是安卓平台的.所谓安卓,就是一层安卓服务包裹着Linux内核所形成的操作系统. BSP组,主要工作内容就是负 ...

  4. mjpg-streamer移植记录

    一.基于ubuntu18.04系统的mjpg-streamer移植记录 1.移植之前使用ubuntu的软件测试USB摄像头是否正常工作 (1).插上摄像头之后,ubuntu右下角有摄像头图标 (2). ...

  5. 【自问自答】armhf/arm64/aarch64异同学习

    问题及解答 armhf/arm64/aarch64 armhf与arm64的不同 arm64 vs. aarch64 ARM,AMD,X86,AArch64的概念 AMD x86 ARM AArch6 ...

  6. (五)Debian Linux中部署Spring Boot + Vue的前后端分离项目详细过程(arm64/aarch64架构下)

    专题系列往期文章目录 (一)移动端安卓手机改造成linux服务器&Linux中安装软件踩坑历险记 (二)Debian Linux系统中安装oracle JDK1.8详细过程(arm64/aar ...

  7. linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境

    Arch Linux 搭建 arm64/AArch64 交叉编译环境 0. 系统环境 系统: Arch Linux: 成文时间最新 工具版本:Binutils:2.34-1 GCC:9.2.1+202 ...

  8. ARM64(aarch64)下安装tensorflow

    首先从Github下载安装包: tensorflow-on-arm 选择合适的版本,例如tensorflow-1.14.0-cp35-none-linux_aarch64.whl 命名规则:cp35代 ...

  9. 基于Android8.1的博通bcm89342蓝牙驱动的驱动移植记录

    基于Android8.1的博通蓝牙BCM89342的驱动移植记录 说明 一 .软硬件平台 二.蓝牙移植流程 2.1 kernel 对蓝牙的驱动支持配置 2.2 kernel层编写蓝牙电源管理(bt r ...

  10. Yolo-FastestV2在树莓派4B上的MNN移植记录

    致谢 Yolo-FastestV2 https://github.com/dog-qiuqiu/Yolo-FastestV2/, 非常感谢作者的分享! 模型准备 首先,下载代码,根据要求训练,或者直接 ...

最新文章

  1. 盘点几个开源的高仿项目,B站最像~
  2. 今天浏览新闻的时候,发现一张图片特别有感触
  3. pyspark subtract代码示例
  4. ftp linux 开启验证_在linux中开启ftp服务
  5. mcs-51单片机视频教程——从硬件到c语言手把手的教,手把手从零教你学51单片机...
  6. 本地psql连接远程Oracle虚拟机_03
  7. 老公想入手一块10万左右的手表有哪些推荐?
  8. 趣图:程序猿和运维狗的工作日常……
  9. TFC2017 腾讯Web前端大会参会小结
  10. 烟台职业学院计算机,烟台职业学院首届计算机应用技能决赛落幕
  11. java 开源进销存项目_JSH_ERP 开源版J2EE进销存系统代码源码下载|JSH_ERP 开源版J2EE进销存系统代码源码官方下载-太平洋下载中心...
  12. JS之BigNumber.js 讲解
  13. 小程序---验证input输入不能为空
  14. 国内知名流程管理软件-汇总介绍
  15. 微信小程序 全局状态管理 ,响应式
  16. 渔翁、魔鬼和四色鱼的故事
  17. 智优ERP的升级版智优E3_ERP,可以自定义列,和自定义打印公司logo
  18. java system.nanotime_java - System.nanoTime()完全没用吗?
  19. K8S章节2 — k8s集群中通过rook方式部署ceph
  20. @Value的用法及(“#{}“)与@Value(“${}“)的区别

热门文章

  1. 2020年还能找到一份高薪的工作嘛?
  2. 程序设计基础第四版任务4.1:清华附中有4位同学中的一位做了好事不留名,表扬信来了之后,校长问4位同学是谁做的好事。
  3. 《The BEA-2019 Shared Task on Grammatical Error Correction》论文笔记
  4. kijiji王建硕的感慨
  5. Undertow在SpringBoot项目的使用,Undertow、Jetty和Tomcat之间的区别比较
  6. 懒羊羊求援【优先队列】
  7. Vue 实现网易云音乐 WebApp
  8. 计算机辅助检测诊断法是什么方法有哪些,肺结节的CT计算机辅助检测和诊断的基本方法和应用.pdf...
  9. 编写程序是以下步骤的一个往复过程:
  10. COM0011 2RAA005844A0007J处理器