본문 바로가기
임베디드/Intern

ASAM OpenSCENARIO: User Guide | 7. Tutorial: How to create a scenario

by 코곰_ 2024. 3. 11.
인턴하면서 새로 다루게 된 OpenSCENARIO에 대해 정리해보겠습니다!
해당 튜토리얼 참고하여 작성했습니다.
https://www.asam.net/index.php?eID=dumpFile&t=f&f=4092&token=d3b6a55e911b22179e3c0895fe2caae8f5492467

 

 

 

 

 

7. Tutorial: How to create a scenario

7.1 Example description of a scenario

차량 2 와 차량 1은 SampleDatabase.xodr 에서 58미터 떨어진 동일한 차선에 있으며 , 차량 2는 차량 1 앞에 있습니다 . 속도가 더 빠른 차량 1이 차량 2를 따라잡아 왼쪽 차선으로 변경해야 합니다. 잠시 후 차량 2 를 추월하면 이전 차선으로 다시 이동하여 차량 2 앞에서 끝납니다 .

 

 

 

7.2 Entities

<Entities>
    <ScenarioObject name="Vehicle 1">
      <Vehicle name="Vehicle 1" vehicleCategory="car">
        <ParameterDeclarations/>
        <BoundingBox>
          <Center x="1.3" y="0.0" z="0.75"/>
          <Dimensions width="1.8" length="4.5" height="1.5"/>
        </BoundingBox>
        <Performance maxSpeed="200.0" maxDeceleration="30.0" maxAcceleration="200.0"/>
        <Axles>
          <FrontAxle positionZ="0.4" trackWidth="1.68" positionX="2.98" maxSteering="0.5235987756" wheelDiameter="0.8"/>
          <RearAxle positionZ="0.4" trackWidth="1.68" positionX="0.0" maxSteering="0.5235987756" wheelDiameter="0.8"/>
        </Axles>
        <Properties/>
      </Vehicle>
      <ObjectController/>
    </ScenarioObject>

    <ScenarioObject name="Vehicle 2">
      <Vehicle name="Vehicle 2" vehicleCategory="car">
        <ParameterDeclarations/>
        <BoundingBox>
          <Center x="1.4" y="0.0" z="0.9"/>
          <Dimensions width="2.0" length="5.0" height="1.8"/>
        </BoundingBox>
        <Performance maxSpeed="200.0" maxDeceleration="30.0" maxAcceleration="200.0"/>
        <Axles>
          <FrontAxle positionZ="0.4" trackWidth="1.68" positionX="2.98" maxSteering="0.5235987756" wheelDiameter="0.8"/>
          <RearAxle positionZ="0.4" trackWidth="1.68" positionX="0.0" maxSteering="0.5235987756" wheelDiameter="0.8"/>
        </Axles>
        <Properties/>
      </Vehicle>
      <ObjectController/>
    </ScenarioObject>
  </Entities>

 

 

 

7.3 Init section

Vehicle 1 has speed 150 km/h and is located 58 m behind Vehicle 2, which has speed 130 km/h.

<Init>
    <Actions>
      <Private entityRef="Vehicle 1">
        <PrivateAction>
          <TeleportAction>
            <Position>
              <RoadPosition roadId="3" s="2.0" t="-11.0">
                <Orientation h="0.0" p="0.0" r="0.0" type="relative"/>
              </RoadPosition>
            </Position>
          </TeleportAction>
        </PrivateAction>
        <PrivateAction>
          <LongitudinalAction>
            <SpeedAction>
              <SpeedActionDynamics dynamicsDimension="time" dynamicsShape="step" value="0.0"/>
              <SpeedActionTarget>
                <AbsoluteTargetSpeed value="41.6666666667"/>
              </SpeedActionTarget>
            </SpeedAction>
          </LongitudinalAction>
        </PrivateAction>
      </Private>

      <Private entityRef="Vehicle 2">
        <PrivateAction>
          <TeleportAction>
            <Position>
              <RoadPosition roadId="3" s="60.0" t="-11.0">
                <Orientation h="0.0" p="0.0" r="0.0" type="relative"/>
              </RoadPosition>
            </Position>
          </TeleportAction>
        </PrivateAction>
        <PrivateAction>
          <LongitudinalAction>
            <SpeedAction>
              <SpeedActionDynamics dynamicsDimension="time" dynamicsShape="step" value="0.0"/>
              <SpeedActionTarget>
                <AbsoluteTargetSpeed value="36.1111111111"/>
              </SpeedActionTarget>
            </SpeedAction>
          </LongitudinalAction>
        </PrivateAction>
      </Private>
    </Actions>
  </Init>

 

 

 

