Skip to content

beta_v0.9.0: promote dev_v0.9.0 (the dyno as an application drives it, a firewall rule at install, a prompt for a missing value) - #420

Merged
yunlishao merged 18 commits into
beta_v0.9.0from
dev_v0.9.0
Sep 29, 2026
Merged

yunlishao merged 18 commits into
beta_v0.9.0from
dev_v0.9.0

Conversation

@yunlishao-vibe

Copy link
Copy Markdown
Contributor

Promotes three PRs merged into dev_v0.9.0 since the last promotion (#414): #413, #417, #416. 15 commits, 22 files. It merges cleanly: beta_v0.9.0 carries no content that dev_v0.9.0 lacks. The latest dev_v0.9.0 push (bb211e9c) built on Linux and published the release.

What is in it

  • The dyno, as an application drives it (xil: FIXS ships the simulated dyno; fixs.config.get; openpilot's hold; fixs.driver startInGear #416):
    • fixs.config.get(section): the run's scenario yaml, read-only, by lowercase names (get('xil')['transport'], plus ip/port from the first VehicleSubscription).
    • fixs.xil.dynosim(vehicle=, dyno=, driver=) replaces fixs.xil.dyno(): FIXS ships the simulated dyno only, and exchange(vref, aref, dt) takes the acceleration command explicitly. Transport: udp is now the application's own rig at ip/port; FIXS opens no socket. XilSetup.Vehicle/Dyno/Driver are gone (no scenario set them).
    • The dyno's robot driver can hold like openpilot: brake while slower than stop_speed_mps and asked for less than stop_accel_mps2 (0.3 / 0.1 in openpilot). Off by default.
    • fixs.driver.set(startInGear=True): the ego is put in first gear on the first controlled step. CARLA's autobox leaves a spawned car in neutral below about 15% throttle, so a creeping pedal never moves it (measured on vehicle.tesla.model3). Off by default.
    • LocalLink rounds through the float32 packet the wire carries.
  • Install (Add TrafficLayer firewall rule at bundle install #413): update_fixs.ps1 checks for an inbound firewall rule on the bundle's TrafficLayer.exe and adds it (asking for elevation once), so the "allow access" dialog stops interrupting co-sims. The install's exit code never changes.
  • run_cosim (run_cosim: ask for a missing option value; no file dialog without a terminal #417): a missing or invalid option value is asked for at the terminal instead of exiting 2; nothing waits on a file dialog without a terminal.

What changes the moment this merges

  • beta_v0.9.0 publishes v0.9.0-beta with these.
  • API change for applications: fixs.xil.dyno() is removed; use fixs.xil.dynosim() and exchange(vref, aref, dt). The only caller, MLK eco-driving in FIXS_Applications, is updated in FIXS_Applications#84, which is on dev and is promoted to beta right after this. Merge this first and let v0.9.0-beta publish: FIXS_Applications beta fetches v0.9.0-beta, and its controller now needs fixs.config.get.
  • Behaviour change: in-process dyno results shift slightly against runs made before, from the float32 rounding in LocalLink.

Related Issues

Promotion; no new issues. Next: FIXS_Applications dev → beta, then beta_v0.9.0 → main.

Checklist

yunlishao-vibe and others added 18 commits September 27, 2026 13:40
update_fixs.ps1 creates an inbound allow rule for the installed
TrafficLayer.exe when elevated, and prints the netsh command otherwise,
so a fresh app checkout no longer pops the firewall dialog mid co-sim.
…actly

Transport: udp read the cell without waiting, so each tick got the answer
to the PREVIOUS tick's reference: one CARLA step behind inprocess. The udp
exchange now drains stale packets, sends, and blocks for this tick's reply
(UDP_REPLY_TIMEOUT_S 0.1 s). A miss passes the reference through and is
counted; UDP_MAX_MISSES (20) in a row stops the run with the cell's address.

LocalLink now carries the same 8-byte float32 packet as the wire. With
full precision the ~1e-7 rounding alone, fed back through the closed loop,
grew to 2.8 m/s of ego speed within 200 s against an otherwise identical
udp run. Inprocess results therefore shift slightly from before.

Measured on MLK rung 5 (to 29300 s, 3999 ticks): inprocess and udp logs
byte-identical, agent and bridge.
… terminal

A missing or invalid value (--carla-res, --carla-res big, --peer, ...) is
asked for when someone is at the terminal: type it, Enter to run without
it, Q to quit. Scripts and --serve still get exit 2.

import_map's package picker no longer opens a Tk window when stdin is not
a terminal, and the test suite refuses any Tk window.
The block quoted a 0.73 s first-tick cost that the same change had already
removed, and read as current. Three lines now.
Unelevated interactive installs now prompt Y/n and raise one UAC prompt
instead of printing a line that scrolls past; the manual netsh command
remains the fallback.
fixs.config.get(section) reads the run's scenario yaml, read-only, by
lowercase names (get('xil')['transport']), with ip/port taken from the
section's first VehicleSubscription.

fixs.xil.dyno() builds the inprocess dyno and returns None for udp and
tcp: an application that speaks to a rig opens its own socket, to
fixs.config.get('xil')['ip']. tcp stays accepted as a reserved value.

The udp lockstep this branch added to _Dyno and UdpLink (drain,
recv_wait, UDP_REPLY_TIMEOUT_S, UDP_MAX_MISSES) goes with it. LocalLink
still rounds through the float32 packet.
…all_rule

Add TrafficLayer firewall rule at bundle install
It builds the simulated dyno the scenario describes whenever EnableXil
is on. Which dyno answers a run is the application's choice, made from
fixs.config.get('xil')['transport']; a udp application's stand-in rig
can now build the same dynosim from the same scenario.
It builds the simulated dyno from the vehicle, dyno and driver parameters
it is given. Whether a dyno is in the loop is the caller's question
(fixs.xil.enabled, fixs.config.get('xil')), so a udp application's
stand-in rig can build the same dynosim with no yaml at all.

XilSetup.Vehicle/Dyno/Driver go with it; no scenario set them.
One spelling for "no window" on both simulators. --render-offscreen and
--no-sumo-gui stay as hidden aliases. --carla-res is now in --help.
run_cosim: ask for a missing option value; no file dialog without a terminal
dev_v0.9.0 -> 0.9.0. Manual dispatch backfills open and merged PRs.
…aref, dt)

RobotDriver brakes while slower than stop_speed_mps and asked for less
than stop_accel_mps2 -- openpilot's should_stop (0.3 m/s, 0.1 m/s^2).
Both default to 0.0, which is off, so a default bench is unchanged.

The acceleration command is explicit: dynosim().exchange(vref, aref, dt)
takes it from the caller and hands it to the driver's hold. Nothing in
the bench derives it.
CARLA's autobox starts a vehicle in neutral and does not leave it below
about 15% throttle (measured on vehicle.tesla.model3: 10% never moves,
15% moves after 3.6 s). A pedal-driven ego asked to creep never moves.
One control with manual_gear_shift=True, gear=1 right after spawn
engages first; the autobox keeps it through later stops, and 2-5%
throttle then moves the car. No creep at zero throttle.

The C++ bridge (VirCarlaEnv) does not have this yet.
fixs.driver(exchange, firstGear=True) calls carla.ego.apply_control with
manual_gear_shift=True, gear=1 on its first controlled step and commands
nothing else that step, so the host does not overwrite it; the autobox
keeps first from then on. Off by default.

Replaces the bridge doing this for every ego (47a00f2).
…ine stays plain

fixs.driver.set(**options) records options for every driver built after
the call; fixs.driver(exchange, **options) still wins over them. The
first-gear option is renamed startInGear (was firstGear), off by default.
xil: FIXS ships the simulated dyno; fixs.config.get; openpilot's hold; fixs.driver startInGear
@yunlishao
yunlishao merged commit 5353b03 into beta_v0.9.0 Sep 29, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants