CARLA 0.9 版本 Python API Tutorial 翻譯

Carla 0.9.4

Carla windows版本下載 目前只有0.9.3和0.9.4 支持windows版本且均是dev版本
需要下載Anoconda並且用Anoconda prompt來打開CarlaUE4 然後打開 python文件
python版本要3.7 不然就無法識別.egg文件 也無法識別到carla模塊
本文檔是在Carla官網中可以找到,並且對應的是最新版本的api,即Carla 0.9.4

幾個核心的概念

Actor: 是能夠在模擬中四處移動的模型,如交通工具、行人、感應器等等
Blueprint:在生成Actor之前你需要喜歡它的屬性,這就是藍圖的用處。我們提供了對於所有Actor定義有效的藍圖庫
World:世界表示了目前載入的地圖並且包含了能夠將藍圖轉化爲actor的函數。它也提供了對於道路的接口以及改變天氣的函數

連接以及獲得世界

爲了連接到模擬器我們需要創建一個Client對象,所以我們需要一個IP地址以及運行模擬器的端口

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

在創建了client之後最首先應該做的就是設置timed-out 超時時長,如果沒有被設置,在網絡異常的情況下會被永遠地阻塞

client.set_timeout(10.0) # seconds

一旦我們配置好了Client 我們就可以獲得世界

world = client.get_world()

理論上來說 接下來我們就不需要client 這個對象了,所有我們創建的對象都會自動地連接到IP和端口之上,而這一過程是對用戶透明的

藍圖

藍圖包含了創建一個任務所必須的信息。比如,如果一個藍圖定義了車輛,那我們就可以在它之上修改其顏色。如果它定義了雷達,那我們可以定義這個雷達包含多少的頻道。藍圖也擁有唯一確定其身份的ID以及其創造的Actor(在我看來 blueprint就是class actor就是object)

blueprint_library = world.get_blueprint_library()

library 允許我們通過特定的ID找到藍圖、通過通配符或者隨機地選取一個

# Find specific blueprint. 
collision_sensor_bp = blueprint_library.find('sensor.other.collision') 
# Chose a vehicle blueprint at random. 
vehicle_bp = random.choice(blueprint_library.filter('vehicle.bmw.*'))

藍圖的一些屬性是可以被修改的然而某些屬性是隻讀的,比如,我們無法改變交通工具的車輪數量但是可以改變其顏色

vehicles = blueprint_library.filter('vehicle.*') bikes = [x for x in vehicles if int(x.get_attribute('number_of_wheels')) == 2]
for bike in bikes:
     bike.set_attribute('color', '255,0,0')

可修改的參數中也存在着推薦的參數屬性
藍圖系統使得使用者更容易地在虛擬編輯器中定製他們想要的人物

生成人物

一旦我們定義好了藍圖,生成人物是十分方便的

transform = Transform(Location(x=230, y=195, z=40), Rotation(yaw=180)) 
actor = world.spawn_actor(blueprint, transform)

生成人物的函數有兩種,spawn_actor以及try_spawn_actor.前者會在人物無法生成的時候提出異常,而後者會返回一個None 生成失敗最常見的錯誤就是在出生點的碰撞,也就是說人物是無法在我們選擇的地址生成的,或許有另外一個物體在我們想要的生成點。

爲了簡化找到生成點的人物,map物體提供了一系列推薦生成點

spawn_points = world.get_map().get_spawn_points()

最後,生成函數有可選的參數,這個參數可以控制是否讓一個人物連接到另外一個人物身上,這個對於傳感器特別管用。在以下的例子中,攝像頭一個連接在我們的車輛之上

camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle)

操控人物

一旦我們在世界上有了人物,那我們可以讓人物四處移動並且檢查它的動態屬性

location = actor.get_location() 
location.z += 10.0 
actor.set_location(location)
print(actor.get_acceleration())
print(actor.get_velocity())

我們甚至能夠通過關閉一個人物的物理模擬從而使人物暫停

actor.set_stimulate_physics(False)

一旦我們不想要一個人物了,我們可以將其移出

actor.destory()

爲了提高執行效率,大部分的操作都是向模擬器異步地發出請求,但是每一幀能夠處理的方法是有限的,如果我們調用了太多的set方法,那麼就會有一個明顯的延遲即lag

交通工具

交通工具是一種提供了額外方法的人物,出了對於人物通用的處理方法,交通工具也能通過提供油門,剎車,方向盤的數據進行控制

vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
carla.VehicleControl( 
     throttle = 0.0 
     steer = 0.0
     brake = 0.0 
     hand_brake = False 
     reverse = False 
     manual_gear_shift = False 
     gear = 0)

以上是VehicleControl的屬性以及默認值
另外,車輛的物理屬性也可以被調整

vehicle.apply_physics_control(carla.VehiclePhysicsControl(max_rpm = 5000.0, center_of_mass = carla.Vector3D(0.0, 0.0, 0.0), torque_curve=[[0,400],[5000,400]]))
#torque --- 扭轉力

以上是通過VehiclePhysicsControl這個對象來控制的
如果想要對每個車輪進行控制 可以通過WheelPhysicsContril來控制