7.4 Stories

시나리오에서, 하나의 Story는 하나의 Act만 정의한다.

<Story name="Story 1">
  <!-- Act 1-->
</Story>

 

 

 

7.5 Acts

Act는 특정 인스턴스가 시작되는 시기를 결정하기 위해 여러 Trigger 인스턴스 집합을 허용한다.

Act는 stopTrigger에 의해 종료된다.

SimulationTimeCondition은 time이 0보다 큰지 체크한다.

<Act name="Act 1">
  <!-- ManeuverGroup 1-->
  <StartTrigger>
    <ConditionGroup>
      <Condition delay="0.0" conditionEdge="rising" name="Simulation Time">
        <ByValueCondition>
          <SimulationTimeCondition rule="greaterThan" value="0.0"/>
        </ByValueCondition>
      </Condition>
    </ConditionGroup>
  </StartTrigger>
</Act>

 

 

 

7.6 Maneuver Groups

  • global action을 실행하려면, actor를 비워두어야 한다.
  • 런타임 중에 actor를 결정하려면, selectTriggeringEntites = true로 해야한다.
    • ManeuverGroup은 maximumExecutionCount로 정의된다. 이러한 설정은 ManeuverGroup의 실행 횟수를 결정하고, 여기서 실행 횟수는 endTransition이 발생할 때마다 1회씩 증가한다.
<ManeuverGroup maximumExecutionCount="1" name="ManeuverGroup 1">
  <Actors selectTriggeringEntities="false">
    <EntityRef entityRef="Vehicle 1"/>
  </Actors>
  <!-- Maneuver 1-->
</ManeuverGroup>

 

 

 

7.7 Maneuvers

이 예시에서 하나의 Maneuver은 두 인스턴스를 그룹화 하는데 사용된다.

<Maneuver name="Maneuver 1">
  <ParameterDeclarations/>
  <Event priority="overwrite" maximumExecutionCount="1" name="Turn left">
    <!-- ... -->
  </Event>
  <Event priority="overwrite" maximumExecutionCount="1" name="Turn right">
    <!-- ... -->
  </Event>
</Maneuver>

 

 

 

7.8 Events and actions

  • Turn Left
    • ConditionGroup:
    • RelativeDistanceCondition → 현재 Vehicle1과 2사이의 longitudinal distance가 20m보다 짧은가? (Vehicle1이 2보다 속도가 높기 때문에 어느 시점에서 상대거리가 20m미만으로 짧아지고, turn left event가 startTrigger에서 트리거 되며 Vehicle1은 left로 LaneChange action)
  • Turn Right
    • Vehicle2가 현재 위치한 동일한 차선을 대상으로 한다. 아래 두 조건을 동시에 만족시켜야 한다.
    • RelativeDistanceCondition: Vehicle 1, 2의 longitudinal distance가 10m보다 큰지
    • SimulationTimeCondition: 5초 이전에 트리거를 허용하지 않음
