本文記錄了如何在 Ubuntu Linux 26.04 LTS 環境下,搭配虛幻引擎 Unreal Engine 4,編譯與安裝 CARLA 開源自動駕駛模擬器,感謝 Yi-Chen Zhang 技術指導。

CARLA 是一套開放原始碼的自動駕駛模擬器,可以用來開發、訓練與驗證自動駕駛系統。由於目前 CARLA 官方對於 Ubuntu Linux 的支援只涵蓋了 Ubuntu Linux 20.04 與 22.04 兩個版本,因此這裡參考了 Yi-Chen Zhang 的文件 來進行 Ubuntu Linux 下的 CARLA 的編譯與安裝。

準備編譯環境

這裡我們編譯與執行環境採用 Ubuntu Linux 26.04,從官方建議的 Ubuntu Linux 22.04 安裝套件清單中,把 g++-12 改成 g++-15,另外將 Ubuntu Linux 26.04 預設裝好的 gcc-16 移除:

# 安裝必要套件
sudo apt-get install build-essential g++-15 cmake ninja-build libvulkan1 \
    python3 python3-dev python3-pip python3-venv autoconf wget curl \
    rsync unzip git git-lfs libpng-dev libtiff5-dev libjpeg-dev

# 移除 gcc-16
sudo apt remove gcc-16

另外再安裝一些編譯與打包 CARLA Python API 會用到的 Python 套件:

# 安裝必要的 Python 套件
sudo apt install python3-auditwheel python3-build python3-distro \
    python3-packaging python3-pyelftools python3-setuptools python3-wheel

在自己的家目錄下建立一個 CARLA 目錄,未來所有 CARLA 相關的東西都會放在這裡面。

# 建立 CARLA 專案目錄
mkdir ~/CARLA

下載與編譯 Unreal Engine 4

依照 Unreal Engine 官方的說明,將自己的 GitHub 帳號與 Unreal Engine 的帳號連結之後,再加入 GitHub 的 Epic Games,加入之後才能用自己的 GitHub 帳號下載 Unreal Engine 原始程式碼。而使用 git 下載之前,要先設定好 GitHub 的 SSH 金鑰

接著使用 git 下載經過 CARLA 修改過的 Unreal Engine 4 原始碼,並進行編譯,這個版本有配合 CARLA 加入一些修補(patches):

# 進入自訂的 CARLA 專案目錄
cd ~/CARLA

# 下載 Unreal Engine 原始碼
git clone --depth 1 -b carla [email protected]:CarlaUnreal/UnrealEngine.git

# 編譯 Unreal Engine
cd UnrealEngine
./Setup.sh && ./GenerateProjectFiles.sh && make

編譯完成後,進行基本測試:

# 測試 Unreal Engine
cd Engine/Binaries/Linux/
./UE4Editor

第一次開啟時,會進行 shader 的編譯,編譯完之後即可看到 Unreal Project Browser 視窗:

Unreal Project Browser

Unreal Project Browser

隨意選擇一種專案,測試一下看看是否可以正常開啟。

Unreal Engine Editor

Unreal Engine Editor

若執行過程中沒出現什麼當機或是錯誤訊息,基本上就算是編譯完成了。

UE4_ROOT 環境變數寫進 ~/.bashrc 中,讓每次登入時可以自動生效:

# 設定 UE4_ROOT 環境變數
echo "export UE4_ROOT=~/CARLA/UnrealEngine" >> ~/.bashrc
source ~/.bashrc

下載 CARLA 原始碼

使用 git 下載 ue4-dev 分支的 CARLA 原始程式碼:

# 進入自訂的 CARLA 專案目錄
cd ~/CARLA

# 下載 ue4-dev 分支的 CARLA 原始碼
git clone -b ue4-dev [email protected]:carla-simulator/carla.git

設定 CARLA_UE4_ROOT 環境變數,指定 CARLA 的放置路徑,這個變數之後會持續使用。

# 設定 CARLA 目錄環境變數
export CARLA_UE4_ROOT=~/CARLA/carla

CARLA 需要搭配大量的 3D 物件,例如地圖、車輛、行人等,這些資料要從其他的套件庫下載。

# 下載額外的 3D 物件
git clone -b master https://bitbucket.org/carla-simulator/carla-content \
    ${CARLA_UE4_ROOT}/Unreal/CarlaUE4/Content/Carla

編譯 CarlaUE4Editor

