Carla从源码编译安装
全文描述了最新0.9.15版本的carla在Ubuntu20.04上的编译过程
因需要使用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
关于编译器的历史,也可以在这里查看
关于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了!
漫长的旅途,生命的意义在于折腾,加油!
更多推荐
所有评论(0)