CARLA 學習筆記 4:世界與客戶端

客戶端和世界是CARLA的兩個基礎概念,是控制仿真及其中執行器(actor)所必需的抽象。
本教程介紹了它們的基本定義以及如何創建它們。

原文鏈接:https://carla.readthedocs.io/en/latest/core_world/

1. 客戶端

客戶端是CARLA體系結構中的主要元素之一。 它們能連接到服務器、檢索信息和更改命令,這些操作可以通過腳本完成。 客戶端明確自己的身份,並連接到世界,然後進行仿真操作。

此外,客戶端還可以訪問 CARLA 高級模塊、高級特性,並能應用命令批處理。 這裏面我們在本節只討論命令批處理。 如果大量的執行器(Actor),這些都是有用,並且是基本的。 客戶端其餘的特性則更爲複雜,它們將在各自的頁面中以及高級特性中進行講解。

請查看Python API參考中的carla.Client,以瞭解該類的特定方法和變量。

1.1 客戶端的創建

需要兩個參數:標識它的IP地址,以及與服務器通信的兩個TCP端口。 可選的第三個參數爲工作線程的數量。 默認情況下,該值設置爲全部(0)。Code recipe 顯示了在運行腳本時如何將這些解析爲參數。
默認情況下,Carla使用本地主機IP和端口2000進行連接,但這些可以隨意更改。我們只需要設置第一個TCP端口的端口號,第二個端口爲N+1,如在下面的代碼中第二個TCP端口爲2001。

client = carla.Client('localhost', 2000)

創建客戶端後,設置其超時(time-out)。 這會限制所有網絡操作, 使它們不能一直阻塞客戶端。 如果連接失敗,將返回錯誤。

client.set_timeout(10.0) # seconds

可以連接多個客戶端,同時運行多個腳本是很常見的。 在具有高級CARLA功能(如流量管理器)的多客戶端方案中工作,通信會變得更加複雜。

注意:客戶端和服務器具有不同的libcarla模塊。 它們的版本不同會出現問題。 這裏可以使用GET_CLIENT_VERSION()GET_SERVER_VERSION()的方法來檢查。

1.2 與“世界”的連接

客戶端可以相當容易地連接和檢索當前“世界”:

world = client.get_world()

客戶端還可以獲取可用地圖列表以更改當前地圖。 這將刪除當前的“世界”,並創造一個新的“世界”。

print(client.get_available_maps())
...
world = client.load_world('Town01')
# client.reload_world() 使用相同的地圖創建世界的新實例

每個世界對象都有一個ID或 episode。 每次客戶端調用load_world()reload_world()時,前一個都會被刪除。 新的一個是從頭開始構建的。 虛幻引擎在此過程中不會重新啓動。

1.3 批處理命令

下面的命令是一些最常用的 CARLA 方法的改編,可以批量應用。 例如,command.SetAutopilot等效於Vehicle.set_autopilot(),用於啓用車輛的自動駕駛。 但是,使用方法Client.Apply_BatchClient.Apply_Batch_sync(),可以在單步仿真中應用命令列表。 對於應用於數百個元素的方法來說,這非常有用。

在下面的示例我們使用批處理刪除所有車輛列表:

client.apply_batch([carla.command.DestroyActor(x) for x in vehicles_list])

Python API 參考列出了所有可用的命令。

1.4 客戶端其他功能

客戶端的主要用途是獲取或更改世界的參數,併發布命令。 同時它還提供對一些附加功能的訪問。

  • 交通管理器: 這個模塊負責每一輛設置場景中的自動駕駛車輛,以模擬城市交通。
  • 記錄器: 使用快照記錄仿真狀態。允許重新執行以前的仿真。這聽起來和蘋果的墓碑機制有點像。

2. “世界”

個人感覺world 理解爲“場景”可能更合適一點。

仿真的主要規則。其實例可以由客戶端檢索。它不包含世界本身的模型(這是Map類的一部分), 但是大多數信息和常規設置都可以通過這個類中訪問:

  • 模擬中的對象(actors)和觀察者(spectator)
  • 藍圖庫
  • 地圖
  • 仿真設置
  • 快照
  • 天氣和燈光管理器

它的一些最重要的方法是getters,可以準確地檢索這些元素的信息或實例。 查看carla.World,瞭解更多關於它的信息。

2.2 執行器(Actors)