加入 Yi-Chen Zhang 提供的修補後,編譯 CarlaUE4Editor,並加入 ROS 2 的支援:

cd ~/CARLA/carla

# 加入 Yi-Chen Zhang 提供的修補
sed -i '11a #include <cstdint>' Build/libosm2dr-source/src/foreign/zstr/zstr.hpp

# 編譯 CarlaUE4Editor
make CarlaUE4Editor ARGS="--ros2"

這裡加入的 --ros2 參數在執行 make 的時候會傳給每一個 target,有一些不支援 --ros2 參數的指令稿會出現不支援此參數的錯誤,基本上若沒有明顯的錯誤,應該是可以忽略。

編譯 CARLA Python API 套件

依據 Yi-Chen Zhang 提供的建議修正編譯器連結參數,讓連結可以正常執行:

# 依據 Yi-Chen Zhang 提供的建議,修正編譯器連結參數
export LDSHARED="${CARLA_UE4_ROOT}/Build/clang.sh -shared"

# 編譯 Python API
make PythonAPI

編譯完成後會產生一個 Python Wheel 套件檔案,放在 ${CARLA_UE4_ROOT}/PythonAPI/carla/dist 目錄之下,其檔案名稱會因為 CARLA 與 Python 的版本而有不同。接著使用 pip 安裝這個產生出來的 Python 套件:

# 安裝 CARLA 的 Python API 套件
pip3 install ${CARLA_UE4_ROOT}/PythonAPI/carla/dist/carla-0.9.16-cp314-cp314-linux_x86_64.whl

編譯與啟動 CARLA 伺服器

以下這行指令會編譯並啟動 CARLA 伺服器與 Unreal Engine 編輯器:

# 編譯並啟動 CARLA 伺服器與 Unreal Engine 編輯器
make launch ARGS="--ros2"

第一次啟動 Unreal Engine 的編輯器時會因為 shader 與 mesh distance fields 等因素產生一些警告,而且需要等比較久,第二次之後就會比較好了。

啟動 Unreal Engine 的編輯器之後,按下 Play 按鈕即可開始進行模擬,鏡頭可以透過 WASD 這幾個按鍵來移動,而滑鼠則可以用來轉動鏡頭角度。

同時我們可以另外開啟兩個終端機,執行範例中的兩個 Python 指令稿,加入車流與天氣變化。

# 終端機 A:加入車流
cd ${CARLA_UE4_ROOT}/PythonAPI/examples
python3 -m pip install -r requirements.txt
python3 generate_traffic.py

# 終端機 B:加入天氣變化
cd ${CARLA_UE4_ROOT}/PythonAPI/examples
python3 dynamic_weather.py

在 Unreal Engine 的編輯器畫面上就可以看到一些車子與行人在上頭跑,天氣也會有各種變化。

CARLA Unreal Engine 編輯器

CARLA Unreal Engine 編輯器

建立 CARLA 封裝版

執行 Util/BuildTools/Package.sh 建立 CARLA 封裝版:

# 建立 CARLA 封裝版
cd ${CARLA_UE4_ROOT}
./Util/BuildTools/Package.sh
Package.sh: Copying extra files to package Carla took 0 seconds.
Package.sh: Packaging CARLA release.
Package.sh: Archiving and compressing the project took 1785543376 seconds.
Package.sh: Cooking all other packages took 0 seconds.
Package.sh: Overall packaging took 3598 seconds.
Package.sh: CARLA release created at /home/gtwang/CARLA/carla/Dist/CARLA_edf3e9f5c.tar.gz
Package.sh: Success!

這裡產生的 CARLA_edf3e9f5c.tar.gz 壓縮檔就是封裝好的 CARLA,可以布署到其他地方,而解開之後執行其中的 CarlaUE4.sh 就可以啟動 CARLA 伺服器:

# 執行封裝版的 CARLA 伺服器
${CARLA_UE4_ROOT}/Dist/CARLA_Shipping_edf3e9f5c/LinuxNoEditor/CarlaUE4.sh --ros2
封裝版 CARLA 伺服器

封裝版 CARLA 伺服器

檢查 CARLA 是否正常有支援 ROS 2:

# 檢查 ROS 2 是否正常有支援
source /opt/ros/lyrical/setup.bash
ros2 topic list
/carla/map
/clock
/parameter_events
/rosout

有出現 /carla/map 就代表 CARLA 有正常支援 ROS 2。