背景:
主要是为了复现叶小飞的OpenCDA仿真环境,方便验证自己的多车协同算法。又重新捡起了carla仿真。一开始使用了Ubuntu16.04配置了所有环境,但是使用OpenCDA的代码时,提示系统内核不符合要求,无奈还是升级了18.04才解决问题。这一路踩坑不少,总结一下,方便以后查阅,同时希望能够帮助到此刻焦头烂额的同行们。
注意:
OpenCDA的选择要求是carla>=0.9.11。并且提供了按照源的方案安装的步骤。
安装之前一定注意,通过源的安装方法,保证磁盘空间要预留至少100G的空间,且运行carla服务器也需要至少4GB的GPU。可以通过指令nvidia-smi
查看系统GPU情况。
这里选择Unreal Engine4.24和carla0.9.11,基于Ubuntu18.04;
sudo apt-get update &&
sudo apt-get install wget software-properties-common &&
sudo add-apt-repository ppa:ubuntu-toolchain-r/test &&
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - &&
sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main" &&
sudo apt-get update
Ubuntu18.04下要安装有:
sudo apt-get install build-essential clang-8 lld-8 g++-7 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev &&
pip2 install --user setuptools &&
pip3 install --user -Iv setuptools==47.3.1 &&
pip2 install --user distro &&
pip3 install --user distro
同时为了避免UE和 CARLA 依赖项之间的兼容性问题,使用相同的编译器版本和 C++ runtime library来编译所有内容。CARLA 团队使用 clang-8 和 LLVM 的 libc++。使用以下指令更改默认 clang 版本以编译 Unreal Engine 和 CARLA 依赖项。
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-8/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-8/bin/clang 180
申请一个github账号和Unreal Engine账号,并形成关联
详细步骤看这里
Unreal Engine 4.24的下载安装
安装的目录最好是在~/UnrealEngine_4.24
,也就是/home/your path/UnrealEngine_4.24
,当然也可以换地方,但是下面的路径问题都要按照相应的改变而调整:
终端运行以下指令下载UE4,会在目录/home/your path
路径下生产UnrealEngine_4.24的文件夹。(如果速度慢,也可以自行去链接下载,并解压到/home/your path
路径下)
git clone --depth=1 -b 4.24 https://github.com/EpicGames/UnrealEngine.git ~/UnrealEngine_4.24
终端进入UE4文件路径下
cd ~/UnrealEngine_4.24
然后运行以下指令获取patch.txt文件并加载
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/UE_Patch/430667-13636743-patch.txt 430667-13636743-patch.txt
patch --strip=4 < 430667-13636743-patch.txt
编译,可能会比较慢。如果因为网速问题失败,建议多次尝试/更换网络/连接手机热点(为了排查错误可以三个指令分别运行)
./Setup.sh && ./GenerateProjectFiles.sh && make
最后运行以下UE4确保已经正确安装,第一次速度可能比较慢
cd ~/UnrealEngine_4.24/Engine/Binaries/Linux && ./UE4Editor
Carla0.9.11的下载安装
不推荐使用git clone https://github.com/carla-simulator/carla
指令直接在/home/your path
目录下获取carla文件,这里默认下载的是最新版本carla,当时默认下载了0.9.13,和UE4.24不匹配,害我所有功夫都白费了。
手动进入carla0.9.11下载压缩包,并解压到/home/your path
目录下,修改文件夹名为carla
进入carla文件夹路径:cd ~/carla
运行./Update.sh
(为了下载content文件,速度可能会很慢,可以连接热点)
添加UE4的工作路径sudo gedit ~/.bashrc
将export UE4_ROOT=~/UnrealEngine_4.24
加入到.bashrc文件里
保存并退出,执行source ~/.bashrc
安装carla的最后一步,就是运行make指令,第一次使用,要先运行make PythonAPI,加载相应的模块。
如果你是用python3,那么可以直接执行make PythonAPI
,默认是执行make PythonAPI.3的
如果需要用Python2,系统默认的是python2.7,执行make PythonAPI ARGS="--python-version=2"
一般只需要make PythonAPI就行了。
这里遇到的几个问题:
①.网速慢,生成的Build文件夹下文件,链接总是失败,一次又一次尝试。切换到热点就解决了
②. make PythonAPI执行一半,提示了找不到git库,无法下载(截图没存),但是网上找都会说使用git init
就可以解决。一定不要用该方法!!!!,只会越陷越深。这里提供我的.git文件,复制到carla/目录下就行了。(如果我还没有附加百度云链接,说明还在上传,请等待更新,有点大)
③. make PythonAPI过程中的error,提示fatal error: 'pyconfig.h' file not found
,在该命令行执行:
export CPLUS_INCLUDE_PATH=/home/your anaconda path/include/python3.7m
如果没有创建anaconda,就用系统自带的python,版本根据自己的去改
export CPLUS_INCLUDE_PATH=/usr/include/python3.6m
④.再次执行make PythonAPI就可以了,成功之后,Build文件夹应该已经完毕,同时生成PythonAPI/carla/dist/文件夹,下面有egg文件,我的是生成了carla-0.9.11-py3.6-linux-x86_64.egg
,如果需要py3.7的,可以直接复制并粘贴修改文件名为carla-0.9.11-py3.7-linux-x86_64.egg
,因为后续OpenCDA要用,而且没有出现问题。如果使用了make PythonAPI ARGS="--python-version=2"
,会生成carla-0.9.11-py2.7-linux-x86_64.egg
文件。
执行make launch
,第一次执行会比较慢,如果成功会弹出carla0.9.11的界面,首次打开会有教程。点击Play/播放,才相当于真正启动carla服务器。
如果出现BuildCarlaUE4.sh: ERROR: UE4_ROOT is not defined, or points to a non-existant directory, please set this environment variable.
的问题,首先检查UE4文件及是否存在,以及是否将UE4的环境变量加到bashrc文件里,如果还是不行,在Carla/Util/BuildTools/BuildCarlaUE4.sh
的首行加入 UE4_ROOT=~/UnrealEngine_4.24
在终端测试,如果成功,会在carla服务器中加载人/车/动态天气
# Terminal A
cd PythonAPI/examples
python3 spawn_npc.py
# Terminal B
cd PythonAPI/examples
python3 dynamic_weather.py
至此,carla问题告一段落。期间碰到的问题主要还是网络不佳,以及版本不匹配问题。
首先还是先下载OpenCDA:
git clone https://github.com/ucla-mobility/OpenCDA.git
cd OpenCDA
安装一些依赖,推荐使用Anaconda3,可以创建虚拟环境,各种依赖也都配置到虚拟环境里。这样也省的又把系统自带的Python给玩坏了。在上一步进入OpenCDA的工作目录下,执行以下命令:
conda env create -f environment.yml
conda activate opencda
python setup.py develop
至此会成功创建名为opencda的虚拟环境。如果环境创建完成,但是通过environment.yml创建的依赖有失败的情况,执行:pip install -r requirements.txt
依赖完成后,需要将carla的库加入到opencda环境中。还是将以下指令加入到.bashrc文件中,并source:
export CARLA_HOME=/path/to/your/CARLA_ROOT
export CARLA_VERSION=0.9.11
./setup.sh
如果一切顺利的话,setup.sh之后会显示Successful Setup! 为了检查是否真的成功,可以运行python -c "import carla"
,如果没有出错,则ok。
注意:
setup.sh主要还是为了在opencda虚拟环境中导入carla库,使该虚拟环境下的python可以直接运行import carla。如果该指令最后失败了,打开.sh文件,按照代码,哪一步出错可以自己操作。同时,如果不利用虚拟环境下的python,为了方便直接运行import carla,按照叶小飞提供的教程,自己写一个setup.py来创建。
为了方便OpenCDA与ros关联(其实就是carla和ros关联),这一步也是必不可少的。最主要的还是踩到坑了,又是因为默认的git下载是最新版本不匹配的问题。
如果要使用carla-ros-bridge,那么make PythonAPI ARGS="--python-version=2"
是必不可少的了。和之前一样的步骤。
还是使用源来安装carla-ros-bridge,进入网页,手动下载ros-bridge-0.9.11.zip。同时单独下载其中的carla-msg,并生成.zip。后续会用。
我知道下面命令行中如果使用rosdep update你一定会失败,解决方法参看这里,也就是先执行:sudo pip install rosdepc
安装rosdepc,然后将所有的rosdep改为rosdepc
mkdir -p ~/carla-ros-bridge/catkin_ws/src
#将下载好的ros-bridge放在src下并:
cd /carla-ros-bridge/catkin_ws/src
ln -s ../../ros-bridge
source /opt/ros/melodic/setup.bash # 注意,这里是 ROS melodic
cd ..
sudo rosdepc init
rosdepc update
rosdepc install --from-paths src --ignore-src -r
catkin_make
我遇到的错误:
在catkin_make的时候,提示:
CMake Error at /home/k/carla-ros-bridge/catkin_ws/build/ros-bridge/carla_ackermann_msgs/cmake/carla_ackermann_msgs-genmsg.cmake:3 (message):
Could not find messages which
'/home/k/carla-ros-bridge/catkin_ws/src/ros-bridge/carla_ackermann_msgs/msg/EgoVehicleControlInfo.msg'
depends on. Did you forget to specify generate_messages(DEPENDENCIES ...)?
Cannot locate message [CarlaEgoVehicleControl] in package [carla_msgs] with
paths
[['/home/k/carla-ros-bridge/catkin_ws/src/ros-bridge/carla_msgs/msg']]
Call Stack (most recent call first):
/opt/ros/melodic/share/genmsg/cmake/genmsg-extras.cmake:307 (include)
ros-bridge/carla_ackermann_msgs/CMakeLists.txt:21 (generate_messages)
-- Configuring incomplete, errors occurred!
See also "/home/k/carla-ros-bridge/catkin_ws/build/CMakeFiles/CMakeOutput.log".
See also "/home/k/carla-ros-bridge/catkin_ws/build/CMakeFiles/CMakeError.log".
Invoking "cmake" failed
原因是刚刚下载的ros-bridge包中的carla-msg,不知道为什么是空的,所以刚刚单独下载了carla-msg.zip,解压后把文件都复制进去,就好了。
在rosdepc update如果提示:也不用管它,不影响。
ERROR: Not all sources were able to be updated.
[[[
ERROR: unable to process source [https://gitee.com/ohhuo/rosdistro/raw/master/releases/fuerte.yaml]:
Failed to download target platform data for gbpdistro:
]]]
以上这些工作都完成之后,就可以运行carla-ros-bridge了:
简单粗暴运行make launch
启动carla
执行:source ~/carla-ros-bridge/catkin_ws/devel/setup.bash
(当然该指令也可以加到.bashrc文件中,但是官网提示可能会与在另一个工作空间中工作时产生冲突,我就没加。大不了每次执行前都运行一次该source)
执行export PYTHONPATH=$PYTHONPATH:~/carla/PythonAPI/carla/dist/carla-0.9.11-py3.7-linux-x86_64.egg
启动carla-ros-bridge:roslaunch carla_ros_bridge carla_ros_bridge.launch
,在此之前,保证在其它终端运行了roscore
,且carla已经运行,并点击了play播放按键。在其它终端中执行rostopic list,可以看到包含carla的节点:
启动carla-ros-bridge的launch文件时,遇到的问题:
ModuleNotFoundError: No module named ‘transforms3d’
ModuleNotFoundError: No module named ‘rospkg’
解决方法是,在激活了opencda虚拟环境的终端中,执行:
pip install rospkg
pip install transforms3d
ImportError: dynamic module does not define module export function (PyInit__tf2)
主要是因为,tf、tf2_ros等包是依赖于python2的,但是我运行该launch文件,就是依赖于python3的,我也搞不明白为什么了,就强行在python3下安装了tf。详情见该链接和这个:
sudo apt update
sudo apt install python3-catkin-pkg-modules python3-rospkg-modules python3-empy
#准备一个catkin工作空间,因为都叫catkin_ws,我就把它和ros-bridge放同一个目录下了
mkdir -p ~/catkin_ws/src; cd ~/catkin_ws
catkin_make
source devel/setup.bash
wstool init
wstool set -y src/geometry2 --git https://github.com/ros/geometry2 -v 0.6.5
wstool up
rosdep install --from-paths src --ignore-src -y -r
#最后用Python3编译
catkin_make --cmake-args \
-DCMAKE_BUILD_TYPE=Release \
-DPYTHON_EXECUTABLE=/usr/bin/python3 \
-DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \
-DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so
至此编译通过后,ros和carla终于也连接到了一起!
完结撒花!可以好好工作了!