SMARTS 创建场景以及 Bubble

王 茂南 2023年4月27日07:08:36
评论
4251字阅读14分10秒
摘要本文会着重介绍如何在 SMARTS 中来创建环境,以及通过 Bubble 的概念,只控制指定区域的 Agent。

简介

本文是对 SMARTS 的进阶使用,包含使用 SMARTS 来创建我们想要的场景。这些场景内可以包含「背景交通流」,「Social Agent」,「Ego Agent」等。同时对于一些场景,我们只希望在某些区域对 Agent 来进行控制,那么我们可以利用 Bubble 的概念。其中 Bubble 可以是固定位置的,也可以是移动位置的。

关于 SMARTS 的基础使用,可以参考 SMARTS 快速上手使用

参考资料

 

气泡(Bubbles)

SMARTS 提供了时空气泡(Bubble)的概念,允许集中模拟交互。气泡旨在解决交互规模的问题(如果仿真场景较大,是很耗费资源的)。例如自动驾驶车辆最重要的行为位于该车辆附近,则全局使用资源会导致模拟资源浪费。

气泡覆盖一个区域并过滤通过该区域的交通车辆。进入气泡的车辆将首先进入 airlock 缓冲区,Agent 可以开始从车辆进行观察。当车辆进入气泡本身时,Bubble Agent 可以完全接管该车辆的控制。当其控制的车辆离开气泡和气闸区域时,气泡 Agent 将把其控制权交给合适的交通提供者。

这部分的官方文档为,SMARTS-Bubble 介绍

 

存在的问题

如果从交通历史数据集中提供轨迹的车辆被气泡内的代理接管,则车辆通常无法在气泡退出时返回到历史数据集中指定的轨迹,而不会出现“跳跃”或“故障”,因为车辆状态与气泡内的历史存在分歧的多种情况。 因此,简单的 SMARTS 流量提供程序此时会控制它,并尝试将其导航到原始目的地,避免沿途发生碰撞。

 

固定气泡(Fixed bubbles)

我们可以将 Bubble 放在特定的 edge 上或是特定的位置,并且为这个 Bubble 指定一个 Agent(当有其他 actor 进入 Bubble 之后,会使用 Bubble 内的 Actor 对其进行接管)。

下面是一个 Fixed Bubbles 的例子。我们为其指定 actor,也就是进入 Bubble 内的车辆会使用这个 actor 控制。接着将这个 Bubble 固定在 Edge ID=E3,第 0laneoffset=5 的位置。margin 是指可以获得 obs 的范围。但是在这个范围内是不能控制的。

  1. fix_bubble_actor = t.SocialAgentActor(
  2.     name="keep-left-with-speed-agent",
  3.     agent_locator="zoo.policies:keep-left-with-speed-agent-v0",
  4. )
  5. fix_bubble = t.Bubble(
  6.     # Edge snapped bubble
  7.     zone=t.MapZone(start=("E3", 0, 5), length=5, n_lanes=1),
  8.     # Margin is an area where agents get observations but not control
  9.     margin=2,
  10.     # Agent actor information
  11.     actor=fix_bubble_actor,
  12. )

 

移动气泡(Dynamic Bubbles)

除了可以将 Bubble 放在固定的位置,还可以将其放在移动的 Actor 上面。例如我们将其放在 Social Actor 上面,这样 Bubble 可以跟随车辆移动。

  1. moving_bubble = [t.Bubble(
  2.         zone=t.PositionalZone(pos=(0, 0), size=(5, 5)),
  3.         margin=3,
  4.         actor=t.SocialAgentActor(
  5.             name=f"move-bubble-actor",
  6.             agent_locator="zoo.policies:keep-lane-agent-v0",
  7.         ),
  8.         # The target of the bubble to follow the given actor
  9.         follow_actor_id=t.Bubble.to_actor_id(_social_actor, mission_group=f"general_{i}"),
  10.         # The offset from the target actor's vehicle(aligned with that vehicle's orientation)
  11.         follow_offset=(0, 0),
  12.     ) for i,_social_actor in enumerate(social_actor)
  13. ]

上面 Fixed Bubbles 和 Moving Bubbles 的最终效果如下:

SMARTS 创建场景以及 Bubble

 

