인턴하면서 새로 다루게 된 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]
- Implicit sequentialization
<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>
- deterministic order는 다른 Action을 위한 StartTrigger로써 하나의 action으로부터 사용되어 보장된다.
- Explicit sequentialization
- Ego 차량은 SimulationTime = 0에서 시작하여 속도를 0에서 100km/h로 증가시킵니다.
- Ego 차량은 첫 번째 이벤트가 completeState로 이동할 때 시작하여 정지합니다.
- <StartTrigger> <ConditionGroup> <Condition name="BrakeCondition" delay="0" conditionEdge="rising"> <ByValueCondition> <StoryboardElementStateCondition storyboardElementType="event" storyboardElementRef="AccelerateEvent" state="completeState"/> </ByValueCondition> </Condition> </ConditionGroup> </StartTrigger>
- 이벤트의 순서는 스토리보드 상태 요소 또는 상태 간 스토리보드 전환을 트리거로 사용하여 시행할 수도 있습니다.
[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>
'임베디드 > Intern' 카테고리의 다른 글
ASAM OpenSCENARIO: User Guide | 8. Examples (0) | 2024.03.11 |
---|---|
ASAM OpenSCENARIO: User Guide | 6. Reuse mechanisms (0) | 2024.03.11 |
ASAM OpenSCENARIO: User Guide | 5. Scenario at runtime (1) | 2024.03.08 |
ASAM OpenSCENARIO: User Guide | 4. Components of a scenario (0) | 2024.03.08 |
ASAM OpenSCENARIO: User Guide | 3. General Concepts (6) | 2024.03.08 |