Movement-related modifiers examples
Example: placement of movement modifiers
OSC2 code: placement of movement 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 sut.scenario1:
car1: vehicle
do serial:
car1.drive() with:
speed([30..70]kph)
Example: absolute and relative movement modifiers
OSC2 code: absolute and relative movement 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 sut.scenario1:
car1: vehicle
do parallel(duration:[1.5..3]second, overlap:equal):
sut.car.drive()
car1.drive() with:
position([10..20]meter, at: start) # Absolute distance from start of path
speed([10..15]kph, faster_than: sut.car) # Relative
lane(same_as: sut.car) # Relative)
Example: track actual movement of referenced vehicle
OSC2 code: track actual movement of referenced vehicle
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.scenario1()
scenario sut.scenario1:
car1: vehicle
do serial():
phase1: parallel(duration:[1.5..3]second, overlap:equal):
d1: sut.car.drive()
d2: car1.drive()
phase2: parallel(duration:[1.5..3]second, overlap:equal):
d3: sut.car.drive()
d4: car1.drive() with:
l1: lane(side_of: sut.car, at: start)
p1: position(time: [0.5..1]second, ahead_of: sut.car, at: start)
l2: lane(same_as: sut.car, at: end)
p2: position(time: [1.5..2]second, ahead_of: sut.car, at: end)
Example: track projected movement of referenced vehicle
OSC2 code: track projected movement of referenced vehicle
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:
car1: vehicle
do serial():
phase1: parallel(duration:[1.5..3]second, overlap:equal):
d1: sut.car.drive()
d2: car1.drive()
phase2: parallel(duration:[1.5..3]second, overlap:equal):
d3: sut.car.drive()
d4: car1.drive() with:
speed(speed: [30..200]kph)
l1: lane(side_of: sut.car, at: start)
p1: position(time: [0.5..1]second, ahead_of: sut.car, at: start)
l2: lane(same_as: sut.car, at: end, track: projected)
p2: position(time: [1.5..2]second, ahead_of: sut.car, at: end, track: projected)
Example: acceleration() modifier
OSC2 code: acceleration() modifier
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:
car1: vehicle
do serial:
car1.drive() with:
acceleration(5kphps)
Example: avoid_collisions()
OSC2 code: avoid_collisions()
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:
car1: vehicle
do serial:
car1.drive() with:
avoid_collisions(false)
Example: change_lane() example 1
OSC2 code: change_lane() example 1
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:
car1: vehicle
do serial:
car1.drive() with:
# Change lane one lane to the left
change_lane(side: left)
Example: change_lane() example 2
OSC2 code: change_lane() example 2
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:
car1: vehicle
do serial:
car1.drive() with:
# Change the lane 1, 2 or 3 lanes to the right
change_lane([1..3], right)
Example: change_speed()
OSC2 code: change_speed()
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:
car1: vehicle
do serial:
car1.drive() with:
change_speed([-20..20]kph)
Example: distance()
OSC2 code: distance()
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:
car1: vehicle
do serial():
d1: car1.drive() with: distance([30..50]m)
Example: driver_controls()
OSC2 code: driver_controls()
import "$FTX/env/basic/adas_hlm_imps/ACC/acc_hlm_imp.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/M81_FTX_highway_straight_5km_3lane_oneway.xodr"
set implicits_kind = none
set test_drain_time = 0second
scenario sut.cancel_acc_with_cancel_button_press:
# How much slower the ftx_driver should drive at after ACC cancellation
# (verifying that controls have been passed back to ftx_driver properly).
speed_delta_to_brake: speed with:
keep(it == 5mps)
# Desired cruise speed.
ACC_cruise_speed: speed with:
keep(default it == 11mps)
# ACC actual speed should be, at the "steady state" phase, in the range of:
# ACC_cruise_speed - ACC_tolerance < actual speed < ACC_cruise_speed + ACC_tolerance
ACC_tolerance: speed with:
keep(default it == 1mps)
# "Grace" time for ACC to reach the target cruise speed.
ACC_transition_drive_duration: time with:
keep(default it == [2..4]second)
# The duration of the "steady state" phase.
ACC_cruise_speed_drive_duration: time with:
keep(default it == [5..7]second)
do serial():
# Turn on ACC.
sut.car.press_ACC_main_button()
# Some intermediate drive.
after_main_button_press: sut.car.drive(duration: [1..5]second) with:
position(distance: 50meter, at: start)
speed(speed: ACC_cruise_speed, run_mode: best_effort)
# Start ACC.
sut.car.press_ACC_set_button(cruise_speed: ACC_cruise_speed)
# Transitioning into ACC's cruise speed.
transitioning_into_cruise_speed: sut.car.drive(duration: ACC_transition_drive_duration)
# ACC "steady state" drive.
acc_drive_with_cruise_speed: sut.car.drive(duration: ACC_cruise_speed_drive_duration)
# Cancel ACC with cancel button press.
sut.car.press_ACC_cancel_button()
# Decelerating.
decelerating_after_cancel: sut.car.drive(duration: [1..5]second) with:
s: speed(ACC_cruise_speed - speed_delta_to_brake, at: end, run_mode: best_effort)
Example: duration()
OSC2 code: duration()
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/M36_FTX_suburban_4way_stops.xodr"
scenario top.my_drive:
car1: vehicle
duration([6..9]sec, tolerance: 1sec)
do serial:
car1.drive()
log("start drive $(top.time)")
car1.drive() with:
speed([50..70]kph)
duration([3..5]sec, tolerance: 1sec)
log("end drive $(top.time)")
extend top.main:
do serial:
log("start scenario $(top.time)")
my_drive()
log("end scenario $(top.time)")
Example: keep_lane()
OSC2 code: keep_lane()
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:
car1: vehicle
do serial:
car1.drive() with:
keep_lane()
Example: keep_position()
OSC2 code: keep_position()
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:
car1: vehicle
do serial:
car1.drive() with:
keep_position()
Example: keep_speed()
OSC2 code: keep_speed()
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:
car1: vehicle
do serial:
car1.drive() with:
speed([40..60]kph)
car1.drive() with:
keep_speed()
Example: lane() example 1
OSC2 code: lane() example 1
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:
car1: vehicle
do serial:
car1.drive() with:
# Drive in lane closest to the center of the road
lane(1)
Example: lane() example 2
OSC2 code: lane() example 2
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:
car1: vehicle
do serial:
car1.drive() with:
# Drive in lane closest to the curb
lane(1, from: curb)
Example: lane() example 3
OSC2 code: lane() example 3
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car2.drive()
car1.drive() with:
# Drive one lane left of car2
lane(left_of: car2)
Example: lane() example 4
OSC2 code: lane() example 4
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car2.drive()
car1.drive() with:
# At the end of this phase, be either one or two lanes
# to the right of car2
lane([1..2], right_of: car2, at: end)
Example: lane() example 5
OSC2 code: lane() example 5
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car2.drive()
car1.drive() with:
# Be either one left, one right or the same as car2
lane([-1..1], right_of: car2)
Example: lane() example 6
OSC2 code: lane() example 6
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car2.drive()
car1.drive() with:
# Be in the same lane as car2
lane(same_as: car2)
Example: lateral()
OSC2 code: lateral()
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:
car1: vehicle
do serial:
car1.drive() with:
speed([40..60]kph)
car1.drive() with:
lateral(distance: 1.5meter, line: right, at: start)
Example: equivalent use of position() example 1
OSC2 code: equivalent use of position() example 1
import "$FTX/env/basic/exe_platforms/model_ssp/config/model_sumo_config"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.scenario1()
scenario sut.scenario1:
car1: vehicle
do parallel(overlap:equal):
car1.drive() with:
speed(speed: 30kph, at: end)
sut.car.drive() with:
position(time: 3second, behind: car1, at: end)
Example: equivalent use of position() example 2
OSC2 code: equivalent use of position() example 2
import "$FTX/env/basic/exe_platforms/model_ssp/config/model_sumo_config"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.scenario1()
scenario sut.scenario1:
car1: vehicle
do parallel(overlap:equal):
car1.drive() with:
position(time: 3second, ahead_of: sut.car, at: end)
sut.car.drive() with:
speed(speed: 40kph, at: end)
Example: position() example 1
OSC2 code: position() example 1
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:
car1: vehicle
do serial:
car1.drive() with:
# Absolute from the start of the path
position([10..20]meter)
Example: position() example 2
OSC2 code: position() example 2
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car1.drive()
car2.drive() with:
# 40 meters ahead of car1 at end
position(40meter, ahead_of: car1, at: end)
Example: position() example 3
OSC2 code: position() example 3
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car1.drive()
car2.drive() with:
# Behind car1 throughout
position([20..30]meter, behind: car1)
Example: position() example 4
OSC2 code: position() example 4
import "$FTX/env/basic/exe_platforms/model_ssp/config/model_sumo_config"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.scenario1()
scenario sut.scenario1:
car1: vehicle
do parallel(overlap:equal):
sut.car.drive()
car1.drive() with:
# Behind sut.car, measured by time
position(time: [2..3]second, behind: sut.car)
Example: position() with tolerance
OSC2 code: position() with tolerance
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:
car1: vehicle
car2:vehicle
do car1.drive(duration: 5s) with:
position(distance: [5..10]m, ahead_of: sut.car, tolerance: 2m)
Example: speed() example 1
OSC2 code: speed() example 1
import "$FTX/env/basic/exe_platforms/model_ssp/config/model_sumo_config"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.scenario1()
scenario sut.scenario1:
do serial:
sut.car.drive() with:
# Absolute speed range
speed([10..20]kph)
Example: speed() example 2
OSC2 code: speed() example 2
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car1.drive()
car2.drive() with:
# Faster than car1 by [1..5]kph
speed([1..5]kph, faster_than: car1)
Example: speed() example 3
OSC2 code: speed() example 3
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:
car1: vehicle
do serial:
car1.drive() with:
# Have that speed at end of the phase
speed(5kph, at: end)
Example: speed() example 4
OSC2 code: speed() example 4
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:
car1: vehicle
car2: vehicle
do parallel(overlap:equal):
car1.drive()
car2.drive() with:
# Really either slower or faster than car1
speed([-20..20]kph, faster_than: car1)
Example: speed() with tolerance
OSC2 code: speed() with tolerance
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:
car1: vehicle
car2:vehicle
do car1.drive(duration: 5s) with:
speed([40..60]kph, tolerance: 5kph)
Example: define arc shape
OSC2 code: define arc shape
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
import "$FTX/ext_modules/foretify_top/driver/behavior_layer/ftx_behaviors/shape/example_shapes/lane_change_shape.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
struct arc_shape inherits lane_change_shape: # line 1
angle: angle with: keep(soft it == 0deg) # line 2
radius: length with: keep(soft it == 0m) # line 3
var time: time # line 4
var request: shape_request # line 5
# line 6
def duration()-> time is also: # line 7
return 5s # line 8
def compute() is also: # line 9
lon = 0.0m # line 10
lat = 0.0m # line 11
scenario vehicle.drive_with_shape:
c: arc_shape with (radius: 15m, angle: 10deg)
Example: continuity implemented in a scenario
OSC2 code: continuity implemented in a scenario
import "$FTX/env/basic/exe_platforms/model_ssp/config/model_sumo_config.osc"
extend test_config:
set map = "$FTX/qa/odr_maps/straight_road_1040m_3x3.xodr"
set implicits_kind = none
extend sut:
keep (car.physical_drive == kinematic)
extend top.main:
do sut.native_lane_change()
scenario sut.native_lane_change:
init_lon_speed: speed with:
keep(it == 20kph)
init_lat_pos: length with:
keep(it == 0m)
lane_change: lane_change_shape with:
keep(it.speed_lon == init_lon_speed)
keep(it.total_duration == 10s)
keep(it.lateral_distance == 3m)
keep(it.lateral_acceleration == 0.5mpsps)
keep(it.lane_change_direction == left)
keep(it.transform == lane_relative)
do serial:
pre_shape: sut.car.drive(duration: 2s) with:
speed(init_lon_speed, at: end)
lateral(init_lat_pos, line: center, at: all)
shape_drive: sut.car.drive() with:
shape(quantity:position, request:both, shape_object: lane_change)
struct lane_change_shape inherits any_position_shape:
speed_lon: speed with:
keep (default speed_lon == 5mps)
total_duration: time with:
keep (default total_duration == 10s)
lateral_distance: length with:
keep(default lateral_distance == 3.5m)
lateral_acceleration: acceleration with:
keep(default lateral_acceleration == 0.5mpsps)
lane_change_direction: av_side with:
keep(default lane_change_direction == left)
def duration()-> time is only:
return total_duration
def compute() is only:
lon = speed_lon * t
lat = 0m
var acc_rl : float = lateral_acceleration/1millimeter_per_sec_sqr
var lat_dist_rl :float = lateral_distance/1mm
var t1 := math.sqrt(lat_dist_rl / acc_rl) * 1s
if t > 0s:
var tau : time
if t > t1:
tau = t1
else:
tau = t
lat = lat + 0.5 * lateral_acceleration * tau * tau
if t > t1:
var tau : time
if t > 2 * t1:
tau = t1
else:
tau = t - t1
var v_m := lateral_acceleration * t1
lat = lat + v_m * tau - 0.5 * lateral_acceleration * tau * tau
if lane_change_direction == right:
lat = -lat