carla.VehiclePhysicsControl( 
 torque_curve,                     #torque_curve:表示汽車引擎在特定轉速下的扭轉力
 max_rpm,                            #max_rpm:汽車引擎每分鐘的最大旋轉數
 moi,                                       #moi:汽車引擎的轉動慣量
 damping_rate_full_throttle,   #damping_rate_full_throttle:油門加滿時候的阻尼速率?
 damping_rate_zero_throttle_clutch_engaged,     #damping_rate_zero_throttle_clutch_engaged:當油門爲0而離合器接合時候的阻尼速率
 damping_rate_zero_throttle_clutch_disengaged, 
 use_gear_autobox,
 gear_switch_time, 
 clutch_strength, 
 mass, drag_coefficient, 
 center_of_mass, steering_curve, 
 wheels)                                #wheels:關於WheelPhysicsControl的物體列表 一般有二輪或者四輪的

carla.WheelPhysicsControl(
 tire_friction, 
 damping_rate,
 steer_angle,
 disable_steering)

也可以爲車輛設置自動駕駛

vehicle.set_autopilot(True)

很多人可能有這樣的錯覺就是我們的自動駕駛是基於機器學習技術的,其實不然,我們需要澄清我們的自動駕駛是完全基於硬編碼。
最後,車輛有封裝他們的bounding box

box = vehicle.bounding_box 
print(box.location) # Location relative to the vehicle.
print(box.extent) # XYZ half-box extents in meters.

傳感器

除了交通工具和傳感器,在世界中還有其他的物體。可以通過world.get_actors()方法獲得
在這些actors當中,你還可以獲得
Traffic lights:有着state屬性來指示當前的狀態
Speed limit signs:它的速度標誌是其type_id之中
Spectator:作爲整個窗口的視角

改變天氣

燈光效果和天氣狀況可以通過世界這個物體來請求和改變

weather = carla.WeatherParameters( 
     cloudyness=80.0, 
     precipitation=30.0, 
     sun_altitude_angle=70.0) 
 world.set_weather(weather)
 print(world.get_weather())

爲了方便,我們有一系列提前定好的天氣

world.set_Weather(carla.WeatherParameters,WetCloudySunset)

地圖和航圖基準點(waypoints)

Carla的一個特點就是我們的道路是完全註釋的。我們也提供了更高層次的API來查詢和引導這個數據
首先,我們要獲得當前世界的道路

map = world.get_map()

該地圖有着name的屬性,與當前載入的城市相符合Town01.我們也可以通過map.get_spawn_point()函數獲得map推薦的生成點
然而,航圖基準點纔是map API中最強大的武器。我們可以讓map給我一個道路上最接近我們車輛的道路基準點

wap_point = map.get_waypoint(vehicle.get_location())

這個對象是處在可行駛的車道上,他的朝向是該店的道路方向。
(在我看來就是道路上的一個個點,比如一條路上可能有十個點,如果交叉路口也是一個點)
Waypoints也包含一個next函數,這個函數返回距離當前點一定的距離的可以根據交通規則訪問到的點的列表。也就是說,如果一個車輛處於該點,那麼該函數就給出了該點可以到達的可能目標

# Retrieve the closest waypoint.
waypoint = map.get_waypoint(vehicle.get_location()) 
# Disable physics, in this example we're just teleporting the vehicle. 
vehicle.set_simulate_physics(False)
while True:
# Find next waypoint 2 meters ahead. 
 waypoint = random.choice(waypoint.next(2.0)) 
# Teleport the vehicle.
vehicle.set_transform(waypoint.transform)

map對象提供了生成大量在一定範圍內的waypoints的方法

waypoint_list = map.generate_waypoints(2.0)

對於路由的目的,我們可以獲取道路的拓撲圖

waypoint_tuple_list  = map.get_topology()

該方法返回了一個數組,數組中的每個元素是一個元祖,一個元祖包含兩個元素,第一個元素和第二個相互連接,該生成方法包含了最小生成樹,每個道路也只包含一個基準點

錄像以及重播系統

Carla包含了一個錄像和重播API,這使得我們可以把我們的模擬記錄到一個文件當中,然後再之後重播這段模擬,這個文件只能在服務器端寫,(如果server和client在一個電腦上當我沒說),文件記錄了對象生成和摧毀的過程以及交通信號燈的狀態以及所有車輛和行人的方向和位置
所有的數據都寫在服務器端的一個二進制文件當中,在CarlaUE4/Saved.據估計,一個包含50個紅綠燈和100個車輛的一小時錄像佔大約200MB的空間

開啓錄像我們只需要提供一個文件名

client.start_recording("recording01.log")

關閉錄像

client.stop_recorder()

在任何時候我們可以重播

client.replay_file("recording01.log")
``
當我們重播時,有一些可選的參數,完整API如下
```python
client.replay_file("recording01.log",start,duration,camera)

如果想要知道錄像的細節,使用以下API

client.show_recorder_file_info("recording01.log")

client.show_recorder.collisions(“recording01.log”,“a”,“a”) //會顯示所有被記錄的碰撞
a a: 會顯示所有被記錄的碰撞
v v: 會顯示所有的交通工具之間的碰撞
v t: 會顯示交通工具和信號燈的碰撞
v w: 會顯示交通工具和行人的碰撞
v o: 會顯示交通工具和其他物體之間的碰撞,比如靜態的房屋等等
h w: 會顯示主物體和行人的碰撞

第一個物體就是hero actor
可以通過文件的記錄來replay當時碰撞的情形,只需要將start提前一些進行播放即可

有一些寫好的可以使用錄像和重播系統的py文件

最後關於錄製系統的翻譯就稍微偷偷懶了,各位看官們就去看看原文檔吧,目前這一部分還不怎麼需要用到,很多地方都是直譯,請諒解!

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