Repository navigation
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
Conversation
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
approved these changes
Sep 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes three PRs merged into
dev_v0.9.0since the last promotion (#414): #413, #417, #416. 15 commits, 22 files. It merges cleanly:beta_v0.9.0carries no content thatdev_v0.9.0lacks. The latestdev_v0.9.0push (bb211e9c) built on Linux and published the release.What is in it
fixs.config.get(section): the run's scenario yaml, read-only, by lowercase names (get('xil')['transport'], plusip/portfrom the first VehicleSubscription).fixs.xil.dynosim(vehicle=, dyno=, driver=)replacesfixs.xil.dyno(): FIXS ships the simulated dyno only, andexchange(vref, aref, dt)takes the acceleration command explicitly.Transport: udpis now the application's own rig atip/port; FIXS opens no socket.XilSetup.Vehicle/Dyno/Driverare gone (no scenario set them).stop_speed_mpsand asked for less thanstop_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 onvehicle.tesla.model3). Off by default.LocalLinkrounds through the float32 packet the wire carries.update_fixs.ps1checks for an inbound firewall rule on the bundle'sTrafficLayer.exeand adds it (asking for elevation once), so the "allow access" dialog stops interrupting co-sims. The install's exit code never changes.What changes the moment this merges
beta_v0.9.0publishesv0.9.0-betawith these.fixs.xil.dyno()is removed; usefixs.xil.dynosim()andexchange(vref, aref, dt). The only caller, MLK eco-driving in FIXS_Applications, is updated in FIXS_Applications#84, which is ondevand is promoted tobetaright after this. Merge this first and letv0.9.0-betapublish: FIXS_Applicationsbetafetchesv0.9.0-beta, and its controller now needsfixs.config.get.LocalLink.Related Issues
Promotion; no new issues. Next: FIXS_Applications
dev→beta, thenbeta_v0.9.0→main.Checklist
dev_v0.9.0; the latestdev_v0.9.0push built and published.tests/Python/unit: 492 passed, 8 skipped, on xil: FIXS ships the simulated dyno; fixs.config.get; openpilot's hold; fixs.driver startInGear #416's head)