Skip to main content
Skip table of contents

.xosc 시나리오 파일 구조 (OpenSCENARIO 기반 포맷)

이 페이지에서는 앞서 실행해보았던 Cut-in 시나리오의 각 부분을 발췌하여 OpenSCENARIO 양식 기반의 시나리오 파일(.xosc) 구조에 대해 간단히 설명한다.

자세한 사항 및 추가 정보는 ASAM 에서 제공하는 ASAM OpenSCENARIO: User Guide 문서에서 확인할 수 있으며, 그 중 '10. Tutorial: How to create a scenario' 파트에서는 OpenSCENARIO 양식을 기반으로 NPC 차량이 EGO 차량을 추월하는 Overtake 시나리오를 작성하는 방법을 다루고 있다.

OpenSCENARIO 양식에는 정의되어 있지 않지만 Scenario Runner 에서 추가로 기능을 제공하는 요소에는 (*)로 표시하였다.

목차


시나리오 파일

MORAI SIM: Drive 에서 제공하는 V_RHT_Suburb_03 지도 상에서 동작하는 Cut-in 시나리오이다.

  • 파일 경로: MoraiLauncher_Win_Data\ScenarioRunner\${ScenarioRunner_version}\data\openscenario\V_RHT_Suburb_03\Scenario_Cut_In_1.xosc

Scenario Definition

XML
<?xml version="1.0" ?>
<OpenSCENARIO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:noNamespaceSchemaLocation="OpenScenario.xsd">
  <FileHeader author="MORAI Inc." date="2022-06-10T10:00:00" description="Cut-in example scenario"
              revMajor="1" revMinor="1"/>
  <ParameterDeclarations/>
  <CatalogLocations/>
  <RoadNetwork>
    <LogicFile filepath="MGeo"/>
  </RoadNetwork>
  <SimulatorInfo>
    <Map name="V_RHT_Suburb_03"/>
  </SimulatorInfo>

xosc 파일은 기본적으로 XML 양식을 기반으로 작성되어있다. 파일의 가장 위쪽에는 Scenario 에 대한 전반적인 정보가 서술된다.

FileHeader

시나리오 파일의 저자, 작성 일자, OpenSCENARIO 버전 등 시나리오에 대한 전반적인 정보를 포함한다. 현재 Scenario Runner 는 OpenSCEANRIO ver 1.1 과 호환된다.

ParameterDeclarations

파일 내에서 쓰일 매개변수를 지정할 수 있다. 해당 예제에는 사용되지 않았으나 아래와 같은 방법으로 활용할 수 있다. ( ASAM OpenSCENARIO: User Guide, 9.1 Parameters )

XML
<ParameterDeclarations>
  <ParameterDeclaration name="Ego_vehicle_model" parameterType="string"
                        value="2016_Hyundai_Genesis_DH" />
</ParameterDeclarations>
<Entities>
  <ScenarioObject name="Ego">
    <Vehicle name="$Ego_vehicle_model" vehicleCategory="car">
    <!-- Same with <Vehicle name="2016_Hyundai_Genesis_DH" vehicleCategory="car"> -->
    </Vehicle>
  </ScenarioObject>
</Entities>

CatalogLocations

Catalog 파일의 위치를 선언하여 시나리오 파일에서 해당 파일에 포함된 매개변수를 사용할 수 있도록 한다.

RoadNetwork

시뮬레이션이 수행될 도로에 대한 정보를 정의한다. 현재 Scenario Runner 는 MGeo 도로정보를 기반으로 동작하므로, 현재 xosc 파일의 위치를 기준으로 MGeo 파일이 포함되어있는 폴더의 이름을 기재한다. 해당 시나리오에 대응하는 MGeo 파일은 xosc 파일과 같은 위치 내에 있는 MGeo 폴더 아래에 있다.

SimulatorInfo(*)

시뮬레이션에서 로드해야하는 지도의 이름을 정의한다. Scenario Runner는 MORAI SIM: Drive 에 명시된 이름의 지도를 로드하도록 요청한다. 반드시 위의 RoadNetwork 에서 정의한 MGeo 정보와 대응되는 지도의 이름을 기재한다. 해당 시나리오는 V_RHT_Suburb_03 지도 환경에서 실행된다.