场景构建(Scenario Studio)

这部分主要内容来自,SMARTS-Scenario Studio。SMARTS 中的 Scenario Studio sstudio 支持创建灵活,不同的场景。一个场景是由下面的几个部分组成的:

  • road map,地图
  • traffic,车流(背景车辆,可以由 SUMO 进行控制)
  • social agent,由一些预先定义的策略进行控制
  • ego agent,自己训练策略并进行控制
  • friction patches,摩擦区域(车辆进入这个区域后,行驶逻辑会变得不一样)

SMARTS 中创建场景主要有下面的几个流程:

  • 1. 创建 scenario.py 文件和文件夹
  • 2. 使用 netedit 来设计路网
  • 3. 添加 traffic, social agent, ego agent, friction patches
  • 4. 将添加的场景加入 gen_scenario
  • 5. 运行下面的命令进行生成 scl scenario build --clean ./new_scenario
  • 6. 对生成的结果进行可视化

 

Traffic 的构建

Traffic 是只背景车辆。下面我们首先定义这个 Actor 的属性(速度),接着创建 Flow,指定开始和结束的时间,和使用的 Actor。

  1. traffic_actor = t.TrafficActor(
  2.     name="car",
  3.     speed=t.Distribution(sigma=0.2, mean=0.8),
  4. # 定义交通参与者
  5. traffic = t.Traffic(
  6.     engine="SUMO",
  7.     flows=[
  8.         t.Flow(
  9.             route=t.RandomRoute(),
  10.             begin=0,
  11.             end=60*60,  # Flow lasts for 10 hours.
  12.             rate=10, # Vehicles per hour
  13.             actors={traffic_actor: 1},
  14.         )
  15.         for i in range(3) # 车的数量
  16.     ],
  17. )

需要注意的是,上面一共会有 3 辆车。

 

Social Agent

Social Agent 是指由预先定义的策略控制的 Agent。可以使用的策略可以在 zoo.policies 中找到。下面是一个定义 Social Agent 的例子:

  1. social_actor = [
  2.         t.SocialAgentActor(
  3.             name=f"keep-lane-agent-{i}",
  4.             agent_locator="zoo.policies:keep-lane-agent-v0",
  5.         ) for i in range(3)
  6.     ]
  7. social_mission = [t.Mission(route=t.RandomRoute()) for _ in range(3)]
  8. social_dict = {
  9.     f"general_{i}": ([_actor], [_mission])
  10.     for i, (_actor, _mission) in enumerate(zip(social_actor, social_mission))
  11. }

我们不仅要定义 Social Agent 的策略,还需要为其定义 route,并且为每一个 Agent 起一个名字。

 

Friction Patches

SMARTS 的还允许生成摩擦斑块(Friction Patches),可以单独为 Ego Agent 或 Social Agent 生成不同的摩擦。当车辆行驶到指定区域时候,对应的运动学会发生改变。当我们运行 gen_scenario() 并传入摩擦图时,将在输出目录下创建一个“friction_map.pkl”文件。

  1. friction_patches = [
  2.     t.RoadSurfacePatch(
  3.         zone=t.PositionalZone(pos=(153, -100), size=(2000, 6000)),
  4.         begin_time=0,
  5.         end_time=300,
  6.         friction_coefficient=0.9,
  7.     ), # 不同的摩擦系数会影响车辆的行驶
  8. ]

 

Road Map

我们可以直接使用 Netedit 来创建路网,并将路网和 scenario.py 放在一个文件夹内。一切准备完毕之后,就可以来生成对应的场景了。

将 traffic,social_agent_missions,friction_maps,bubbles 都放在 gen_scenario 里面,从而进行场景的生成。

  1. gen_scenario(
  2.     scenario=t.Scenario(
  3.         traffic={"basic": traffic},
  4.         social_agent_missions=social_dict,
  5.         ego_missions=ego_missions,
  6.         friction_maps=friction_patches,
  7.         bubbles=[fix_bubble, ] + moving_bubble,
  8.     ),
  9.     output_dir=Path(__file__).parent,
  10. )

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2023年4月27日07:08:36
  • 转载请务必保留本文链接:https://mathpretty.com/16108.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: