对于CARLA模拟器来说,这是一段漫长的旅程。该团队于2016年底开始了这一冒险活动,旨在将最先进的自动驾驶模拟器带入开源社区。我们的目标很明确:通过可访问的模拟使自动驾驶民主化,并创建一个平台,使学者和行业成员可以共享知识和结果公开。2017年11月,我们首次公开发行了CARLA。当时,该平台是一个谦虚的模拟器,围绕基于摄像机的策略学习和数据获取任务的用例构建。一个很好的起点,但还不够。因此,我们决定完全重新设计平台,以生产出更先进,更灵活的自动驾驶模拟器,并牢记以下目标:
- 用户必须能够以简单的方式创建***新的内容***(即地图,关卡)
- 用户必须能够创建复杂的***交通场景***(又名交通状况)
- 用户必须能够利用自动驾驶中使用的任何***现有传感器***
- 用户必须能够自动培训和***评估***他们的驾驶人员(驾驶人员)
- 该平台必须是***可扩展的***,即计算在不同节点之间分布
我们在过去的10个月中致力于重新设计平台以实现这些目标。0.9.0版本是此工作的初步展示,其中引入了新的CARLA API,多客户端体系结构以及可以随意控制所有仿真车辆的功能。
在此0.9.1版本中,我们添加了关键功能,以启用使用外部工具制作的新内容(地图)的摄取,以及使用基于航点和地图查询的新API轻松***导航***这些地图。为此,我们采用了OpenDrive作为CARLA道路网络格式的核心。我们的地图表示基于OpenDrive构建,从而提供了易于使用的通用导航API。我们还介绍了***Town03***,这是一个复杂的城市场景,具有多车道的道路,隧道,环形交叉路口和许多其他有趣的功能,以外部工具半自动生成的地图为例。
现在,让我们深入了解此版本的新功能,请注意,这仍然是开发版本!
驾驶模拟消息
服务器在0.8.X分支中生成的所有驾驶消息都已作为CARLA 0.9.1的传感器合并回去。这使客户能够检测到碰撞并确定车道变化。新的可以检测到与场景的静态布局和动态对象(如车辆)的碰撞sensor.other.collision
。
class CollisionSensor(object):
"""
Encapsulate sensor.other.collision messages
"""
def __init__(self, parent_actor):
self._parent = parent_actor
self._history = collections.defaultdict(int)
bp = world.get_blueprint_library().find('sensor.other.collision')
self._sensor = world.spawn_actor(bp, carla.Transform(), attach_to=self._parent)
# We need to pass the lambda a weak reference to self to avoid circular
# reference.
weak_self = weakref.ref(self)
self.sensor.listen(lambda event: CollisionSensor._on_collision(weak_self, event))
@staticmethod
def _on_collision(weak_self, event):
self = weak_self()
if not self:
return
actor_type = ' '.join(event.other_actor.type_id.replace('_', '.').title().split('.')[1:])
self._hud.notification('Collision with %r' % actor_type)
impulse = event.normal_impulse
intensity = math.sq