Using OSC2 examples
Example: control attribute values with keep()
OSC2 code: control attribute values with keep()
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario traffic.scenario1:
my_speed: speed
keep(my_speed < 50kph)
Example: control attribute values with scenario modifiers
OSC2 code: control attribute values with scenario modifiers
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario traffic.using_snp:
speed: speed
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car1.drive()
car2.drive() with:
speed(speed: 20kph, faster_than: car1)
Example: event declaration
OSC2 code: event declaration
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario sut.scenario1:
snow_depth: length
event deep_snow is (snow_depth > 15cm)
Example: actor declaration
OSC2 code: actor declaration
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
# Define an actor
actor my_car_group:
average_distance: length
number_of_cars: uint
Example: actor extension
OSC2 code: actor extension
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# Extend an actor in a separate file
import "my_car_group.osc"
extend my_car_group:
average_speed: speed
extend top.main:
do sut.car.drive(duration: 5s)
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
Example: scenario implementation
OSC2 code: scenario implementation
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
# A two-phase scenario
scenario traffic.two_phases: # Scenario name
# Define the truck with specific attributes
truck1: vehicle with:
keep(it.color == green)
keep(it.vehicle_category == box_truck)
# Define the behavior
do serial:
phase1: truck1.drive() with:
speed(speed: 0kph, at: start)
speed(speed: 10kph, at: end)
phase2: truck1.drive() with:
speed(speed: [10..15]kph)
Example: define test
OSC2 code: define test
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
import "two_phases.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr" # specify map to use in this test
extend top.main:
do traffic.two_phases()
Example: define a cut-in maneuver
OSC2 code: define a cut-in maneuver
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
# The cut-in scenario
scenario sut.cut_in:
car1: vehicle # The other car
side: av_side # A side: left or right
r: one_way_road with: keep(it.min_lanes >= 2)# at least two lanes
do serial():
get_ahead: parallel(duration:[1..5]s, overlap:equal): # get_ahead is a label
sut.car.drive() with:
speed(speed: [30..70]kph)
along(r)
car1.drive() with:
position(distance: [5..100]m,
behind: sut.car, at: start)
position(distance: [5..15]m,
ahead_of: sut.car, at: end)
along(r)
change_lane: parallel(duration:[2..5]s, overlap:equal): # change_lane is a label
sut.car.drive() with:
along(r)
car1.drive() with:
lane(side_of: sut.car, side: side, at: start)
lane(same_as: sut.car, at: end)
along(r)
Example: use cut_in() in two_cut_in()
OSC2 code: use cut_in() in two_cut_in()
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# The cut-in scenario
scenario sut.cut_in:
car1: vehicle # The other car
side: av_side # A side: left or right
r: one_way_road with: keep(it.min_lanes >= 2)
do serial():
get_ahead: parallel(duration:[1..5]s, overlap:equal): # get_ahead is a label
sut.car.drive() with:
speed(speed: [30..70]kph)
along(r)
car1.drive() with:
position(distance: [5..100]m,
behind: sut.car, at: start)
position(distance: [5..15]m,
ahead_of: sut.car, at: end)
along(r)
change_lane: parallel(duration:[2..5]s, overlap:equal): # change_lane is a label
sut.car.drive() with:
along(r)
car1.drive() with:
lane(side_of: sut.car, side: side, at: start)
lane(same_as: sut.car, at: end)
along(r)
scenario sut.two_cut_ins:
do serial():
c1: cut_in(side: left) # c1 is a label
c2: cut_in(side: right) # c2 is a label
with:
keep(c1.car1.color != c2.car1.color)
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
Example: run cut_in() with concrete values
OSC2 code: run cut_in() with concrete values
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# The cut-in scenario
scenario sut.cut_in:
car1: vehicle # The other car
side: av_side # A side: left or right
r: one_way_road with: keep(it.min_lanes >= 2)
do serial():
get_ahead: parallel(duration:[1..5]s, overlap:equal): # get_ahead is a label
sut.car.drive() with:
speed(speed: [30..70]kph)
along(r)
car1.drive() with:
position(distance: [5..100]m,
behind: sut.car, at: start)
position(distance: [5..15]m,
ahead_of: sut.car, at: end)
along(r)
change_lane: parallel(duration:[2..5]s, overlap:equal): # change_lane is a label
sut.car.drive() with:
along(r)
car1.drive() with:
lane(side_of: sut.car, side: side, at: start)
lane(same_as: sut.car, at: end)
along(r)
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
# Run cut_in with concrete values
extend top.main:
do sut.cut_in() with:
keep(it.get_ahead.duration == 3s)
keep(it.change_lane.duration == 4s)
Example: mix multiple scenarios
OSC2 code: mix multiple scenarios
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# Mixing multiple scenarios
scenario sut.interceptor:
car1: vehicle
scenario sut.interceptor_at_yield:
do interceptor: sut.interceptor()
# The cut-in scenario
scenario sut.cut_in:
car1: vehicle # The other car
side: av_side # A side: left or right
r: one_way_road with: keep(it.min_lanes >= 2)
do serial():
get_ahead: parallel(duration:[1..5]s, overlap:equal): # get_ahead is a label
sut.car.drive() with:
speed(speed: [30..70]kph)
along(r)
car1.drive() with:
position(distance: [5..100]m,
behind: sut.car, at: start)
position(distance: [5..15]m,
ahead_of: sut.car, at: end)
along(r)
change_lane: parallel(duration:[2..5]s, overlap:equal): # change_lane is a label
sut.car.drive() with:
along(r)
car1.drive() with:
lane(side_of: sut.car, side: side, at: start)
lane(same_as: sut.car, at: end)
along(r)
scenario sut.mix_dangers:
weather: weather_type
keep(weather != clear)
do parallel(overlap:any):
cut_in()
interceptor_at_yield()
environment.weather(kind: weather)
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
Example: declare the cut_in_and_slow() scenario
OSC2 code: declare the cut_in_and_slow() scenario
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
set test_drain_time = 0second
# declare cut_in_and_slow
scenario sut.cut_in_and_slow:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
# cut_in_and_slow_imp.osc
extend sut.cut_in_and_slow:
do serial():
start_behind_sut: parallel(duration:[1..10]second, overlap:equal):
sut.car.drive()
car1.drive() with:
speed(speed: [30..200]kph)
position(distance: [5..30]meter, behind: sut.car, measure_by: nearest, at: start)
change_lane: parallel(duration:[1.5..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
l1: lane(side_of: sut.car, side: side, at: start)
p1: position(time: [1..5]second, ahead_of: sut.car, measure_by: nearest, at: start)
speed([30..200]kph, run_mode: best_effort)
avoid_collisions(false)
l2: lane(same_as: sut.car, track: projected, at: end)
p2: position(time: [1..5]second, ahead_of: sut.car,
track: projected, measure_by: nearest, at: end)
slow: parallel(duration:[3..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
keep_lane()
change_speed([-20..-10]kph)
extend top.main:
do sut.cut_in_and_slow()
Example: implement the cut_in_and_slow() scenario
OSC2 code: implement the cut_in_and_slow() scenario
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.cut_in_and_slow()
# cut_in_and_slow
scenario sut.cut_in_and_slow:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
# cut_in_and_slow_imp
extend sut.cut_in_and_slow:
do serial():
start_behind_sut: parallel(duration:[1..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
speed(speed: [30..200]kph)
position(distance: [5..100]meter, behind: sut.car, at: start)
change_lane: parallel(duration:[1.5..3]second, overlap:equal):
sut.car.drive()
car1.drive() with:
l1: lane(side_of: sut.car, side: side, at: start)
p1: position(time: [0.5..1]second, ahead_of: sut.car, at: start)
speed([30..200]kph, run_mode: best_effort)
avoid_collisions(false)
l2: lane(same_as: sut.car, track: projected, at: end)
p2: position(time: [1.5..2]second, ahead_of: sut.car,
track: projected, at: end)
slow: parallel(duration:[3..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
keep_lane()
acceleration(acceleration: \
[car1.policy.get_min_acceleration()..car1.policy.get_min_acceleration()/2])
Example: define the cut_in() scenario in a separate file
OSC2 code: define the cut_in() scenario in a separate file
# ts_cut_in_and_slow
# import simulator interface
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# cut_in_and_slow
scenario sut.cut_in_and_slow:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
# cut_in_and_slow_imp
# cut_in.osc
scenario sut.cut_in:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
do serial():
change_lane: parallel(duration:[1.5..3]second, overlap:equal):
sut.car.drive() with:
keep_lane() # prevent sut from avoiding cut in
car1.drive() with:
l1: lane(side_of: sut.car, side: side, at: start)
p1: position(time: [0.5..1]second, ahead_of: sut.car, at: start)
speed([30..200]kph, run_mode: best_effort)
avoid_collisions(false)
l2: lane(same_as: sut.car, track: projected, at: end)
p2: position(time: [1.5..2]second, ahead_of: sut.car,
track: projected, at: end)
extend sut.cut_in_and_slow:
road: one_way_road
do serial():
start_behind_dut: parallel(duration:[1..5]second, overlap:equal):
sut.car.drive() with:
speed(speed: [30..200]kph)
keep_lane()
along(road)
car1.drive() with:
speed(speed: [30..200]kph)
position(distance: [5..100]meter, behind: sut.car, at: start)
l1: lane(side_of: sut.car, side: side)
along(road)
cut_in: cut_in(car1: car1, side: side)
slow: parallel(duration:[3..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
keep_lane()
acceleration(acceleration:
[car1.policy.get_min_acceleration()..car1.policy.get_min_acceleration()/2])
# specify the map to use
extend test_config:
set map = "$FTX_PACKAGES/maps/M67_FTX_highway_speed_variations.xodr"
# extend the entry-point scenario to activate the scenario
extend top.main:
do cias: sut.cut_in_and_slow()
Example: import and invoke the cut_in() scenario
OSC2 code: import and invoke the cut_in() scenario
# ts_cut_in_and_slow
# import simulator interface
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# cut_in_and_slow_imp.osc
import "cut_in.osc"
# cut_in_and_slow
scenario sut.cut_in_and_slow:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
extend sut.cut_in_and_slow:
do serial():
start_behind_dut: parallel(duration:[1..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
speed(speed: [30..200]kph)
position(distance: [5..100]meter, behind: sut.car, at: start)
cut_in: cut_in(car1: car1, side: side)
slow: parallel(duration:[3..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
keep_lane()
acceleration(acceleration:
[car1.policy.get_min_acceleration()..car1.policy.get_min_acceleration()/2])
# specify the map to use
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
# extend the entry-point scenario to activate the scenario
extend top.main:
do cias: sut.cut_in_and_slow()
Example: define the coverage metrics
OSC2 code: define the coverage metrics
# ts_cut_in_and_slow
# import simulator interface
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
# cut_in_and_slow
scenario sut.cut_in_and_slow:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
# cut_in_and_slow_imp
# cut_in.osc
scenario sut.cut_in:
car1: vehicle # The "cut-in" car
side: av_side # The side of which car1 cuts in, left or right
do serial():
change_lane: parallel(duration:[1.5..3]second, overlap:equal):
sut.car.drive()
car1.drive() with:
l1: lane(side_of: sut.car, side: side, at: start)
p1: position(time: [0.5..1]second, ahead_of: sut.car, at: start)
speed([30..200]kph, run_mode: best_effort)
avoid_collisions(false)
l2: lane(same_as: sut.car, track: projected, at: end)
p2: position(time: [1.5..2]second, ahead_of: sut.car,
track: projected, at: end)
extend sut.cut_in_and_slow:
do serial():
start_behind_dut: parallel(duration:[1..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
speed(speed: [30..200]kph)
position(distance: [5..100]meter, behind: sut.car, at: start)
cut_in: cut_in(car1: car1, side: side)
slow: parallel(duration:[3..5]second, overlap:equal):
sut.car.drive()
car1.drive() with:
keep_lane()
acceleration(acceleration:
[car1.policy.get_min_acceleration()..car1.policy.get_min_acceleration()/2])
# cut_in_cover
extend sut.cut_in:
cover(side)
# sample the same parameters at the start of change_lane phase
var rel_d_change_lane_start:= sample(map.abs_distance_between_positions(
sut.car.state.msp_pos.road_position,
car1.state.msp_pos.road_position), @start) with:
cover(rel_d_change_lane_start,
text: "How ahead is car1 relative to dut at change_lane start (in centimeter)",
unit: centimeter,
range: [0..5000],
every: 50)
var dut_v_change_lane_start:= sample(sut.car.state.speed, @start) with:
cover(dut_v_change_lane_start,
text: "Speed of dut at change_lane start (in kph)",
unit: kph,
range: [10..200],
every: 10)
var rel_v_change_lane_start := sample(car1.state.speed - sut.car.state.speed,
@start) with:
cover(rel_v_change_lane_start,
text: "How much faster is car1 than the sut at change_lane start (in m/sec)",
unit: mps,
range: [-53..53])
# sample the same parameters at the end of change_lane phase
var rel_d_change_lane_end:= sample(map.abs_distance_between_positions(
sut.car.state.msp_pos.road_position,
car1.state.msp_pos.road_position), @change_lane.end) with:
cover(rel_d_change_lane_end,
text: "How far ahead is car1 from dut at change_lane end (in cm)",
unit: centimeter,
range: [0..6000],
every: 50)
var dut_v_change_lane_end:= sample(sut.car.state.speed, @change_lane.end) with:
cover(dut_v_change_lane_end,
text: "Speed of dut at change_lane end (in kph)",
unit: kph,
range: [10..200],
every: 10)
var rel_v_change_lane_end := sample(car1.state.speed - sut.car.state.speed,
@change_lane.end) with:
cover(rel_v_change_lane_end,
text: "How much is car1 than the sut at change_lane end (in m/sec)",
unit: mps,
range: [-53..53])
# specify the map to use
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
# extend the entry-point scenario to activate the scenario
extend top.main:
do cias: sut.cut_in_and_slow()