<Event priority="overwrite" maximumExecutionCount="1" name="Turn left">
  <Action name="Lane Change">
    <PrivateAction>
      <LateralAction>
        <LaneChangeAction targetLaneOffset="0.0238800048828">
          <LaneChangeActionDynamics dynamicsDimension="distance" dynamicsShape="cubic" value="36.6430664063"/>
          <LaneChangeTarget>
            <AbsoluteTargetLane value="-3"/>
          </LaneChangeTarget>
        </LaneChangeAction>
      </LateralAction>
    </PrivateAction>
  </Action>
  <StartTrigger>
    <ConditionGroup>
      <Condition delay="0.0" conditionEdge="rising" name="Relative Distance">
        <ByEntityCondition>
          <TriggeringEntities triggeringEntitiesRule="any">
            <EntityRef entityRef="Vehicle 1"/>
          </TriggeringEntities>
          <EntityCondition>
            <RelativeDistanceCondition freespace="false" rule="lessThan" entityRef="Vehicle 2" value="20.0" relativeDistanceType="longitudinal"/>
          </EntityCondition>
        </ByEntityCondition>
      </Condition>
    </ConditionGroup>
  </StartTrigger>
</Event>

<Event priority="overwrite" maximumExecutionCount="1" name="Turn right">
  <Action name="Lane Change">
    <PrivateAction>
      <LateralAction>
        <LaneChangeAction>
          <LaneChangeActionDynamics dynamicsDimension="distance" dynamicsShape="cubic" value="20.0"/>
          <LaneChangeTarget>
            <AbsoluteTargetLane value="-4"/>
          </LaneChangeTarget>
        </LaneChangeAction>
      </LateralAction>
    </PrivateAction>
  </Action>
  <StartTrigger>
    <ConditionGroup>
      <Condition delay="0.0" conditionEdge="rising" name="Relative Distance">
        <ByEntityCondition>
          <TriggeringEntities triggeringEntitiesRule="any">
            <EntityRef entityRef="Vehicle 2"/>
          </TriggeringEntities>
          <EntityCondition>
            <RelativeDistanceCondition freespace="false" rule="greaterThan" entityRef="Vehicle 1" value="10.0" relativeDistanceType="longitudinal"/>
          </EntityCondition>
        </ByEntityCondition>
      </Condition>
      <Condition delay="0.0" conditionEdge="none" name="Simulation Time">
        <ByValueCondition>
          <SimulationTimeCondition rule="greaterThan" value="5.0"/>
        </ByValueCondition>
      </Condition>
    </ConditionGroup>
  </StartTrigger>
</Event>

 

 

 

7.9 Sequential Execution

StoryboardElement 인스턴스의 기본 실행 패턴은 중첩된 요소들의 병렬 실행입니다. 예를 들어, Storyboard가 Story를 실행할 때 동시에 Story는 하나나 여러 개의 Act를 동시에 병렬적으로 실행합니다.

  • StoryboardElement 인스턴스의 암시적(Implicit) 동기화: Ego vehicle의 속도가 증가한다. Ego vehicle이 특정 속도에 도달하면 다른 event가 발생한다.
  • 명시적(Explicit) 동기화: 이벤트 또는 start trigger는 storyboard 요소의 상태를 수신한다.

[EX1]

  1. Implicit sequentialization 
  2. <Maneuver name="AccelerateAndBrakeManeuver"> <Event name="AccelerateEvent" priority="overwrite" maximumExecutionCount="1"> <Action name="AccelerateAction"> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="linear" value="4.0" dynamicsDimension="rate" /> <SpeedActionTarget> <AbsoluteTargetSpeed value="27.78" /> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="AccelerateStartCondition" delay="0" conditionEdge="none"> <ByValueCondition> <SimulationTimeCondition value="0" rule="greaterThan"/> </ByValueCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> <Event name="BrakeEvent" priority="overwrite" maximumExecutionCount="1"> <Action name="BrakeAction"> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="linear" value="-4.0" dynamicsDimension="rate" /> <SpeedActionTarget> <AbsoluteTargetSpeed value="0" /> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="BrakeStartCondition" delay="0" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="any"> <EntityRef entityRef="Ego"/> </TriggeringEntities> <EntityCondition> <SpeedCondition value="27.78" rule="greaterOrEqual"/> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> </Maneuver>
  3. deterministic order는 다른 Action을 위한 StartTrigger로써 하나의 action으로부터 사용되어 보장된다.
  4. Explicit sequentialization
    1. Ego 차량은 SimulationTime = 0에서 시작하여 속도를 0에서 100km/h로 증가시킵니다.
    2. Ego 차량은 첫 번째 이벤트가 completeState로 이동할 때 시작하여 정지합니다.
    StartTrigger의 브레이크가 다음과 같이 변경됩니다.
  5. <StartTrigger> <ConditionGroup> <Condition name="BrakeCondition" delay="0" conditionEdge="rising"> <ByValueCondition> <StoryboardElementStateCondition storyboardElementType="event" storyboardElementRef="AccelerateEvent" state="completeState"/> </ByValueCondition> </Condition> </ConditionGroup> </StartTrigger>
  6. 이벤트의 순서는 스토리보드 상태 요소 또는 상태 간 스토리보드 전환을 트리거로 사용하여 시행할 수도 있습니다.

 

 

