Apollo 自动驾驶工程 x86迁移到ARM ORIN

2023-05-16

概述 最近工作主要关于自动驾驶工程跨平台迁移,从原来的X86架构工控机形式迁移到英伟达Orin Soc,由于Orin是ARM以及这个嵌入式平台的内核是定制的,所以遇到了很多问题,这里分享出来

在容器里使用CUDA计算在ORIN平台

一开始使用的是ubuntu cuda作为基础镜像,并没有专门使用英伟达Jetson平台的L4T基础镜像,导致在容器里初始化CUDA一直失败,做了一些实验,同样的代码同样的可执行文件在容器外就可以初始化成功,使用L4T作为基础镜像就没有问题,英伟达L4T基础镜像Github上L4T镜像Dockerfile同时启动选项中要加上

 docker run --gpus all

或者

 docker run --runtime=nvidia

或者使用

nvidia-docker

作为启动项.原因推测的话使用官方的基础镜像CUDA 挂载才是正确的,有知道的大神可以补充。

ARM平台的适配问题

这里主要有两点问题

  • 一个是整个工程的依赖库都要切换到Arm平台的
  • apollo cyber中关于协程要更新到比较新的commit,支持了Arm相关指令集
cyber/croutine/detail/routine_context.cc

例如在上面这个文件里

#ifdef __aarch64__
  char *sp = ctx->stack + STACK_SIZE - sizeof(void *);
#else
  char *sp = ctx->stack + STACK_SIZE - 2 * sizeof(void *);
#endif

也可以在整个工程搜索

 #ifdef __aarch64__ 

关键字和百度apollo github代码工程作比较,看哪里需要补充,编译器会自动识别走aarch64分支。
关于arm平台的其他一些问题可以谷歌得到。如果有问题可以提出来进行补充。

一些其他问题

由于整个apollo cyber采取的是分布式节点通讯方式,所以建议一个一个模块的进行编译和适配。整个工程的迁移顺序应如下

  1. 整个工程Docker image的编译,后续所有编译和运行都在这个镜像里,所以应先把镜像编译出来。遇到问题可以谷歌。这个过程比较耗时,目前是我是在orin上直接进行编译,没有使用交叉编译。
  2. cyber的编译以及运行
  3. 各个模块,例如localization,perception等模块的编译运行。

有用的小工具

可视化查看cpu以及gpu使用情况工具jtop

git clone https://github.com/rbonghi/jetson_stats.git

注意在这里进入jtop crtl菜单可以把功耗选到最大,否则CPU和GPU频率会被限制。ORIN CPU最大频率在2.2GHZ,GPU最大频率在1.3GHZ。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo 自动驾驶工程 x86迁移到ARM ORIN 的相关文章

  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 如何在 Ubuntu 14.04 LTS 中安装 ia32-libs (Trusty Tahr)

    我昨天安装了 Ubuntu 14 04 Trusty Tahr 一切看起来都还好 但是当我尝试编译一些C代码时 我遇到了以下错误 该错误似乎是由于操作系统缺乏 32 位架构支持造成的 错误输出如下 usr bin ld i386 archi
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • React 未捕获的不变违规:在 ApolloConsumer 的上下文中找不到“客户端”。将根组件包装在

    我有一个使用 React 应用程序react apollo 2 5 8以及我通过 NPM 安装并在应用程序中使用的自定义组件库 图书馆有react apollo 2 5 8列在对等和开发依赖项中 自从我将 React apollo 升级到
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • Apollo 更新查询未调用?

    我正在 GitHunt React 和 GitHunt API 中研究 Apollo pub sub 当我运行这些应用程序并输入新评论时 评论将通过调用提交来保存 然后 updateQueries 代码块在此处运行 const Commen
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允

随机推荐