Entities

XML
<Entities>
  <ScenarioObject name="Ego">
    <Vehicle name="2016_Hyundai_Ioniq" vehicleCategory="car"/>
  </ScenarioObject>
  <ScenarioObject name="NPC_1">
    <Vehicle name="2016_Hyundai_Ioniq" vehicleCategory="car">
      <Properties>
        <Property name="check_tl" value="false"/>
      </Properties>
    </Vehicle>
  </ScenarioObject>
  <ScenarioObject name="NPC_2">
    <Vehicle name="2016_Hyundai_Ioniq" vehicleCategory="car">
      <Properties>
        <Property name="check_tl" value="false"/>
      </Properties>
    </Vehicle>
  </ScenarioObject>
</Entities>

시나리오에 등장하는 개체를 정의한다. 각각의 개체는 ScenarioObject 요소로 정의되며, Vehicle, Pedestrian, MiscellaneousObject 세 가지 타입을 제공한다. 개체가 Vehicle일 경우, Vehicle name 에는 차량의 모델명을 기재한다. NPC 차량의 경우, check_tl (tl: traffic light) 속성을 정의할 수 있는데, 이 값이 false일 경우 신호등을 무시하고 현재 차선을 기반으로 주행한다. 이 시나리오에는 총 세 대의 현대 아이오닉 차량이 등장하며, NPC 차량들은 신호를 무시하고 주행하도록 정의되어 있다.

Storyboard

XML
<Storyboard>
  <Init />
  <Story />
  <StopTrigger/>
</Storyboard>

Storyboard는 Init, Story, StopTrigger의 세 부분으로 구성되어 있다. Init 은 시뮬레이션 시작 시 초기 정보를 포함하며, 날씨, 시간, 각 차량의 위치 및 속도 등을 포함한다. Story 는 시뮬레이션 중 일어나는 사건에 대한 정보를 포함한다. StopTrigger 가 활성화될 경우 시뮬레이션을 중단하며, 그렇지 않을 경우 Story 내의 모든 사건이 종료되면 시뮬레이션이 종료된다.

Init

Global Action

XML
<Init>
  <Actions>
    <GlobalAction>
      <EnvironmentAction>
        <Environment name="Environment1">
          <TimeOfDay animation="false" dateTime="2021-07-19T12:00:00"/>
          <Weather cloudState="free">
            <Sun azimuth="0.0" elevation="1.571" intensity="1.0"/>
            <Fog visualRange="100000.0"/>
            <Precipitation precipitationIntensity="0.0" precipitationType="dry"/>
          </Weather>
          <RoadCondition frictionScaleFactor="1.0"/>
        </Environment>
      </EnvironmentAction>
    </GlobalAction>

시뮬레이션이 수행될 환경을 정의한다. OpenSCENARIO 에서는 다양한 Global action 을 정의하고 있으며, 기를 활용하여 날씨, 신호 정보, 교통 상태 등을 정의할 수 있다. 이 시나리오에서는 Environment Action을 통해 시뮬레이션 내의 시각과 날씨를 정의하고 있다. 현재 Scenario Runner에서는 맑음/흐림/비/눈 등 간단한 날씨 변화 및 아침/밤/낮 등의 간단한 조도 변화 시각효과를 제공하고 있다.

Private

XML
<Private entityRef="Ego">
  <PrivateAction>
    <LongitudinalAction>
      <SpeedAction>
        <SpeedActionTarget>
          <AbsoluteTargetSpeed value="13.88888889"/>
        </SpeedActionTarget>
        <SpeedActionDynamics dynamicsDimension="time" dynamicsShape="step" value="0"/>
      </SpeedAction>
    </LongitudinalAction>
  </PrivateAction>
  <PrivateAction>
    <TeleportAction>
      <Position>
        <WorldPosition h="104" p="0" r="0" x="550.57" y="42.166" z="0.0"/>
      </Position>
    </TeleportAction>
  </PrivateAction>
</Private>
<Private entityRef="NPC_1">
  <PrivateAction>
    <TeleportAction>
      <Position>
        <LinkPosition id="_18_0_L2_" index="60"/>
      </Position>
    </TeleportAction>
  </PrivateAction>
