Carla 是一個開源的自動駕駛模擬器,環境基於 Unreal Engine 4 開發,包含 C++ 和 Python 全部開放接口。
以 Carla 仿真環境為核心構建的仿真生態鏈逐步支持各種自動駕駛仿真標准或規則,比如支持 OpenDrive 和 OpenScenario 標准,支持 Responsibility Sensitive Safety(RSS)
核心主要有:
世界和客戶端
演員和藍圖
地圖和導航
傳感器和數據
一、World 和 client
客戶端(Client)是用戶在模擬中運行來請求信息或更改的模塊
客戶端使用一個IP和一個特定的端口(port)運行。通過終端與服務器通信,連接到世界,然后使用模擬進行操作(控制車輛和仿真世界)。可以同時運行多個客戶端
客戶端創建
client = carla.Client('localhost', 2000)
創建客戶端后,設置時間,超過這個時間,視為連接失敗,返回錯誤
client.set_timeout(10.0) # seconds
世界(World)代表模擬的仿真世界。它充當一個抽象層,包含生成actor(spawn actors)、更改天氣(change the weather)、獲取當前世界狀態(state of the world)等主要方法。
每個模擬只有一個世界。當地圖改變時,它將被銷毀並替換為新的
連接當前世界
world = client.get_world()
連接指定世界
world = client.load_world('Town01')
每個世界對象都有一個id或情節,每次客戶端調用load_world()或reload_world()前一個被銷毀
二、Actor 和 blueprints
藍圖(blueprint)是一個准備好的actor 模型,可用於生產actor(spawn actor)。
生成汽車,有模型、形狀
路人有相應的模型,比如老人 小孩
傳感器,比如有RGB傳感器和雷達傳感器
基本上,模型具有動畫(animation)和一組屬性(attribute)。有些屬性可以由用戶自定義,有些則不能。
可用的藍圖及其屬性列在藍圖庫中。車輛和步行者藍圖有一個世代屬性,指示它們是新的(第 2 代)還是舊的(第 1 代)資產
管理藍圖庫
carla.BlueprintLibrary類包含一個carla.ActorBlueprint元素列表,world對象可以進行訪問
blueprint_library = world.get_blueprint_library()
藍圖有一個 ID 來識別它們以及由此產生的演員
可以讀取該庫以查找某個 ID,隨機選擇一個藍圖,或使用過通配符模式濾結果
# 找到具體的藍圖 collision_sensor_bp = blueprint_library.find('sensor.other.collision') # 隨機選擇車輛藍圖 vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))
演員(Actor )是一些角色,比如無人車(Vehicles)、傳感器(Sensors)、行人(Walkers)、觀眾(spectator)、傳感器(Sensors)、交通標志和交通信號燈(Traffic signs and traffic lights)
演員生命周期:
1、產卵
世界對象負責生成actors並跟蹤它們,生成只需要一個藍圖和一個carla.Transform,說明 actor 的位置和旋轉。
有兩種不同的方法來產生演員
- spawn_actor()如果生成失敗,則引發異常。
- try_spawn_actor()None如果生成失敗則返回
transform = Transform(Location(x=230, y=195, z=40), Rotation(yaw=180)) actor = world.spawn_actor(blueprint, transform)
如果在指定位置發生碰撞,actor 將不會生成。無論這發生在靜態對象還是其他演員身上
map.get_spawn_points() 對於車輛。
返回推薦的生成點列表
spawn_points = world.get_map().get_spawn_points()
world.get_random_location() 對於步行者
返回人行道上的隨機點。同樣的方法用於為步行者設置目標位置
spawn_point = carla.Transform() spawn_point.location = world.get_random_location_from_navigation()
一個actor在生成時可以附加到另一個actor上。演員跟隨他們所依附的父母。這對傳感器特別有用
示例將攝像頭固定在車輛上,因此它們的相對位置保持固定
camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle, carla.AttachmentType.Rigid)
當產生附加的actors時,提供的變換必須是相對於父actors的
生成后,世界對象會將演員添加到列表中
actor_list = world.get_actors() # 按id查找演員 actor = actor_list.find(id) # 打印世界上所有限速標志的位置 for speed_sign in actor_list.filter('traffic.speed_limit.*'): print(speed_sign.get_location())
2、處理
carla.Actor主要由get()和set()方法組成,用於管理地圖周圍的演員
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)
3、破壞
當 Python 腳本完成時,Actor 不會被銷毀。他們必須明確地摧毀自己
destroyed_sucessfully = actor.destroy() # 如果成功,則返回True
演員的類型:
1、傳感器
傳感器是產生數據流的參與者
此示例生成一個攝像頭傳感器,將其附加到車輛上,並告訴攝像頭將生成的圖像保存到磁盤
camera_bp = blueprint_library.find('sensor.camera.rgb') camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle) camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))
- 傳感器也有藍圖。設置屬性至關重要
- 大多數傳感器將連接到車輛上以收集有關其周圍環境的信息
- 傳感器監聽數據。當接收到數據時,它們調用一個用Lambda 表達式 描述的函數
2、觀眾
由虛幻引擎放置以提供游戲內視角。它可以用來移動模擬器窗口的視圖
示例將移動旁觀者演員,以將視線指向所需的車輛
spectator = world.get_spectator() transform = vehicle.get_transform() spectator.set_transform(carla.Transform(transform.location + carla.Location(z=50), carla.Rotation(pitch=-90)))
3、交通標志和交通燈
在 CARLA 中,只有停靠點、讓路和紅綠燈被認為是演員。其余的 OpenDRIVE 標志可通過 API 作為carla.Landmark 訪問
使用 OpenDRIVE 文件中的信息自動生成模擬開始、停止、產量和交通信號燈。這些都無法在藍圖庫中找到,因此無法生成
道路地圖本身並未定義交通標志,如下頁所述。相反,他們有一個carla.BoundingBox來影響其中的車輛
#讓交通信號燈影響車輛 if vehicle_actor.is_at_traffic_light(): traffic_light = vehicle_actor.get_traffic_light()
交通信號燈出現在路口。與任何參與者一樣,他們有自己的唯一 ID,但也有group路口的 ID。為了識別同一組中的交通燈,pole使用了一個 ID
/* 同一組中的紅綠燈遵循一個循環。第一個設置為綠色,而其余的則保持為紅色。活躍的在綠色、黃色和紅色上花費幾秒鍾,所以有一段時間所有的燈都是紅色的。然后,下一個紅綠燈開始循環,前一個紅綠燈與其他紅綠燈一起凍 */
4、汽車
carla.Vehicle是一種特殊類型的演員。它包含模擬輪式車輛物理特性的特殊內部組件
carla.VehicleControl為油門、轉向、剎車等駕駛命令提供輸入
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
carla.VehiclePhysicsControl定義了車輛的物理屬性並包含另外兩個控制器
- carla.GearPhysicsControl控制齒輪
- carla.WheelPhysicsControl提供對每個車輪的特定控制
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]]))
5、步行者
carla.Walker的工作方式與車輛類似。對它們的控制由控制器提供
- carla.WalkerControl以一定的方向和速度移動行人。它還允許他們跳躍
-
carla.WalkerBoneControl提供對 3D 骨架的控制。本教程解釋了如何控制它
步行者可以由人工智能控制。他們沒有自動駕駛模式。carla.WalkerAIController Actor 圍繞它所連接的 Actor 移動
walker_controller_bp = world.get_blueprint_library().find('controller.ai.walker') world.SpawnActor(walker_controller_bp, carla.Transform(), parent_walker)
三、Map 和 navigation
地圖(Map)是模擬世界的對象,主要是城鎮。有七種地圖可供選擇。它們都使用OpenDRIVE 1.4 standard(一種道路規范標准,就像lanelet2)來描述道路
更改地圖
要改變地圖,世界也必須改變,可以在新世界中使用同一張地圖重新開始,也可以同時更改地圖和世界
- reload_world()使用相同的地圖創建世界的新實例
- load_world()更改當前地圖並創建一個新世界
每張地圖都有一個name與當前加載的城市名稱相匹配的屬性,例如Town01
world = client.load_world('Town01')
要獲取可用地圖的列表
print(client.get_available_maps())
導航(navigation)Carla中的導航包括道路(roads)、車道(lans)和路口(junctions)由Python API管理,可以從客戶端訪問。它們與waypoint類一起用於為車輛提供導航路徑
客戶端必須首先與服務器通信以檢索包含航點信息的地圖對象
通過航點導航:
Waypoint API 公開了一些方法,這些方法允許路點相互連接並沿着道路構建路徑供車輛導航
- next(d)在車道 的方向上創建一個近似距離內的航點d列表。該列表包含每個可能偏差的一個航路點
- previous(d)在車道的相反方向上d創建一個近似距離內的航點列表。該列表包含每個可能偏差的一個航路點
- next_until_lane_end(d)並previous_until_lane_start(d)返回d相距一定距離的航路點列表。這些列表分別從當前航路點到其車道的終點和起點
- get_right_lane()並get_left_lane()返回相鄰車道中的等效航路點(如果存在)。可以通過在其右/左車道上找到下一個航路點並移動到該航路點來進行變道操作
# 在前方2米處找到下一個航路點 waypoint = waypoint.next(2.0)
生成地圖導航:
客戶端需要向服務器發出請求以獲取.xodr地圖文件並將其解析為carla.Map對象。這只需要執行一次
獲取地圖對象
map = world.get_map()
地圖對象包含用於創建車輛的推薦生成點。您可以使用以下方法獲取這些生成點的列表,每個生成點都包含一個carla.Transform
生成點可能已經被占用,導致由於碰撞而無法創建車輛
spawn_points = world.get_map().get_spawn_points()
通過獲取到特定位置或特定位置的最近航點以及地圖 OpenDRIVE 定義中的值road_id來開始使用航點:lane_ids
# 車道或人行道中心最近的航路點 waypoint01 = map.get_waypoint(vehicle.get_location(),project_to_road=True, lane_type=(carla.LaneType.Driving | carla.LaneType.Sidewalk)) #最近的航路點,但指定OpenDRIVE參數. waypoint02 = map.get_waypoint_xodr(road_id,lane_id,s)
四、Sensor 和 data
傳感器(sensor)等待某個事件(event)發生,然后從模擬中收集數據。它們調用一個定義如何管理數據的函數。根據不同的類型,傳感器檢索(retrieve)不同類型的傳感器數據
傳感器是一個附加(attract to)在車輛(vehicle)上的行為體(actor)。它跟隨車輛四處移動,收集周圍環境的信息。Blueprint library 中定義了不同類型的傳感器