[EX2] 이 예는 최대 20m/s의 속도를 내는 Ego 차량을 보여줍니다. 속도에 도달하면 red_vehicle은 30m/s의 속도로 따라잡기 시작해야 합니다.

Ego Setup: ManeuverGroup은 Ego vehicle을 actor로 정의한다. Event는 속도를 선형 값 2m/s로 증가시킨다. 10초 후에 Ego vehicle의 속도는 20m/s에 도달한다.

<Act name ="EgoSpeedUpAct">
  <ManeuverGroup maximumExecutionCount="1" name="EgoSpeedUpManeuverGroup">
    <Actors selectTriggeringEntities="false">
      <EntityRef entityRef="Ego"/>
    </Actors>
    <Maneuver name="EgoSpeedUp">
      <Event name="EgoSpeedUpEvent" priority="overwrite">
        <Action name="EgoSpeedUpAction">
          <PrivateAction>
            <LongitudinalAction>
              <SpeedAction>
                <SpeedActionDynamics dynamicsShape="linear"
                                     value="2"
                                     dynamicsDimension="time"/>
                <SpeedActionTarget>
                  <AbsoluteTargetSpeed value="20"/>
                </SpeedActionTarget>
              </SpeedAction>
            </LongitudinalAction>
          </PrivateAction>
        </Action>
        <StartTrigger>
          <ConditionGroup>
            <Condition name="AtSimulationStarts"
                     delay="0"
                     conditionEdge="none">
              <ByValueCondition>
                <SimulationTimeCondition value="0" rule="greaterThan"/>
              </ByValueCondition>
            </Condition>
          </ConditionGroup>
        </StartTrigger>
      </Event>
    </Maneuver>
  </ManeuverGroup>
  <StartTrigger>
    <ConditionGroup>
	  <Condition name="AtSimulationStarts"
			 delay="0"
			 conditionEdge="none">
	    <ByValueCondition>
		  <SimulationTimeCondition value="0" rule="greaterThan"/>
	    </ByValueCondition>
	  </Condition>
    </ConditionGroup>
  </StartTrigger>
</Act>

Implicit sequentialization:  Ego가 20m/s에 도달할 때 red_vehicle의 SpeedAction 적용되고 StartTrigger가 명시된다.

