Carla从源码编译安装

因需要使用Carla的C++源码开发,所以需要从源码进行编译安装。

参考文献:

https://carla.readthedocs.io/en/stable/how_to_build_on_linux/

系统环境 Ubuntu 20.4

步骤1 下载Unreal Engine

  官网地址:The most powerful real-time 3D creation tool - Unreal Engine

   下载步骤参考地址:Unreal Engine on GitHub

    详细的参考地址:

     https://docs.unrealengine.com/5.3/en-US/downloading-unreal-engine-source-code/

    编译参考地址:

    https://docs.unrealengine.com/5.3/en-US/building-unreal-engine-from-source/

  步骤1-1 必须有GitHub账户

  步骤1-2 必须注册Unreal Engine账号

  注册地址:Epic Games

    注册成功后,并登录

   在账户中心,将自己的github账户和epic games绑定

上图中github界面,点击connect即可完成。

绑定账户成功

绑定账户后,一定要在GitHub绑定的邮箱中确认绑定,否则,是无法打开UnrealEngine页面的,一直提示404。

绑定后,打开页面效果如下:

  步骤1-3 下载UnrealEngine源代码

git下载不下来,直接用https下载

步骤2 编译UnrealEngine

  根据教程执行命令:./Setup.bash, 提示mono-dmcs没有办法安装。使用指令修改sed -i.bak "s/mono-dmcs/mono-mcs/;s/clang-3.9/clang-10/" Engine/Build/BatchFiles/Linux/Setup.sh

继续运行,出现如下错误,提示没有办法下载依赖。

上面的问题是一个官方问题,解决方案在:Upcoming Disruption of Service Impacting Unreal Engine Users on GitHub - Announcements - Epic Developer Community Forums

我觉得还是更换版本比较合适,决定使用最新的版本来编译。

下载最新的版本!

更换版本后,很轻松执行成功!

继续执行命令  ./GenerateProjectFiles.sh 

执行make

经过漫长的等待,终于编译完毕!

测试一下UnrealEngine是否可以启动。进入Engine/Binaries/Linux,运行UnrealEditor

  

步骤3 编译calar

参考网址:https://carla.readthedocs.io/en/0.9.15/build_linux/

步骤3-1 下载calar

$ git clone https://github.com/carla-simulator/carla

步骤3-2 编译calar

导出UE环境变量

export UE4_ROOT=~/carla_learning/carla_source/UnrealEngine-5.3.2-release

编译PythonAPI接口

make PythonAPI

出现错误,应该是下载的boost不完整

再次make PythonAPI,依然出错,再次运行!怀疑是第一次下载不完整,删除下载文件,再次运行编译

出现错误,应该是编译器环境没有设置

执行下面的代码

sudo apt-add-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main" sudo apt-get update sudo apt-get install build-essential clang-10 lld-10 g++-7 cmake ninja-build libvulkan1 python python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 && sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180

提示有错误,但是感觉应该不影响,因为系统本身带了这个库。

apt-get update更新一下,依然提示不能连接等错误,无视,继续执行最后三条命令

sudo apt-get install build-essential clang-10 lld-10 g++-7 cmake ninja-build libvulkan1 python python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 && sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180

编译器安装完毕,继续执行make命令

依然同样错误。使用命令导出环境变量,测试一下

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
 

依然是这个错误,怀疑和UE编译时的环境变量混淆,打算重启电脑。

电脑重启后,错误依旧!这个变量什么时候设置的,这应该是问题的关键。

这个变量在Util/Build/BuildTools这个文件夹中的Setup.sh中设置,修改该文件内容,使其指向正确的编译器!

执行编译时,又出现与std库不匹配的问题,如下图所示。

经过漫长的分析,现在已经确定是UnrealEngine的C++标准库版本太低,不支持Carla的调用。现在问题如何解决是一个大难题,一种方法是更换编译器,一种方法是更换编译时所使用的依赖库。先测试一下更换编译器。

知识补充:

1. 关于编译器库的搜索路径

资料来源:https://www.cnblogs.com/webor2006/p/9946061.html

关于编译器的历史,也可以在这里查看

C++主流编译器总结 - 张小凯的博客

关于Clang编译过程,或者编译的原理,可以看下面资料

《程序员的自我修养(链接、装载与库)》学习笔记二(编译和链接) | zhangferry的技术博客

先来了解一下【非常重要,是编译三方库非常重要的知识点】:

  • --sysroot=XX
    使用XX作为这一次编译的头文件与库文件的查找目录,查找XX下面的 usr/include、usr/lib目录。
  • -isysroot XX
    头文件查找目录,覆盖--sysroot ,查找 XX/usr/include。什么意思,比如说"gcc --sysroot=目录1 main.c",如果main.c中依赖于头文件和库文件,则会到目录1中的user/include和user/lib目录去查找,而如果"gcc --sysroot=目录1 -isysroot 目录2 main.c"意味着会查找头文件会到目录2中查找而非--sysroot所指定的目录1下的/usr/include了,当然查找库文件还是在目录1下的user/lib目录去查找。
  • -isystem XX
    指定头文件查找路径(直接查找根目录)。比如"gcc --sysroot=目录1 -isysroot 目录2 -isystem 目录3  -isystem 目录4 main.c"意味着头文件查找除了会到目录2下的/usr/include,还会到isystem指定的目录3和目录4下进行查找,注意:这个isystem指定的目录就是头文件查找的全路径,而非像isysroot所指定的目录还需要定位到/usr/include目录。
  • -IXX
    头文件查找目录。

其查找头文件的优先级为:
-I -> -isystem -> sysroot

比如说:“gcc --sysroot=目录1 -isysroot 目录2 -isystem 目录3  -isystem 目录4 -I目录5 main.c”,其头文件首先会去目录5找,如果没找到则会到目录3和4找,如果还没找到则会到目录2找。

  • -LXX
    指定库文件查找目录。
  • -lxx.so
    指定需要链接的库名。

2. Make相关知识

参考文献:https://opensource.com/article/18/8/what-how-makefile

经过很久很久的分析,依然在编译器上卡着。要么是库的头文件不对,要么是链接不上,目前测试了使用UnrealEngine的默认编译器和系统的编译器,均无法正常工作。

知识补充:

  C++标准库

  参考文献:https://db.in.tum.de/teaching/ss21/c++praktikum/slides/lecture-08.pdf?lang=en

  最著名的c++标准库是libstdc++, gcc编译器默认库,libc++, llvm默认的库

Clang命令解释

参考文献:浅学 Clang(一):clang 指令介绍 - 掘金

LIBCXX环境变量指定了使用的C++标准库,可以是libstdc++,或者是libc++,clang可以通过选项指定-stdlib=来进行指定库的名称。

经过两周,翻江倒海的研究,问题还是没有解决,其核心问题是编译器要使用不同的标准库,这就要求修改项目的编译文件,这么大工程的编译文件,已经超出了我的能力范围。还有一种方法是修改项目源代码,使其符合现在库的规范。但是,对于源代码的修改将是一个巨大的工程,需要熟悉C++库的各个版本的不同函数的替代功能。而且,修改后,即使编译通过,也可能带来运行时的问题,这也将是一个无穷无尽的困难选择。

在无路可走的时候,我想只能更换UnrealEditor的版本了,结果,发现自己犯了大错,上天可怜,在UE的第一个分支居然是carla分支,这引起了我的好奇,最后发现,只有这个carla分支才是正确的选择,而文档说明书里面也写的很清晰。

 git clone --depth 1 -b carla https://github.com/CarlaUnreal/UnrealEngine.git ~/UnrealEngine_4.26

上面代码中的 -b carla就是指的是分支carla,而我阅读文档时,只注意到了4.26,这导致我想下载的版本是4.26,没有发现4.26版本后,使用了4.18版本,4.18版本无法编译通过后,使用了最新的5版本,编译通过,继续编译carla时出现问题,之后就被废掉了两周。

问题总算解决。

编译Carla的命令:

make PythonAPI #编译python客户端

make launch #编译服务器并启动Unreal Engine

步骤4 启动Carla服务器

编译完毕后,会启动Unreal Engine, 如果编译好了,直接使用

make launch-only 

来启动Unreal Engine。

但是,碰到问题,当点击UE的Play时,系统卡死,没有启动成功,估计是因为我没有下载,而是直接使用Copy的文档,问题如下图所示

问题解决,是因为点击Play后,需要很久的时间才能启动。

成功后,可以看到2000 2001 2002等端口启动

UE4也出现了pause和stop按钮

步骤5 使用客户端,连接服务

连接的具体命令如下:

在PythonAPI目录下的example,执行命令

python3 -m pip requirements.txt

python3 generate_traffic.py

如果服务器没有启动,会显示无法连接端口。

虽然连接成功,但是出现了段错误。

原因:未知,原来测试的时候也遇到过这个问题,就是版本不匹配就会出现这个问题。现在使用软件包的Update.sh来升级一下,看看问题是否解决。

我先测试一下使用系统的Carla服务器,是否可以运行。

居然用系统的Carla服务器可以,应该就是版本不匹配所导致的。

问题终于找到了,原因是多个Carla版本在电脑上,参见Carla FAQ:

“Cannot run example scripts or "RuntimeError: rpc::rpc_error during call in function version".”

网址:https://carla.readthedocs.io/en/0.9.11/build_faq/

这个问题,引发了一大堆的问题,就是版本混乱所导致的。

更正方法:

1. 清除掉原来的Carla版本

 sudo apt-get purge carla-simulator

2. 修改~/.bashrc,添加下列指令

export PYTHONPATH=$PYTHONPATH:"${CARLA_ROOT}/PythonAPI/carla/dist/$(ls ${CARLA_ROOT}/PythonAPI/carla/dist | grep py3.)" export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla

来个全家福,一切都OK了!

漫长的旅途,生命的意义在于折腾,加油!

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值