錄像機(jī)
crala的這個(gè)特性使得可以使用它來記錄或者復(fù)現(xiàn)之前的仿真場景,所有發(fā)生的事件都被記錄在recoder file之中。
recording 記錄
所有的數(shù)據(jù)都寫在服務(wù)器端的二進(jìn)制文件里,但recoder是通過carla.client來管理的。
重要 直至回訪截止,車輛都會(huì)被設(shè)置成自動(dòng)駕駛模式,但是行人會(huì)停止。
recoder file 包括了與“角色”相關(guān)的信息:
- “角色”的創(chuàng)建和毀滅
- 交通燈的狀態(tài)變換
- 車輛和行人的位置和角度
要開始recorder的話,你只需要指定路徑和文件名就可以了,如果不指定的話,文件會(huì)默認(rèn)存放在CarlaUE4/Saved
client.start_recorder("/home/carla/recording01.log")
停止recorder也很簡單粗暴:
client.stop_recorder()
注意 估計(jì)來說,50個(gè)交通燈和100輛車記錄一個(gè)小時(shí)大概需要200M的磁盤空間。
仿真回放
回放可以在仿真過程中的任何時(shí)間開啟,除了需要log file的路徑外,這種方法也需要一些其他參數(shù)。
client.replay_file("recording01.log", start, duration, camera)
| 參數(shù) | 描述 | 注意 |
|---|---|---|
start |
記錄開始仿真的時(shí)間,單位為秒 | 如果為正值,從記錄的開始算起,如果單位為負(fù)值,則從記錄的結(jié)束往前算 |
duration |
回放的時(shí)長,0則是代表整個(gè)全部 | 直至回訪截止,車輛都會(huì)被設(shè)置成自動(dòng)駕駛模式,但是行人會(huì)停止。 |
camera |
攝像頭會(huì)聚焦的“角色”ID | 設(shè)置為0可以讓監(jiān)視器自由移動(dòng) |
設(shè)置時(shí)間元素 time factor
time factor會(huì)決定回訪的速度,它可以在不停止回復(fù)的情況下隨時(shí)進(jìn)行更改。
client.set_replayer_time_factor(2.0)
| 參數(shù) | 默認(rèn) | 最快 | 最慢 |
|---|---|---|---|
time_factor |
1.0 | >1.0 | <1.0 |
重要 如果time_factor>2.0,“角色”的位置插值是不可用的,并只能更新。行人的的動(dòng)畫則不受time factor的影響。

錄像文件
記錄的細(xì)節(jié)可以通過使用簡單的API調(diào)用來檢索,默認(rèn)的話,只檢索注冊(cè)了事件的幀,將參數(shù)設(shè)定為show_all會(huì)返回所有幀的所有信息。關(guān)于存儲(chǔ)數(shù)據(jù)的細(xì)節(jié)請(qǐng)參閱這里.
# Show info for relevant frames
print(client.show_recorder_file_info("recording01.log"))
- **Opening information ** 地圖、數(shù)據(jù)和仿真被記錄的時(shí)間
- Frame information 任何可能發(fā)生的事件,例如“角色”的產(chǎn)生或碰撞。它包含了“角色”的ID和附加信息。
- Closing information 幀數(shù)和記錄的所有時(shí)間。
Version: 1
Map: Town05
Date: 02/21/19 10:46:20
Frame 1 at 0 seconds
Create 2190: spectator (0) at (-260, -200, 382.001)
Create 2191: traffic.traffic_light (3) at (4255, 10020, 0)
Create 2192: traffic.traffic_light (3) at (4025, 7860, 0)
...
Create 2258: traffic.speed_limit.90 (0) at (21651.7, -1347.59, 15)
Create 2259: traffic.speed_limit.90 (0) at (5357, 21457.1, 15)
Frame 2 at 0.0254253 seconds
Create 2276: vehicle.mini.cooperst (1) at (4347.63, -8409.51, 120)
number_of_wheels = 4
object_type =
color = 255,241,0
role_name = autopilot
...
Frame 2350 at 60.2805 seconds
Destroy 2276
Frame 2351 at 60.3057 seconds
Destroy 2277
...
Frames: 2354
Duration: 60.3753 seconds
Queries 查詢
碰撞
車輛必須有與之綁定的collision dectector來記錄碰撞。這是可以被查詢的,使用參數(shù)可以過濾碰撞相關(guān)“角色”的類型,例如:h確定role_name = hero的“角色”,通常與用戶管理的車輛是相關(guān)的。下面是一些查詢可用的具體的“角色”類型設(shè)置。
- h = Hero
- v = Vehicle
- w = Walker
- t = Traffic light
- o = Other
-
a = Any
注意manual_sontrol.py腳本為ego車輛指定了role_name = hero.
碰撞查詢需要2個(gè)參數(shù)來過濾碰撞,寫面的示例將展示車輛之間和其他任何物體的碰撞。
print(client.show_recorder_collisions("recording01.log", "v", "a"))
輸出總結(jié)了碰撞的時(shí)間、類型、ID以及相關(guān)“角色”的描述。
Version: 1
Map: Town05
Date: 02/19/19 15:36:08
Time Types Id Actor 1 Id Actor 2
16 v v 122 vehicle.yamaha.yzf 118 vehicle.dodge_charger.police
27 v o 122 vehicle.yamaha.yzf 0
Frames: 790
Duration: 46 seconds
重要 由于是hero或ego來注冊(cè)碰撞,所以它通常會(huì)是Actor 1。
碰撞可以通過使用recorder并設(shè)定時(shí)間發(fā)生前的時(shí)間來復(fù)現(xiàn)。
client.replay_file("col2.log", 13, 0, 122)
在本案例中,回放如下。