<Act name="RedVehicleSpeedUpAct">
  <ManeuverGroup maximumExecutionCount="1"
                 name="RedVehicleSpeedUpManeuverGroup">
    <Actors selectTriggeringEntities="false">
      <EntityRef entityRef="red_vehicle"/>
    </Actors>
    <Maneuver name="RedVehicleSpeedUp">
      <Event name="RedVehicleSpeedUpEvent" priority="overwrite">
        <Action name="RedVehicleSpeedUpAction">
          <PrivateAction>
            <LongitudinalAction>
              <SpeedAction>
                <SpeedActionDynamics dynamicsShape="step"
                                     value="0"
                                     dynamicsDimension="time"/>
                <SpeedActionTarget>
                  <AbsoluteTargetSpeed value="30"/>
                </SpeedActionTarget>
              </SpeedAction>
            </LongitudinalAction>
          </PrivateAction>
        </Action>
        <StartTrigger>
          <ConditionGroup>
            <Condition name="StartOnEgoReachingSpeed"
                       delay="0"
                       conditionEdge="rising">
              <ByEntityCondition>
                <TriggeringEntities triggeringEntitiesRule="any">
                  <EntityRef entityRef="ego"/>
                </TriggeringEntities>
                <EntityCondition>
                  <SpeedCondition value="20"
                                  freespace="false"
                                  rule="greaterOrEqual"/>
                </EntityCondition>
              </ByEntityCondition>
            </Condition>
          </ConditionGroup>
        </StartTrigger>
      </Event>
    </Maneuver>
  </ManeuverGroup>
  <StartTrigger>
    <ConditionGroup>
      <Condition name="StartOnEgoReachingSpeed"
                 delay="0"
                 conditionEdge="rising">
        <ByEntityCondition>
	      <TriggeringEntities triggeringEntitiesRule="any">
	        <EntityRef entityRef="ego"/>
	      </TriggeringEntities>
	      <EntityCondition>
	        <SpeedCondition value="20"
			                freespace="false"
                            rule="greaterOrEqual"/>
	      </EntityCondition>
        </ByEntityCondition>
      </Condition>
    </ConditionGroup>
  </StartTrigger>
</Act>

Explicit sequentialization: RedVehicleSpeedUpActionStartTrigger이 성공적으로 끝났을 때 SpeedAction이 적용되고 StartTrigger가 명시된다. StartTrigger 요소는 현재 StoryboardElementStateCondition를 포함한다.

<StartTrigger>
  <ConditionGroup>
    <Condition name="StartOnEgoActionEnd"
			 delay="0"
			 conditionEdge="rising">
	  <ByValueCondition>
	    <StoryboardElementStateCondition storyboardElementType="action"
                                         storyboardElementRef="RedVehicleSpeedUpAction"
                                         state="endTransition"
                                         />
	  </ByValueCondition>
    </Condition>
  </ConditionGroup>
</StartTrigger>

 

 

7.10 Traffic Signal

[Ex1] Traffic Signal Example

다음 예는 5개의 교통 신호등( T1 … T5 )이 있는 T 교차로를 보여줍니다. TrafficSignalController모든 교통 신호는 하나 ( TJunctionController ) 에 의해 제어됩니다 . 컨트롤러는 6개의 위상( Phase_1 … Phase_6 )을 정의합니다. 주기의 지속 시간은 69초입니다.

  • Phase_1 에서는 T1 과 T5가 녹색 신호를 표시합니다. 다른 모든 교통 신호는 빨간색입니다.
  • Phase_2 에서는 T1이 노란색 으로 변합니다.
  • Phase_3 에서는 T1 이 빨간색으로 바뀌고 T3 과 T4가 녹색으로 변합니다.
  • Phase_4 에서는 T4 와 T5가 노란색 으로 변합니다.
  • Phase_5 에서는 T4 와 T5가 빨간색 으로 변하고 T2가 녹색으로 변하도록 활성화합니다.
  • Phase_5 에서는 T4 와 T5가 빨간색 으로 변하고 T2가 녹색으로 변하도록 활성화합니다.
  • Phase_6 에서는 Phase_1이 반복되기 전에 T2 와 T3 가 노란색으로 변 합니다 .
<TrafficSignalController name="TJunctionController">
  <Phase name="Phase_1" duration="40">
    <TrafficSignalState state="green" trafficSignalId="T1"/>
    <TrafficSignalState state="red" trafficSignalId="T2"/>
    <TrafficSignalState state="red" trafficSignalId="T3"/>
    <TrafficSignalState state="red" trafficSignalId="T4"/>
    <TrafficSignalState state="green" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_2" duration="3">
    <TrafficSignalState state="yellow" trafficSignalId="T1"/>
    <TrafficSignalState state="red" trafficSignalId="T2"/>
    <TrafficSignalState state="red" trafficSignalId="T3"/>
    <TrafficSignalState state="red" trafficSignalId="T4"/>
    <TrafficSignalState state="green" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_3" duration="10">
    <TrafficSignalState state="red" trafficSignalId="T1"/>
    <TrafficSignalState state="red" trafficSignalId="T2"/>
    <TrafficSignalState state="green" trafficSignalId="T3"/>
    <TrafficSignalState state="green" trafficSignalId="T4"/>
    <TrafficSignalState state="green" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_4" duration="3">
    <TrafficSignalState state="red" trafficSignalId="T1"/>
    <TrafficSignalState state="red" trafficSignalId="T2"/>
    <TrafficSignalState state="green" trafficSignalId="T3"/>
    <TrafficSignalState state="yellow" trafficSignalId="T4"/>
    <TrafficSignalState state="yellow" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_5" duration="10">
    <TrafficSignalState state="red" trafficSignalId="T1"/>
    <TrafficSignalState state="green" trafficSignalId="T2"/>
    <TrafficSignalState state="green" trafficSignalId="T3"/>
    <TrafficSignalState state="red" trafficSignalId="T4"/>
    <TrafficSignalState state="red" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_6" duration="3">
    <TrafficSignalState state="red" trafficSignalId="T1"/>
    <TrafficSignalState state="yellow" trafficSignalId="T2"/>
    <TrafficSignalState state="yellow" trafficSignalId="T3"/>
    <TrafficSignalState state="red" trafficSignalId="T4"/>
    <TrafficSignalState state="red" trafficSignalId="T5"/>
 </Phase>
</TrafficSignalController>

 

 

[Ex2] Extended Example

일부 국가에서는 신호등이 녹색으로 바뀌기 전에 빨간색+노란색으로 변합니다. 이는 위의 예를 3개의 단계로 확장합니다.

  • Phase_2a(Phase_2 ~ Phase_3): T3 및 T4는 빨간색 +노란색 신호를 표시합니다.
  • Phase_4a(Phase_4 ~ Phase_5): T2는 빨간색 +노란색 신호를 표시합니다.
  • Phase_6a(Phase_6 ~ Phase_1): T1 과 T5는 빨간색 +노란색 신호를 표시합니다.
<TrafficSignalController name="TJunctionController">
 <Phase name="Phase_1" duration="40">
    ...
 </Phase>
 <Phase name="Phase_2" duration="3">
    ...
 </Phase>
 <Phase name="Phase_2a" duration="2">
    <TrafficSignalState state="red" trafficSignalId="T1"/>
    <TrafficSignalState state="red" trafficSignalId="T2"/>
    <TrafficSignalState state="red/yellow" trafficSignalId="T3"/>
    <TrafficSignalState state="red/yellow" trafficSignalId="T4"/>
    <TrafficSignalState state="green" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_3" duration="10">
     ...
 </Phase>
 <Phase name="Phase_4" duration="3">
     ...
 </Phase>
 <Phase name="Phase_4a" duration="2">
    <TrafficSignalState state="red" trafficSignalId="T1"/>
    <TrafficSignalState state="red/yellow" trafficSignalId="T2"/>
    <TrafficSignalState state="green" trafficSignalId="T3"/>
    <TrafficSignalState state="red" trafficSignalId="T4"/>
    <TrafficSignalState state="red" trafficSignalId="T5"/>
 </Phase>
 <Phase name="Phase_5" duration="10">
    ...
 </Phase>
 <Phase name="Phase_6" duration="3">
    ...
 </Phase>
 <Phase name="Phase_6a" duration="2">
    <TrafficSignalState state="red/yellow" trafficSignalId="T1"/>
    <TrafficSignalState state="red" trafficSignalId="T2"/>
    <TrafficSignalState state="red" trafficSignalId="T3"/>
    <TrafficSignalState state="red" trafficSignalId="T4"/>
    <TrafficSignalState state="red/yellow" trafficSignalId="T5"/>
 </Phase>
</TrafficSignalController>