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 = 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 中定义了不同类型的传感器