Blocked actor 被堵“角色”
檢測記錄中車輛的擁堵,“角色”的擁堵是用過在一定時(shí)間下沒有移動(dòng)超過一定距離來定義的。這種定義使用者可以在查詢時(shí)來決定。
print(client.show_recorder_actors_blocked("recording01.log", min_time, min_distance))
| Parameter | 描述 | 默認(rèn) |
|---|---|---|
min_time |
移動(dòng)最小距離的最小時(shí)間 | 30s |
min_distance |
不被認(rèn)為是擁堵所需移動(dòng)的最小距離 | 10cm |
注意 有些時(shí)候車倆在紅綠等前的等待時(shí)間可能比預(yù)期要久,也可能會(huì)被認(rèn)為是擁堵。
下面的例子假設(shè)車輛在60s內(nèi)移動(dòng)不超過1m即為擁堵。
client.show_recorder_actors_blocked("col3.log", 60, 100)
輸出是按持續(xù)時(shí)間來分類的,即是車輛在擁堵狀態(tài)下移動(dòng)最小距離耗費(fèi)的時(shí)間。
Version: 1
Map: Town05
Date: 02/19/19 15:45:01
Time Id Actor Duration
36 173 vehicle.nissan.patrol 336
75 214 vehicle.chevrolet.impala 295
302 143 vehicle.bmw.grandtourer 67
Frames: 6985
Duration: 374 seconds
173車輛在36秒時(shí)停止了336秒,可以通過復(fù)現(xiàn)36秒之前的一些時(shí)間來進(jìn)行回放。
client.replay_file("col3.log", 34, 0, 173)

python腳本示例
官方在PythonAPI/examples路徑下提供了一些腳本,可以幫助recorder的使用。
- start_recording.py 可以啟動(dòng)recorder,記錄的持續(xù)時(shí)間可以被設(shè)置,并且可以在開始的時(shí)候產(chǎn)生“角色”。
| 參數(shù) | 描述 |
|---|---|
-f |
文件名稱 |
-n(可選) |
產(chǎn)生車輛,默認(rèn)是10 |
-t(可選) |
記錄持續(xù)的時(shí)間 |
- start_replaying.py 啟動(dòng)記錄的回放,開始時(shí)間、持續(xù)時(shí)間、追蹤的“角色”都可以設(shè)定。
| 參數(shù) | 描述 |
|---|---|
-f |
文件名稱 |
-s(可選) |
開始時(shí)間,默認(rèn)是10 |
-d(可選) |
持續(xù)時(shí)間,默認(rèn)是全部 |
-c(可選) |
追逐“角色”的ID |
- show_recorder_file_info.py 展示記錄文件的所有信息,默認(rèn)情況下只顯示有記錄事件的幀,但是也可以顯示所有幀。
| 參數(shù) | 描述 |
|---|---|
-f |
文件名稱 |
-s(可選) |
顯示所有細(xì)節(jié)的標(biāo)志 |
-
show_recorder_collisions.py 展示A和B類型“角色”的標(biāo)記的碰撞,
-t = vv會(huì)顯示車輛間的所有碰撞。
| 參數(shù) | 描述 |
|---|---|
-f |
文件名稱 |
-t |
涉及的“角色”的標(biāo)記h = hero |
v = vehiclew = walkert = traffic lighto = othera = any |
- show_recorder_actors_blocked.py 展示被認(rèn)為是擁堵的車輛,車輛在一定時(shí)間內(nèi)沒有移動(dòng)超過一定距離就被認(rèn)定為擁堵。
| 參數(shù) | 描述 |
|---|---|
-f |
文件名稱 |
-t(可選) |
在被認(rèn)為是擁堵前的時(shí)間 |
-d(可選) |
不被認(rèn)為是擁堵所需移動(dòng)的距離 |
后話
現(xiàn)在是時(shí)候進(jìn)行一下實(shí)驗(yàn)了,使用recorder去回放一個(gè)仿真過程,追蹤發(fā)生的時(shí)間,并試著修改一下源碼看下效果,有神馬問題都可以去carla的論壇提問。