</Private>

Entities 에 정의된 각 요소의 초기 상태를 정의할 수 있다. Ego 차량은 초기 속도 50 km/h (13.8889 m/s), 초기 위치 ( 550.57 m, 42.17 m, 104 deg ) 상태에서 출발한다. 위치의 경우 절대 위치 대신 RoadNetwork 에 정의된 차선의 정보로도 입력할 수 있다. NPC_1 차량의 경우 _18_0_L2_ 차선의 60 번째 점에서 출발한다. (MGeo 정보 내의 각 차선은 등간격의 점으로 이루어져 있다)

Story

XML
<Story name="MyStory">
  <ParameterDeclarations/>
  <Act name="MyAct">
    <ManeuverGroup name="MyManeuverGroup" maximumExecutionCount="1" >
      <Actors selectTriggeringEntities="false">
        <EntityRef entityRef="NPC_2"/>
      </Actors>
      <Maneuver name="MyManeuver">
        <Event name="MyEvent" maximumExecutionCount="1" priority="overwrite">
          <Action name="MyAction">
            <PrivateAction>
              <LateralAction>
                <LaneChangeAction targetLaneOffset="0">
                  <LaneChangeActionDynamics dynamicsDimension="distance" dynamicsShape="cubic"
                                            value="30"/>
                  <LaneChangeTarget>
                    <RelativeTargetLane entityRef="Ego" value="0"/>
                  </LaneChangeTarget>
                </LaneChangeAction>
              </LateralAction>
            </PrivateAction>
          </Action>
          <StartTrigger />
        </Event>
      </Maneuver>
    </ManeuverGroup>
    <StartTrigger />
    <StopTrigger/>
  </Act>
</Story>

시뮬레이션 중에 발생하는 사건 및 각 사건이 활성화 되었을 때 각 개체의 동작을 정의한다. 사건 및 동작의 정의는 Story, Act, ManeuverGroup, Maneuver, Event, Action 총 여섯 가지 요소로 정의되며, 각 요소는 여러 개의 하위 요소를 포함할 수 있고, 자신보다 상위 요소가 활성화 되었을 때만 활성화 될 수 있다. 이에 대한 자세한 설명은 OpenSCENARIO의 설명을 참고한다. (ASAM OpenSCENARIO: User Guide, 8.4 Storyboard element execution ) 최종적으로 Event 요소가 자신이 갖고 있는 StartTrigger 요소에 의해 활성화 되었을 때, 그 아래에 있는 Action 요소가 활성화되어 각 개체의 동작을 제어하게 된다.

이 시나리오에는 Story, Act, ManeuverGroup, Maneuver, Event, Action 요소가 각각 하나씩 정의되어 있다. ManeuverGroup 아래에 정의된 바에 같이 NPC_2 차량이 그 하부의 Maneuver를 수행한다. (selectTriggeringEntities 옵션이 true 일 경우, 정의된 조건에 따라 해당 Maneuver를 수행할 개체를 자동으로 선택한다.) Action 은 PrivateAction 중 LaneChangeAction 으로 정의되어 있으며, 활성화 될 경우, Actors 요소에서 정의된 대로 NPC_2 차량이 차선 변경을 시도한다. 이 때 Ego 차량을 기준으로 0 번 위치의 차선, 즉 동일한 차선으로 변경하며(RelativeLane 은 부호 있는 정수로 정의되며, 중앙선 방향을 양의 방향으로 한다), 전진방향 distance 기준 30 m 동안 차선을 변경하고 이 때의 차선 변경 경로는 3차함수(cubic) 형태를 따른다.

Trigger

