X86下一文带你构建Apollo9.0运行环境(基于Ubuntu20.04避坑版)

embedded/2024/9/30 1:56:24/

X86下一文带你构建Apollo9.0运行环境基于Ubuntu20.04避坑版

  • 前言
  • 准备
  • 安装基础软件
    • 1.安装Docker19.03+
    • 安装Nvidia驱动
    • 安装配置Nvidia container toolkit
  • 下载Apollo源码(笔者下载的是releases下9.0.0版本,大家可以参考)
  • 编译Apollo9.0
    • 下载资源包 (非40系显卡可以忽略,笔者显卡为RTX4060)
    • 启动Apollo环境容器
    • 进入Apollo环境容器
    • 编译
  • 编译过程中可能出现的问题
    • 出现Socket closed导致编译未完成
  • 总结

前言

书接上文,笔者历经九九八十难之后终于在VM虚拟机上成功将apollo部署成功,然而在用的时候发现VM没法调用虚拟机资源,于是推倒重干,在电脑上装WIN+Linux双系统把性能吃满,现在在x86上重新部署apollo,与虚拟机上有些区别,笔者也是踩了很多坑,现分享给诸位道友们,愿诸位少走点弯路,快速的进入到apollo的世界

准备

  • 一台已经安装ubuntu系统的电脑(Ubuntu系统的版本可以参考Apollo官方文档里面的配置表适配安装,我这里装的是Ubuntu20.04)

安装基础软件

1.安装Docker19.03+

  • 查看本机当前的docker版本
docker version

查询docker版本

  • 安装docker(如果已有docker且版本 > 19.03请忽略,否则需重新安装(如果docker版本小于19.03,则需先卸载当前版本再重新安装))
sudo apt-get update
sudo apt-get install docker.io
  • 安装完成之后可以通过下述命令查看是否安装成功
docker version

docker安装成功

  • 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是否安装成功:检测出版本号即为安装成功
    检测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

下载资源包 (非40系显卡可以忽略,笔者显卡为RTX4060)

链接: https://pan.baidu.com/s/1Z42Zsad8NMqOSScE9pO99w

提取码: r5cn

使用上述链接下载资源包

启动Apollo环境容器

  • 更换docker/scripts/dev_start.sh文件(非40系显卡可以忽略)
    更换刚才所下载的资源包里面的dev_start.sh
    替换dev_start.sh
  • 更换docker源
    修改/etc/docker/daemon.json文件:添加以下源
"registry-mirrors": ["https://dockerproxy.cn"]

更换docker源
然后再执行下面命令

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环境容器

编译

  • 替换modules/perception/common/inference/tensorrt/rt_legacy.h文件(非40系显卡可以忽略)
    替换刚才所下载的资源包里面的rt_legacy.h
    替换rt_legacy.h
  • 替换third_party/centerpoint_infer_op/workspace.bzl文件(非40系显卡可以忽略)
    替换刚才所下载的资源包里面的workspace.bzl
    替换workspace.bzl
  • 替换third_party/paddleinference/workspace.bzl文件(非40系显卡可以忽略)
    替换刚才所下载的资源包里面的paddleinference/workspace.bzl
    替换paddleinference/workspace.bzl
  • 在容器内的 /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"

如下图所示
bug解决

总结

以上就是笔者的踩坑避坑经验之享,愿能帮到诸位道友!


http://www.ppmy.cn/embedded/119667.html

相关文章

BERT训练之数据集处理(代码实现)

目录 1读取文件数据 2.生成下一句预测任务的数据 3.预测下一个句子 4.生成遮蔽语言模型任务的数据 5.从词元中得到遮掩的数据 6.将文本转化为预训练数据集 7.封装函数类 8.调用 import os import random import torch import dltools 1读取文件数据 def _read_wiki(data_d…

如何借助Java批量操作Excel文件?

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的意思一般有两种: 对批量的Excel文件进行操作。如导入多个Excel文件…

JavaScript爬虫:数据抓取的艺术与实践

在当今数据驱动的世界中,JavaScript作为一种广泛使用的编程语言,不仅在前端开发中占据重要地位,也可以用于编写爬虫程序,从互联网上抓取有价值的数据。本文将介绍如何使用JavaScript编写爬虫程序,并探讨其在数据抓取中…

面经 | ES6

ES6 ES6Promise对象创建Promise三个状态resolve/reject 和微任务的关系awaitset vs weakSetmap vs weakMapES6 Promise对象 new Promise(excutor);excutor是一个函数,会立刻执行;then里的回调函数,会进入微任务队列;then会返回一个新的promise对象await等到的是一定是一个已…

基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真,对比网络通信开销,存活节点数量,网络能耗以及数据通信量四个指标…

springboot项目使用cxf框架开发webservice接口,常用注解

在 Spring Boot 项目中使用 Apache CXF 框架开发 WebService 接口时,常用的注解主要有以下几种: WebService:用于标注一个类为 WebService 接口。通常用于定义服务端接口。 import javax.jws.WebService;WebService public interface MyWebSe…

近万字深入讲解iOS常见锁及线程安全

什么是锁? 在程序中,当多个任务(或线程)同时访问同一个资源时,比如多个操作同时修改一份数据,可能会导致数据不一致。这时候,我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…

“避开死锁泥潭:开发者必知的技巧与工具“

“欲买桂花同载酒,终不似、少年游。” 在之前的有一期中,我谈到了关于“线程安全的问题”,那么在线程安全问题中,讲到了 synchronized 关键字,对于 synchronized 关键字的使用,是一定要特别注意的。因为如果…