“世界”有不同的與執行器相關的方法,它們有不同的功能。

  • 產生演員(但不能刪除他們)
  • 讓每個執行器到仿真場景中,或者找到一個特別的執行器
  • 訪問藍圖庫
  • 訪問觀察者,即仿真的視點
  • 檢索適合產生執行器的隨機位置

生成將在下一個筆記解釋。 這需要對藍圖庫、屬性等有所瞭解。

2.3 天氣

天氣本身不是一個類,而是一組可以從“世界”訪問的參數。 參數包括太陽方向、雲量、風、霧等。 幫助類carla.WeatherParameters用於定義自定義天氣。

weather = carla.WeatherParameters(
    cloudiness=80.0,
    precipitation=30.0,
    sun_altitude_angle=70.0)

world.set_weather(weather)

print(world.get_weather())

有一些天氣預設可以直接應用於世界。 這些參數列在carla.WeatherParameters中,可以作爲枚舉進行訪問。

world.set_weather(carla.WeatherParameters.WetCloudySunset)

注意: 天氣的變化不會影響物理學性能。 它們只是攝像機可以捕捉到的視覺效果。

2.4 燈光

sun_alight_angle < 0時進入夜間模式(這被認爲是日落)。 這就是路燈和車燈變得特別重要的時候。

  • 路燈會在夜間模式開始時自動亮起。 路燈由地圖開發人員放置,並可作爲carla.Light對象進行訪問。 它們的屬性可以改變。 可以檢索carla.LightManager的實例來處理燈光組。

  • 車燈必須由用戶打開/關閉。 每輛車都在carla.VehicleLightState中列出了一組燈。 到目前爲止,並不是所有的車輛都集成了燈。 以下是在撰寫本文時可用的列表。

    • 自行車, 庫裏的自行車都有前後燈
    • 摩托車,庫裏有雅馬哈和哈雷·戴維森模特
    • 汽車,CARLA庫裏有 奧迪TT,雪佛蘭,道奇(警車),埃特龍,林肯,野馬,特斯拉3S,大衆T2和新來賓。

可以使用方法carla.Vehicle.get_light_statecarla.Vehicle.set_light_state隨時檢索和更新車輛的燈光。 它們使用二進制操作來自定義燈光設置。

# Turn on position lights
current_lights = carla.VehicleLightState.NONE
current_lights |= carla.VehicleLightState.Position
vehicle.set_light_state(current_lights)

2.5 調試

World對象將carla.DebugHelper對象作爲公共屬性。 它允許在仿真期間繪製不同的形狀。 這些可以用於跟蹤發生的事件。 下面的示例將在執行器的位置和旋轉處繪製一個紅色方框:

debug = world.debug
debug.draw_box(carla.BoundingBox(actor_snapshot.get_transform().location,carla.Vector3D(0.5,0.5,2)),actor_snapshot.get_transform().rotation, 0.05, carla.Color(255,0,0,0),0)

此示例在 code recipe 中進行了擴展,以便爲世界快照中的每個執行器繪製方框。

2.6 世界快照

包含仿真中每個執行器在某一幀的狀態,是一種帶有時間參考的靜止的世界圖像。 信息來自相同的仿真步驟,即使在異步模式下也是如此。

# Retrieve a snapshot of the world at current frame.
world_snapshot = world.get_snapshot()

一個carla.WorldSnapshot包含一個carla.Timestamp和一個carla.ActorSnapshot列表。 可以使用執行元的ID搜索執行器快照。 快照列出了出現在其中的執行器的ID

timestamp = world_snapshot.timestamp # Get the time reference 

for actor_snapshot in world_snapshot: # Get the actor and the snapshot information
    actual_actor = world.get_actor(actor_snapshot.id)
    actor_snapshot.get_transform()
    actor_snapshot.get_velocity()
    actor_snapshot.get_angular_velocity()
    actor_snapshot.get_acceleration()  

actor_snapshot = world_snapshot.find(actual_actor.id) # Get an actor's snapshot

2.7 世界的設置

世界可以訪問一些用於設置的高級配置。 這些參數確定渲染條件、仿真時間步長以及客戶端和服務器之間的同步。 可以從幫助類carla.WorldSettings訪問它們。

目前,Carla 默認以最佳的圖形質量、可變的時間步長和異步方式運行。 要進一步深入瞭解這一問題,請查看高級部分。 頁面上的同步和時間步長以及渲染選項可能是一個很好的起點。


這是對世界和客戶端對象的概括。 下一步將更仔細地研究執行器和藍圖,以賦予仿真生命。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章