CARLA 笔记(05)— Actors and blueprints(创建和修改 Blueprint、生成 Spawning、使用 Handling、销毁 Destruction)
創立了世界之后,就要開始安放我們的主角 actor了。Actor 翻譯為演員,在仿真世界里則代表可以移動的物體,包括交通標志、交通信號燈、視角、汽車,傳感器(因為傳感器要安在車身上)以及行人。
1. Blueprints
要創建 Actor,首先需要提供要創建的 Actor 的類型,不同的類型會有不同的屬性,比如一臺車,它可以是不同的型號,可以是不同的顏色, 外觀不同,可以通過油門和方向盤來控制,而如果是一個傳感器,它可能都沒有這些任何一個屬性,因此創建一個 Actor 需要知道這些信息,也就是類似于需要使用一個模板,這個東西在 Carla 中叫做藍圖,即 Blueprints,Carla 中已經內置了一個藍圖庫,里邊包含了許多不同的 Actors 。
這些布局允許用戶將新的 Actor 順利加入仿真。 它們是帶有動畫和一系列屬性的已制作模型。 其中一些是可修改的,而另一些則不能。 這些屬性包括車輛顏色、激光雷達傳感器中的通道數量、步行者的速度等等。
carla.BlueprintLibrary類包含一個 carla.ActorBlueprint 元素列表。 world對象可以提供對它的訪問。
# 拿到這個世界所有物體的藍圖 blueprint_library = world.get_blueprint_library()blueprint 有一個 ID 來識別它們以及由此產生的 Actor。 可以讀取該庫以查找特定 ID、隨機選擇 blueprint 或使用通配符模式過濾結果。
# 從浩瀚如海的藍圖中找到奔馳的藍圖 ego_vehicle_bp = blueprint_library.find('vehicle.mercedes-benz.coupe') # 給我們的車加上特定的顏色 ego_vehicle_bp.set_attribute('color', '0, 0, 0')# 找到一個碰撞藍圖 collision_sensor_bp = blueprint_library.find('sensor.other.collision') # Choose a vehicle blueprint at random. # 使用 `filter` 方法然后給定模糊匹配的方法獲取到多個藍圖 vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))在 find 里找到添加的東西,建議打開網頁然后 CTRL+F ,然后搜索關鍵字,比如:
除此之外,每個 carla.ActorBlueprint 都有一系列 carla.ActorAttribute 可以 get 和 set。
is_bike = [vehicle.get_attribute('number_of_wheels') == 2] if(is_bike):vehicle.set_attribute('color', '255,0,0')有些屬性不能修改。在 藍圖庫 中查看一下。
屬性有一個 carla.ActorAttributeType 變量。 它從枚舉列表中聲明其類型。 此外,可修改屬性帶有推薦值列表。
for attr in blueprint:if attr.is_modifiable:blueprint.set_attribute(attr.id, random.choice(attr.recommended_values))2. Actor life cycle
一個 Actor 可以被生成(Spawning),使用(Handling),以及銷毀(Destruction)。
- 生成:有了藍圖之后,意味著我們有了模板,然后就需要使用這個模板生成一個或者多個演員(Actor),這一過程叫做 Spawning ,因為 Actor 是在世界中存在的一個物體,因此在生成的時候,需要告訴環境它的出生點在哪里。
- 使用:當 Actor 生成以后,就可以通過客戶端來控制它的一些行為,比如可以讓車子跑起來,并控制它的油門和轉向。
- 銷毀:當我們不在需要一個 Actor 的時候可以選擇銷毀它,這樣可以釋放仿真環境的資源,讓環境運行更順暢。
2.1 Spawning
構建好藍圖以后,下一步便是選定它的出生點。不過上邊提到,在生成 Actor 的時候,需要告訴世界它的出生點在哪里,出生點在 Carla 中抽象為 carla.Transform 。
world 對象負責生成 actors 并跟蹤它們,生成 actors 只需要一個 blueprint 和一個 carla.Transform,說明 actor 的位置和旋轉角。
world 有兩種不同的方法來產生 Actors:
- spawn_actor() 如果生成失敗會引發異常。
- try_spawn_actor() 如果生成失敗將返回 None。
比如,我們可以用下邊這段代碼,指定將 Actor 生成到某一個地點。
transform = Transform(Location(x=230, y=195, z=40), Rotation(yaw=180)) actor = world.spawn_actor(blueprint, transform)CARLA uses the Unreal Engine coordinates system. Remember that carla.Rotation constructor is defined as (pitch, yaw, roll), that differs from Unreal Engine Editor (roll, pitch, yaw).
或者賦予隨機的位置,不過這個位置必須是空的位置,因為物體在世界中是有體積的,所以有可能你指定的地點上已經有其他物體了,比如,該位置已經有臺車子,或者該位置是一個建筑物,這種情況下,Actor 被生成的時候就會出現碰撞,為了避免這個問題,Carla 提供了一個接口可以獲取到所有空的出生點,只要在這些空的出生點上生成 Actor 就不會出現碰撞的問題了。
如果在指定位置發生碰撞,actor 將不會生成。 無論這發生在靜態對象還是其他 Actor身上。 可以嘗試避免這些不希望的產碰撞產生。
- map.get_spawn_points() 對于車輛,返回推薦的生成點列表
- world.get_random_location() 對于步行者。 返回人行道上的隨機點。 同樣的方法用于為步行者設置目標位置。
一個 actor 在生成時可以附加到另一個 actor 上。 Actor 跟隨他們所依附的 Actor。 這對傳感器特別有用。 附件可以是剛性的(適合檢索精確數據),也可以根據其父項輕松移動。 它由助手類 carla.AttachmentType 定義。
將攝像頭固定在車輛上,因此它們的相對位置保持固定。
camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle, carla.AttachmentType.Rigid)注意:When spawning attached actors, the transform provided must be relative to the parent actor.
生成后,world 對象會將 Actor 添加到列表中。 這可以很容易地搜索或迭代。
actor_list = world.get_actors() # Find an actor by id.actor = actor_list.find(id) # Print the location of all the speed limit signs in the world. for speed_sign in actor_list.filter('traffic.speed_limit.*'):print(speed_sign.get_location())2.2 Handling
當 Actor 被生成以后,生成方法會返回被生成的 Actor 對象,我們可以使用該對象控制 Actor 的行為。比如,我們可以隨意挪動它的初始位置,定義它的動態參數等等,根據不同的 Actor 類型,可以控制的參數也不一樣。
carla.Actor 主要由 get() 和 set()方法組成,用于管理地圖周圍的 Actor。
print(actor.get_acceleration()) print(actor.get_velocity())location = actor.get_location() location.z += 10.0 actor.set_location(location)可以禁用演員的物理特性以將其凍結在適當的位置。
# 我們可以甚至在中途將這輛車“凍住”,通過抹殺它的物理仿真 actor.set_simulate_physics(False)除此之外,Actor 也有他們的 blueprint 藍圖提供的標簽。 這些對語義分割傳感器最有用。
大多數方法都以異步方式向仿真器發送請求。每次更新時,仿真器解析它們的時間有限。用 set() 方法充斥仿真器會積累大量的延遲。
2.3 Destruction
當 Python 腳本完成時,Actor 不會被自動銷毀。 必須明確地摧毀自己。
destroyed = actor.destroy() # Returns True if successful最后如果我們不需要生成的 actor 之后,我們可以用代碼把原來生成的車輛關閉,語句如下:
finally:for actor in actor_list:actor.destroy()銷毀一個 actor 將阻塞仿真器,直到進程完成。
command 有一些最常見的 CARLA 方法的適配,也可以批量應用。例如,命令 SetAutopilot 等同于vehicle.set_autopilot() ,啟用車輛的自動駕駛。也可以使用批量的 Client 方法。
# 如果你有多個 Actor 存在 list 里,可以一起銷毀。 client.apply_batch([carla.command.DestroyActor(x) for x in actor_list])當執行多個腳本文件的時候,服務器是不會自動清理掉上一個腳本生成的 actor 的,所以需要手動清除。
總結
以上是生活随笔為你收集整理的CARLA 笔记(05)— Actors and blueprints(创建和修改 Blueprint、生成 Spawning、使用 Handling、销毁 Destruction)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过ajax单独上传图片
- 下一篇: Atlassian Bamboo 安装