XML
<Story name="MyStory">
  <ParameterDeclarations/>
  <Act name="MyAct">
    <ManeuverGroup name="MyManeuverGroup" >
      <Actors />
      <Maneuver name="MyManeuver">
        <Event name="MyEvent" >
          <Action name="MyAction" />
          <StartTrigger>
            <ConditionGroup>
              <Condition conditionEdge="rising" delay="0" name="StartCondition1">
                <ByEntityCondition>
                  <TriggeringEntities triggeringEntitiesRule="any">
                    <EntityRef entityRef="NPC_2"/>
                  </TriggeringEntities>
                  <EntityCondition>
                    <DistanceCondition freespace="false" rule="greaterThan" value="6">
                      <Position>
                        <RelativeObjectPosition dx="0" dy="0" entityRef="Ego"/>
                      </Position>
                    </DistanceCondition>
                  </EntityCondition>
                </ByEntityCondition>
              </Condition>
            </ConditionGroup>
          </StartTrigger>
        </Event>
      </Maneuver>
    </ManeuverGroup>
    <StartTrigger>
      <ConditionGroup>
        <Condition conditionEdge="none" delay="0" name="Act_Condition">
          <ByValueCondition>
            <SimulationTimeCondition rule="greaterThan" value="0"/>
          </ByValueCondition>
        </Condition>
      </ConditionGroup>
    </StartTrigger>
    <StopTrigger/>
  </Act>
</Story>

특정 요소가 활성화되는 조건을 정의한다. ConditionGroup 및 그 하부의 Condition으로 정의되며, ConditionGroup은 모든 Condition이 True 일 때 활성화되며, Trigger는 ConditionGroup 중 하나가 활성화되면 활성화된다. Trigger 는 Storyboard, Act, Event 아래에 정의될 수 있다.

이 시나리오에서는 Act 와 Event 아래에 각각 하나의 ConditionGroup과 Condition 으로 이루어진 Trigger 가 정의되어 있다. Act StartTrigger 는 SimulationTimeCondition 으로, Simulation 이 시작된 후 경과된 시간이 0 초보다 클 때(greaterThan) 활성화되도록, 즉 무조건 활성화되도록 정의되어 있다. 이 때 ConditionEdge는 none, delay 는 0 초로 정의되어, 조건이 만족하기만 하면 바로 활성화된다. (ASAM OpenSCENARIO: User Guide, 7.6.2. Condition Edges )

Event StartTrigger는 NPC_2에 대한 DistanceCondition 으로 정의되어 있다. triggeringEntitiesRule이 any 일 경우 그 하부에 정의된 개체 중 하나라도 조건을 만족하면 활성화된다. 결과적으로 Trigger는 Ego 차량 기준 NPC_2 차량과의 중심간 거리(freespace="false")가 6 m 보다 커질 때(rule="greaterThan", conditionEdge="rising") 활성화 된다. 즉, Ego 차량을 추월하여 6 m 이상 앞지르는 순간 활성화된다.

Evaluation(*)

XML
<Evaluation>
  <!-- <SuccessConditionGroup /> -->
  <FailureConditionGroup>
    <Condition name="Collision_Condition" delay="0" conditionEdge="once">
      <ByEntityCondition>
        <TriggeringEntities triggeringEntitiesRule="any">
          <EntityRef entityRef="Ego" />
        </TriggeringEntities>
        <EntityCondition>
          <CollisionCondition>
            <ByType type="vehicle" />
          </CollisionCondition>
        </EntityCondition>
      </ByEntityCondition>
    </Condition>
  </FailureConditionGroup>
</Evaluation>

시뮬레이션 종료 후 시나리오의 성공 조건을 정의한다. OpenSCENARIO 에는 정의되어 있지 않으나 Scenario Runner 에서 추가로 지원하는 요소이다. 여러 개의 SuccessConditionGroup과 FailureConditionGroup을 하위 요소로 가지며, ConditionGroup이 하나도 없을 수도 있다. 각 ConditionGroup은 Trigger 아래에서와 동일하게 하위의 모든 Condition 이 만족하면 활성화된다. 시나리오는 시뮬레이션 종료 시점에 모든 FailureConditionGroup이 비활성화 상태이면서, SuccessConditionGroup 중 하나 이상이 활성화 상태이면 성공으로 판단되며, FailureConditoinGroup 중 하나 이상이 활성화 상태이면 실패로 판단된다. 따라서 각 ConditionGroup의 상태에 따라 성공도 실패도 아닌 경우가 존재한다.

이 시나리오는 시나리오 성공 조건을 가지고 있지 않으며, CollisionCondition을 활용하여 실패 조건을 정의하고 있다. Ego 차량이 임의의 차량 (type="vehicle")과 충돌할 경우 시나리오는 실패로 판단된다.


© 2022 MORAI Inc.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.