Carla⾃动驾驶仿真模拟器基本概念
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 = _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 = _blueprint_library()
蓝图有⼀个 ID 来识别它们以及由此产⽣的演员
可以读取该库以查某个 ID,随机选择⼀个蓝图,或使⽤过通配符模式滤结果
# 到具体的蓝图
collision_sensor_bp = blueprint_library.find('llision')
# 随机选择车辆蓝图
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 将不会⽣成。⽆论这发⽣在静态对象还是其他演员⾝上
<_spawn_points() 对于车辆。
返回推荐的⽣成点列表
spawn_points = _map().get_spawn_points()
<_random_location() 对于步⾏者
返回⼈⾏道上的随机点。同样的⽅法⽤于为步⾏者设置⽬标位置
spawn_point = carla.Transform()
spawn_point.location = _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 = _actors()
# 按id查演员
actor = actor_list.find(id)
# 打印世界上所有限速标志的位置
for speed_sign in actor_list.filter('traffic.speed_limit.*'):
print(_location())
2、处理
carla.Actor主要由get()和set()⽅法组成,⽤于管理地图周围的演员
_acceleration())
_velocity())
location = _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('b')
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 = _spectator()
transform = _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 = _traffic_light()
交通信号灯出现在路⼝。与任何参与者⼀样,他们有⾃⼰的唯⼀ ID,但也有group路⼝的 ID。为了识别同⼀组中的交通灯,pole使⽤了⼀个 ID
/*
同⼀组中的红绿灯遵循⼀个循环。第⼀个设置为绿⾊,⽽其余的则保持为红⾊。活跃的在绿⾊、黄⾊和
红⾊上花费⼏秒钟,所以有⼀段时间所有的灯都是红⾊的。然后,下⼀个红绿灯开始循环,前⼀个红绿灯与其他红绿灯⼀起冻*/
4、汽车
carla.Vehicle是⼀种特殊类型的演员。它包含模拟轮式车辆物理特性的特殊内部组件
carla.VehicleControl为油门、转向、刹车等驾驶命令提供输⼊
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
python在线模拟器
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 = _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')
要获取可⽤地图的列表
_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 = (2.0)
⽣成地图导航:
客户端需要向服务器发出请求以获取.xodr地图⽂件并将其解析为carla.Map对象。这只需要执⾏⼀次
获取地图对象
map = _map()
地图对象包含⽤于创建车辆的推荐⽣成点。您可以使⽤以下⽅法获取这些⽣成点的列表,每个⽣成点都包含⼀个carla.Transform
⽣成点可能已经被占⽤,导致由于碰撞⽽⽆法创建车辆
spawn_points = _map().get_spawn_points()
通过获取到特定位置或特定位置的最近航点以及地图 OpenDRIVE 定义中的值road_id来开始使⽤航点:lane_ids
# 车道或⼈⾏道中⼼最近的航路点
waypoint01 = __location(),project_to_road=True, lane_type=(carla.LaneType.Driving | carla.LaneType.Sidewalk))
#最近的航路点,但指定OpenDRIVE参数.
waypoint02 = _waypoint_xodr(road_id,lane_id,s)
四、Sensor 和 data
传感器(sensor)等待某个事件(event)发⽣,然后从模拟中收集数据。它们调⽤⼀个定义如何管理数据的函数。根据不同的类型,传感器检索(retrieve)不同类型的传感器数据
传感器是⼀个附加(attract to)在车辆(vehicle)上的⾏为体(actor)。它跟随车辆四处移动,收集周围环境的信息。Blueprint library 中定义了不同类型的传感器