自动驾驶车辆导航,基于新航点的API,地图创建等

2020-12-16  本文已影响0人  KangSmit的算法那些事儿

对于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.sqrt(impulse.x**2 + impulse.y**2 + impulse.z**2)
        self._history.append((event.frame_number, intensity))
        ...

在这个例子中,我们将接收的消息的每个所述时间parent_actor(车辆)崩溃针对场景的其它演员,说明其类型大小的影响。该传感器还报告与地图的静态元素(例如交通标志,墙壁,交通信号灯,人行道等)的碰撞。

sensor.other.lane_detector现在可以使用新的传感器来检测车道变化。新的CARLA地图更加复杂,包含多车道的道路。在这种情况下,重要的是要检测车辆何时改变车道,确定车辆已越过哪种类型的车道标记以及目标车道的方向是什么。请参见下面的代码示例:

class LaneInvasionSensor(object):
    def __init__(self, parent_actor, hud):
        self.sensor = None
        self._parent = parent_actor
        self._hud = hud
        world = self._parent.get_world()
        bp = world.get_blueprint_library().find('sensor.other.lane_detector')
        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: LaneInvasionSensor._on_invasion(weak_self, event))

    @staticmethod
    def _on_invasion(weak_self, event):
        self = weak_self()
        if not self:
            return
        text = ['%r' % str(x).split()[-1] for x in set(event.crossed_lane_markings)]
        self._hud.notification('Crossed line %s' % ' and '.join(text))

地图和航点表示

现在可以通过Map类访问公路网的高级表示。借助地图对象,我们可以获取建议的车辆生成点(可以安全地实例化新对象的地方):

map.get_spawn_points()

通过新的航点查询API,这也使从客户端驱动变得非常容易。在下面的代码中,我们获得与角色的当前位置关联的航路点。

w = map.get_waypoint(location)

用户还可以生成指定距离内的航路点:

 map.generate_waypoints(distance)

总体而言,用户可以利用这些新功能来创建自己的导航算法:

client = carla.Client(args.host, args.port)
client.set_timeout(2.0)

hud = HUD(args.width, args.height)
world = World(client.get_world(), hud)
world.vehicle.set_simulate_physics(False)

m = world.world.get_map()
w = m.get_waypoint(world.vehicle.get_location())

clock = pygame.time.Clock()
count = 0
while True:
    clock.tick_busy_loop(60)
    world.tick(clock)
    world.render(display)
    pygame.display.flip()
    if count % 10 == 0:
        nexts = list(w.next(1.0))
        print('Next(1.0) --> %d waypoints' % len(nexts))
        if not nexts:
            raise RuntimeError("No more waypoints!")
        w = random.choice(nexts)
        text = "road id = %d, lane id = %d, transform = %s"
        print(text % (w.road_id, w.lane_id, w.transform))
        if count % 40 == 0:
            draw_waypoints(world.world, w)
            count = 0
        t = w.transform
        world.vehicle.set_transform(t)
    count += 1

以下的航点

图1.使用新的Waypoint类即时生成的航点

用于半自动地图生成的管道

此版本最令人兴奋的功能之一就是与使用外部工具创建的新地图的兼容性。我们希望用户在CARLA中轻松创建自己的地图。为此,我们采用了OpenDrive作为我们的地图定义标准。使用众所周知的标准可减少创建与CARLA模拟器兼容的新内容所需的工作。

我们一直与VectorZero紧密合作,以确保RoadRunner和CARLA之间的完全兼容性。凭借强大的程序生成引擎,RoadRunner是一种只需单击几下即可生成复杂驾驶地图的工具。最好的是,它还会生成与3D地图关联的OpenDrive文件,因此RoadRunner生成的地图可以直接在CARLA中使用,并具有当前城镇可用的所有功能。

VectorZero已承诺向要求它的学者免费授予将RoadRunner用于学术和研究目的的许可。因此,请访问他们的网站以获得许可证并开始构建自己的地图!

image.png

图2. RoadRunner场景示例

缺少的东西

这些功能将很快添加。我们将在以后的版本中继续改进此API。如果您发现任何问题或可以添加的建议,请随时在我们的GitHubDiscord chat与社区共享。有关可用方法的完整列表,请参阅《Python API参考》

非常感谢我们所有的支持者和赞助者使这个项目成为现实。祝1年快乐CARLA!


完整变更清单

上一篇 下一篇

猜你喜欢

热点阅读