CARLA and OpenDrive -【Python 學習筆記】

接續先前對高精地圖 HD Map 概念性的介紹,本篇會介紹在自駕模擬器 CARLA中,針對 OpenDrive 格式的 HD Map 操作。

可以先從之前的文章 High level 了解 Map & HD Map,再從本篇了解基於 CARLA 自駕模擬器的環境,對 OpenDrive 高精地圖的相關實做方法。

https://mapostech.com/hd-map/

CARLA

CARLA是已經發展數年,相當成熟的一款自動駕駛模擬器,背後的合作企業有 Intel、Nvidia 及 Toyota 等等。場景有高架道路、市區、停車場等,還有交通規則與號誌、天氣條件等,讓使用者在各種環境下測試自己的演算法。其實有玩過 GTA 俠盜列車手的人,可以把它當作一款沒有人的版本…。

詳細的說明可以參考官網:

官網

User Guide

安裝的話,我是透過 Anaconda 的 Python 來執行,跟本地環境做區隔。 Anaconda 的安裝很簡單,就不多贅述,裝好以後,在 Terminal conda 環境下先安裝 Python 3.7 跟相關的軟件包:

conda create -n py37 python=3.7    
conda activate py37
pip install numpy
pip install pygame

Carla的安裝可以參考上面Carla Documentation 的網頁,照著步驟說明安裝,就沒有問題。

裝好以後,在 Terminal 執行CarlaUE4.exe , 我有遇到 dirextX 問題,去微軟官網下載安裝就可解決。成功運行就會看下面畫面:

CARLA

接著再另外開一個 Terminal,在這邊輸入想做的操作,例如執行 sample code automatic_control.py。要注意這邊要先在 conda 環境下啟動 python。

conda activate py37
python automatic_control.py
conda activate py37

參考資料:

https://blog.csdn.net/fhzhu830/article/details/120614040

HD Map in CARLA

安裝好之後,可以在 HDMaps 路徑下找到內建的地圖檔案,以 Town + 編號命名的 .xodr 檔案。也可以上CARLA的 github 查閱。每個地圖有不同的環境內容,可以上Carla Documentation 網站,左邊目錄選擇 Maps ,會看到一張總表,再逐一點進去看地圖的特色介紹。

CARLA
CARLA

取得速限訊息

下面會以取得 OpenDriver 地圖中,目前車道的速限為主題,說明相關操作:

# get map
world = client.load_world('Town01')

# get map object, 這邊就是另一篇文章提到對高精地圖的物件化
map = world.get_map()

# 根據輸入的位置 (x, y, z),取得最近的 waypoint
# 注意輸入坐標要是CARLA坐標系統,與 ROS 或 UTM 可能是不同的
# ex. transform = trans.ros_pose_to_carla_transform(msg.pose.pose)
wp = carla_map.get_waypoint(transform.location)

# 根據這個 wp 與間距參數 d 生成整條車道的 waypoint list
wps_front = wp.next_until_lane_end(d) // wp 到車道終點的 list
wps = wp.previous_until_lane_start(d) // wp 到車道起點的 list
wps.reverse() // reverse 後會從車道起點開始排序
for wp0 in wps_front :
    wps.append(wp0)

# 從 landmarks type 型別中取得 wp 200m 範圍內所有的速限, ID 是 274
# 以這個例子來說,其實最終我只在意最近的速限,故取清單中的第一筆
speed_limits = wp.get_landmarks_of_type(200.0, "274", False)
if speed_lims:
    speed_limit = speed_limits[0].value

LandmarkType 中定義了許多資料類別, 速限是 MaximumSpeed , Type 274。可以參考列表,自行修改取得其他的資料。

上面使用到的Carla APIs 與地圖相關操作可以參考:

Carla地圖連結1

Carla地圖連結2

Carla坐標系統

Waypoint 的結構

其他參考資料:

https://blog.csdn.net/wohu1104/article/details/126004611

延伸應用 曲率 & 坡度

車道曲率計算:

# 把車道 wp 的 xyz 取出
for wp0 in wps:
    x.append(wp0.transform.location.x)
    y.append(wp0.transform.location.y)
    z.append(wp0.transform.location.z)
np.array(x)
np.array(y)
np.array(z)

# 對車道 (waypoint list) 曲線擬合    
curve = np.polyfit(x, y, 2)
    
# 根據當前 wp 坐標與曲線方程計算目前曲率
curvature = np.absolute(2 * curve[0]) / ((1 + (2 * curve[0] * wp.transform.location.x + curve [1])**2)**1.5)

當前坡度計算:

# 從當前 wp 到車道終點的 waypoint list 取出下一個 wp
wp_next = wps_front [0]


# 依據坡度公式計算 slop ratio
slop = (wp_next .transform.location.z - wp.transform.location.z) / ((wp_next .transform.location.x - wp.transform.location.x)**2 + (wp_next .transform.location.y - wp.transform.location.y)**2)**0.5 * 100

參考資料:

https://github.com/georgesung/advanced_lane_detection/blob/master/line_fit.py

https://x-engineer.org/road-slope-gradient-force/

上一篇:
下一篇: