carla-recorder录像机
录像机
crala的这个特性使得可以使用它来记录或者复现之前的仿真场景,所有发生的事件都被记录在recoder file
之中。
recording 记录
所有的数据都写在服务器端的二进制文件里,但recoder是通过carla.client来管理的。
重要 直至回访截止,车辆都会被设置成自动驾驶模式,但是行人会停止。
recoder file 包括了与“角色”相关的信息:
- “角色”的创建和毁灭
- 交通灯的状态变换
- 车辆和行人的位置和角度
要开始recorder的话,你只需要指定路径和文件名就可以了,如果不指定的话,文件会默认存放在CarlaUE4/Saved
client.start_recorder("/home/carla/recording01.log")
停止recorder也很简单粗暴:
client.stop_recorder()
注意 估计来说,50个交通灯和100辆车记录一个小时大概需要200M的磁盘空间。
仿真回放
回放可以在仿真过程中的任何时间开启,除了需要log file的路径外,这种方法也需要一些其他参数。
client.replay_file("recording01.log", start, duration, camera)
参数 | 描述 | 注意 |
---|---|---|
start |
记录开始仿真的时间,单位为秒 | 如果为正值,从记录的开始算起,如果单位为负值,则从记录的结束往前算 |
duration |
回放的时长,0则是代表整个全部 | 直至回访截止,车辆都会被设置成自动驾驶模式,但是行人会停止。 |
camera |
摄像头会聚焦的“角色”ID | 设置为0 可以让监视器自由移动 |
设置时间元素 time factor
time factor会决定回访的速度,它可以在不停止回复的情况下随时进行更改。
client.set_replayer_time_factor(2.0)
参数 | 默认 | 最快 | 最慢 |
---|---|---|---|
time_factor |
1.0 | >1.0 | <1.0 |
重要 如果time_factor>2.0
,“角色”的位置插值是不可用的,并只能更新。行人的的动画则不受time factor的影响。
录像文件
记录的细节可以通过使用简单的API调用来检索,默认的话,只检索注册了事件的帧,将参数设定为show_all
会返回所有帧的所有信息。关于存储数据的细节请参阅这里.
# Show info for relevant frames
print(client.show_recorder_file_info("recording01.log"))
- **Opening information ** 地图、数据和仿真被记录的时间
- Frame information 任何可能发生的事件,例如“角色”的产生或碰撞。它包含了“角色”的ID和附加信息。
- Closing information 帧数和记录的所有时间。
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来记录碰撞。这是可以被查询的,使用参数可以过滤碰撞相关“角色”的类型,例如:h
确定role_name = hero
的“角色”,通常与用户管理的车辆是相关的。下面是一些查询可用的具体的“角色”类型设置。
- h = Hero
- v = Vehicle
- w = Walker
- t = Traffic light
- o = Other
-
a = Any
注意manual_sontrol.py
脚本为ego车辆指定了role_name = hero
.
碰撞查询需要2个参数来过滤碰撞,写面的示例将展示车辆之间和其他任何物体的碰撞。
print(client.show_recorder_collisions("recording01.log", "v", "a"))
输出总结了碰撞的时间、类型、ID以及相关“角色”的描述。
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
来注册碰撞,所以它通常会是Actor 1
。
碰撞可以通过使用recorder并设定时间发生前的时间来复现。
client.replay_file("col2.log", 13, 0, 122)
在本案例中,回放如下。
image
Blocked actor 被堵“角色”
检测记录中车辆的拥堵,“角色”的拥堵是用过在一定时间下没有移动超过一定距离来定义的。这种定义使用者可以在查询时来决定。
print(client.show_recorder_actors_blocked("recording01.log", min_time, min_distance))
Parameter | 描述 | 默认 |
---|---|---|
min_time |
移动最小距离的最小时间 | 30s |
min_distance |
不被认为是拥堵所需移动的最小距离 | 10cm |
注意 有些时候车俩在红绿等前的等待时间可能比预期要久,也可能会被认为是拥堵。
下面的例子假设车辆在60s内移动不超过1m即为拥堵。
client.show_recorder_actors_blocked("col3.log", 60, 100)
输出是按持续时间来分类的,即是车辆在拥堵状态下移动最小距离耗费的时间。
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
秒时停止了336
秒,可以通过复现36
秒之前的一些时间来进行回放。
client.replay_file("col3.log", 34, 0, 173)
image
python脚本示例
官方在PythonAPI/examples
路径下提供了一些脚本,可以帮助recorder的使用。
- start_recording.py 可以启动recorder,记录的持续时间可以被设置,并且可以在开始的时候产生“角色”。
参数 | 描述 |
---|---|
-f |
文件名称 |
-n (可选) |
产生车辆,默认是10 |
-t (可选) |
记录持续的时间 |
- start_replaying.py 启动记录的回放,开始时间、持续时间、追踪的“角色”都可以设定。
参数 | 描述 |
---|---|
-f |
文件名称 |
-s (可选) |
开始时间,默认是10 |
-d (可选) |
持续时间,默认是全部 |
-c (可选) |
追逐“角色”的ID |
- show_recorder_file_info.py 展示记录文件的所有信息,默认情况下只显示有记录事件的帧,但是也可以显示所有帧。
参数 | 描述 |
---|---|
-f |
文件名称 |
-s (可选) |
显示所有细节的标志 |
-
show_recorder_collisions.py 展示A和B类型“角色”的标记的碰撞,
-t = vv
会显示车辆间的所有碰撞。
参数 | 描述 |
---|---|
-f |
文件名称 |
-t |
涉及的“角色”的标记h = hero |
v = vehiclew = walkert = traffic lighto = othera = any |
- show_recorder_actors_blocked.py 展示被认为是拥堵的车辆,车辆在一定时间内没有移动超过一定距离就被认定为拥堵。
参数 | 描述 |
---|---|
-f |
文件名称 |
-t (可选) |
在被认为是拥堵前的时间 |
-d (可选) |
不被认为是拥堵所需移动的距离 |
后话
现在是时候进行一下实验了,使用recorder去回放一个仿真过程,追踪发生的时间,并试着修改一下源码看下效果,有神马问题都可以去carla的论坛提问。