From 568aa6545cc03b74df4fc0291ce5576f86f06914 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 15 Oct 2026 14:48:14 -0700 Subject: [PATCH 01/13] feat(demo): add a CARLA teleop demo Simulated trucks in one CARLA world, watched and steered from a browser over MoQ. demo/carla/web is the player, demo/carla/sim the Python worker with its CARLA build, Unreal plugin, and user units, and demo/carla/bridge the GPU video bridge that hands the simulator's Vulkan images to moq-video's encoder without leaving the GPU. The gate routes each part to its module: the player to js, the bridge to rs (a moq-video change re-checks it), and the worker to a new carla module. The bridge's NVIDIA test stays an explicit recipe. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 15 + Cargo.toml | 1 + bun.lock | 19 + demo/carla/README.md | 228 ++++ demo/carla/bridge/Cargo.toml | 37 + demo/carla/bridge/examples/standin.rs | 73 + demo/carla/bridge/gpu.sh | 57 + demo/carla/bridge/gpu.test.sh | 76 ++ demo/carla/bridge/include/carla_bridge.h | 105 ++ demo/carla/bridge/src/ffi.rs | 253 ++++ demo/carla/bridge/src/lib.rs | 218 +++ demo/carla/bridge/src/protocol.rs | 523 +++++++ demo/carla/bridge/src/server.rs | 346 +++++ demo/carla/bridge/src/source.rs | 407 ++++++ demo/carla/bridge/src/stream.rs | 864 ++++++++++++ demo/carla/bridge/tests/gpu.rs | 480 +++++++ demo/carla/bridge/tests/standin/mod.rs | 493 +++++++ demo/carla/justfile | 130 ++ demo/carla/sim/.gitignore | 7 + demo/carla/sim/cdi.sh | 26 + demo/carla/sim/moq_carla_sim/__init__.py | 12 + demo/carla/sim/moq_carla_sim/aerial.py | 155 +++ demo/carla/sim/moq_carla_sim/benchmark.py | 189 +++ demo/carla/sim/moq_carla_sim/bridge.py | 455 +++++++ demo/carla/sim/moq_carla_sim/drive.py | 245 ++++ demo/carla/sim/moq_carla_sim/handback.py | 146 ++ demo/carla/sim/moq_carla_sim/main.py | 306 +++++ demo/carla/sim/moq_carla_sim/park.py | 74 + demo/carla/sim/moq_carla_sim/publish.py | 374 ++++++ demo/carla/sim/moq_carla_sim/roadmap.py | 177 +++ demo/carla/sim/moq_carla_sim/runtime.py | 349 +++++ demo/carla/sim/moq_carla_sim/watchdog.py | 108 ++ demo/carla/sim/moq_carla_sim/world.py | 976 ++++++++++++++ demo/carla/sim/patches/README.md | 120 ++ demo/carla/sim/patches/bridge-camera.patch | 219 +++ demo/carla/sim/patches/build.sh | 73 + demo/carla/sim/patches/builder.Containerfile | 16 + demo/carla/sim/patches/checkout.sh | 26 + demo/carla/sim/patches/compile.sh | 124 ++ .../patches/engine-timeline-semaphore.patch | 22 + demo/carla/sim/patches/rpc-idle-wait.patch | 40 + demo/carla/sim/patches/runtime.Containerfile | 12 + demo/carla/sim/patches/sources.sh | 124 ++ demo/carla/sim/patches/sources.test.sh | 135 ++ .../sim/plugin/MoqBridge/MoqBridge.Build.cs | 26 + .../MoqBridge/Private/MoqBridgeCamera.cpp | 609 +++++++++ .../MoqBridge/Private/MoqBridgeModule.cpp | 35 + .../MoqBridge/Private/MoqBridgeSettings.h | 17 + .../plugin/MoqBridge/Public/MoqBridgeCamera.h | 44 + demo/carla/sim/pyproject.toml | 47 + demo/carla/sim/python.sh | 43 + demo/carla/sim/python.test.sh | 47 + demo/carla/sim/server.sh | 119 ++ demo/carla/sim/server.test.sh | 67 + demo/carla/sim/systemd/carla-sim.service | 31 + demo/carla/sim/systemd/carla-worker.service | 31 + .../carla/sim/systemd/install-user-service.sh | 52 + .../sim/systemd/install-user-service.test.sh | 84 ++ demo/carla/sim/tests/conftest.py | 109 ++ demo/carla/sim/tests/test_aerial.py | 92 ++ demo/carla/sim/tests/test_benchmark.py | 85 ++ demo/carla/sim/tests/test_bridge.py | 378 ++++++ demo/carla/sim/tests/test_drive.py | 234 ++++ demo/carla/sim/tests/test_handback.py | 149 ++ demo/carla/sim/tests/test_main.py | 232 ++++ demo/carla/sim/tests/test_park.py | 80 ++ demo/carla/sim/tests/test_publish.py | 305 +++++ demo/carla/sim/tests/test_roadmap.py | 80 ++ demo/carla/sim/tests/test_runtime.py | 530 ++++++++ demo/carla/sim/tests/test_watchdog.py | 87 ++ demo/carla/sim/tests/test_world.py | 922 +++++++++++++ demo/carla/sim/trucks.json | 1 + demo/carla/sim/typings/carla.pyi | 3 + demo/carla/sim/venv.sh | 39 + demo/carla/web/bunfig.toml | 2 + demo/carla/web/index.html | 54 + demo/carla/web/package.json | 27 + demo/carla/web/src/calibration.css | 105 ++ demo/carla/web/src/feedback.test.ts | 71 + demo/carla/web/src/feedback.ts | 84 ++ demo/carla/web/src/guides.test.ts | 35 + demo/carla/web/src/guides.ts | 237 ++++ demo/carla/web/src/hint.test.ts | 50 + demo/carla/web/src/hint.ts | 33 + demo/carla/web/src/input.test.ts | 241 ++++ demo/carla/web/src/input.ts | 154 +++ demo/carla/web/src/interaction.test.ts | 107 ++ demo/carla/web/src/interaction.ts | 77 ++ demo/carla/web/src/main.ts | 1196 +++++++++++++++++ demo/carla/web/src/map.test.ts | 181 +++ demo/carla/web/src/map.ts | 195 +++ demo/carla/web/src/maps/README.md | 54 + .../web/src/maps/Town10HD_Opt.aerial.json | 54 + .../web/src/maps/Town10HD_Opt.aerial.webp | Bin 0 -> 1975394 bytes demo/carla/web/src/maps/Town10HD_Opt.json | 501 +++++++ demo/carla/web/src/maps/index.ts | 48 + demo/carla/web/src/paths.test.ts | 27 + demo/carla/web/src/paths.ts | 33 + demo/carla/web/src/presence.test.ts | 21 + demo/carla/web/src/presence.ts | 16 + demo/carla/web/src/preview.ts | 45 + demo/carla/web/src/schemas.test.ts | 31 + demo/carla/web/src/schemas.ts | 92 ++ demo/carla/web/src/style.css | 828 ++++++++++++ demo/carla/web/src/truck.test.ts | 443 ++++++ demo/carla/web/src/truck.ts | 498 +++++++ demo/carla/web/src/vite-env.d.ts | 9 + demo/carla/web/src/wheel.test.ts | 402 ++++++ demo/carla/web/src/wheel.ts | 644 +++++++++ demo/carla/web/test/worklet.ts | 6 + demo/carla/web/tsconfig.json | 11 + demo/carla/web/vite.config.ts | 8 + demo/carla/web/wrangler.jsonc | 17 + doc/bin/demo.md | 20 + justfile | 1 + package.json | 1 + quest/m2/README.md | 1 + quest/m2/carla-bridge.md | 61 + quest/m2/teleop/README.md | 3 + sh/dispatch.sh | 12 +- sh/rs/select.sh | 25 +- sh/rs/select.test.py | 9 +- 122 files changed, 20169 insertions(+), 14 deletions(-) create mode 100644 demo/carla/README.md create mode 100644 demo/carla/bridge/Cargo.toml create mode 100644 demo/carla/bridge/examples/standin.rs create mode 100755 demo/carla/bridge/gpu.sh create mode 100755 demo/carla/bridge/gpu.test.sh create mode 100644 demo/carla/bridge/include/carla_bridge.h create mode 100644 demo/carla/bridge/src/ffi.rs create mode 100644 demo/carla/bridge/src/lib.rs create mode 100644 demo/carla/bridge/src/protocol.rs create mode 100644 demo/carla/bridge/src/server.rs create mode 100644 demo/carla/bridge/src/source.rs create mode 100644 demo/carla/bridge/src/stream.rs create mode 100644 demo/carla/bridge/tests/gpu.rs create mode 100644 demo/carla/bridge/tests/standin/mod.rs create mode 100644 demo/carla/justfile create mode 100644 demo/carla/sim/.gitignore create mode 100755 demo/carla/sim/cdi.sh create mode 100644 demo/carla/sim/moq_carla_sim/__init__.py create mode 100644 demo/carla/sim/moq_carla_sim/aerial.py create mode 100644 demo/carla/sim/moq_carla_sim/benchmark.py create mode 100644 demo/carla/sim/moq_carla_sim/bridge.py create mode 100644 demo/carla/sim/moq_carla_sim/drive.py create mode 100644 demo/carla/sim/moq_carla_sim/handback.py create mode 100644 demo/carla/sim/moq_carla_sim/main.py create mode 100644 demo/carla/sim/moq_carla_sim/park.py create mode 100644 demo/carla/sim/moq_carla_sim/publish.py create mode 100644 demo/carla/sim/moq_carla_sim/roadmap.py create mode 100644 demo/carla/sim/moq_carla_sim/runtime.py create mode 100644 demo/carla/sim/moq_carla_sim/watchdog.py create mode 100644 demo/carla/sim/moq_carla_sim/world.py create mode 100644 demo/carla/sim/patches/README.md create mode 100644 demo/carla/sim/patches/bridge-camera.patch create mode 100755 demo/carla/sim/patches/build.sh create mode 100644 demo/carla/sim/patches/builder.Containerfile create mode 100755 demo/carla/sim/patches/checkout.sh create mode 100755 demo/carla/sim/patches/compile.sh create mode 100644 demo/carla/sim/patches/engine-timeline-semaphore.patch create mode 100644 demo/carla/sim/patches/rpc-idle-wait.patch create mode 100644 demo/carla/sim/patches/runtime.Containerfile create mode 100755 demo/carla/sim/patches/sources.sh create mode 100755 demo/carla/sim/patches/sources.test.sh create mode 100644 demo/carla/sim/plugin/MoqBridge/MoqBridge.Build.cs create mode 100644 demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeCamera.cpp create mode 100644 demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeModule.cpp create mode 100644 demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeSettings.h create mode 100644 demo/carla/sim/plugin/MoqBridge/Public/MoqBridgeCamera.h create mode 100644 demo/carla/sim/pyproject.toml create mode 100755 demo/carla/sim/python.sh create mode 100755 demo/carla/sim/python.test.sh create mode 100755 demo/carla/sim/server.sh create mode 100755 demo/carla/sim/server.test.sh create mode 100644 demo/carla/sim/systemd/carla-sim.service create mode 100644 demo/carla/sim/systemd/carla-worker.service create mode 100755 demo/carla/sim/systemd/install-user-service.sh create mode 100755 demo/carla/sim/systemd/install-user-service.test.sh create mode 100644 demo/carla/sim/tests/conftest.py create mode 100644 demo/carla/sim/tests/test_aerial.py create mode 100644 demo/carla/sim/tests/test_benchmark.py create mode 100644 demo/carla/sim/tests/test_bridge.py create mode 100644 demo/carla/sim/tests/test_drive.py create mode 100644 demo/carla/sim/tests/test_handback.py create mode 100644 demo/carla/sim/tests/test_main.py create mode 100644 demo/carla/sim/tests/test_park.py create mode 100644 demo/carla/sim/tests/test_publish.py create mode 100644 demo/carla/sim/tests/test_roadmap.py create mode 100644 demo/carla/sim/tests/test_runtime.py create mode 100644 demo/carla/sim/tests/test_watchdog.py create mode 100644 demo/carla/sim/tests/test_world.py create mode 100644 demo/carla/sim/trucks.json create mode 100644 demo/carla/sim/typings/carla.pyi create mode 100755 demo/carla/sim/venv.sh create mode 100644 demo/carla/web/bunfig.toml create mode 100644 demo/carla/web/index.html create mode 100644 demo/carla/web/package.json create mode 100644 demo/carla/web/src/calibration.css create mode 100644 demo/carla/web/src/feedback.test.ts create mode 100644 demo/carla/web/src/feedback.ts create mode 100644 demo/carla/web/src/guides.test.ts create mode 100644 demo/carla/web/src/guides.ts create mode 100644 demo/carla/web/src/hint.test.ts create mode 100644 demo/carla/web/src/hint.ts create mode 100644 demo/carla/web/src/input.test.ts create mode 100644 demo/carla/web/src/input.ts create mode 100644 demo/carla/web/src/interaction.test.ts create mode 100644 demo/carla/web/src/interaction.ts create mode 100644 demo/carla/web/src/main.ts create mode 100644 demo/carla/web/src/map.test.ts create mode 100644 demo/carla/web/src/map.ts create mode 100644 demo/carla/web/src/maps/README.md create mode 100644 demo/carla/web/src/maps/Town10HD_Opt.aerial.json create mode 100644 demo/carla/web/src/maps/Town10HD_Opt.aerial.webp create mode 100644 demo/carla/web/src/maps/Town10HD_Opt.json create mode 100644 demo/carla/web/src/maps/index.ts create mode 100644 demo/carla/web/src/paths.test.ts create mode 100644 demo/carla/web/src/paths.ts create mode 100644 demo/carla/web/src/presence.test.ts create mode 100644 demo/carla/web/src/presence.ts create mode 100644 demo/carla/web/src/preview.ts create mode 100644 demo/carla/web/src/schemas.test.ts create mode 100644 demo/carla/web/src/schemas.ts create mode 100644 demo/carla/web/src/style.css create mode 100644 demo/carla/web/src/truck.test.ts create mode 100644 demo/carla/web/src/truck.ts create mode 100644 demo/carla/web/src/vite-env.d.ts create mode 100644 demo/carla/web/src/wheel.test.ts create mode 100644 demo/carla/web/src/wheel.ts create mode 100644 demo/carla/web/test/worklet.ts create mode 100644 demo/carla/web/tsconfig.json create mode 100644 demo/carla/web/vite.config.ts create mode 100644 demo/carla/web/wrangler.jsonc create mode 100644 quest/m2/carla-bridge.md diff --git a/Cargo.lock b/Cargo.lock index 3bf788a746d..d5b31e10ddc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4373,6 +4373,21 @@ dependencies = [ "url", ] +[[package]] +name = "moq-carla-bridge" +version = "0.1.0" +dependencies = [ + "anyhow", + "ash", + "bytes", + "moq-mux", + "moq-net", + "moq-video", + "parking_lot", + "pollster", + "tracing", +] + [[package]] name = "moq-cli" version = "0.14.2" diff --git a/Cargo.toml b/Cargo.toml index 6070495c7e9..4c8884e8e4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "demo/carla/bridge", "rs/hang", "rs/kio", "rs/libmoq", diff --git a/bun.lock b/bun.lock index 1bf3578f65c..9888c5a2161 100644 --- a/bun.lock +++ b/bun.lock @@ -35,6 +35,23 @@ "vite-plugin-solid": "^2.11.14", }, }, + "demo/carla/web": { + "name": "@moq/demo-carla", + "version": "0.1.0", + "dependencies": { + "@moq/json": "workspace:^", + "@moq/net": "workspace:^", + "@moq/watch": "workspace:^", + "zod": "^4.6.5", + }, + "devDependencies": { + "@types/bun": "^1.4.2", + "rolldown": "^1.2.12", + "typescript": "7.0.2", + "vite": "^8.3.2", + "wrangler": "^4.147.0", + }, + }, "demo/web": { "name": "@moq/demo", "version": "0.1.1", @@ -679,6 +696,8 @@ "@moq/demo-boy": ["@moq/demo-boy@workspace:demo/boy"], + "@moq/demo-carla": ["@moq/demo-carla@workspace:demo/carla/web"], + "@moq/drain-test": ["@moq/drain-test@workspace:test/drain"], "@moq/flate": ["@moq/flate@workspace:js/flate"], diff --git a/demo/carla/README.md b/demo/carla/README.md new file mode 100644 index 00000000000..27ab69f826a --- /dev/null +++ b/demo/carla/README.md @@ -0,0 +1,228 @@ +# CARLA teleop demo + +Drive simulated trucks from a browser over MoQ. Trucks share one +[CARLA](https://carla.org) world and drive themselves until someone takes +control. Each truck publishes its cameras and a status track; a web player +watches them on a map and publishes a steering **control** track back. Control +follows the [moq-boy](../boy) pattern: the viewer publishes, the truck +subscribes, and the truck echoes what it accepted on `status`. + +```text +├── web/ # the player: map, video, keyboard and steering-wheel input (@moq/demo-carla) +├── sim/ # the worker: one Python process driving every truck in CARLA +│ ├── moq_carla_sim/ # safety gate, CARLA world, MoQ publish and control +│ ├── plugin/ # the Unreal module that feeds the GPU bridge +│ ├── patches/ # the CARLA build with the bridge (`just carla build`) +│ └── systemd/ # rootless user units for an always-on workstation +├── bridge/ # Rust: the GPU video bridge the simulator loads (moq-carla-bridge) +└── justfile # `just carla ` +``` + +## Running locally + +Needs a Linux host with an NVIDIA GPU and podman; the repo's dev shell +(`nix develop`, or direnv) provides everything else. Build the simulator image +and the worker's virtualenv once, then leave the simulator running: + +```bash +just carla build # prints the image tag +just carla venv +CARLA_IMAGE= just carla server # separate terminal +just carla # relay + every truck + web player +``` + +`just carla cdi` generates the rootless `nvidia.com/gpu` CDI device the +container runs with; rerun it after a driver update, and `just carla server` +refuses a stale one. On a SELinux host the container runs with +`label=disable`, because SELinux denies `/dev/nvidia*` in a way that looks like +a missing driver. + +The player alone runs against any relay with `just carla web `. Append +`?preview` to the local URL for a fixture-driven layout review that opens no +connection; it is removed from production builds. + +## Broadcasts + +```text +carla/{truck}/{camera}.hang <- one media broadcast per camera (hang catalog) + sd 240p H.264, for map previews + hd 720p H.264, for the focused view + status JSON Snapshot telemetry + +viewer/carla/{truck}/{driverId} <- one broadcast per driver + control JSON Snapshot commands +``` + +The worker consumes `viewer/carla/{truck}/` for each truck, fanning in every +driver's `control` track. Cameras are sibling broadcasts, so switching views +never creates a second claim on the same wheel, and the driver scope is +disjoint from every media path. + +### Control (player to truck) + +```json +{ "type": "drive", "sequence": 42, "steering": -1.0..1.0, + "throttle": 0..1, "brake": 0..1, + "gear": "neutral|forward|reverse", "timestamps": [...] } +{ "type": "estop", "sequence": 43, "timestamps": [...] } +{ "type": "reset_estop", "sequence": 44, "timestamps": [...] } +{ "type": "respawn", "sequence": 45, "timestamps": [...] } +``` + +### Status (truck to player) + +```json +{ "accepted": { "steering": .., "throttle": .., "brake": .., "gear": ".." }, + "autonomy": "autonomous|manual", "estopped": true, + "driver": "ab12cd", "estop_by": "ef34gh", "sequence": 44, + "media_pipeline": { "ab12cd": [ { "label": "received→decoded", "ms": 12 } ] }, + "map": "Town10HD_Opt", + "pose": { "x": 12.35, "y": -78.9, "yaw": 180.1, "speed": 9.88 }, + "measured": { "steering": .., "throttle": .., "brake": .., "gear": ".." }, + "motion": { "yaw_rate": 3.4, "accel_lon": 1.23, "accel_lat": -2.35 }, + "collision": { "at": 1756334400123, "other": "vehicle.tesla.model3", "impulse": 4210.6 } } +``` + +Status republishes every 100 ms whether or not anyone is driving, since an +autonomous truck changes no accepted state as it moves. `pose` is in CARLA +world metres (x east, y south, yaw clockwise from +x), which is what the +player's baked road maps use. + +`accepted` is the gate repeating what it let through. `measured`, `motion`, and +`collision` come from the vehicle itself, so the player can draw requested +against measured steering and show the gap. `collision.at` is the unix +millisecond contact began: a fixed instant gives the event an identity on a +snapshot track, so a late joiner never mistakes a retained collision for a +fresh one. Continuing contact with the same actor within a second is one +collision. + +### The safety gate + +The worker's gate (`sim/moq_carla_sim/drive.py`) owns every truck's controls: + +- **One driver at a time.** The first driver to send a command holds the + lease until its broadcast ends or its 1 s watchdog expires; the player + heartbeats every 250 ms. The lease is bound to the driver's path and the + epoch it announced with, so a driver that reconnects at the same path is a + new claimant rather than a continuation. +- **E-stop latches** until an explicit reset, from any viewer: the player + latches and resets it through a short-lived safety broadcast without taking + the lease. +- **Gear changes are interlocked**: the gate keeps the current gear unless the + command releases throttle and applies some brake. +- **An unclaimed truck goes back to autonomy**, not to full brake. It first + coasts onto the nearest lane running its way (`handback.py`), because + Traffic Manager steers a truck it takes back toward the nearest waypoint + whatever its heading. +- **A wedged truck respawns**: an autonomous truck that has not moved 2 m in + 5 minutes returns to a free spawn point. + +The lease is cooperative. Anyone who can publish under `viewer/carla/` can +announce a driver path, so it stops two honest drivers fighting over a truck, +not a deliberate takeover. Anything beyond a simulator needs per-driver tokens +scoped to the driver's own path. + +## The simulator + +The trucks listed in `sim/trucks.json` share one CARLA map, so they can see +each other. The worker is Python because CARLA's own client is a Python wheel +and moq's Python bindings (built from `py/` in this checkout by +`just carla venv`) cover publishing and the JSON tracks. CARLA advises a single +command-sending client, and one process keeps Traffic Manager coherent. + +- **Video follows demand.** A map preview subscribes to `sd` and the focused + view to `hd`. The simulator renders only the camera covering the largest + demanded rendition, scales the rest from it on the GPU, and parks the camera, + its encoders, and the world renderer once the last subscriber leaves. +- **So does the clock.** Stepping physics costs most of a core with rendering + parked, so the world stops once no viewer, status subscriber, or driver + needs it. +- **The world runs at a fixed step.** CARLA is in synchronous mode at 1/30 s, + so every frame is stamped exactly a frame apart instead of with however long + the last tick took. The worker returns the world to free-running on exit. +- **An idle simulator parks.** The server boots with rendering on and outlives + every client; `just carla park` disables rendering unless a worker holds the + simulator. + +Bake a town's roads for the player's map against a running simulator with +`just carla map`, and commit what it writes to `web/src/maps/`. See +[`web/src/maps/README.md`](web/src/maps/README.md) for an aligned aerial image. + +## The GPU video bridge + +Camera pixels never leave the GPU. `bridge/` is a library the simulator loads: +the CARLA plugin (`sim/plugin/MoqBridge`) copies each camera's render target +into an exportable Vulkan image on Unreal's own queue, and the bridge hands it +to the `moq-video` encoder on the same device, which converts, scales, and +encodes it there. Compressed frames cross a Unix socket to the worker +(`sim/moq_carla_sim/bridge.py`), which publishes them on `sd` and `hd`. There +is no CPU path: a camera that cannot reach the bridge fails its spawn, and the +worker exits for systemd to restart. + +- **Bounded.** Each camera cycles a few slots; with none free it drops the + picture before anything encodes it, and a worker that falls behind loses + packets only up to the next keyframe. +- **Tested without CARLA.** A Vulkan stand-in for the plugin drives the + bridge: `just carla bridge-gpu` runs it on an NVIDIA host, and + `cargo run -p moq-carla-bridge --example standin -- truck1/front` + feeds a worker by hand. The plugin itself compiles only in the CARLA build. + +The C ABI the plugin calls is `bridge/include/carla_bridge.h`. + +## Keeping it running + +On a Linux workstation, the simulator and worker run as rootless systemd user +units. The installer records this checkout's path; rerun it after moving the +checkout. + +```bash +just carla build +just carla venv +just carla service-install + +# The units read this. MOQ_URL carries a token allowed to publish `carla/**` +# and subscribe `viewer/carla/**`; keeping it here keeps it off the command +# line. CARLA_IMAGE is the tag `just carla build` printed, since the worker +# refuses a stock simulator. +cat >~/.config/moq/carla.env <<'EOF' +MOQ_URL=https://cdn.moq.dev/demo?jwt=... +CARLA_IMAGE=localhost/moq-carla:0.9.16-bridge-... +EOF +chmod 600 ~/.config/moq/carla.env + +just carla service-enable +just carla service-status +just carla service-logs +``` + +`carla-sim.service` owns the podman container and `carla-worker.service` the +Python process; both restart with capped backoff. Run +`sudo loginctl enable-linger "$USER"` once to start them at boot rather than +at login. + +## The player + +`just carla deploy` builds the player against `https://cdn.moq.dev/demo` and +deploys it to `carla.moq.dev`. With no simulator publishing, it says so. + +Hover a truck on the map to stream its 240p preview; click it for 720p. A drive +key, a wheel movement, or **Take control** claims the lease, and **Esc** +releases it. Inputs ramp rather than snap and hold where you leave them: +**A**/**D** steer, **C** recenters, **W** releases the brake then feeds +throttle, **S** cuts throttle then brakes, **Space** or **G** changes gear, +**E** e-stops, and **R** resets the e-stop. **Reset** returns the focused truck +to a free spawn point under autonomy. + +A steering wheel works through the +[Gamepad API](https://developer.mozilla.org/docs/Web/API/Gamepad_API). Unlike +the keys it is absolute: rim angle is steering angle and pedal travel is +throttle and brake. It takes over only once it moves with the throttle +released, so a resting foot cannot claim control, and losing an armed wheel +cuts the throttle and brakes. Click its name in the header to calibrate an +unfamiliar layout; the result is stored per device. + +## Checks + +`just carla check` lints and tests the worker and its launchers without CARLA +or a GPU. `just js` and `just rs` cover the player and the bridge, and +`just carla bridge-gpu` runs the bridge's hardware test. diff --git a/demo/carla/bridge/Cargo.toml b/demo/carla/bridge/Cargo.toml new file mode 100644 index 00000000000..215417a62f0 --- /dev/null +++ b/demo/carla/bridge/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "moq-carla-bridge" +description = "CARLA video bridge: encodes Unreal render targets on the GPU and hands compressed frames to the demo's worker." +authors = ["Luke Curley "] +repository = "https://github.com/moq-dev/moq" +license = "MIT OR Apache-2.0" +publish = false + +version = "0.1.0" +edition = "2024" +rust-version.workspace = true + +[lib] +name = "carla_bridge" +# cdylib: what the CARLA plugin loads through include/carla_bridge.h. +# rlib: what the tests link. +crate-type = ["cdylib", "rlib"] + +# Linux only: elsewhere the crate is empty, so the workspace still builds on a Mac. +[target.'cfg(target_os = "linux")'.dependencies] +anyhow = { workspace = true } +bytes = { workspace = true } +moq-mux = { workspace = true } +moq-net = { workspace = true } +# The NVIDIA encoder, which imports the plugin's Vulkan images. The encoder is +# opened for the plugin's device, so no software fallback can take a frame. +moq-video = { workspace = true, features = ["nvidia"] } +parking_lot = "0.12" +# Blocking on a slot's GPU completion when a source closes, which is the one +# place the bridge waits on the GPU. +pollster = { workspace = true } +tracing = { workspace = true } + +[target.'cfg(target_os = "linux")'.dev-dependencies] +# The stand-in producer: a native Vulkan renderer that hands the bridge +# exportable slots exactly the way the CARLA plugin does. +ash = { workspace = true } diff --git a/demo/carla/bridge/examples/standin.rs b/demo/carla/bridge/examples/standin.rs new file mode 100644 index 00000000000..2cec08ad949 --- /dev/null +++ b/demo/carla/bridge/examples/standin.rs @@ -0,0 +1,73 @@ +//! Feed the bridge without CARLA: the test's stand-in renderer drives an sd +//! and an hd camera of one stream at 30 fps, cycling colors, for exercising +//! the worker's bridge client, a relay and the player by hand. +//! +//! ```sh +//! cargo run -p moq-carla-bridge --example standin -- /tmp/carla-bridge.sock truck1/front +//! ``` +//! +//! Needs the host NVIDIA driver on the loader path, as `just carla bridge-gpu` +//! arranges. + +#[cfg(target_os = "linux")] +#[path = "../tests/standin/mod.rs"] +mod standin; + +#[cfg(target_os = "linux")] +use std::time::{Duration, Instant}; + +#[cfg(target_os = "linux")] +use carla_bridge::{Bridge, Size}; + +#[cfg(target_os = "linux")] +const STEP: Duration = Duration::from_nanos(33_333_333); + +// An example needs a `main` on every target, or `--all-targets` stops compiling +// on a Mac, so elsewhere it refuses instead of vanishing. +#[cfg(not(target_os = "linux"))] +fn main() -> Result<(), &'static str> { + Err("standin needs Linux and the NVIDIA driver") +} + +#[cfg(target_os = "linux")] +fn main() -> anyhow::Result<()> { + let mut args = std::env::args().skip(1); + let (Some(socket), Some(stream)) = (args.next(), args.next()) else { + anyhow::bail!("usage: standin "); + }; + let gpu = standin::Gpu::open().ok_or_else(|| anyhow::anyhow!("no NVIDIA Vulkan device"))?; + let bridge = Bridge::listen(&socket)?; + let mut cameras = [ + standin::Camera::new(&gpu, &bridge, &stream, Size::new(426, 240), 3), + standin::Camera::new(&gpu, &bridge, &stream, Size::new(1280, 720), 3), + ]; + eprintln!("standin: rendering {stream} for the worker at {socket}"); + + let start = Instant::now(); + let mut wanted = [false; 2]; + let mut frame = 0u64; + loop { + frame += 1; + let deadline = start + STEP * frame as u32; + std::thread::sleep(deadline.saturating_duration_since(Instant::now())); + // A slow sweep through the hue circle, so motion is visible. + let phase = frame as f64 / 90.0 * std::f64::consts::TAU; + let channel = |offset: f64| (128.0 + 100.0 * (phase + offset).sin()) as u8; + let rgb = [channel(0.0), channel(2.1), channel(4.2)]; + for (index, camera) in cameras.iter_mut().enumerate() { + let now = camera.wanted(); + if now != wanted[index] { + eprintln!( + "standin: {}x{} camera {}", + camera.size.width, + camera.size.height, + if now { "rendering" } else { "parked" } + ); + wanted[index] = now; + } + if now && !camera.render(rgb, frame, frame * 33_333) { + eprintln!("standin: frame {frame} dropped, every slot busy"); + } + } + } +} diff --git a/demo/carla/bridge/gpu.sh b/demo/carla/bridge/gpu.sh new file mode 100755 index 00000000000..ee0cd1b0d8a --- /dev/null +++ b/demo/carla/bridge/gpu.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# Run a command against this host's NVIDIA driver and Vulkan loader, or skip on +# a host with no NVIDIA GPU. The GPU is found on the PCI bus rather than by its +# libraries, because the userspace libraries outlive a removed card. A card +# without a loaded driver is an error, so a host that should run the command +# never skips. CARLA_GPU_ROOT prefixes every probed path for the test. +set -euo pipefail + +root="${CARLA_GPU_ROOT:-}" + +gpu= +shopt -s nullglob +for device in "$root"/sys/bus/pci/devices/*; do + # NVIDIA's vendor ID with a display controller class (VGA, 3D, ...). + if [[ "$(<"$device/vendor")" == 0x10de && "$(<"$device/class")" == 0x03* ]]; then + gpu="${device##*/}" + break + fi +done +shopt -u nullglob + +if [[ -z "$gpu" ]]; then + echo "bridge-gpu: skipped, no NVIDIA GPU on this host" >&2 + exit 0 +fi + +if [[ ! -d "$root/proc/driver/nvidia" ]]; then + echo "bridge-gpu: NVIDIA GPU $gpu has no loaded kernel driver (no /proc/driver/nvidia); install the NVIDIA driver or load the nvidia module" >&2 + exit 1 +fi + +# NixOS keeps the loader outside the driver's directory, so they are found separately. +driver= +for candidate in "$root/run/opengl-driver/lib" "$root/usr/lib64" "$root/usr/lib/x86_64-linux-gnu" "$root/usr/lib"; do + if [[ -e "$candidate/libcuda.so.1" && -e "$candidate/libnvidia-encode.so.1" ]]; then + driver="$candidate" + break + fi +done +if [[ -z "$driver" ]]; then + echo "bridge-gpu: NVIDIA GPU $gpu has no driver libraries with CUDA and NVENC (libcuda.so.1, libnvidia-encode.so.1); install the NVIDIA driver's userspace" >&2 + exit 1 +fi + +vulkan= +for candidate in "$driver" "$root/run/current-system/sw/lib" "$root/usr/lib64" "$root/usr/lib/x86_64-linux-gnu" "$root/usr/lib"; do + if [[ -e "$candidate/libvulkan.so.1" ]]; then + vulkan="$candidate" + break + fi +done +if [[ -z "$vulkan" ]]; then + echo "bridge-gpu: the NVIDIA driver is in $driver but no Vulkan loader (libvulkan.so.1) was found; install one" >&2 + exit 1 +fi + +LD_LIBRARY_PATH="$driver:$vulkan${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" exec "$@" diff --git a/demo/carla/bridge/gpu.test.sh b/demo/carla/bridge/gpu.test.sh new file mode 100755 index 00000000000..ae9800e5ab7 --- /dev/null +++ b/demo/carla/bridge/gpu.test.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# Offline regression for gpu.sh's NVIDIA detection against a fake host root. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT + +pci() { + mkdir -p "$tmp/root/sys/bus/pci/devices/$1" + echo "$2" >"$tmp/root/sys/bus/pci/devices/$1/vendor" + echo "$3" >"$tmp/root/sys/bus/pci/devices/$1/class" +} + +# Runs gpu.sh against the fake root; the command prints the loader path it got. +run() { + CARLA_GPU_ROOT="$tmp/root" LD_LIBRARY_PATH='' bash "$here/gpu.sh" bash -c 'echo "ran $LD_LIBRARY_PATH"' >"$tmp/out" 2>&1 +} + +expect_skip() { + run || { + cat "$tmp/out" >&2 + echo "gpu.sh failed, expected a skip: $1" >&2 + exit 1 + } + if ! grep -Fq 'skipped, no NVIDIA GPU' "$tmp/out" || grep -Fq ran "$tmp/out"; then + cat "$tmp/out" >&2 + echo "gpu.sh did not skip: $1" >&2 + exit 1 + fi +} + +expect_error() { + if run; then + cat "$tmp/out" >&2 + echo "gpu.sh succeeded, expected an error: $1" >&2 + exit 1 + fi + grep -Fq "$2" "$tmp/out" +} + +# No /sys at all, like a Mac. +mkdir -p "$tmp/root" +expect_skip "no sysfs" + +# Leftover NVIDIA libraries with only Intel and AMD GPUs, plus an NVIDIA +# non-display function (an audio controller), must still skip. +mkdir -p "$tmp/root/usr/lib/x86_64-linux-gnu" +touch "$tmp/root/usr/lib/x86_64-linux-gnu/"{libcuda.so.1,libnvidia-encode.so.1,libvulkan.so.1} +pci 0000:00:02.0 0x8086 0x030000 +pci 0000:04:00.0 0x1002 0x030000 +pci 0000:04:00.1 0x10de 0x040300 +expect_skip "stale libraries without an NVIDIA GPU" + +# An NVIDIA GPU without the kernel driver loaded. +pci 0000:01:00.0 0x10de 0x030000 +expect_error "no kernel driver" "no loaded kernel driver" + +# The kernel driver without the userspace libraries. +mkdir -p "$tmp/root/proc/driver/nvidia" +rm "$tmp/root/usr/lib/x86_64-linux-gnu/"{libcuda.so.1,libnvidia-encode.so.1} +expect_error "no driver libraries" "no driver libraries" + +# The driver without a Vulkan loader. +touch "$tmp/root/usr/lib/x86_64-linux-gnu/"{libcuda.so.1,libnvidia-encode.so.1} +rm "$tmp/root/usr/lib/x86_64-linux-gnu/libvulkan.so.1" +expect_error "no Vulkan loader" "no Vulkan loader" + +# NixOS: the driver and loader live in separate directories. +mkdir -p "$tmp/root/run/opengl-driver/lib" "$tmp/root/run/current-system/sw/lib" +touch "$tmp/root/run/opengl-driver/lib/"{libcuda.so.1,libnvidia-encode.so.1} +touch "$tmp/root/run/current-system/sw/lib/libvulkan.so.1" +run +grep -Fxq "ran $tmp/root/run/opengl-driver/lib:$tmp/root/run/current-system/sw/lib" "$tmp/out" + +printf 'bridge GPU detection test: ok\n' diff --git a/demo/carla/bridge/include/carla_bridge.h b/demo/carla/bridge/include/carla_bridge.h new file mode 100644 index 00000000000..51b37c1c84a --- /dev/null +++ b/demo/carla/bridge/include/carla_bridge.h @@ -0,0 +1,105 @@ +/* + * The CARLA demo's GPU video bridge, as the CARLA plugin sees it. + * + * A source is one camera. The plugin allocates `slots` exportable Vulkan + * images on Unreal's device, each a dedicated VK_IMAGE_TILING_OPTIMAL + * allocation of the capture size in R8G8B8A8 or B8G8R8A8 UNORM with + * VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, plus one timeline semaphore + * per image exported as an opaque fd and starting at 0. Per rendered frame, + * on the RHI thread: + * + * if (carla_bridge_source_wanted(source) && + * carla_bridge_source_acquire(source, &slot, &ready) == 1) { + * record: barrier (after every earlier use of the image on this queue) + * -> copy the render target into image[slot] + * -> transition image[slot] to VK_IMAGE_LAYOUT_GENERAL + * vkQueueSubmit(..., signal timeline[slot] = ready) + * carla_bridge_source_submit(source, slot, frame, timestamp_us); + * } + * + * Nothing here blocks except carla_bridge_source_close. Functions returning + * int report -1 on failure with a message in carla_bridge_error(). A producer + * that cannot go on, whether for such an error or its own (a failed copy or + * submission), reports it with carla_bridge_source_fail, which the worker + * sees as the stream failing, then closes the source. + */ + +#ifndef CARLA_BRIDGE_H +#define CARLA_BRIDGE_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CarlaBridgeSource CarlaBridgeSource; + +#define CARLA_BRIDGE_RGBA 0u +#define CARLA_BRIDGE_BGRA 1u + +/* + * Register a camera of stream `stream` (the worker's broadcast, e.g. + * "truck1/front"). The first call in a process starts the bridge listening on + * `socket`, which fails while another process's bridge holds that path; later + * calls must name the same path. `device_uuid` and `driver_uuid` are the + * 16-byte VkPhysicalDeviceIDProperties::deviceUUID and ::driverUUID of the + * rendering device; every camera of a stream renders on one device. Returns + * NULL on failure. + */ +CarlaBridgeSource *carla_bridge_source_open(const char *socket, const char *stream, const uint8_t *device_uuid, + const uint8_t *driver_uuid, uint32_t width, uint32_t height, uint32_t channels, + uint32_t slots); + +/* + * Import slot `slot`'s image memory and timeline semaphore, each exported as an + * opaque fd. Both descriptors are consumed whatever the result. + * `allocation_size` is the whole VkDeviceMemory size and `memory_type` the + * VkMemoryAllocateInfo::memoryTypeIndex it was allocated from; an opaque + * import must repeat both. + */ +int carla_bridge_source_import(CarlaBridgeSource *source, uint32_t slot, int memory_fd, int timeline_fd, + uint64_t allocation_size, uint32_t memory_type); + +/* Whether the stream wants this camera's pictures now: render only if so. */ +bool carla_bridge_source_wanted(const CarlaBridgeSource *source); + +/* + * Take an idle slot. Returns 1 with the slot and the timeline value the copy's + * submission must signal, 0 when every slot is busy (drop this picture), or -1. + */ +int carla_bridge_source_acquire(CarlaBridgeSource *source, uint32_t *slot, uint64_t *ready); + +/* + * Hand an acquired slot to the encoder once its submission, including the + * `ready` signal, is queued. `frame` is CARLA's frame counter and + * `timestamp_us` the simulation time of the picture. + */ +int carla_bridge_source_submit(CarlaBridgeSource *source, uint32_t slot, uint64_t frame, uint64_t timestamp_us); + +/* + * The producer can no longer feed this camera, for `message`. The stream stops + * wanting it and fails the worker's session for the stream, and every session + * opened on it until another camera registers; close the source next. Never + * blocks. + */ +int carla_bridge_source_fail(CarlaBridgeSource *source, const char *message); + +/* Return an acquired slot without submitting it, when recording failed. */ +int carla_bridge_source_cancel(CarlaBridgeSource *source, uint32_t slot); + +/* + * Stop the camera and free `source`. Blocks until the GPU has finished with + * every slot, after which the images and semaphores may be destroyed. + */ +void carla_bridge_source_close(CarlaBridgeSource *source); + +/* The calling thread's last error, valid until its next bridge call. */ +const char *carla_bridge_error(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/demo/carla/bridge/src/ffi.rs b/demo/carla/bridge/src/ffi.rs new file mode 100644 index 00000000000..ac3a67647e5 --- /dev/null +++ b/demo/carla/bridge/src/ffi.rs @@ -0,0 +1,253 @@ +//! The C ABI the CARLA plugin calls, declared in `include/carla_bridge.h`. +//! +//! One bridge per process, created by the first source that names a socket. +//! Every entry point reports failure through its return value and +//! [`carla_bridge_error`]; a panic is caught at the boundary and reported the +//! same way rather than unwinding into Unreal. + +use std::cell::RefCell; +use std::ffi::{CStr, CString, c_char, c_int}; +use std::os::fd::{FromRawFd, OwnedFd}; +use std::panic::{AssertUnwindSafe, catch_unwind}; +use std::path::Path; + +use anyhow::{Context, Result, anyhow, bail}; +use parking_lot::Mutex; + +use crate::{Bridge, Device, Format, Size, Source}; + +static BRIDGE: Mutex> = Mutex::new(None); + +thread_local! { + static ERROR: RefCell = RefCell::new(CString::default()); +} + +/// Opaque to C. +pub struct CarlaBridgeSource(Source); + +fn guard(failed: T, body: impl FnOnce() -> Result) -> T { + let error = match catch_unwind(AssertUnwindSafe(body)) { + Ok(Ok(value)) => return value, + Ok(Err(err)) => format!("{err:#}"), + Err(panic) => { + let message = panic + .downcast_ref::<&str>() + .map(|s| s.to_string()) + .or_else(|| panic.downcast_ref::().cloned()) + .unwrap_or_default(); + format!("CARLA bridge panicked: {message}") + } + }; + tracing::error!(%error, "CARLA bridge call failed"); + let error = CString::new(error.replace('\0', " ")).expect("NULs replaced"); + ERROR.with(|slot| *slot.borrow_mut() = error); + failed +} + +/// # Safety +/// `value` is NULL or a NUL-terminated string. +unsafe fn text<'a>(value: *const c_char, what: &str) -> Result<&'a str> { + if value.is_null() { + bail!("{what} is NULL"); + } + // SAFETY: the caller passes a NUL-terminated string. + unsafe { CStr::from_ptr(value) } + .to_str() + .with_context(|| format!("{what} is not UTF-8")) +} + +/// # Safety +/// `source` is NULL or a live pointer from `carla_bridge_source_open`. +unsafe fn source<'a>(source: *const CarlaBridgeSource) -> Result<&'a Source> { + // SAFETY: the caller passes a live source. + unsafe { source.as_ref() } + .map(|source| &source.0) + .ok_or_else(|| anyhow!("source is NULL")) +} + +/// Register a camera; see `include/carla_bridge.h`. +/// +/// # Safety +/// `socket` and `stream` are NUL-terminated strings, and `device_uuid` and +/// `driver_uuid` each point at 16 bytes. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_open( + socket: *const c_char, + stream: *const c_char, + device_uuid: *const u8, + driver_uuid: *const u8, + width: u32, + height: u32, + channels: u32, + slots: u32, +) -> *mut CarlaBridgeSource { + guard(std::ptr::null_mut(), || { + // SAFETY: forwarded from the caller. + let socket = unsafe { text(socket, "socket") }?; + // SAFETY: forwarded from the caller. + let stream = unsafe { text(stream, "stream") }?; + if device_uuid.is_null() || driver_uuid.is_null() { + bail!("device or driver UUID is NULL"); + } + // SAFETY: the caller passes 16 readable bytes for each. + let device = Device { + device_uuid: unsafe { *device_uuid.cast::<[u8; 16]>() }, + driver_uuid: unsafe { *driver_uuid.cast::<[u8; 16]>() }, + render_node: None, + }; + let format = match channels { + 0 => Format::Rgba8, + 1 => Format::Bgra8, + other => bail!("unknown channel order {other}"), + }; + + let mut bridge = BRIDGE.lock(); + let bridge = match &mut *bridge { + Some(bridge) if bridge.path() == Path::new(socket) => bridge, + Some(bridge) => bail!("the bridge already listens on {}", bridge.path().display()), + None => bridge.insert(Bridge::listen(socket)?), + }; + let source = bridge.source( + stream, + device, + Size::new(width, height), + format, + slots as usize, + )?; + Ok(Box::into_raw(Box::new(CarlaBridgeSource(source)))) + }) +} + +/// # Safety +/// `source` is a live source; the descriptors are owned by the caller and +/// consumed by this call whatever it returns. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_import( + source_: *mut CarlaBridgeSource, + slot: u32, + memory_fd: c_int, + timeline_fd: c_int, + allocation_size: u64, + memory_type: u32, +) -> c_int { + // Owned first, so an early error still closes them. + // SAFETY: the caller transfers ownership of both descriptors. + let memory = (memory_fd >= 0).then(|| unsafe { OwnedFd::from_raw_fd(memory_fd) }); + // SAFETY: as above. + let timeline = (timeline_fd >= 0).then(|| unsafe { OwnedFd::from_raw_fd(timeline_fd) }); + guard(-1, || { + let (Some(memory), Some(timeline)) = (memory, timeline) else { + bail!("invalid file descriptor"); + }; + // SAFETY: forwarded from the caller. + unsafe { source(source_) }?.import( + slot as usize, + memory, + timeline, + allocation_size, + memory_type, + )?; + Ok(0) + }) +} + +/// # Safety +/// `source` is a live source. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_wanted(source_: *const CarlaBridgeSource) -> bool { + // SAFETY: forwarded from the caller. + guard(false, || Ok(unsafe { source(source_) }?.wanted())) +} + +/// # Safety +/// `source` is a live source and `slot`/`ready` are writable. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_acquire( + source_: *mut CarlaBridgeSource, + slot: *mut u32, + ready: *mut u64, +) -> c_int { + guard(-1, || { + if slot.is_null() || ready.is_null() { + bail!("output pointer is NULL"); + } + // SAFETY: forwarded from the caller. + let Some((index, value)) = unsafe { source(source_) }?.acquire()? else { + return Ok(0); + }; + // SAFETY: the caller passes writable outputs. + unsafe { + *slot = index as u32; + *ready = value; + } + Ok(1) + }) +} + +/// # Safety +/// `source` is a live source. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_submit( + source_: *mut CarlaBridgeSource, + slot: u32, + frame: u64, + timestamp_us: u64, +) -> c_int { + guard(-1, || { + // SAFETY: forwarded from the caller. + unsafe { source(source_) }?.submit(slot as usize, frame, timestamp_us)?; + Ok(0) + }) +} + +/// # Safety +/// `source` is a live source. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_cancel( + source_: *mut CarlaBridgeSource, + slot: u32, +) -> c_int { + guard(-1, || { + // SAFETY: forwarded from the caller. + unsafe { source(source_) }?.cancel(slot as usize)?; + Ok(0) + }) +} + +/// Report that the producer can no longer feed a camera; see +/// `include/carla_bridge.h`. +/// +/// # Safety +/// `source` is a live source and `message` a NUL-terminated string. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_fail( + source_: *mut CarlaBridgeSource, + message: *const c_char, +) -> c_int { + guard(-1, || { + // SAFETY: forwarded from the caller. + let message = unsafe { text(message, "message") }?; + // SAFETY: forwarded from the caller. + unsafe { source(source_) }?.fail(message); + Ok(0) + }) +} + +/// # Safety +/// `source` is NULL or a live source, which this call frees. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn carla_bridge_source_close(source_: *mut CarlaBridgeSource) { + guard((), || { + if !source_.is_null() { + // SAFETY: the caller hands back the pointer `open` returned, once. + drop(unsafe { Box::from_raw(source_) }); + } + Ok(()) + }) +} + +/// The calling thread's last error, valid until its next bridge call. +#[unsafe(no_mangle)] +pub extern "C" fn carla_bridge_error() -> *const c_char { + ERROR.with(|slot| slot.borrow().as_ptr()) +} diff --git a/demo/carla/bridge/src/lib.rs b/demo/carla/bridge/src/lib.rs new file mode 100644 index 00000000000..24d4775b5de --- /dev/null +++ b/demo/carla/bridge/src/lib.rs @@ -0,0 +1,218 @@ +//! The native half of the CARLA demo's GPU video path. +//! +//! CARLA renders each truck camera with Unreal. The CARLA plugin copies the +//! render target on the GPU into an exportable Vulkan image it shares with this +//! library, which hands it to moq-video's encoder opened for the plugin's +//! device: NVENC converts, scales, and encodes it there. Compressed frames +//! leave through a Unix socket to the Python worker, which publishes them on +//! the truck's MoQ broadcast. Raw pixels never reach CPU memory, and nothing +//! here falls back to a CPU path: an unsupported device or a failed GPU step is +//! an error. +//! +//! - [`Bridge`] listens for the worker and owns the streams. The CARLA plugin +//! holds one per process through the C ABI in `include/carla_bridge.h`. +//! - A stream is one worker broadcast (`truck1/front`) with its renditions, +//! demand and encoders. Cameras register as sources of a stream by name. +//! - A [`Source`] is one camera's bounded set of exportable image slots. +//! +//! The worker protocol is [`protocol`]. +//! +//! Linux only; the crate is empty elsewhere. +#![cfg(target_os = "linux")] + +mod ffi; +pub mod protocol; +mod server; +mod source; +mod stream; + +use std::collections::HashMap; +use std::fs::{File, TryLockError}; +use std::os::unix::fs::FileTypeExt; +use std::os::unix::net::{UnixListener, UnixStream}; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::thread::JoinHandle; + +use anyhow::{Context, Result, bail}; +use parking_lot::Mutex; + +pub use moq_video::Size; +pub use moq_video::frame::vulkan::{Device, Format}; +pub use source::Source; + +use server::Output; +use stream::Stream; + +/// The bridge: a socket for the worker and the streams it encodes. +pub struct Bridge { + shared: Arc, + listener: Option>, + /// Held for the bridge's life: whoever holds it owns the socket path, so a + /// second process refuses the path instead of unlinking a live listener. + _lock: File, +} + +pub(crate) struct Shared { + path: PathBuf, + output: Arc, + streams: Mutex>>, + connection: Mutex>, + closing: AtomicBool, +} + +impl Bridge { + /// Listen for the worker at `path`, replacing a socket a previous process + /// left behind. Another live bridge on `path` is an error. + pub fn listen(path: impl Into) -> Result { + let path = path.into(); + // A socket file cannot say whether its listener is alive, and probing it + // with a connection would displace that bridge's worker. An flock beside + // it can: the kernel releases it when its holder exits. + let mut lock_path = path.clone().into_os_string(); + lock_path.push(".lock"); + let lock_path = PathBuf::from(lock_path); + let lock = File::options() + .write(true) + .create(true) + .truncate(false) + .open(&lock_path) + .with_context(|| format!("open {}", lock_path.display()))?; + match lock.try_lock() { + Ok(()) => {} + Err(TryLockError::WouldBlock) => { + bail!("another bridge is listening on {}", path.display()) + } + Err(TryLockError::Error(err)) => { + return Err(err).with_context(|| format!("lock {}", lock_path.display())); + } + } + match std::fs::symlink_metadata(&path) { + Ok(meta) if meta.file_type().is_socket() => { + std::fs::remove_file(&path) + .with_context(|| format!("remove the stale socket {}", path.display()))?; + } + Ok(_) => bail!("{} exists and is not a socket", path.display()), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => {} + Err(err) => return Err(err).with_context(|| format!("inspect {}", path.display())), + } + let listener = + UnixListener::bind(&path).with_context(|| format!("listen on {}", path.display()))?; + let shared = Arc::new(Shared { + path, + output: Arc::default(), + streams: Mutex::default(), + connection: Mutex::default(), + closing: AtomicBool::new(false), + }); + let listener = std::thread::Builder::new() + .name("carla-bridge:listen".into()) + .spawn({ + let shared = shared.clone(); + move || server::listen(&shared, listener) + }) + .context("start the bridge listener")?; + Ok(Self { + shared, + listener: Some(listener), + _lock: lock, + }) + } + + /// The socket the worker connects to. + pub fn path(&self) -> &Path { + &self.shared.path + } + + /// Register a camera of `stream` rendering `size` images in `format` on the + /// Vulkan `device`, with `slots` images to cycle. Every camera of a stream + /// renders on one device. + pub fn source( + &self, + stream: &str, + device: Device, + size: Size, + format: Format, + slots: usize, + ) -> Result { + let stream = self.shared.stream(stream)?; + Source::new(stream, device, size, format, slots) + } +} + +impl Drop for Bridge { + fn drop(&mut self) { + self.shared.closing.store(true, Ordering::Release); + // Wake the blocking accept; it sees `closing` and exits. + let _ = UnixStream::connect(&self.shared.path); + if let Some(listener) = self.listener.take() { + let _ = listener.join(); + } + if let Some((_, socket)) = self.shared.connection.lock().take() { + let _ = socket.shutdown(std::net::Shutdown::Both); + } + for stream in self.shared.streams.lock().drain().map(|(_, stream)| stream) { + stream.shutdown(); + } + let _ = std::fs::remove_file(&self.shared.path); + } +} + +impl Shared { + fn closing(&self) -> bool { + self.closing.load(Ordering::Acquire) + } + + /// The stream called `name`, started on first use by either side. + fn stream(&self, name: &str) -> Result> { + let mut streams = self.streams.lock(); + if let Some(stream) = streams.get(name) { + return Ok(stream.clone()); + } + let stream = Stream::spawn(name.to_owned(), self.output.clone())?; + streams.insert(name.to_owned(), stream.clone()); + Ok(stream) + } + + /// Make `socket` the worker connection, returning the one it replaces. + fn replace_connection(&self, key: u64, socket: UnixStream) -> Option { + self.connection + .lock() + .replace((key, socket)) + .map(|(_, socket)| socket) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn socket_path(name: &str) -> PathBuf { + std::env::temp_dir().join(format!("carla-bridge-{name}-{}.sock", std::process::id())) + } + + #[test] + fn a_live_bridge_keeps_its_socket() { + let path = socket_path("live"); + let first = Bridge::listen(&path).unwrap(); + let err = Bridge::listen(&path) + .err() + .expect("a second bridge on the path"); + assert!(err.to_string().contains("another bridge"), "{err:#}"); + // The first bridge still owns a socket that accepts connections. + UnixStream::connect(&path).expect("the first bridge still listens"); + drop(first); + } + + #[test] + fn a_stale_socket_is_replaced() { + let path = socket_path("stale"); + let _ = std::fs::remove_file(&path); + // A listener that exited without unlinking, like a crashed process. + drop(UnixListener::bind(&path).unwrap()); + let bridge = Bridge::listen(&path).unwrap(); + UnixStream::connect(&path).expect("the new bridge listens"); + drop(bridge); + } +} diff --git a/demo/carla/bridge/src/protocol.rs b/demo/carla/bridge/src/protocol.rs new file mode 100644 index 00000000000..843d6bcb9c7 --- /dev/null +++ b/demo/carla/bridge/src/protocol.rs @@ -0,0 +1,523 @@ +//! The encoded-frame protocol between the bridge and the demo's worker. +//! +//! The bridge runs inside CARLA; the worker is the Python process that owns the +//! MoQ broadcasts. They share one Unix stream socket that carries compressed +//! video and control only: raw pixels never cross it. +//! +//! Every message is `u32 length | u8 kind | body`, where `length` counts the +//! kind byte and the body. Integers are little-endian, a string is +//! `u16 length | UTF-8`, and a blob is `u32 length | bytes`. +//! `moq_carla_sim/bridge.py` mirrors this module and tests the same vectors. + +use std::io::{self, Read}; + +use bytes::{Buf, BufMut, Bytes, BytesMut}; + +/// Bumped on any incompatible change; both sides refuse a mismatch. +pub const VERSION: u16 = 1; + +/// The largest message either side accepts. A 720p IDR is a few hundred kB. +pub const MAX_MESSAGE: u32 = 16 << 20; + +/// Renditions per stream, so demand fits a one-byte mask. +pub const MAX_RENDITIONS: usize = 8; + +const HELLO: u8 = 0x01; +const OPEN: u8 = 0x02; +const DEMAND: u8 = 0x03; +const KEYFRAME: u8 = 0x04; +const CLOSE: u8 = 0x05; + +const EVENT_HELLO: u8 = 0x81; +const EVENT_CONFIG: u8 = 0x82; +const EVENT_FRAME: u8 = 0x83; +const EVENT_ERROR: u8 = 0x84; + +/// One encoded size of a stream. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Rendition { + /// The MoQ track name the worker publishes it as. + pub name: String, + pub width: u32, + pub height: u32, + /// Target bitrate in bits per second. + pub bitrate: u64, + /// Frames per second the simulation steps at. + pub framerate: u32, +} + +/// Worker to bridge. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Request { + /// The first message on a connection. + Hello { version: u16 }, + /// Encode the capture sources registered as `name` as stream `id`. The + /// bridge answers with one [`Event::Config`] per rendition, in order. + Open { + id: u32, + name: String, + renditions: Vec, + }, + /// The renditions that have subscribers, as a mask of `Open` indices. + Demand { id: u32, renditions: u8 }, + /// Encode the next frame of one rendition as an IDR. + Keyframe { id: u32, rendition: u8 }, + /// Stop encoding stream `id`. + Close { id: u32 }, +} + +/// Bridge to worker. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Event { + /// The answer to [`Request::Hello`]. + Hello { version: u16 }, + /// A rendition's Annex-B parameter sets, sent before any of its frames so + /// the worker can advertise the track before anyone subscribes. + Config { id: u32, rendition: u8, init: Bytes }, + /// One encoded access unit. + Frame(Frame), + /// A failure. Stream 0 is the connection itself; any other stream has + /// stopped encoding. + Error { id: u32, message: String }, +} + +/// One encoded access unit and where it came from. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Frame { + pub id: u32, + pub rendition: u8, + /// CARLA's frame counter at capture. + pub frame: u64, + /// Simulation time at capture, in microseconds. + pub timestamp_us: u64, + /// An IDR: a subscriber can start decoding here. + pub keyframe: bool, + /// Annex-B, with in-band parameter sets on every IDR. + pub payload: Bytes, +} + +impl Request { + pub fn encode(&self) -> Bytes { + let mut out = Message::new(); + match self { + Self::Hello { version } => { + out.kind(HELLO); + out.buf.put_u16_le(*version); + } + Self::Open { + id, + name, + renditions, + } => { + out.kind(OPEN); + out.buf.put_u32_le(*id); + out.string(name); + out.buf.put_u8(renditions.len() as u8); + for rendition in renditions { + out.string(&rendition.name); + out.buf.put_u32_le(rendition.width); + out.buf.put_u32_le(rendition.height); + out.buf.put_u64_le(rendition.bitrate); + out.buf.put_u32_le(rendition.framerate); + } + } + Self::Demand { id, renditions } => { + out.kind(DEMAND); + out.buf.put_u32_le(*id); + out.buf.put_u8(*renditions); + } + Self::Keyframe { id, rendition } => { + out.kind(KEYFRAME); + out.buf.put_u32_le(*id); + out.buf.put_u8(*rendition); + } + Self::Close { id } => { + out.kind(CLOSE); + out.buf.put_u32_le(*id); + } + } + out.finish() + } + + pub fn decode(kind: u8, mut body: Bytes) -> io::Result { + let body = &mut body; + let request = match kind { + HELLO => Self::Hello { + version: u16_le(body)?, + }, + OPEN => { + let id = u32_le(body)?; + let name = string(body)?; + let count = usize::from(u8_(body)?); + if count == 0 || count > MAX_RENDITIONS { + return Err(invalid(format!("stream {name:?} has {count} renditions"))); + } + let mut renditions = Vec::with_capacity(count); + for _ in 0..count { + renditions.push(Rendition { + name: string(body)?, + width: u32_le(body)?, + height: u32_le(body)?, + bitrate: u64_le(body)?, + framerate: u32_le(body)?, + }); + } + Self::Open { + id, + name, + renditions, + } + } + DEMAND => Self::Demand { + id: u32_le(body)?, + renditions: u8_(body)?, + }, + KEYFRAME => Self::Keyframe { + id: u32_le(body)?, + rendition: u8_(body)?, + }, + CLOSE => Self::Close { id: u32_le(body)? }, + kind => return Err(invalid(format!("unknown request kind {kind:#04x}"))), + }; + end(body)?; + Ok(request) + } +} + +impl Event { + pub fn encode(&self) -> Bytes { + let mut out = Message::new(); + match self { + Self::Hello { version } => { + out.kind(EVENT_HELLO); + out.buf.put_u16_le(*version); + } + Self::Config { + id, + rendition, + init, + } => { + out.kind(EVENT_CONFIG); + out.buf.put_u32_le(*id); + out.buf.put_u8(*rendition); + out.blob(init); + } + Self::Frame(frame) => { + out.kind(EVENT_FRAME); + out.buf.put_u32_le(frame.id); + out.buf.put_u8(frame.rendition); + out.buf.put_u64_le(frame.frame); + out.buf.put_u64_le(frame.timestamp_us); + out.buf.put_u8(u8::from(frame.keyframe)); + out.blob(&frame.payload); + } + Self::Error { id, message } => { + out.kind(EVENT_ERROR); + out.buf.put_u32_le(*id); + out.string(message); + } + } + out.finish() + } + + pub fn decode(kind: u8, mut body: Bytes) -> io::Result { + let body = &mut body; + let event = match kind { + EVENT_HELLO => Self::Hello { + version: u16_le(body)?, + }, + EVENT_CONFIG => Self::Config { + id: u32_le(body)?, + rendition: u8_(body)?, + init: blob(body)?, + }, + EVENT_FRAME => Self::Frame(Frame { + id: u32_le(body)?, + rendition: u8_(body)?, + frame: u64_le(body)?, + timestamp_us: u64_le(body)?, + keyframe: match u8_(body)? { + 0 => false, + 1 => true, + other => return Err(invalid(format!("keyframe flag {other}"))), + }, + payload: blob(body)?, + }), + EVENT_ERROR => Self::Error { + id: u32_le(body)?, + message: string(body)?, + }, + kind => return Err(invalid(format!("unknown event kind {kind:#04x}"))), + }; + end(body)?; + Ok(event) + } +} + +/// Read one message's kind and body, or `None` at a clean end of stream, which +/// is only between messages: a torn header is an error like a torn body. +pub fn read(reader: &mut impl Read) -> io::Result> { + let mut length = [0u8; 4]; + let mut filled = 0; + while filled < length.len() { + match reader.read(&mut length[filled..]) { + Ok(0) if filled == 0 => return Ok(None), + Ok(0) => { + return Err(io::Error::new( + io::ErrorKind::UnexpectedEof, + "end of stream inside a message header", + )); + } + Ok(read) => filled += read, + Err(err) if err.kind() == io::ErrorKind::Interrupted => {} + Err(err) => return Err(err), + } + } + let length = u32::from_le_bytes(length); + if length == 0 || length > MAX_MESSAGE { + return Err(invalid(format!("message length {length}"))); + } + let mut message = vec![0u8; length as usize]; + reader.read_exact(&mut message)?; + let mut message = Bytes::from(message); + let kind = message.get_u8(); + Ok(Some((kind, message))) +} + +struct Message { + buf: BytesMut, +} + +impl Message { + fn new() -> Self { + let mut buf = BytesMut::new(); + // The length is patched in by `finish`. + buf.put_u32_le(0); + Self { buf } + } + + fn kind(&mut self, kind: u8) { + self.buf.put_u8(kind); + } + + fn string(&mut self, value: &str) { + let len = u16::try_from(value.len()).expect("protocol string longer than 64 KiB"); + self.buf.put_u16_le(len); + self.buf.put_slice(value.as_bytes()); + } + + fn blob(&mut self, value: &[u8]) { + let len = u32::try_from(value.len()).expect("protocol blob longer than 4 GiB"); + self.buf.put_u32_le(len); + self.buf.put_slice(value); + } + + fn finish(mut self) -> Bytes { + let length = u32::try_from(self.buf.len() - 4).expect("protocol message longer than 4 GiB"); + self.buf[..4].copy_from_slice(&length.to_le_bytes()); + self.buf.freeze() + } +} + +fn invalid(message: String) -> io::Error { + io::Error::new(io::ErrorKind::InvalidData, message) +} + +fn need(body: &Bytes, len: usize) -> io::Result<()> { + if body.remaining() < len { + return Err(invalid(format!( + "truncated message: need {len} bytes, have {}", + body.remaining() + ))); + } + Ok(()) +} + +fn u8_(body: &mut Bytes) -> io::Result { + need(body, 1)?; + Ok(body.get_u8()) +} + +fn u16_le(body: &mut Bytes) -> io::Result { + need(body, 2)?; + Ok(body.get_u16_le()) +} + +fn u32_le(body: &mut Bytes) -> io::Result { + need(body, 4)?; + Ok(body.get_u32_le()) +} + +fn u64_le(body: &mut Bytes) -> io::Result { + need(body, 8)?; + Ok(body.get_u64_le()) +} + +fn string(body: &mut Bytes) -> io::Result { + let len = usize::from(u16_le(body)?); + need(body, len)?; + String::from_utf8(body.split_to(len).to_vec()).map_err(|err| invalid(format!("string: {err}"))) +} + +fn blob(body: &mut Bytes) -> io::Result { + let len = u32_le(body)? as usize; + need(body, len)?; + Ok(body.split_to(len)) +} + +fn end(body: &Bytes) -> io::Result<()> { + if body.has_remaining() { + return Err(invalid(format!("{} trailing bytes", body.remaining()))); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + // Shared with `moq_carla_sim/bridge.py`'s tests: both sides must produce and + // accept exactly these bytes. + const HELLO_HEX: &str = "03000000010100"; + const OPEN_HEX: &str = "2c00000002070000000c00747275636b312f66726f6e740102007364aa010000f000000000350c00000000001e000000"; + const DEMAND_HEX: &str = "06000000030700000002"; + const KEYFRAME_HEX: &str = "06000000040700000001"; + const CLOSE_HEX: &str = "050000000507000000"; + const EVENT_HELLO_HEX: &str = "03000000810100"; + const CONFIG_HEX: &str = "0f000000820700000000050000000000000167"; + const FRAME_HEX: &str = + "20000000830700000001d204000000000000404b4c000000000001050000000000000165"; + const ERROR_HEX: &str = "0b00000084000000000400626f6f6d"; + + fn requests() -> Vec<(Request, &'static str)> { + vec![ + (Request::Hello { version: 1 }, HELLO_HEX), + ( + Request::Open { + id: 7, + name: "truck1/front".into(), + renditions: vec![Rendition { + name: "sd".into(), + width: 426, + height: 240, + bitrate: 800_000, + framerate: 30, + }], + }, + OPEN_HEX, + ), + ( + Request::Demand { + id: 7, + renditions: 0b10, + }, + DEMAND_HEX, + ), + ( + Request::Keyframe { + id: 7, + rendition: 1, + }, + KEYFRAME_HEX, + ), + (Request::Close { id: 7 }, CLOSE_HEX), + ] + } + + fn events() -> Vec<(Event, &'static str)> { + vec![ + (Event::Hello { version: 1 }, EVENT_HELLO_HEX), + ( + Event::Config { + id: 7, + rendition: 0, + init: Bytes::from_static(&[0, 0, 0, 1, 0x67]), + }, + CONFIG_HEX, + ), + ( + Event::Frame(Frame { + id: 7, + rendition: 1, + frame: 1234, + timestamp_us: 5_000_000, + keyframe: true, + payload: Bytes::from_static(&[0, 0, 0, 1, 0x65]), + }), + FRAME_HEX, + ), + ( + Event::Error { + id: 0, + message: "boom".into(), + }, + ERROR_HEX, + ), + ] + } + + fn hex(bytes: &[u8]) -> String { + bytes.iter().map(|b| format!("{b:02x}")).collect() + } + + fn unhex(text: &str) -> Vec { + (0..text.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&text[i..i + 2], 16).unwrap()) + .collect() + } + + #[test] + fn requests_match_the_shared_vectors() { + for (request, expected) in requests() { + assert_eq!(hex(&request.encode()), expected, "{request:?}"); + let wire = unhex(expected); + let (kind, body) = read(&mut &wire[..]).unwrap().unwrap(); + assert_eq!(Request::decode(kind, body).unwrap(), request); + } + } + + #[test] + fn events_match_the_shared_vectors() { + for (event, expected) in events() { + assert_eq!(hex(&event.encode()), expected, "{event:?}"); + let wire = unhex(expected); + let (kind, body) = read(&mut &wire[..]).unwrap().unwrap(); + assert_eq!(Event::decode(kind, body).unwrap(), event); + } + } + + #[test] + fn rejects_malformed_messages() { + // Truncated body, and a header torn after 1 to 3 bytes. + let wire = unhex("06000000030700"); + assert!(read(&mut &wire[..]).is_err()); + for torn in 1..4 { + assert!(read(&mut &wire[..torn]).is_err(), "{torn} header bytes"); + } + // Trailing bytes after a complete request. + let (kind, body) = read(&mut &unhex("0700000003070000000200")[..]) + .unwrap() + .unwrap(); + assert!(Request::decode(kind, body).is_err()); + // Unknown kind. + let (kind, body) = read(&mut &unhex("0100000009")[..]).unwrap().unwrap(); + assert!(Request::decode(kind, body).is_err()); + // Too many renditions. + let mut open = Request::Open { + id: 1, + name: "x".into(), + renditions: Vec::new(), + } + .encode() + .to_vec(); + assert!(Request::decode(open[4], Bytes::copy_from_slice(&open[5..])).is_err()); + open[4 + 1 + 4 + 3] = 9; + assert!(Request::decode(open[4], Bytes::copy_from_slice(&open[5..])).is_err()); + // Zero and oversized lengths. + assert!(read(&mut &unhex("00000000")[..]).is_err()); + assert!(read(&mut &unhex("ffffffff01")[..]).is_err()); + // A clean end of stream between messages. + assert!(read(&mut &[][..]).unwrap().is_none()); + } +} diff --git a/demo/carla/bridge/src/server.rs b/demo/carla/bridge/src/server.rs new file mode 100644 index 00000000000..707f6cb210d --- /dev/null +++ b/demo/carla/bridge/src/server.rs @@ -0,0 +1,346 @@ +//! The worker's side of the socket: one connection at a time. +//! +//! The newest connection wins. A restarted worker reconnects while the old +//! socket may still look open, so a new connection shuts the old one down and +//! closes every stream it opened. + +use std::collections::HashMap; +use std::io::{self, BufReader, BufWriter, Write}; +use std::os::unix::net::{UnixListener, UnixStream}; +use std::sync::Arc; +use std::sync::mpsc::{self, SyncSender, TrySendError}; + +use anyhow::{Context, Result, bail}; +use bytes::Bytes; +use parking_lot::Mutex; + +use crate::Shared; +use crate::protocol::{self, Event, MAX_RENDITIONS, Request, VERSION}; +use crate::stream::{Session, SessionId, Stream}; + +/// Encoded messages queued for the worker: about two seconds of two +/// renditions at 30 fps. Beyond that the worker is not keeping up, and a +/// stream drops to its next IDR rather than queue without bound. +const OUTPUT_DEPTH: usize = 128; + +/// Where encoded frames go: the current connection's writer, if any. +#[derive(Default)] +pub(crate) struct Output { + current: Mutex)>>, +} + +pub(crate) enum Sent { + Queued, + /// The worker is behind; the message was dropped. + Full, + /// That connection is gone; its streams are closing. + Gone, +} + +impl Output { + fn sender(&self, connection: u64) -> Option> { + match &*self.current.lock() { + Some((current, sender)) if *current == connection => Some(sender.clone()), + _ => None, + } + } + + /// Queue a frame without waiting. + pub fn try_send(&self, connection: u64, event: &Event) -> Sent { + let Some(sender) = self.sender(connection) else { + return Sent::Gone; + }; + match sender.try_send(event.encode()) { + Ok(()) => Sent::Queued, + Err(TrySendError::Full(_)) => Sent::Full, + Err(TrySendError::Disconnected(_)) => Sent::Gone, + } + } + + /// Queue a message that must not be dropped, waiting for room. + pub fn send(&self, connection: u64, event: &Event) { + if let Some(sender) = self.sender(connection) { + let _ = sender.send(event.encode()); + } + } + + fn connect(&self, connection: u64, sender: SyncSender) { + *self.current.lock() = Some((connection, sender)); + } + + fn disconnect(&self, connection: u64) { + let mut current = self.current.lock(); + if current + .as_ref() + .is_some_and(|(current, _)| *current == connection) + { + *current = None; + } + } +} + +pub(crate) fn listen(shared: &Arc, listener: UnixListener) { + let mut connection = 0u64; + for socket in listener.incoming() { + if shared.closing() { + break; + } + let socket = match socket { + Ok(socket) => socket, + Err(err) => { + tracing::error!(%err, "accept a worker"); + continue; + } + }; + connection += 1; + if let Err(err) = accept(shared, connection, socket) { + tracing::error!(err = format!("{err:#}"), "start a worker connection"); + } + } +} + +fn accept(shared: &Arc, connection: u64, socket: UnixStream) -> Result<()> { + let (sender, receiver) = mpsc::sync_channel::(OUTPUT_DEPTH); + let reader = socket.try_clone().context("clone the worker socket")?; + let writer = socket.try_clone().context("clone the worker socket")?; + if let Some(previous) = shared.replace_connection(connection, socket) { + tracing::warn!("a new worker connected; dropping the previous one"); + let _ = previous.shutdown(std::net::Shutdown::Both); + } + shared.output.connect(connection, sender); + + std::thread::Builder::new() + .name("carla-bridge:write".into()) + .spawn(move || { + let mut writer = BufWriter::new(writer); + // Ends once the connection is replaced or its reader finishes, after + // writing whatever was already queued, such as a final error. + while let Ok(message) = receiver.recv() { + if let Err(err) = write(&mut writer, &receiver, message) { + tracing::warn!(%err, "worker write failed"); + break; + } + } + let _ = writer.get_ref().shutdown(std::net::Shutdown::Both); + }) + .context("start the worker writer")?; + + let shared = shared.clone(); + std::thread::Builder::new() + .name("carla-bridge:read".into()) + .spawn(move || { + let mut connection = Connection { + shared: &shared, + key: connection, + streams: HashMap::new(), + hello: false, + }; + let result = connection.serve(&mut BufReader::new(reader)); + if let Err(err) = &result { + tracing::error!(err = format!("{err:#}"), "worker protocol error"); + shared.output.send( + connection.key, + &Event::Error { + id: 0, + message: format!("{err:#}"), + }, + ); + } + connection.finish(); + }) + .context("start the worker reader")?; + Ok(()) +} + +/// Write `message` and everything queued behind it, then flush once, so a +/// burst of packets costs one syscall rather than one each. +fn write( + writer: &mut BufWriter, + queue: &mpsc::Receiver, + message: Bytes, +) -> io::Result<()> { + writer.write_all(&message)?; + while let Ok(message) = queue.try_recv() { + writer.write_all(&message)?; + } + writer.flush() +} + +struct Connection<'a> { + shared: &'a Arc, + key: u64, + streams: HashMap>, + hello: bool, +} + +impl Connection<'_> { + fn serve(&mut self, reader: &mut impl io::Read) -> Result<()> { + while let Some((kind, body)) = protocol::read(reader).context("read from the worker")? { + let request = Request::decode(kind, body).context("decode a worker request")?; + self.handle(request)?; + } + Ok(()) + } + + fn handle(&mut self, request: Request) -> Result<()> { + // A replaced connection's reader can still be mid-request. Holding the + // connection lock orders each request against a replacement, and a + // superseded connection may not touch the streams its successor owns. + let current = self.shared.connection.lock(); + if current.as_ref().map(|(key, _)| *key) != Some(self.key) { + bail!("superseded by a newer worker connection"); + } + if !self.hello && !matches!(request, Request::Hello { .. }) { + bail!("expected hello, got {request:?}"); + } + match request { + Request::Hello { version } => { + if self.hello { + bail!("repeated hello"); + } + if version != VERSION { + bail!("worker speaks protocol {version}, bridge speaks {VERSION}"); + } + self.hello = true; + // Sending waits for queue room; never while a replacement waits. + drop(current); + self.shared + .output + .send(self.key, &Event::Hello { version: VERSION }); + } + Request::Open { + id, + name, + renditions, + } => { + if id == 0 { + bail!("stream id 0 is reserved for the connection"); + } + validate(&name, &renditions)?; + if self.streams.contains_key(&id) { + bail!("stream {id} is already open"); + } + if self.streams.values().any(|stream| stream.name() == name) { + bail!("stream {name:?} is already open"); + } + let stream = self.shared.stream(&name)?; + stream.open(Session { + key: self.session(id), + renditions, + }); + self.streams.insert(id, stream); + } + Request::Demand { id, renditions } => { + self.stream(id)?.demand(self.session(id), renditions)? + } + Request::Keyframe { id, rendition } => { + self.stream(id)?.keyframe(self.session(id), rendition)? + } + Request::Close { id } => { + let stream = self + .streams + .remove(&id) + .with_context(|| format!("stream {id} is not open"))?; + stream.close(self.session(id)); + } + } + Ok(()) + } + + fn stream(&self, id: u32) -> Result<&Arc> { + self.streams + .get(&id) + .with_context(|| format!("stream {id} is not open")) + } + + fn session(&self, id: u32) -> SessionId { + SessionId { + connection: self.key, + id, + } + } + + /// The worker is gone: stop every stream it opened. + fn finish(self) { + self.shared.output.disconnect(self.key); + for (id, stream) in self.streams { + stream.close(SessionId { + connection: self.key, + id, + }); + } + } +} + +fn validate(name: &str, renditions: &[protocol::Rendition]) -> Result<()> { + if name.is_empty() { + bail!("stream name is empty"); + } + if renditions.is_empty() || renditions.len() > MAX_RENDITIONS { + bail!("stream {name:?} has {} renditions", renditions.len()); + } + for (index, rendition) in renditions.iter().enumerate() { + let label = format!("stream {name:?} rendition {:?}", rendition.name); + if rendition.name.is_empty() { + bail!("{label}: empty name"); + } + if renditions[..index] + .iter() + .any(|other| other.name == rendition.name) + { + bail!("{label}: duplicate name"); + } + if rendition.width == 0 + || rendition.height == 0 + || !rendition.width.is_multiple_of(2) + || !rendition.height.is_multiple_of(2) + { + bail!( + "{label}: size {}x{} must be non-zero and even", + rendition.width, + rendition.height + ); + } + if rendition.framerate == 0 || rendition.bitrate == 0 { + bail!("{label}: framerate and bitrate must be non-zero"); + } + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_superseded_connection_changes_nothing() { + let path = std::env::temp_dir().join(format!( + "carla-bridge-superseded-{}.sock", + std::process::id() + )); + let bridge = crate::Bridge::listen(&path).unwrap(); + // Not the current connection: another worker replaced it (here, none + // is current at all). + let mut stale = Connection { + shared: &bridge.shared, + key: u64::MAX, + streams: HashMap::new(), + hello: true, + }; + let err = stale + .handle(Request::Open { + id: 1, + name: "truck1/front".into(), + renditions: vec![protocol::Rendition { + name: "sd".into(), + width: 426, + height: 240, + bitrate: 800_000, + framerate: 30, + }], + }) + .unwrap_err(); + assert!(err.to_string().contains("superseded"), "{err:#}"); + assert!(bridge.shared.streams.lock().is_empty()); + } +} diff --git a/demo/carla/bridge/src/source.rs b/demo/carla/bridge/src/source.rs new file mode 100644 index 00000000000..2aa207a5ff2 --- /dev/null +++ b/demo/carla/bridge/src/source.rs @@ -0,0 +1,407 @@ +//! A capture source: one CARLA camera's exportable image slots. +//! +//! The producer (the CARLA plugin on Unreal's RHI thread) owns the Vulkan +//! images; the bridge holds their exported handles as moq-video slots, which +//! the encoders import on the producer's device. A slot cycles +//! +//! ```text +//! Idle -> Acquired (producer copies the render target and signals `ready`) +//! -> Queued (waiting for the stream thread) +//! -> InFlight (the encoders wait `ready`, read, and signal `complete`) +//! -> Idle once the GPU has finished +//! ``` +//! +//! Every producer call is non-blocking: a slot comes back through a completion +//! the producer checks on its next acquire, and a producer with no idle slot +//! drops that frame before anything encodes it. Only [`Source::close`] waits, +//! so the producer can free its images afterwards. + +use std::os::fd::OwnedFd; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; + +use anyhow::{Context, Result, bail}; +use moq_video::Size; +use moq_video::frame::vulkan::{ + self, Completion, Device, Format, Handles, Image, Memory, Slot, Timeline, +}; +use parking_lot::{Condvar, Mutex}; + +use crate::stream::{Stream, Work}; + +static NEXT_ID: AtomicU64 = AtomicU64::new(1); + +/// One camera feeding a stream. +pub struct Source { + inner: Arc, +} + +pub(crate) struct Inner { + pub id: u64, + pub size: Size, + format: Format, + device: Device, + pub stream: Arc, + /// Set by the stream: whether this camera is the one it wants pictures from. + pub wanted: Arc, + slots: Mutex, + /// Signalled whenever a queued slot leaves the queue. + settled: Condvar, + /// Frames the producer rendered with no idle slot to copy into. + dropped: AtomicU64, +} + +struct Slots { + states: Vec, + /// The last timeline value handed out per slot. Values only grow: a + /// cancelled or unpublished use just skips ahead. + values: Vec, + closed: bool, +} + +enum State { + /// Not imported yet. + Empty, + Idle(Slot<()>), + /// With the stream generation at acquire time, so a switch away and back + /// before submit cannot relabel this picture as the resumed stream's. + Acquired(Slot<()>, Timeline, u64), + Queued, + InFlight(Completion<()>), + /// The GPU failed after publishing, and the slot was released rather than + /// handed back for reuse. + Failed, +} + +impl Source { + pub(crate) fn new( + stream: Arc, + device: Device, + size: Size, + format: Format, + slots: usize, + ) -> Result { + if slots == 0 { + bail!("a source needs at least one slot"); + } + if size.width == 0 + || size.height == 0 + || !size.width.is_multiple_of(2) + || !size.height.is_multiple_of(2) + { + bail!("capture size {size} must be non-zero and even"); + } + let inner = Arc::new(Inner { + id: NEXT_ID.fetch_add(1, Ordering::Relaxed), + size, + format, + device, + stream, + wanted: Arc::new(AtomicBool::new(false)), + slots: Mutex::new(Slots { + states: (0..slots).map(|_| State::Empty).collect(), + values: vec![0; slots], + closed: false, + }), + settled: Condvar::new(), + dropped: AtomicU64::new(0), + }); + inner + .stream + .attach(inner.id, device, size, inner.wanted.clone())?; + Ok(Self { inner }) + } + + /// Import slot `index`: a dedicated optimal-tiling image of the capture + /// size and format, allocated from the device's `memory_type`, in + /// `VK_IMAGE_LAYOUT_GENERAL` whenever the bridge owns it, and a timeline + /// semaphore starting at 0. The descriptors are consumed whatever happens. + pub fn import( + &self, + index: usize, + memory: OwnedFd, + timeline: OwnedFd, + allocation_size: u64, + memory_type: u32, + ) -> Result<()> { + let mut slots = self.inner.slots.lock(); + if slots.closed { + bail!("source is closed"); + } + match slots.states.get(index) { + Some(State::Empty) => {} + Some(_) => bail!("slot {index} is already imported"), + None => bail!( + "slot {index} is out of range for {} slots", + slots.states.len() + ), + } + let image = Image { + device: self.inner.device, + memory: Memory::OpaqueFd { memory_type }, + size: self.inner.size, + allocation_size, + format: self.inner.format, + }; + let slot = Slot::new(Handles { memory, timeline }, image, ()) + .with_context(|| format!("import slot {index}"))?; + slots.states[index] = State::Idle(slot); + Ok(()) + } + + /// Whether the stream wants this camera's pictures now. Render and submit + /// only while this holds; it is a single atomic load. + pub fn wanted(&self) -> bool { + self.inner.wanted.load(Ordering::Acquire) + } + + /// Take an idle slot for the next picture: its index and the timeline value + /// the producer's queue submission must signal once the copy has landed. + /// + /// `None` means every slot is still in use, and the producer drops this + /// picture: nothing has been encoded from it, so no reference chain breaks. + /// The producer must order each copy after the previous use of the same + /// image on its queue, as any reuse of a render target already is. + pub fn acquire(&self) -> Result> { + let mut guard = self.inner.slots.lock(); + let slots = &mut *guard; + if slots.closed { + bail!("source is closed"); + } + reap(&mut slots.states); + if slots + .states + .iter() + .all(|state| matches!(state, State::Failed)) + { + bail!("every slot failed on the GPU"); + } + let Some(index) = slots + .states + .iter() + .position(|state| matches!(state, State::Idle(_))) + else { + self.inner.dropped.fetch_add(1, Ordering::Relaxed); + return Ok(None); + }; + let State::Idle(slot) = std::mem::replace(&mut slots.states[index], State::Empty) else { + unreachable!() + }; + let ready = slots.values[index] + 1; + let timeline = Timeline::new(ready, ready + 1).expect("complete follows ready"); + slots.values[index] = ready + 1; + let generation = self.inner.stream.generation(); + slots.states[index] = State::Acquired(slot, timeline, generation); + Ok(Some((index, ready))) + } + + /// Hand an acquired slot to the encoder once the producer's queue + /// submission, including its `ready` signal, has been made. + /// + /// `frame` is CARLA's frame counter and `timestamp_us` the simulation time + /// the picture shows; both ride through to the worker with the packet. + pub fn submit(&self, index: usize, frame: u64, timestamp_us: u64) -> Result<()> { + let job = { + let mut slots = self.inner.slots.lock(); + let Some(State::Acquired(..)) = slots.states.get(index) else { + bail!("slot {index} was not acquired"); + }; + let State::Acquired(slot, timeline, generation) = + std::mem::replace(&mut slots.states[index], State::Queued) + else { + unreachable!() + }; + Job { + source: self.inner.clone(), + index, + slot: Some(slot), + timeline, + generation, + frame, + timestamp_us, + } + }; + // A stream thread that has shut down drops the job, which hands the + // slot straight back. + self.inner.stream.send(Work::Frame(job)); + Ok(()) + } + + /// Return an acquired slot the producer did not fill. + pub fn cancel(&self, index: usize) -> Result<()> { + let mut slots = self.inner.slots.lock(); + let Some(State::Acquired(..)) = slots.states.get(index) else { + bail!("slot {index} was not acquired"); + }; + let State::Acquired(slot, ..) = std::mem::replace(&mut slots.states[index], State::Empty) + else { + unreachable!() + }; + slots.states[index] = State::Idle(slot); + Ok(()) + } + + /// The producer can no longer feed this camera, for `message`. The stream + /// stops wanting it and fails the worker's session; close it next. + pub fn fail(&self, message: &str) { + self.inner.stream.fail_producer(self.inner.id, message); + } + + /// Frames dropped so far because every slot was busy. + pub fn dropped(&self) -> u64 { + self.inner.dropped.load(Ordering::Relaxed) + } + + /// Stop capturing and release every import once the GPU is done with it. Returns only after that, so the producer may destroy its images and + /// semaphores next. The stream keeps encoding from any other camera. + pub fn close(self) { + drop(self); + } +} + +impl Drop for Source { + fn drop(&mut self) { + self.inner.stream.detach(self.inner.id); + let mut slots = self.inner.slots.lock(); + slots.closed = true; + // A queued slot is about to be published or handed back; wait for it + // rather than guess, since publishing starts GPU work on the image. + while slots + .states + .iter() + .any(|state| matches!(state, State::Queued)) + { + self.inner.settled.wait(&mut slots); + } + let states = std::mem::take(&mut slots.states); + drop(slots); + for state in states { + if let State::InFlight(completion) = state { + // Resolves once the encoders have signalled completion. On a device + // error the slot is released instead; either way nothing on the GPU + // still references the image afterwards. + let _ = pollster::block_on(completion.wait()); + } + } + } +} + +/// Move every slot the GPU has finished with back to idle, without waiting. +fn reap(states: &mut [State]) { + for state in states.iter_mut() { + let State::InFlight(completion) = state else { + continue; + }; + match completion.try_wait() { + Ok(Some(slot)) => *state = State::Idle(slot), + Ok(None) => {} + Err(err) => { + tracing::error!(%err, "capture slot lost"); + *state = State::Failed; + } + } + } +} + +/// One submitted picture on its way to the stream thread. +pub(crate) struct Job { + source: Arc, + index: usize, + slot: Option>, + timeline: Timeline, + /// The stream generation at submission: a picture from before a camera + /// switch is never encoded into the new stream. + pub generation: u64, + pub frame: u64, + pub timestamp_us: u64, +} + +impl Job { + pub fn source(&self) -> &Arc { + &self.source + } + + /// Publish the producer's copy. The slot stays in flight until the returned + /// frame, and every encoder's read of it, has finished on the GPU. + pub fn publish(mut self) -> Result { + let slot = self.slot.take().expect("job published twice"); + let result = slot.publish(self.timeline); + let mut slots = self.source.slots.lock(); + let published = match result { + Ok((frame, completion)) => { + slots.states[self.index] = State::InFlight(completion); + Ok(frame) + } + Err(err) => { + let (error, slot) = err.into_parts(); + slots.states[self.index] = State::Idle(slot); + Err(anyhow::Error::from(error).context("publish the capture slot")) + } + }; + drop(slots); + self.source.settled.notify_all(); + published + } +} + +impl Drop for Job { + fn drop(&mut self) { + // Never published, so the GPU holds nothing of the image. + if let Some(slot) = self.slot.take() { + let mut slots = self.source.slots.lock(); + slots.states[self.index] = State::Idle(slot); + drop(slots); + self.source.settled.notify_all(); + } + } +} + +#[cfg(test)] +mod tests { + use std::fs::File; + + use super::*; + use crate::server::Output; + + fn device(byte: u8) -> Device { + Device { + device_uuid: [byte; 16], + driver_uuid: [0; 16], + render_node: None, + } + } + + fn handle() -> OwnedFd { + File::open("/dev/null").unwrap().into() + } + + #[test] + fn a_picture_nobody_encodes_returns_its_slot() { + let stream = Stream::spawn("truck1/front".into(), Arc::new(Output::default())).unwrap(); + let size = Size::new(64, 64); + let source = Source::new(stream.clone(), device(1), size, Format::Bgra8, 1).unwrap(); + source + .import(0, handle(), handle(), 64 * 64 * 4, 0) + .unwrap(); + + let (index, _) = source.acquire().unwrap().expect("an idle slot"); + source.submit(index, 1, 1).unwrap(); + // No session wants the picture. Publishing it would leave a frame no + // encoder reads, which never completes and loses the only slot. + stream.shutdown(); + assert!(source.acquire().unwrap().is_some()); + } + + #[test] + fn every_camera_of_a_stream_renders_on_one_device() { + let stream = Stream::spawn("truck1/front".into(), Arc::new(Output::default())).unwrap(); + let size = Size::new(64, 64); + let _first = Source::new(stream.clone(), device(1), size, Format::Bgra8, 1).unwrap(); + let _same = Source::new(stream.clone(), device(1), size, Format::Rgba8, 1).unwrap(); + let err = Source::new(stream.clone(), device(2), size, Format::Bgra8, 1) + .err() + .expect("a camera on another device"); + assert!(err.to_string().contains("encodes on"), "{err:#}"); + stream.shutdown(); + } +} diff --git a/demo/carla/bridge/src/stream.rs b/demo/carla/bridge/src/stream.rs new file mode 100644 index 00000000000..eb52e5e2a22 --- /dev/null +++ b/demo/carla/bridge/src/stream.rs @@ -0,0 +1,864 @@ +//! A stream: the video of one worker broadcast, fed by one or more cameras. +//! +//! Each stream owns a thread, because encoders are thread-confined and the +//! producer's RHI thread must never wait on a conversion or an encode. The +//! stream picks which camera renders: the smallest one covering the largest +//! demanded rendition. Every demanded rendition is scaled on the GPU from that +//! one capture, so SD and HD demand together still render once. + +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc; +use std::thread::JoinHandle; + +use anyhow::{Context, Result, bail}; +use bytes::Bytes; +use moq_mux::codec::annexb; +use moq_video::encode::{Encoder, Kind}; +use moq_video::frame::vulkan::{self, Device}; +use moq_video::{Color, Frame, I420, Rate, Size, Surface}; +use parking_lot::Mutex; + +use crate::protocol::{self, Event, Rendition}; +use crate::server::{Output, Sent}; +use crate::source::Job; + +/// Identifies one worker `Open`: a stream id is only meaningful on the +/// connection that chose it. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct SessionId { + pub connection: u64, + pub id: u32, +} + +/// Every rendition is written and labelled BT.709 limited. `Color::infer` would +/// pick BT.601 for the 240p rendition, but its pixels are scaled from the same +/// conversion, so the label follows the conversion rather than the size. +const COLOR: Color = Color::Bt709Limited; + +#[derive(Clone, Debug)] +pub(crate) struct Session { + pub key: SessionId, + pub renditions: Vec, +} + +pub(crate) enum Work { + Open(Session), + Close(SessionId), + Frame(Job), + /// The first camera attached, so a session waiting for its device can open. + Attached, + /// A camera's producer failed: fail this session. + Fail(SessionId, String), + Shutdown, +} + +pub(crate) struct Stream { + name: String, + state: Mutex, + work: mpsc::Sender, + thread: Mutex>>, +} + +struct State { + session: Option, + /// Renditions with subscribers, as a mask of session indices. + demand: u8, + /// Renditions whose next frame must be an IDR. + resync: u8, + sources: Vec, + /// The Vulkan device every camera renders on, learned from the first. The + /// encoders import on it, so a stream cannot open before a camera attaches. + device: Option, + /// Why a camera's producer failed, until another camera attaches. Every + /// session opened meanwhile fails with it rather than wait on video that + /// may never come. + failed: Option, + /// The camera currently rendering. + target: Option, + /// Bumped whenever the target changes, so pictures submitted before a + /// camera switch are never encoded after it. + generation: u64, + /// The simulation time each rendition last encoded. Every camera captures + /// on the same tick, so a switch can offer a rendition the same instant + /// twice; its timestamps must strictly increase. + latest: Vec>, +} + +struct Attached { + id: u64, + size: Size, + wanted: Arc, +} + +/// What to encode from one picture. +struct Plan { + session: SessionId, + renditions: Vec, +} + +struct Planned { + index: usize, + keyframe: bool, +} + +impl Stream { + pub fn spawn(name: String, output: Arc) -> Result> { + let (work, receiver) = mpsc::channel(); + let stream = Arc::new(Self { + name, + state: Mutex::new(State { + session: None, + demand: 0, + resync: 0, + sources: Vec::new(), + device: None, + failed: None, + target: None, + generation: 0, + latest: Vec::new(), + }), + work, + thread: Mutex::new(None), + }); + let thread = std::thread::Builder::new() + .name(format!("carla-bridge:{}", stream.name)) + .spawn({ + let stream = stream.clone(); + move || run(&stream, &output, receiver) + }) + .context("start the stream thread")?; + *stream.thread.lock() = Some(thread); + Ok(stream) + } + + pub fn name(&self) -> &str { + &self.name + } + + pub fn send(&self, work: Work) { + // Fails only after shutdown, when dropping the work is the right thing: + // a job hands its slot back as it drops. + let _ = self.work.send(work); + } + + pub fn shutdown(&self) { + self.send(Work::Shutdown); + if let Some(thread) = self.thread.lock().take() { + let _ = thread.join(); + } + } + + pub fn generation(&self) -> u64 { + self.state.lock().generation + } + + pub fn attach( + &self, + id: u64, + device: Device, + size: Size, + wanted: Arc, + ) -> Result<()> { + let mut state = self.state.lock(); + match state.device { + Some(current) if current != device => { + bail!( + "camera renders on {device}, but stream {} encodes on {current}", + self.name + ) + } + Some(_) => {} + None => { + state.device = Some(device); + self.send(Work::Attached); + } + } + state.failed = None; + state.sources.push(Attached { id, size, wanted }); + state.retarget(); + Ok(()) + } + + fn device(&self) -> Option { + self.state.lock().device + } + + pub fn detach(&self, id: u64) { + let mut state = self.state.lock(); + if let Some(attached) = state.sources.iter().find(|source| source.id == id) { + attached.wanted.store(false, Ordering::Release); + } + state.sources.retain(|source| source.id != id); + state.retarget(); + } + + /// A camera's producer can no longer feed it: stop wanting its pictures and + /// fail the open session, so the worker errors instead of waiting on video + /// that will not come. + pub fn fail_producer(&self, id: u64, message: &str) { + self.detach(id); + let message = format!("camera failed: {message}"); + let key = { + let mut state = self.state.lock(); + state.failed = Some(message.clone()); + state.session.as_ref().map(|session| session.key) + }; + if let Some(key) = key { + self.send(Work::Fail(key, message)); + } + } + + pub fn open(&self, session: Session) { + let mut state = self.state.lock(); + state.latest = vec![None; session.renditions.len()]; + state.session = Some(session.clone()); + state.demand = 0; + state.resync = 0; + state.retarget(); + let failed = state.failed.clone(); + drop(state); + let key = session.key; + self.send(Work::Open(session)); + if let Some(message) = failed { + self.send(Work::Fail(key, message)); + } + } + + pub fn close(&self, key: SessionId) { + self.end(key); + self.send(Work::Close(key)); + } + + /// Stop wanting pictures for a session, keeping its encoders until the + /// thread sees the matching close. + fn end(&self, key: SessionId) { + let mut state = self.state.lock(); + if state + .session + .as_ref() + .is_some_and(|session| session.key == key) + { + state.session = None; + state.demand = 0; + state.resync = 0; + state.retarget(); + } + } + + pub fn demand(&self, key: SessionId, renditions: u8) -> Result<()> { + let mut state = self.state.lock(); + let count = state.renditions(key)?; + if u32::from(renditions) >> count != 0 { + bail!("demand mask {renditions:#b} names renditions beyond {count}"); + } + // A rendition that gains subscribers starts at an IDR; pictures it + // skipped while idle are not references anything can use. + state.resync |= renditions & !state.demand; + state.demand = renditions; + state.retarget(); + Ok(()) + } + + pub fn keyframe(&self, key: SessionId, rendition: u8) -> Result<()> { + let mut state = self.state.lock(); + let count = state.renditions(key)?; + if usize::from(rendition) >= count { + bail!("rendition {rendition} is beyond {count}"); + } + state.resync |= 1 << rendition; + Ok(()) + } + + fn resync(&self, key: SessionId, rendition: usize) { + let mut state = self.state.lock(); + if state + .session + .as_ref() + .is_some_and(|session| session.key == key) + { + state.resync |= 1 << rendition; + } + } + + fn plan(&self, source: u64, generation: u64, timestamp_us: u64) -> Option { + self.state.lock().plan(source, generation, timestamp_us) + } +} + +impl State { + fn renditions(&self, key: SessionId) -> Result { + match &self.session { + Some(session) if session.key == key => Ok(session.renditions.len()), + _ => bail!("stream {} is not open", key.id), + } + } + + /// What to encode from a picture of `source` at `timestamp_us`, taken at + /// `generation`, or `None` when nothing should: no session, nobody watching, + /// or a picture from a camera the stream has since switched away from. + fn plan(&mut self, source: u64, generation: u64, timestamp_us: u64) -> Option { + if self.generation != generation || self.target != Some(source) { + return None; + } + let session = self.session.as_ref()?; + let mut renditions = Vec::new(); + for index in 0..session.renditions.len() { + let bit = 1 << index; + if self.demand & bit == 0 + || self.latest[index].is_some_and(|latest| latest >= timestamp_us) + { + continue; + } + self.latest[index] = Some(timestamp_us); + renditions.push(Planned { + index, + keyframe: self.resync & bit != 0, + }); + // Only once planned: a skipped instant leaves the IDR to the next one. + self.resync &= !bit; + } + Some(Plan { + session: session.key, + renditions, + }) + } + + fn retarget(&mut self) { + let largest = self.session.as_ref().and_then(|session| { + session + .renditions + .iter() + .enumerate() + .filter(|(index, _)| self.demand & (1 << index) != 0) + .map(|(_, rendition)| Size::new(rendition.width, rendition.height)) + .max_by_key(Size::pixels) + }); + let target = largest.and_then(|largest| { + self.sources + .iter() + .filter(|source| { + source.size.width >= largest.width && source.size.height >= largest.height + }) + .min_by_key(|source| source.size.pixels()) + .map(|source| source.id) + }); + if target != self.target { + self.target = target; + self.generation += 1; + // Every rendition restarts from the new camera at an IDR. + self.resync |= self.demand; + } + for source in &self.sources { + source + .wanted + .store(Some(source.id) == target, Ordering::Release); + } + } +} + +fn run(stream: &Arc, output: &Output, work: mpsc::Receiver) { + let mut encoding: Option = None; + // A session opened before any camera attached, so before its device is known. + let mut waiting: Option = None; + while let Ok(work) = work.recv() { + match work { + Work::Open(session) => { + encoding = None; + waiting = None; + match stream.device() { + Some(device) => encoding = open(stream, output, session, device), + None => waiting = Some(session), + } + } + Work::Attached => { + if let (Some(session), Some(device)) = (waiting.take(), stream.device()) { + encoding = open(stream, output, session, device); + } + } + Work::Close(key) => { + if encoding + .as_ref() + .is_some_and(|open| open.session.key == key) + { + encoding = None; + } + if waiting.as_ref().is_some_and(|session| session.key == key) { + waiting = None; + } + } + Work::Frame(job) => { + if let Err((key, err)) = frame(stream, output, encoding.as_mut(), job) { + encoding = None; + fail(stream, output, key, &err); + } + } + Work::Fail(key, message) => { + if encoding + .as_ref() + .is_some_and(|open| open.session.key == key) + { + encoding = None; + } + if waiting.as_ref().is_some_and(|session| session.key == key) { + waiting = None; + } + fail(stream, output, key, &anyhow::anyhow!(message)); + } + Work::Shutdown => break, + } + } +} + +/// Open the encoders for `session` on `device` and send the worker each +/// rendition's parameter sets. +fn open(stream: &Stream, output: &Output, session: Session, device: Device) -> Option { + let key = session.key; + match Encoding::open(session, device) { + Ok((opened, configs)) => { + for (rendition, init) in configs.into_iter().enumerate() { + output.send( + key.connection, + &Event::Config { + id: key.id, + rendition: rendition as u8, + init, + }, + ); + } + Some(opened) + } + Err(err) => { + fail(stream, output, key, &err); + None + } + } +} + +/// Report a stream failure to the worker, which treats it as fatal. +fn fail(stream: &Stream, output: &Output, key: SessionId, err: &anyhow::Error) { + tracing::error!( + stream = stream.name(), + err = format!("{err:#}"), + "stream failed" + ); + stream.end(key); + output.send( + key.connection, + &Event::Error { + id: key.id, + message: format!("{}: {err:#}", stream.name()), + }, + ); +} + +fn frame( + stream: &Stream, + output: &Output, + encoding: Option<&mut Encoding>, + job: Job, +) -> Result<(), (SessionId, anyhow::Error)> { + let (generation, number, timestamp_us) = (job.generation, job.frame, job.timestamp_us); + // Publish only a picture an encoder will read: an unread frame never signals + // completion, which loses its slot. Dropping the job instead hands the slot + // straight back, which is safe because the producer orders every copy into + // an image after its previous one. + let Some(plan) = stream.plan(job.source().id, generation, timestamp_us) else { + return Ok(()); + }; + let key = plan.session; + let Some(encoding) = encoding.filter(|open| open.session.key == key) else { + return Ok(()); + }; + if plan.renditions.is_empty() { + return Ok(()); + } + let image = job.publish().map_err(|err| (key, err))?; + encoding + .encode(stream, output, image, plan, number, timestamp_us) + .map_err(|err| (key, err)) +} + +struct Encoding { + session: Session, + encoders: Vec, + gate: Gate, +} + +/// Keeps each rendition's reference chain whole across packets the worker +/// had no room for. A rendition that loses a packet drops everything after it +/// until the IDR requested at the loss is queued, so the worker never receives +/// a frame whose reference is missing. +#[derive(Default)] +struct Gate { + broken: u8, +} + +impl Gate { + fn admit(&self, rendition: usize, keyframe: bool) -> bool { + keyframe || self.broken & (1 << rendition) == 0 + } + + /// Record what became of an admitted packet. True when the rendition just + /// broke and needs an IDR. + fn sent(&mut self, rendition: usize, keyframe: bool, sent: &Sent) -> bool { + let bit = 1 << rendition; + match sent { + Sent::Queued => { + if keyframe { + self.broken &= !bit; + } + false + } + Sent::Full => { + self.broken |= bit; + true + } + Sent::Gone => false, + } + } +} + +impl Encoding { + /// Open one encoder per rendition on the cameras' device, and read each + /// one's parameter sets so the worker can advertise the track before it has + /// a subscriber. + fn open(session: Session, device: Device) -> Result<(Self, Vec)> { + let mut encoders = Vec::with_capacity(session.renditions.len()); + let mut configs = Vec::with_capacity(session.renditions.len()); + for rendition in &session.renditions { + let config = config(rendition, device)?; + configs.push( + probe(&config).with_context(|| format!("probe rendition {}", rendition.name))?, + ); + encoders.push( + Encoder::new(&config) + .with_context(|| format!("open the encoder for {}", rendition.name))?, + ); + } + Ok(( + Self { + session, + encoders, + gate: Gate::default(), + }, + configs, + )) + } + + fn encode( + &mut self, + stream: &Stream, + output: &Output, + image: vulkan::Frame, + plan: Plan, + number: u64, + timestamp_us: u64, + ) -> Result<()> { + let key = plan.session; + let timestamp = + moq_net::Timestamp::from_micros(timestamp_us).context("capture timestamp")?; + // The encoders share one conversion of the capture and each scales it to + // its rendition on the GPU. The slot's completion is signalled once the + // last of them has read it, after this frame and its clones drop. + let frame = Frame::new(Surface::Vulkan(image), timestamp); + for planned in plan.renditions { + let encoder = &mut self.encoders[planned.index]; + if planned.keyframe { + encoder.cut().context("request an IDR")?; + } + let packets = encoder.encode(&frame).context("encode")?; + for packet in packets { + let keyframe = packet.keyframe; + if !self.gate.admit(planned.index, keyframe) { + continue; + } + let event = Event::Frame(protocol::Frame { + id: key.id, + rendition: planned.index as u8, + frame: number, + timestamp_us, + keyframe, + payload: packet.payload, + }); + let sent = output.try_send(key.connection, &event); + if self.gate.sent(planned.index, keyframe, &sent) { + tracing::warn!( + stream = stream.name(), + frame = number, + "worker queue full; resuming at an IDR" + ); + stream.resync(key, planned.index); + } + } + } + Ok(()) + } +} + +fn config(rendition: &Rendition, device: Device) -> Result { + let framerate = Rate::new(rendition.framerate, 1).context("framerate")?; + let mut config = moq_video::encode::Config::new(rendition.width, rendition.height, framerate); + config.bitrate = Some(moq_net::bandwidth::Rate::from_bps(rendition.bitrate)); + config.kind = Kind::Named("nvenc".into()); + config.color = Some(COLOR); + config.input = Some(device); + Ok(config) +} + +/// The parameter sets `config` produces, from a throwaway session on the same +/// device fed one synthetic mid-gray picture. A separate session so the one +/// that encodes camera pictures only ever receives the cameras' images. +fn probe(config: &moq_video::encode::Config) -> Result { + let size = config.size(); + let luma = size.width as usize * size.height as usize; + let gray = I420::new(size, vec![0x80; luma + luma / 2])?; + let mut encoder = Encoder::new(config)?; + let mut packets = encoder.encode(&Frame::new( + Surface::I420(gray), + moq_net::Timestamp::from_micros(0)?, + ))?; + packets.extend(encoder.finish()?); + let mut sets = Vec::new(); + for packet in &packets { + for nal in nals(&packet.payload)? { + if matches!(nal.first().map(|header| header & 0x1f), Some(7 | 8)) { + sets.push(nal); + } + } + } + if sets.is_empty() { + bail!("the encoder emitted no SPS/PPS"); + } + Ok(annexb::build_prefix(&sets)) +} + +fn nals(payload: &Bytes) -> Result> { + let mut buf = payload.clone(); + let mut iter = annexb::NalIterator::new(&mut buf); + let mut nals = Vec::new(); + for nal in iter.by_ref() { + nals.push(nal?); + } + nals.extend(iter.flush()?); + Ok(nals) +} + +#[cfg(test)] +mod tests { + use super::*; + + const SD: Size = Size { + width: 426, + height: 240, + }; + const HD: Size = Size { + width: 1280, + height: 720, + }; + const KEY: SessionId = SessionId { + connection: 1, + id: 1, + }; + + fn rendition(name: &str, size: Size) -> Rendition { + Rendition { + name: name.into(), + width: size.width, + height: size.height, + bitrate: 1_000_000, + framerate: 30, + } + } + + /// A stream with the demo's shape: an sd and an hd camera, and the + /// worker's sd and hd renditions. + fn state() -> (State, Arc, Arc) { + let mut state = State { + session: Some(Session { + key: KEY, + renditions: vec![rendition("sd", SD), rendition("hd", HD)], + }), + demand: 0, + resync: 0, + sources: Vec::new(), + device: None, + failed: None, + target: None, + generation: 0, + latest: vec![None; 2], + }; + let (sd, hd) = ( + Arc::new(AtomicBool::new(false)), + Arc::new(AtomicBool::new(false)), + ); + state.sources.push(Attached { + id: 10, + size: SD, + wanted: sd.clone(), + }); + state.sources.push(Attached { + id: 20, + size: HD, + wanted: hd.clone(), + }); + state.retarget(); + (state, sd, hd) + } + + fn demand(state: &mut State, mask: u8) { + state.resync |= mask & !state.demand; + state.demand = mask; + state.retarget(); + } + + fn planned(plan: &Plan) -> Vec<(usize, bool)> { + plan.renditions + .iter() + .map(|planned| (planned.index, planned.keyframe)) + .collect() + } + + #[test] + fn nothing_renders_without_demand() { + let (mut state, sd, hd) = state(); + assert_eq!(state.target, None); + assert!(!sd.load(Ordering::Acquire) && !hd.load(Ordering::Acquire)); + assert!(state.plan(10, state.generation, 1).is_none()); + } + + #[test] + fn renders_the_smallest_camera_covering_the_largest_demand() { + let (mut state, sd, hd) = state(); + demand(&mut state, 0b01); + assert_eq!(state.target, Some(10)); + assert!(sd.load(Ordering::Acquire) && !hd.load(Ordering::Acquire)); + + // SD and HD together render once, from the HD camera. + demand(&mut state, 0b11); + assert_eq!(state.target, Some(20)); + assert!(!sd.load(Ordering::Acquire) && hd.load(Ordering::Acquire)); + let plan = state.plan(20, state.generation, 1).unwrap(); + assert_eq!(planned(&plan), vec![(0, true), (1, true)]); + } + + #[test] + fn resuming_and_switching_force_idrs_once() { + let (mut state, ..) = state(); + demand(&mut state, 0b01); + let generation = state.generation; + assert_eq!( + planned(&state.plan(10, generation, 1).unwrap()), + vec![(0, true)] + ); + assert_eq!( + planned(&state.plan(10, generation, 2).unwrap()), + vec![(0, false)] + ); + + // Parking and resuming the same camera still starts at an IDR. + demand(&mut state, 0); + demand(&mut state, 0b01); + assert_eq!( + planned(&state.plan(10, state.generation, 3).unwrap()), + vec![(0, true)] + ); + + // An explicit keyframe request. + state.resync |= 0b01; + assert_eq!( + planned(&state.plan(10, state.generation, 4).unwrap()), + vec![(0, true)] + ); + } + + #[test] + fn pictures_from_before_a_switch_are_not_encoded() { + let (mut state, ..) = state(); + demand(&mut state, 0b01); + let before = state.generation; + demand(&mut state, 0b11); + // The SD camera's queued picture, and even an HD picture stamped before + // the switch, are stale. + assert!(state.plan(10, before, 1).is_none()); + assert!(state.plan(20, before, 1).is_none()); + assert!(state.plan(20, state.generation, 1).is_some()); + } + + #[test] + fn a_rendition_never_encodes_an_instant_twice() { + let (mut state, ..) = state(); + demand(&mut state, 0b01); + // The SD camera captured tick 5 and it was encoded. + assert_eq!( + planned(&state.plan(10, state.generation, 5).unwrap()), + vec![(0, true)] + ); + // HD demand arrives mid-tick; the HD camera's picture of the same tick + // feeds only HD, and SD's IDR waits for the next tick. + demand(&mut state, 0b11); + let generation = state.generation; + assert_eq!( + planned(&state.plan(20, generation, 5).unwrap()), + vec![(1, true)] + ); + assert_eq!( + planned(&state.plan(20, generation, 6).unwrap()), + vec![(0, true), (1, false)] + ); + // Nor does time run backwards. + assert_eq!(planned(&state.plan(20, generation, 4).unwrap()), vec![]); + } + + #[test] + fn losing_the_camera_falls_back_to_one_that_still_covers() { + let (mut state, sd, hd) = state(); + demand(&mut state, 0b01); + assert_eq!(state.target, Some(10)); + let generation = state.generation; + state.sources.retain(|source| source.id != 10); + state.retarget(); + // The HD camera covers SD too. + assert_eq!(state.target, Some(20)); + assert!(hd.load(Ordering::Acquire)); + assert!(state.generation > generation); + let _ = sd; + + // Nothing covers HD once its camera is gone. + demand(&mut state, 0b10); + state.sources.clear(); + state.retarget(); + assert_eq!(state.target, None); + } + + #[test] + fn closing_the_session_parks_the_cameras() { + let (mut state, sd, _) = state(); + demand(&mut state, 0b01); + assert!(sd.load(Ordering::Acquire)); + state.session = None; + state.demand = 0; + state.retarget(); + assert!(!sd.load(Ordering::Acquire)); + } + + #[test] + fn a_lost_packet_drops_its_rendition_until_the_next_idr() { + let mut gate = Gate::default(); + assert!(gate.admit(0, false)); + assert!(!gate.sent(0, false, &Sent::Queued)); + // The worker had no room: rendition 0 breaks, rendition 1 does not. + assert!(gate.sent(0, false, &Sent::Full)); + assert!(!gate.admit(0, false)); + assert!(gate.admit(1, false)); + // A keyframe gets through, but only a queued one heals the chain. + assert!(gate.admit(0, true)); + assert!(gate.sent(0, true, &Sent::Full)); + assert!(!gate.admit(0, false)); + assert!(!gate.sent(0, true, &Sent::Queued)); + assert!(gate.admit(0, false)); + // A departed worker neither breaks nor heals anything. + assert!(!gate.sent(1, false, &Sent::Gone)); + assert!(gate.admit(1, false)); + } +} diff --git a/demo/carla/bridge/tests/gpu.rs b/demo/carla/bridge/tests/gpu.rs new file mode 100644 index 00000000000..15bb348d4cd --- /dev/null +++ b/demo/carla/bridge/tests/gpu.rs @@ -0,0 +1,480 @@ +//! The bridge on real hardware: a stand-in for the CARLA plugin renders on +//! Vulkan, the bridge encodes with NVENC through moq-video, and a worker +//! client on the socket checks every packet and decodes it. +//! +//! Needs a Linux NVIDIA GPU, so it is ignored by default and run by +//! `just carla bridge-gpu`, which `just carla check` calls on such a host. +#![cfg(target_os = "linux")] + +mod standin; + +use std::collections::{HashMap, VecDeque}; +use std::io::Write; +use std::os::unix::net::UnixStream; +use std::path::{Path, PathBuf}; +use std::time::{Duration, Instant}; + +use carla_bridge::Bridge; +use carla_bridge::protocol::{self, Event, Frame, Rendition, Request}; +use moq_video::decode::{Config, Decoder, Kind}; +use moq_video::{Output, Size}; +use standin::{Camera, Gpu}; + +const STREAM: &str = "truck1/front"; +const SD: Size = Size { + width: 426, + height: 240, +}; +const HD: Size = Size { + width: 1280, + height: 720, +}; +/// One simulation step at 30 fps. +const STEP_US: u64 = 33_333; + +fn renditions() -> Vec { + vec![ + Rendition { + name: "sd".into(), + width: SD.width, + height: SD.height, + bitrate: 800_000, + framerate: 30, + }, + Rendition { + name: "hd".into(), + width: HD.width, + height: HD.height, + bitrate: 4_000_000, + framerate: 30, + }, + ] +} + +/// The worker's end of the socket. +struct Worker { + socket: UnixStream, + /// A decoder per rendition, fed every packet in order, so a broken + /// reference chain shows up as a failed decode or a wrong color. + decoders: HashMap, + /// Pictures decoded and color-checked. + checked: usize, +} + +impl Worker { + fn connect(path: &Path) -> Self { + let socket = UnixStream::connect(path).expect("connect to the bridge"); + let mut worker = Self { + socket, + decoders: HashMap::new(), + checked: 0, + }; + worker.send(Request::Hello { + version: protocol::VERSION, + }); + assert_eq!( + worker.next(), + Event::Hello { + version: protocol::VERSION + } + ); + worker + } + + fn send(&mut self, request: Request) { + self.socket + .write_all(&request.encode()) + .expect("write to the bridge"); + } + + fn next(&mut self) -> Event { + let (kind, body) = protocol::read(&mut self.socket) + .expect("read from the bridge") + .expect("the bridge closed the connection"); + Event::decode(kind, body).expect("decode an event") + } + + /// Open the stream and check each rendition's parameter sets describe it. + fn open(&mut self, id: u32) { + self.send(Request::Open { + id, + name: STREAM.into(), + renditions: renditions(), + }); + self.decoders.clear(); + for (index, rendition) in renditions().iter().enumerate() { + let event = self.next(); + let Event::Config { + id: got, + rendition: got_rendition, + init, + } = event + else { + panic!("expected the config for {}, got {event:?}", rendition.name); + }; + assert_eq!((got, usize::from(got_rendition)), (id, index)); + let config = moq_mux::codec::h264::config(&init).expect("parse the parameter sets"); + assert_eq!( + (config.coded_width, config.coded_height), + (Some(rendition.width), Some(rendition.height)) + ); + eprintln!( + "config {}: {} bytes, {:?}", + rendition.name, + init.len(), + config.codec + ); + } + } + + /// The next frame event, checked and decoded. + fn frame(&mut self, rendition: u8, number: u64, rgb: [u8; 3]) -> Frame { + let Event::Frame(frame) = self.next() else { + panic!("expected a frame"); + }; + assert_eq!( + (frame.rendition, frame.frame), + (rendition, number), + "frame out of order" + ); + assert_eq!(frame.timestamp_us, number * STEP_US); + self.decode(&frame, rgb); + frame + } + + fn decode(&mut self, frame: &Frame, rgb: [u8; 3]) { + if frame.keyframe { + let catalog = + moq_mux::codec::h264::config(&frame.payload).expect("an IDR carries its SPS"); + let mut config = Config::new(); + config.kind = Kind::Named("openh264".into()); + config.output = Output::Cpu; + let decoder = Decoder::new(&catalog, &config).expect("open a decoder"); + self.decoders + .insert(frame.rendition, (decoder, VecDeque::new())); + } + let (decoder, expected) = self + .decoders + .get_mut(&frame.rendition) + .expect("the first packet of a rendition is an IDR"); + expected.push_back((frame.frame, rgb)); + let timestamp = moq_net::Timestamp::from_micros(frame.timestamp_us).unwrap(); + // The software decoder may hold a picture back; match pictures to + // packets in order rather than one for one. + for picture in decoder + .decode(&frame.payload, timestamp, frame.keyframe) + .expect("decode the packet") + { + let (number, rgb) = expected.pop_front().expect("more pictures than packets"); + let i420 = picture.surface.to_i420().expect("CPU picture"); + let size = SIZES[usize::from(frame.rendition)]; + assert_eq!((i420.width(), i420.height()), (size.width, size.height)); + let (y, u, v) = (mean(i420.y()), mean(i420.u()), mean(i420.v())); + let (ey, eu, ev) = bt709_limited(rgb); + assert!( + (y - ey).abs() < 3.0 && (u - eu).abs() < 3.0 && (v - ev).abs() < 3.0, + "frame {number} rendition {}: decoded YUV ({y:.1}, {u:.1}, {v:.1}), expected ({ey:.1}, {eu:.1}, {ev:.1}) for {rgb:?}", + frame.rendition + ); + self.checked += 1; + } + } +} + +const SIZES: [Size; 2] = [SD, HD]; + +/// A rendition's decoder and the frames (number, color) it has yet to output. +type Decoding = (Decoder, VecDeque<(u64, [u8; 3])>); + +fn mean(plane: &[u8]) -> f64 { + plane.iter().map(|&sample| f64::from(sample)).sum::() / plane.len() as f64 +} + +/// The display-referred bytes as BT.709 limited-range Y'CbCr, with no transfer +/// function applied: what the bridge's conversion promises. +fn bt709_limited([r, g, b]: [u8; 3]) -> (f64, f64, f64) { + let (r, g, b) = ( + f64::from(r) / 255.0, + f64::from(g) / 255.0, + f64::from(b) / 255.0, + ); + let y = 0.2126 * r + 0.7152 * g + 0.0722 * b; + ( + 16.0 + 219.0 * y, + 128.0 + 224.0 * (b - y) / 1.8556, + 128.0 + 224.0 * (r - y) / 1.5748, + ) +} + +/// A distinct, well-inside-gamut color per frame. +fn color(number: u64) -> [u8; 3] { + let n = number as u32; + [ + (40 + (n * 53) % 170) as u8, + (40 + (n * 97 + 64) % 170) as u8, + (40 + (n * 29 + 128) % 170) as u8, + ] +} + +/// Spin until another thread publishes some state, named by `_what` for the +/// reader. Unbounded, like every read here: a slow host must not fail a +/// correct run. +fn until(_what: &str, mut done: impl FnMut() -> bool) { + while !done() { + std::thread::yield_now(); + } +} + +/// Latency from submitting a picture to receiving its packets, for the report. +#[derive(Default)] +struct Latency(Vec); + +impl Latency { + fn report(&mut self, phase: &str) { + if self.0.is_empty() { + return; + } + self.0.sort(); + let pick = |q: f64| self.0[((self.0.len() - 1) as f64 * q) as usize]; + eprintln!( + "{phase}: {} frames, submit->packets p50 {:?} p90 {:?} max {:?}", + self.0.len(), + pick(0.5), + pick(0.9), + pick(1.0) + ); + self.0.clear(); + } +} + +/// Render frame `number` on `camera` and receive its packet for every +/// rendition in `renditions`, returning which were keyframes. +fn step( + camera: &mut Camera, + worker: &mut Worker, + latency: &mut Latency, + number: u64, + renditions: &[u8], +) -> Vec { + let rgb = color(number); + until("an idle slot", || { + camera.render(rgb, number, number * STEP_US) + }); + let submitted = Instant::now(); + let keyframes = renditions + .iter() + .map(|&rendition| worker.frame(rendition, number, rgb).keyframe) + .collect(); + latency.0.push(submitted.elapsed()); + keyframes +} + +fn socket_path() -> PathBuf { + std::env::temp_dir().join(format!("carla-bridge-test-{}.sock", std::process::id())) +} + +#[test] +#[ignore = "needs a Linux NVIDIA GPU; run by `just carla bridge-gpu`"] +fn gpu_video_reaches_the_worker() { + let gpu = Gpu::open().expect("an NVIDIA Vulkan device"); + let bridge = Bridge::listen(socket_path()).expect("listen"); + let mut sd = Camera::new(&gpu, &bridge, STREAM, SD, 3); + let mut hd = Camera::new(&gpu, &bridge, STREAM, HD, 3); + let mut latency = Latency::default(); + let mut number = 0u64; + let mut next = || { + number += 1; + number + }; + + let mut worker = Worker::connect(bridge.path()); + worker.open(1); + // No subscriber, no rendering. + assert!(!sd.wanted() && !hd.wanted()); + + eprintln!("-- sd demand renders the sd camera only"); + worker.send(Request::Demand { + id: 1, + renditions: 0b01, + }); + until("the sd camera", || sd.wanted()); + assert!(!hd.wanted()); + for i in 0..45 { + let keyframes = step(&mut sd, &mut worker, &mut latency, next(), &[0]); + assert_eq!( + keyframes, + [i == 0], + "sd starts at an IDR and then follows its GOP" + ); + } + latency.report("sd from the sd camera"); + + eprintln!("-- sd and hd demand render once, from the hd camera"); + worker.send(Request::Demand { + id: 1, + renditions: 0b11, + }); + until("the hd camera", || hd.wanted()); + assert!(!sd.wanted()); + for i in 0..45 { + let keyframes = step(&mut hd, &mut worker, &mut latency, next(), &[0, 1]); + assert_eq!( + keyframes, + [i == 0, i == 0], + "a camera switch restarts both renditions at an IDR" + ); + } + latency.report("sd+hd from the hd camera"); + + eprintln!("-- a keyframe request is honored out of cadence"); + worker.send(Request::Keyframe { + id: 1, + rendition: 1, + }); + let mut forced = false; + for _ in 0..10 { + let keyframes = step(&mut hd, &mut worker, &mut latency, next(), &[0, 1]); + assert!(!keyframes[0], "only the requested rendition cuts"); + if keyframes[1] { + forced = true; + break; + } + } + assert!(forced, "no IDR followed the request"); + + eprintln!("-- no demand parks both cameras; resuming starts at an IDR"); + worker.send(Request::Demand { + id: 1, + renditions: 0, + }); + until("both cameras to park", || !sd.wanted() && !hd.wanted()); + worker.send(Request::Demand { + id: 1, + renditions: 0b10, + }); + until("the hd camera", || hd.wanted()); + for i in 0..10 { + let keyframes = step(&mut hd, &mut worker, &mut latency, next(), &[1]); + assert_eq!(keyframes, [i == 0]); + } + latency.report("hd from the hd camera"); + + eprintln!("-- a restarted worker replaces the old connection"); + let replacement = Worker::connect(bridge.path()); + assert!( + protocol::read(&mut worker.socket).expect("read").is_none(), + "the replaced worker's socket was not closed" + ); + until("the old session to park its camera", || !hd.wanted()); + let checked = worker.checked; + drop(worker); + let mut worker = replacement; + worker.open(7); + worker.send(Request::Demand { + id: 7, + renditions: 0b01, + }); + until("the sd camera", || sd.wanted()); + for i in 0..5 { + let keyframes = step(&mut sd, &mut worker, &mut latency, next(), &[0]); + assert_eq!(keyframes, [i == 0]); + } + + eprintln!("-- closing a camera with work in flight waits for the GPU"); + worker.send(Request::Demand { + id: 7, + renditions: 0b11, + }); + until("the hd camera", || hd.wanted()); + let in_flight = next(); + until("an idle slot", || { + hd.render(color(in_flight), in_flight, in_flight * STEP_US) + }); + drop(hd); + // Nothing left covers hd, so nothing renders. + until("the sd camera to park", || !sd.wanted()); + worker.send(Request::Demand { + id: 7, + renditions: 0b01, + }); + until("the sd camera", || sd.wanted()); + let resumed = next(); + let rgb = color(resumed); + until("an idle slot", || { + sd.render(rgb, resumed, resumed * STEP_US) + }); + // The closed camera's last picture may or may not have been encoded. + let frame = loop { + let Event::Frame(frame) = worker.next() else { + panic!("expected a frame"); + }; + if frame.frame != in_flight { + break frame; + } + }; + assert_eq!(frame.frame, resumed); + assert!(frame.keyframe); + + eprintln!("-- a camera whose producer fails fails the worker's stream"); + sd.source().fail("the copy could not be submitted"); + let Event::Error { id: 7, message } = worker.next() else { + panic!("expected the stream to fail"); + }; + assert!( + message.contains(STREAM) && message.contains("the copy could not be submitted"), + "{message}" + ); + until("the failed camera to park", || !sd.wanted()); + + eprintln!("-- the failure outlives the session until a camera replaces it"); + let checked = checked + worker.checked; + drop(worker); + let mut worker = Worker::connect(bridge.path()); + worker.open(9); + let Event::Error { id: 9, message } = worker.next() else { + panic!("expected the next session to fail"); + }; + assert!( + message.contains("the copy could not be submitted"), + "{message}" + ); + // The worker treats a stream error as fatal, and its replacement respawns + // the cameras. + drop(worker); + drop(sd); + let sd = Camera::new(&gpu, &bridge, STREAM, SD, 3); + let mut worker = Worker::connect(bridge.path()); + worker.open(10); + worker.send(Request::Demand { + id: 10, + renditions: 0b01, + }); + until("the replacement sd camera", || sd.wanted()); + + eprintln!("-- a departed worker parks the cameras"); + let checked = checked + worker.checked; + drop(worker); + until("the sd camera to park", || !sd.wanted()); + + eprintln!("-- malformed requests end the connection with an error"); + let mut worker = Worker::connect(bridge.path()); + let mut odd = renditions(); + odd[0].width = 425; + worker.send(Request::Open { + id: 1, + name: STREAM.into(), + renditions: odd, + }); + let Event::Error { id: 0, message } = worker.next() else { + panic!("expected a connection error"); + }; + assert!(message.contains("even"), "{message}"); + assert!(protocol::read(&mut worker.socket).expect("read").is_none()); + + eprintln!("dropped for want of a slot: {}", sd.source().dropped()); + assert!( + checked > 100, + "only {checked} pictures were decoded and checked" + ); + drop(sd); +} diff --git a/demo/carla/bridge/tests/standin/mod.rs b/demo/carla/bridge/tests/standin/mod.rs new file mode 100644 index 00000000000..5b3bc7f92fb --- /dev/null +++ b/demo/carla/bridge/tests/standin/mod.rs @@ -0,0 +1,493 @@ +//! A stand-in for the CARLA plugin: a native Vulkan renderer that feeds the +//! bridge exactly the way the plugin will from Unreal's RHI thread. +//! +//! Each camera owns a private render target, like a scene capture's, and a +//! ring of exportable slots. A frame clears the render target to a known +//! color (the "render"), copies it on the GPU into an acquired slot, moves the +//! slot to `GENERAL`, and signals the slot's timeline with the value the bridge +//! handed out. No pixel ever passes through host memory. + +use std::ffi::CStr; +use std::os::fd::{FromRawFd, OwnedFd}; + +use ash::vk; +use carla_bridge::{Bridge, Device, Format, Size, Source}; + +pub struct Gpu { + _entry: ash::Entry, + instance: ash::Instance, + physical: vk::PhysicalDevice, + device: ash::Device, + queue: vk::Queue, + queue_family: u32, + pub identity: Device, +} + +impl Gpu { + /// The first NVIDIA Vulkan device, or `None` when there is none. + pub fn open() -> Option { + // SAFETY: every handle is destroyed in reverse order by `Drop`. + match unsafe { Self::create() } { + Ok(gpu) => Some(gpu), + Err(err) => { + eprintln!("no NVIDIA Vulkan device: {err:#}"); + None + } + } + } + + unsafe fn create() -> anyhow::Result { + let entry = unsafe { ash::Entry::load()? }; + let app = vk::ApplicationInfo::default().api_version(vk::API_VERSION_1_2); + let instance = unsafe { + entry.create_instance( + &vk::InstanceCreateInfo::default().application_info(&app), + None, + )? + }; + let mut selected = None; + for physical in unsafe { instance.enumerate_physical_devices()? } { + let properties = unsafe { instance.get_physical_device_properties(physical) }; + if properties.vendor_id != 0x10de { + continue; + } + let family = unsafe { instance.get_physical_device_queue_family_properties(physical) } + .iter() + .position(|family| { + family + .queue_flags + .contains(vk::QueueFlags::GRAPHICS | vk::QueueFlags::TRANSFER) + }); + if let Some(family) = family { + selected = Some((physical, family as u32, properties)); + break; + } + } + let Some((physical, queue_family, properties)) = selected else { + unsafe { instance.destroy_instance(None) }; + anyhow::bail!("no NVIDIA graphics queue"); + }; + let mut id = vk::PhysicalDeviceIDProperties::default(); + let mut properties2 = vk::PhysicalDeviceProperties2::default().push_next(&mut id); + unsafe { instance.get_physical_device_properties2(physical, &mut properties2) }; + let name = unsafe { CStr::from_ptr(properties.device_name.as_ptr()) }.to_string_lossy(); + eprintln!( + "stand-in renderer on {name}, driver {:#x}", + properties.driver_version + ); + + let priority = [1.0]; + let queues = [vk::DeviceQueueCreateInfo::default() + .queue_family_index(queue_family) + .queue_priorities(&priority)]; + // What the plugin enables on Unreal's device, through its extension hook + // and the timeline-semaphore feature. + let extensions = [ + ash::khr::external_memory_fd::NAME.as_ptr(), + ash::khr::external_semaphore_fd::NAME.as_ptr(), + ]; + let mut timeline = + vk::PhysicalDeviceTimelineSemaphoreFeatures::default().timeline_semaphore(true); + let create = vk::DeviceCreateInfo::default() + .queue_create_infos(&queues) + .enabled_extension_names(&extensions) + .push_next(&mut timeline); + let device = unsafe { instance.create_device(physical, &create, None)? }; + let queue = unsafe { device.get_device_queue(queue_family, 0) }; + Ok(Self { + _entry: entry, + instance, + physical, + device, + queue, + queue_family, + identity: Device { + device_uuid: id.device_uuid, + driver_uuid: id.driver_uuid, + render_node: None, + }, + }) + } + + fn memory_type(&self, bits: u32, flags: vk::MemoryPropertyFlags) -> u32 { + let properties = unsafe { + self.instance + .get_physical_device_memory_properties(self.physical) + }; + (0..properties.memory_type_count) + .find(|index| { + bits & (1 << index) != 0 + && properties.memory_types[*index as usize] + .property_flags + .contains(flags) + }) + .expect("device-local memory type") + } + + fn image( + &self, + size: Size, + usage: vk::ImageUsageFlags, + export: bool, + ) -> (vk::Image, vk::DeviceMemory, u64, u32) { + let mut external = vk::ExternalMemoryImageCreateInfo::default() + .handle_types(vk::ExternalMemoryHandleTypeFlags::OPAQUE_FD); + let mut info = vk::ImageCreateInfo::default() + .image_type(vk::ImageType::TYPE_2D) + .format(vk::Format::B8G8R8A8_UNORM) + .extent(vk::Extent3D { + width: size.width, + height: size.height, + depth: 1, + }) + .mip_levels(1) + .array_layers(1) + .samples(vk::SampleCountFlags::TYPE_1) + .tiling(vk::ImageTiling::OPTIMAL) + .usage(usage) + .sharing_mode(vk::SharingMode::EXCLUSIVE) + .initial_layout(vk::ImageLayout::UNDEFINED); + if export { + info = info.push_next(&mut external); + } + let image = unsafe { self.device.create_image(&info, None) }.expect("create image"); + let requirements = unsafe { self.device.get_image_memory_requirements(image) }; + let memory_type = self.memory_type( + requirements.memory_type_bits, + vk::MemoryPropertyFlags::DEVICE_LOCAL, + ); + let mut exported = vk::ExportMemoryAllocateInfo::default() + .handle_types(vk::ExternalMemoryHandleTypeFlags::OPAQUE_FD); + let mut dedicated = vk::MemoryDedicatedAllocateInfo::default().image(image); + let mut allocation = vk::MemoryAllocateInfo::default() + .allocation_size(requirements.size) + .memory_type_index(memory_type) + .push_next(&mut dedicated); + if export { + allocation = allocation.push_next(&mut exported); + } + let memory = + unsafe { self.device.allocate_memory(&allocation, None) }.expect("allocate image"); + unsafe { self.device.bind_image_memory(image, memory, 0) }.expect("bind image"); + (image, memory, requirements.size, memory_type) + } +} + +impl Drop for Gpu { + fn drop(&mut self) { + unsafe { + let _ = self.device.device_wait_idle(); + self.device.destroy_device(None); + self.instance.destroy_instance(None); + } + } +} + +struct Slot { + image: vk::Image, + memory: vk::DeviceMemory, + timeline: vk::Semaphore, + /// The last recording into this slot, freed when the bridge hands the slot + /// back: by then the encoder has waited on its signal, so it has executed. + commands: Option, + written: bool, +} + +/// One camera: a render target, its slots, and the bridge source they feed. +pub struct Camera<'a> { + gpu: &'a Gpu, + pub size: Size, + source: Option, + target: vk::Image, + target_memory: vk::DeviceMemory, + pool: vk::CommandPool, + slots: Vec, + pub rendered: u64, +} + +impl<'a> Camera<'a> { + pub fn new(gpu: &'a Gpu, bridge: &Bridge, stream: &str, size: Size, slots: usize) -> Self { + let source = bridge + .source(stream, gpu.identity, size, Format::Bgra8, slots) + .expect("register the camera"); + let (target, target_memory, ..) = gpu.image( + size, + vk::ImageUsageFlags::TRANSFER_SRC | vk::ImageUsageFlags::TRANSFER_DST, + false, + ); + let pool = unsafe { + gpu.device.create_command_pool( + &vk::CommandPoolCreateInfo::default().queue_family_index(gpu.queue_family), + None, + ) + } + .expect("command pool"); + let memory_fd = ash::khr::external_memory_fd::Device::new(&gpu.instance, &gpu.device); + let semaphore_fd = ash::khr::external_semaphore_fd::Device::new(&gpu.instance, &gpu.device); + let mut ring = Vec::with_capacity(slots); + for index in 0..slots { + let (image, memory, allocation_size, memory_type) = gpu.image( + size, + vk::ImageUsageFlags::TRANSFER_DST + | vk::ImageUsageFlags::SAMPLED + | vk::ImageUsageFlags::STORAGE, + true, + ); + let mut kind = vk::SemaphoreTypeCreateInfo::default() + .semaphore_type(vk::SemaphoreType::TIMELINE) + .initial_value(0); + let mut export = vk::ExportSemaphoreCreateInfo::default() + .handle_types(vk::ExternalSemaphoreHandleTypeFlags::OPAQUE_FD); + let timeline = unsafe { + gpu.device.create_semaphore( + &vk::SemaphoreCreateInfo::default() + .push_next(&mut kind) + .push_next(&mut export), + None, + ) + } + .expect("timeline semaphore"); + let (memory_handle, timeline_handle) = unsafe { + ( + memory_fd + .get_memory_fd( + &vk::MemoryGetFdInfoKHR::default() + .memory(memory) + .handle_type(vk::ExternalMemoryHandleTypeFlags::OPAQUE_FD), + ) + .expect("export slot memory"), + semaphore_fd + .get_semaphore_fd( + &vk::SemaphoreGetFdInfoKHR::default() + .semaphore(timeline) + .handle_type(vk::ExternalSemaphoreHandleTypeFlags::OPAQUE_FD), + ) + .expect("export slot timeline"), + ) + }; + // SAFETY: Vulkan returned fresh descriptors owned by the caller. + let (memory_handle, timeline_handle) = unsafe { + ( + OwnedFd::from_raw_fd(memory_handle), + OwnedFd::from_raw_fd(timeline_handle), + ) + }; + source + .import( + index, + memory_handle, + timeline_handle, + allocation_size, + memory_type, + ) + .expect("import the slot"); + ring.push(Slot { + image, + memory, + timeline, + commands: None, + written: false, + }); + } + Self { + gpu, + size, + source: Some(source), + target, + target_memory, + pool, + slots: ring, + rendered: 0, + } + } + + pub fn source(&self) -> &Source { + self.source.as_ref().expect("camera closed") + } + + pub fn wanted(&self) -> bool { + self.source().wanted() + } + + /// Render one solid `rgb` frame and hand it to the bridge. Returns false + /// when every slot is still in use. + pub fn render(&mut self, rgb: [u8; 3], frame: u64, timestamp_us: u64) -> bool { + let Some((index, ready)) = self.source().acquire().expect("acquire a slot") else { + return false; + }; + let device = &self.gpu.device; + let slot = &mut self.slots[index]; + if let Some(previous) = slot.commands.take() { + unsafe { device.free_command_buffers(self.pool, &[previous]) }; + } + let commands = unsafe { + device.allocate_command_buffers( + &vk::CommandBufferAllocateInfo::default() + .command_pool(self.pool) + .level(vk::CommandBufferLevel::PRIMARY) + .command_buffer_count(1), + ) + } + .expect("command buffer")[0]; + let range = vk::ImageSubresourceRange { + aspect_mask: vk::ImageAspectFlags::COLOR, + base_mip_level: 0, + level_count: 1, + base_array_layer: 0, + layer_count: 1, + }; + let layers = vk::ImageSubresourceLayers { + aspect_mask: vk::ImageAspectFlags::COLOR, + mip_level: 0, + base_array_layer: 0, + layer_count: 1, + }; + let barrier = |image, old, new, src_access, dst_access| { + vk::ImageMemoryBarrier::default() + .old_layout(old) + .new_layout(new) + .src_access_mask(src_access) + .dst_access_mask(dst_access) + .src_queue_family_index(vk::QUEUE_FAMILY_IGNORED) + .dst_queue_family_index(vk::QUEUE_FAMILY_IGNORED) + .image(image) + .subresource_range(range) + }; + // Component order, whatever the image's byte order. + let [r, g, b] = rgb.map(|channel| f32::from(channel) / 255.0); + let clear = vk::ClearColorValue { + float32: [r, g, b, 1.0], + }; + unsafe { + device + .begin_command_buffer( + commands, + &vk::CommandBufferBeginInfo::default() + .flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT), + ) + .expect("begin"); + // "Render": after the previous frame's copy read the target. + device.cmd_pipeline_barrier( + commands, + vk::PipelineStageFlags::ALL_COMMANDS, + vk::PipelineStageFlags::TRANSFER, + vk::DependencyFlags::empty(), + &[], + &[], + &[barrier( + self.target, + vk::ImageLayout::UNDEFINED, + vk::ImageLayout::TRANSFER_DST_OPTIMAL, + vk::AccessFlags::TRANSFER_READ, + vk::AccessFlags::TRANSFER_WRITE, + )], + ); + device.cmd_clear_color_image( + commands, + self.target, + vk::ImageLayout::TRANSFER_DST_OPTIMAL, + &clear, + &[range], + ); + // The plugin's part: the render target into the slot, after every + // earlier use of the slot on this queue. + device.cmd_pipeline_barrier( + commands, + vk::PipelineStageFlags::ALL_COMMANDS, + vk::PipelineStageFlags::TRANSFER, + vk::DependencyFlags::empty(), + &[], + &[], + &[ + barrier( + self.target, + vk::ImageLayout::TRANSFER_DST_OPTIMAL, + vk::ImageLayout::TRANSFER_SRC_OPTIMAL, + vk::AccessFlags::TRANSFER_WRITE, + vk::AccessFlags::TRANSFER_READ, + ), + barrier( + slot.image, + if slot.written { + vk::ImageLayout::GENERAL + } else { + vk::ImageLayout::UNDEFINED + }, + vk::ImageLayout::TRANSFER_DST_OPTIMAL, + vk::AccessFlags::MEMORY_READ | vk::AccessFlags::MEMORY_WRITE, + vk::AccessFlags::TRANSFER_WRITE, + ), + ], + ); + device.cmd_copy_image( + commands, + self.target, + vk::ImageLayout::TRANSFER_SRC_OPTIMAL, + slot.image, + vk::ImageLayout::TRANSFER_DST_OPTIMAL, + &[vk::ImageCopy::default() + .src_subresource(layers) + .dst_subresource(layers) + .extent(vk::Extent3D { + width: self.size.width, + height: self.size.height, + depth: 1, + })], + ); + device.cmd_pipeline_barrier( + commands, + vk::PipelineStageFlags::TRANSFER, + vk::PipelineStageFlags::ALL_COMMANDS, + vk::DependencyFlags::empty(), + &[], + &[], + &[barrier( + slot.image, + vk::ImageLayout::TRANSFER_DST_OPTIMAL, + vk::ImageLayout::GENERAL, + vk::AccessFlags::TRANSFER_WRITE, + vk::AccessFlags::MEMORY_READ, + )], + ); + device.end_command_buffer(commands).expect("end"); + } + let signals = [ready]; + let mut timeline = + vk::TimelineSemaphoreSubmitInfo::default().signal_semaphore_values(&signals); + let buffers = [commands]; + let semaphores = [slot.timeline]; + let submit = vk::SubmitInfo::default() + .push_next(&mut timeline) + .command_buffers(&buffers) + .signal_semaphores(&semaphores); + unsafe { device.queue_submit(self.gpu.queue, &[submit], vk::Fence::null()) } + .expect("submit"); + slot.commands = Some(commands); + slot.written = true; + self.rendered += 1; + self.source() + .submit(index, frame, timestamp_us) + .expect("submit to the bridge"); + true + } +} + +impl Drop for Camera<'_> { + fn drop(&mut self) { + // The plugin's teardown order: close the source, which returns once the + // GPU is done with every slot, then free the images. + drop(self.source.take()); + let device = &self.gpu.device; + unsafe { + let _ = device.queue_wait_idle(self.gpu.queue); + for slot in self.slots.drain(..) { + device.destroy_semaphore(slot.timeline, None); + device.destroy_image(slot.image, None); + device.free_memory(slot.memory, None); + } + device.destroy_command_pool(self.pool, None); + device.destroy_image(self.target, None); + device.free_memory(self.target_memory, None); + } + } +} diff --git a/demo/carla/justfile b/demo/carla/justfile new file mode 100644 index 00000000000..f45f5fe540f --- /dev/null +++ b/demo/carla/justfile @@ -0,0 +1,130 @@ +#!/usr/bin/env just --justfile +# +# The CARLA demo: simulated trucks in one CARLA world, watched and steered from +# a browser over MoQ. See README.md. + +set fallback + +# The relay the worker publishes into. Production passes a demo-project token +# here through ~/.config/moq/carla.env; local development needs none. +relay_url := env("MOQ_URL", "http://localhost:4443") + +# The simulator is not included: start `just carla server` once and leave it +# running across restarts of everything else. +# +# Run a local relay, both trucks, and the web player. +default: + bun install + bun run concurrently --kill-others --names relay,trucks,web --prefix-colors auto \ + "just relay" \ + "just wait && just wait-port 127.0.0.1 2000 && just worker" \ + "just wait && just web" + +# Run the Python worker: every truck in one shared CARLA world. +worker *ARGS: + @MOQ_URL='{{ relay_url }}' sim/python.sh -m moq_carla_sim.main {{ ARGS }} + +# Run the web player against a relay. +web url='http://localhost:4443': + cd web && VITE_RELAY_URL="{{ url }}" bun --bun vite --open + +# Build the player for carla.moq.dev, against the public demo relay. +build-web: + bun install --frozen-lockfile + cd web && VITE_RELAY_URL=https://cdn.moq.dev/demo bun run build + +# Deploy the player to carla.moq.dev. +deploy: build-web + cd web && bun wrangler deploy + +# Build the worker's virtualenv, with moq's Python bindings from this checkout. +venv: + sim/venv.sh + +# Run the CARLA simulator on the local NVIDIA GPU, in podman. +server: + sim/server.sh + +# Generate the rootless NVIDIA CDI device the simulator runs with. +cdi: + sim/cdi.sh + +# Build the simulator image (GPU video bridge, RPC idle wait) from source; see sim/patches/README.md. +build: + sim/patches/build.sh + +# Disable rendering on a simulator no worker owns, so an idle simulator stays idle. +park *ARGS: + @sim/python.sh -m moq_carla_sim.park {{ ARGS }} + +# Measure camera capture capacity on a separate, idle simulator. +benchmark *ARGS: + @sim/python.sh -m moq_carla_sim.benchmark {{ ARGS }} + +# Bake the running town's road network into the player's map; commit the result. +map *ARGS: + @sim/python.sh -m moq_carla_sim.roadmap --out web/src/maps {{ ARGS }} + +# Install the simulator and worker as rootless systemd user units. +service-install: + sim/systemd/install-user-service.sh + +# Start the units now and at login (at boot with `loginctl enable-linger`). +service-enable: + systemctl --user enable --now carla-worker.service + +# Stop the units and remove them from startup. +service-disable: + systemctl --user disable --now carla-worker.service carla-sim.service + +# Show the units' status. +service-status: + systemctl --user status carla-worker.service carla-sim.service + +# Follow the units' logs. +service-logs: + journalctl --user -u carla-worker.service -u carla-sim.service -f + +# None of these need CARLA or a GPU. `just js` and `just rs` cover the player and +# the bridge. +# +# Lint and test the worker and its launchers. +check: + uv sync --project ../.. --locked --no-install-workspace + cd sim && uv run --project ../../.. --no-sync ruff check . + cd sim && uv run --project ../../.. --no-sync ruff format --check . + cd sim && uv run --project ../../.. --no-sync pyright + cd sim && uv run --project ../../.. --no-sync pytest -q + sim/python.test.sh + sim/server.test.sh + sim/systemd/install-user-service.test.sh + sim/patches/sources.test.sh + bridge/gpu.test.sh + +# Auto-fix the worker's lint and formatting. +fix: + uv sync --project ../.. --no-install-workspace + cd sim && uv run --project ../../.. --no-sync ruff check --fix . + cd sim && uv run --project ../../.. --no-sync ruff format . + +# A Vulkan stand-in plays the CARLA plugin. A host with no NVIDIA GPU skips, and +# one whose NVIDIA driver is not loaded fails. +# +# Run the GPU bridge end to end on this host's NVIDIA GPU. +bridge-gpu: + cd ../.. && demo/carla/bridge/gpu.sh cargo test --locked -p moq-carla-bridge --test gpu -- --ignored + +# Wait for a TCP port to accept connections. bash's /dev/tcp rather than nc, +# because the user units gate on this at boot and nc is not in the devshell. +[private] +wait-port host port tries="60": + #!/usr/bin/env bash + set -euo pipefail + for _ in $(seq 1 {{ tries }}); do + if (exec 3<>/dev/tcp/{{ host }}/{{ port }}) 2>/dev/null; then + exit 0 + fi + sleep 0.5 + done + echo "timed out waiting for {{ host }}:{{ port }}" >&2 + exit 1 diff --git a/demo/carla/sim/.gitignore b/demo/carla/sim/.gitignore new file mode 100644 index 00000000000..c373c7551a1 --- /dev/null +++ b/demo/carla/sim/.gitignore @@ -0,0 +1,7 @@ +# The runtime venv, rebuilt by venv.sh. +.venv/ +__pycache__/ +*.egg-info/ +# Left behind by the Python checks. +.pytest_cache/ +.ruff_cache/ diff --git a/demo/carla/sim/cdi.sh b/demo/carla/sim/cdi.sh new file mode 100755 index 00000000000..8cd879f0571 --- /dev/null +++ b/demo/carla/sim/cdi.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Generate a rootless Podman CDI spec whose hook survives Nix garbage collection. +set -euo pipefail + +state_dir="${XDG_STATE_HOME:-$HOME/.local/state}/moq" +cdi_dir="${XDG_CONFIG_HOME:-$HOME/.config}/cdi" +toolkit="$state_dir/nvidia-container-toolkit" +hook="$toolkit/bin/nvidia-ctk" + +mkdir -p "$state_dir" "$cdi_dir" + +# The CDI spec embeds the hook's absolute path. A bare `nix shell` leaves that +# path unrooted, so a later Nix GC breaks every container start. The out-link is +# both the stable path written into the spec and the GC root that keeps it alive. +nix build --out-link "$toolkit" nixpkgs#nvidia-container-toolkit + +tmp="$(mktemp "$cdi_dir/nvidia.XXXXXX.yaml")" +trap 'rm -f "$tmp"' EXIT +"$hook" cdi generate \ + --mode=nvml \ + --nvidia-cdi-hook-path="$hook" \ + --output="$tmp" +mv "$tmp" "$cdi_dir/nvidia.yaml" +trap - EXIT + +printf 'carla: wrote %s with rooted hook %s\n' "$cdi_dir/nvidia.yaml" "$hook" >&2 diff --git a/demo/carla/sim/moq_carla_sim/__init__.py b/demo/carla/sim/moq_carla_sim/__init__.py new file mode 100644 index 00000000000..096a8dad796 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/__init__.py @@ -0,0 +1,12 @@ +"""Simulated trucks in one shared CARLA world, published over MoQ. + +The trucks drive themselves under Traffic Manager and can be taken over from +the browser. Every driver command passes the safety gate in `drive` before it +reaches CARLA. + +Python rather than Rust because the `carla` crate's C++ bindings (`carla-sys`, +via autocxx) only build against LLVM 11-13, which neither nixpkgs nor Fedora +still ship. CARLA's own client is a Python wheel, and moq's Python bindings +cover publishing and the JSON control tracks, so the whole worker fits in one +process with no FFI of ours in the middle. +""" diff --git a/demo/carla/sim/moq_carla_sim/aerial.py b/demo/carla/sim/moq_carla_sim/aerial.py new file mode 100644 index 00000000000..8fac0fc7340 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/aerial.py @@ -0,0 +1,155 @@ +"""Capture a calibrated aerial image without changing the running CARLA world.""" + +from __future__ import annotations + +import argparse +import json +import math +import queue +import time +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Any + + +@dataclass(frozen=True) +class Camera: + x: float + y: float + z: float + pitch: float = -90.0 + yaw: float = -90.0 + fov: float = 20.0 + + +def calibration( + bbox: list[float], padding: float = 30.0, ground_z: float = 0.0, fov: float = 20.0 +) -> tuple[Camera, list[float]]: + """Fit a square pinhole footprint; image right is +x and image down is +y. + + The footprint is exact on the chosen ground plane. Elevated roofs and + uneven terrain retain perspective displacement, so this is not an orthophoto. + """ + if len(bbox) != 4 or not all(math.isfinite(value) for value in bbox): + raise ValueError("bbox must contain four finite world coordinates") + left, top, right, bottom = bbox + if right <= left or bottom <= top: + raise ValueError("bbox must have positive width and height") + if not math.isfinite(padding) or padding < 0: + raise ValueError("padding must be finite and nonnegative") + if not math.isfinite(ground_z) or not math.isfinite(fov) or not 1 <= fov <= 90: + raise ValueError("ground height must be finite and field of view must be 1..90 degrees") + side = max(right - left, bottom - top) + 2 * padding + x, y = (left + right) / 2, (top + bottom) / 2 + half = side / 2 + camera = Camera(x=x, y=y, z=ground_z + half / math.tan(math.radians(fov / 2)), fov=fov) + return camera, [x - half, y - half, x + half, y + half] + + +def capture(world: Any, camera: Camera, resolution: int, timeout: float) -> Any: + """Own just one temporary camera; the existing simulator owns all ticks.""" + import carla + + if resolution < 256 or resolution > 4096: + raise ValueError("resolution must be 256..4096 pixels") + if not math.isfinite(timeout) or timeout <= 0: + raise ValueError("capture timeout must be finite and positive") + if world.get_settings().no_rendering_mode: + raise RuntimeError("CARLA rendering is parked; open a truck camera in the demo and rerun") + blueprint = world.get_blueprint_library().find("sensor.camera.rgb") + for name, value in { + "image_size_x": str(resolution), + "image_size_y": str(resolution), + "fov": str(camera.fov), + "sensor_tick": "0.5", + "lens_k": "0", + "lens_kcube": "0", + "motion_blur_intensity": "0", + }.items(): + blueprint.set_attribute(name, value) + transform = carla.Transform( + carla.Location(x=camera.x, y=camera.y, z=camera.z), + carla.Rotation(pitch=camera.pitch, yaw=camera.yaw, roll=0), + ) + frames: queue.Queue[Any] = queue.Queue(maxsize=1) + + def receive(frame: Any) -> None: + try: + frames.put_nowait(frame) + except queue.Full: + # A capture only needs one pending frame, never a backlog of images. + return + + sensor = world.spawn_actor(blueprint, transform) + try: + sensor.listen(receive) + deadline = time.monotonic() + timeout + + def next_frame() -> Any: + remaining = deadline - time.monotonic() + if remaining <= 0: + raise TimeoutError("no aerial image before capture deadline") + try: + return frames.get(timeout=remaining) + except queue.Empty as error: + raise TimeoutError("no aerial image before capture deadline") from error + + # Discard initial exposure frames without driving or changing world time. + for _ in range(3): + next_frame() + return next_frame() + finally: + try: + sensor.stop() + finally: + if not sensor.destroy(): + raise RuntimeError(f"failed to destroy temporary aerial camera {sensor.id}") + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--carla-host", default="127.0.0.1") + parser.add_argument("--carla-port", type=int, default=2000) + parser.add_argument("--timeout", type=float, default=30.0) + parser.add_argument("--resolution", type=int, default=2048) + parser.add_argument("--padding", type=float, default=30.0, help="metres outside the baked roads") + parser.add_argument("--ground-z", type=float, default=0.0, help="calibration plane in world metres") + parser.add_argument("--fov", type=float, default=20.0) + parser.add_argument("--out", type=Path, default=Path(__file__).resolve().parents[2] / "web/src/maps") + args = parser.parse_args(argv) + if not math.isfinite(args.timeout) or args.timeout <= 0: + parser.error("--timeout must be finite and positive") + + import carla + + client = carla.Client(args.carla_host, args.carla_port) + client.set_timeout(args.timeout) + world = client.get_world() + name = world.get_map().name.rsplit("/", 1)[-1] + roads = json.loads((args.out / f"{name}.json").read_text()) + if roads["name"] != name: + raise ValueError("baked road map name does not match the running world") + camera, bbox = calibration(roads["bbox"], args.padding, args.ground_z, args.fov) + frame = capture(world, camera, args.resolution, args.timeout) + image = args.out / f"{name}.aerial.png" + frame.save_to_disk(str(image)) + if not image.is_file() or image.stat().st_size == 0: + raise RuntimeError(f"CARLA did not save an image to {image}") + manifest = { + "name": name, + "image": image.name, + "bbox": bbox, + "width": frame.width, + "height": frame.height, + "groundZ": args.ground_z, + "camera": asdict(camera), + "frame": frame.frame, + } + path = args.out / f"{name}.aerial.json" + path.write_text(json.dumps(manifest, indent=2) + "\n") + print(f"Wrote {image} and {path}; verify road alignment before shipping") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/demo/carla/sim/moq_carla_sim/benchmark.py b/demo/carla/sim/moq_carla_sim/benchmark.py new file mode 100644 index 00000000000..1ce091f6c94 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/benchmark.py @@ -0,0 +1,189 @@ +"""Measure camera throughput on an otherwise idle CARLA server (no MoQ required).""" + +from __future__ import annotations + +import argparse +import json +import math +import statistics +import threading +import time +from contextlib import ExitStack + + +class Frames: + """Keep frame identities, not images, so delivery cannot hide behind tick FPS.""" + + def __init__(self) -> None: + self.condition = threading.Condition() + self.received: dict[int, float] = {} + self.duplicates = 0 + + def receive(self, image) -> None: + with self.condition: + if image.frame in self.received: + self.duplicates += 1 + else: + self.received[image.frame] = time.monotonic() + self.condition.notify_all() + + def finish(self, expected: dict[int, float], deadline: float) -> dict: + with self.condition: + self.condition.wait_for( + lambda: expected.keys() <= self.received.keys(), max(0, deadline - time.monotonic()) + ) + missing = sorted(expected.keys() - self.received.keys()) + # Same client monotonic clock on both sides: delay from requesting + # this world tick to receiving its image, not glass-to-glass latency. + delays = sorted( + (self.received[frame] - started) * 1000 for frame, started in expected.items() if frame in self.received + ) + return { + "delivered": len(expected) - len(missing), + "missing": missing, + "duplicates": self.duplicates, + "callback_delay_p95_ms": delays[math.ceil(len(delays) * 0.95) - 1] if delays else None, + "callback_delay_max_ms": max(delays) if delays else None, + } + + +def summary(durations: list[float]) -> dict: + ordered = sorted(durations) + return { + "tick_fps": len(durations) / sum(durations), + "mean_ms": statistics.mean(durations) * 1000, + "p50_ms": statistics.median(durations) * 1000, + "p95_ms": ordered[math.ceil(len(ordered) * 0.95) - 1] * 1000, + "max_ms": max(durations) * 1000, + "over_30fps_budget": sum(duration > 1 / 30 for duration in durations), + } + + +def require_idle(world, timeout: float) -> None: + if world.get_settings().synchronous_mode: + raise RuntimeError("benchmark requires an idle asynchronous server; another client may own its ticks") + # A new client can see an empty actor cache before its first world snapshot. + # Receive that snapshot without taking ownership of the simulation clock. + world.wait_for_tick(timeout) + actors = world.get_actors() + if any(actors.filter(pattern) for pattern in ("vehicle.*", "walker.*", "sensor.*")): + raise RuntimeError("benchmark requires an empty server; use a separate CARLA instance") + + +def destroy(actor) -> None: + if not actor.destroy(): + raise RuntimeError(f"failed to destroy benchmark actor {actor.id}") + + +def measure( + client, cameras: int, width: int, height: int, ticks: int, warmup: int, timeout: float, listen: bool +) -> dict: + import carla + + world = client.get_world() + require_idle(world, timeout) + original = world.get_settings() + settings = world.get_settings() + settings.synchronous_mode = True + settings.fixed_delta_seconds = 1 / 30 + settings.no_rendering_mode = False + # ExitStack attempts every cleanup even if one actor RPC fails. Restore the + # clock last, after removing only actors this measurement created. + with ExitStack() as cleanup: + cleanup.callback(world.apply_settings, original) + world.apply_settings(settings) + library = world.get_blueprint_library() + vehicle = world.spawn_actor( + library.find("vehicle.carlamotors.european_hgv"), world.get_map().get_spawn_points()[0] + ) + cleanup.callback(destroy, vehicle) + vehicle.set_simulate_physics(False) + collectors = [] + for index in range(cameras): + blueprint = library.find("sensor.camera.rgb") + blueprint.set_attribute("image_size_x", str(width)) + blueprint.set_attribute("image_size_y", str(height)) + blueprint.set_attribute("sensor_tick", "0.0") + sensor = world.spawn_actor( + blueprint, carla.Transform(carla.Location(x=-6, z=3 + index * 0.1)), attach_to=vehicle + ) + cleanup.callback(destroy, sensor) + if listen: + frames = Frames() + collectors.append(frames) + sensor.listen(frames.receive) + cleanup.callback(sensor.stop) + for _ in range(warmup): + world.tick() + durations = [] + expected = {} + for _ in range(ticks): + started = time.monotonic() + frame = world.tick() + durations.append(time.monotonic() - started) + expected[frame] = started + if len(expected) != ticks or max(expected) - min(expected) != ticks - 1: + raise RuntimeError("nonconsecutive world frames; another client may be ticking this server") + # GPU cameras are pipelined. Waiting for each same-tick image deadlocks + # that pipeline and measures the client barrier instead of capacity. + # Drain extra world ticks without counting their images or durations. + for _ in range(8): + world.tick() + deadline = time.monotonic() + timeout + delivery = [collector.finish(expected, deadline) for collector in collectors] + result = { + "cameras": cameras, + "width": width, + "height": height, + "listening": listen, + "ticks": ticks, + "warmup": warmup, + **summary(durations), + "delivery": delivery, + } + print(json.dumps(result), flush=True) + if any(item["missing"] or item["duplicates"] for item in delivery): + raise RuntimeError("camera delivery was incomplete or duplicated; this is not a passing throughput result") + return result + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, default=2200) + parser.add_argument("--ticks", type=int, default=300) + parser.add_argument("--warmup", type=int, default=60) + parser.add_argument("--timeout", type=float, default=30) + parser.add_argument("--cameras", type=int, nargs="+", default=[0, 1, 2, 3, 4]) + parser.add_argument("--sizes", nargs="+", default=["320x180"]) + parser.add_argument("--no-listen", action="store_true", help="control: spawn cameras without activating capture") + args = parser.parse_args(argv) + if args.ticks < 1 or args.warmup < 1 or any(count < 0 for count in args.cameras): + parser.error("ticks and warmup must be positive, camera counts nonnegative") + if not math.isfinite(args.timeout) or args.timeout <= 0 or not 1 <= args.port <= 65535: + parser.error("timeout must be finite and positive, port must be 1..65535") + sizes = [] + for size in args.sizes: + try: + width, height = map(int, size.split("x")) + if not (1 <= width <= 4096 and 1 <= height <= 4096): + raise ValueError + except ValueError: + parser.error("sizes must be WIDTHxHEIGHT with dimensions 1..4096") + sizes.append((width, height)) + + import carla + + client = carla.Client(args.host, args.port) + client.set_timeout(args.timeout) + if client.get_client_version() != client.get_server_version(): + raise RuntimeError("CARLA client/server versions differ") + print(json.dumps({"server": client.get_server_version(), "map": client.get_world().get_map().name}), flush=True) + for width, height in sizes: + for cameras in args.cameras: + measure(client, cameras, width, height, args.ticks, args.warmup, args.timeout, not args.no_listen) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/demo/carla/sim/moq_carla_sim/bridge.py b/demo/carla/sim/moq_carla_sim/bridge.py new file mode 100644 index 00000000000..3353eacec23 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/bridge.py @@ -0,0 +1,455 @@ +"""The worker's side of the native CARLA video bridge. + +The bridge (`demo/carla/bridge`) runs inside CARLA: it copies each camera's render +target on the GPU, converts and scales it with CUDA, and encodes it with NVENC. +This module speaks its Unix-socket protocol, mirrored from +`demo/carla/bridge/src/protocol.rs`, and republishes the compressed frames on the +truck's broadcast. Raw pixels never reach Python. + +Each message is `u32 length | u8 kind | body`: little-endian integers, a string +as `u16 length | UTF-8`, a blob as `u32 length | bytes`. +""" + +from __future__ import annotations + +import asyncio +import logging +import struct +from dataclasses import dataclass +from datetime import timedelta +from typing import Callable + +import moq + +log = logging.getLogger(__name__) + +VERSION = 1 +MAX_MESSAGE = 16 << 20 +MAX_RENDITIONS = 8 + +_HELLO = 0x01 +_OPEN = 0x02 +_DEMAND = 0x03 +_KEYFRAME = 0x04 +_CLOSE = 0x05 + +_EVENT_HELLO = 0x81 +_EVENT_CONFIG = 0x82 +_EVENT_FRAME = 0x83 +_EVENT_ERROR = 0x84 + + +class BridgeError(Exception): + """The bridge reported a failure, broke the protocol, or went away.""" + + +@dataclass(frozen=True) +class Rendition: + """One encoded size of a stream, published as track `name`.""" + + name: str + width: int + height: int + bitrate: int + framerate: int + + +@dataclass(frozen=True) +class Hello: + version: int + + +@dataclass(frozen=True) +class Config: + """A rendition's Annex-B parameter sets, sent before any of its frames.""" + + id: int + rendition: int + init: bytes + + +@dataclass(frozen=True) +class Frame: + """One encoded access unit, stamped with CARLA's frame and simulation time.""" + + id: int + rendition: int + frame: int + timestamp_us: int + keyframe: bool + payload: bytes + + +@dataclass(frozen=True) +class Error: + """Stream 0 is the connection itself; any other stream has stopped.""" + + id: int + message: str + + +Event = Hello | Config | Frame | Error + + +def _message(kind: int, body: bytes) -> bytes: + return struct.pack(" bytes: + encoded = value.encode() + return struct.pack(" bytes: + return _message(_HELLO, struct.pack(" bytes: + body = struct.pack(" bytes: + return _message(_DEMAND, struct.pack(" bytes: + return _message(_KEYFRAME, struct.pack(" bytes: + return _message(_CLOSE, struct.pack(" None: + self._data = memoryview(data) + self._offset = 0 + + def take(self, size: int) -> bytes: + if self._offset + size > len(self._data): + raise BridgeError(f"truncated message: need {size} bytes, have {len(self._data) - self._offset}") + value = bytes(self._data[self._offset : self._offset + size]) + self._offset += size + return value + + def unpack(self, fmt: str) -> tuple[int, ...]: + return struct.unpack(fmt, self.take(struct.calcsize(fmt))) + + def string(self) -> str: + (size,) = self.unpack(" bytes: + (size,) = self.unpack(" None: + if self._offset != len(self._data): + raise BridgeError(f"{len(self._data) - self._offset} trailing bytes") + + +def decode_event(kind: int, body: bytes) -> Event: + reader = _Body(body) + event: Event + if kind == _EVENT_HELLO: + (version,) = reader.unpack(" Event | None: + """The next event, or None when the bridge closed the socket between messages.""" + try: + header = await reader.readexactly(4) + except asyncio.IncompleteReadError as err: + if err.partial: + raise BridgeError("bridge closed mid-message") from err + return None + (length,) = struct.unpack(" MAX_MESSAGE: + raise BridgeError(f"message length {length}") + try: + message = await reader.readexactly(length) + except asyncio.IncompleteReadError as err: + raise BridgeError("bridge closed mid-message") from err + return decode_event(message[0], message[1:]) + + +class Bridge: + """One connection to the bridge, shared by every truck's stream. + + `run` is the only reader: it must be running while streams open, since the + parameter sets each `open` waits for arrive through it. + """ + + def __init__(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: + self._reader = reader + self._writer = writer + self._streams: dict[int, BridgeStream] = {} + # Ids are never reused, so a closed one stays known: the bridge may + # still deliver frames it encoded before it saw the close. + self._closed: set[int] = set() + self._next_id = 1 + # Why `run` ended; every stream opened after that fails with it. + self._failure: BaseException | None = None + + @classmethod + async def connect(cls, path: str) -> Bridge: + reader, writer = await asyncio.open_unix_connection(path, limit=MAX_MESSAGE) + bridge = cls(reader, writer) + bridge._send(encode_hello()) + hello = await read_event(reader) + if hello != Hello(VERSION): + raise BridgeError(f"expected hello {VERSION}, got {hello!r}") + return bridge + + def disconnect(self) -> None: + """Close the connection; the bridge stops every stream on it.""" + self._writer.close() + + def _send(self, message: bytes) -> None: + # Control messages are tiny and rare; the transport buffers them. + self._writer.write(message) + + async def open(self, name: str, renditions: list[Rendition], broadcast: moq.BroadcastProducer) -> BridgeStream: + """Encode the cameras registered as `name` into `broadcast`'s tracks. + + Returns once every rendition is advertised, before anyone subscribes. + """ + if not renditions or len(renditions) > MAX_RENDITIONS: + raise ValueError(f"{name}: {len(renditions)} renditions") + if self._failure is not None: + raise BridgeError(f"{name}: the bridge connection has ended") from self._failure + id = self._next_id + self._next_id += 1 + stream = BridgeStream(self, id, name, renditions, broadcast) + self._streams[id] = stream + self._send(encode_open(id, name, renditions)) + await stream.advertised() + return stream + + async def run(self) -> None: + """Deliver events until the connection ends. Always raises: the bridge + going away, or any error it reports, ends the worker's video.""" + try: + await self._deliver() + except BaseException as err: + # Nothing else answers an `open` still waiting for its parameter + # sets, so it would wait forever; later ones fail straight away. + self._failure = err + for stream in self._streams.values(): + stream.fail(err) + raise + + async def _deliver(self) -> None: + while True: + event = await read_event(self._reader) + if event is None: + raise BridgeError("bridge closed the connection") + if isinstance(event, Error): + stream = self._streams.get(event.id) + where = stream.name if stream else "bridge" + raise BridgeError(f"{where}: {event.message}") + if isinstance(event, Hello): + raise BridgeError("unexpected hello") + stream = self._streams.get(event.id) + if stream is None: + if event.id in self._closed: + continue + raise BridgeError(f"event for unknown stream {event.id}") + if isinstance(event, Config): + stream.configure(event) + else: + stream.publish(event) + + def demand(self, id: int, renditions: int) -> None: + self._send(encode_demand(id, renditions)) + + def keyframe(self, id: int, rendition: int) -> None: + self._send(encode_keyframe(id, rendition)) + + def close(self, id: int) -> None: + self._streams.pop(id, None) + self._closed.add(id) + self._send(encode_close(id)) + + +class BridgeStream: + """One broadcast's video tracks, fed by the bridge. + + Each rendition's subscribers drive the bridge's demand, which decides what + CARLA renders: the smallest camera covering the largest demanded rendition, + scaled on the GPU for the rest, and nothing at all without subscribers. + """ + + def __init__( + self, + bridge: Bridge, + id: int, + name: str, + renditions: list[Rendition], + broadcast: moq.BroadcastProducer, + ) -> None: + self._bridge = bridge + self.id = id + self.name = name + self._renditions = renditions + self._broadcast = broadcast + self._tracks: list[moq.media.TrackProducer | None] = [None] * len(renditions) + self._advertised: asyncio.Future[None] = asyncio.get_running_loop().create_future() + self._demand = 0 + self._on_demand: Callable[[bool], None] | None = None + self._finished = False + # Simulation time of the first frame, shared by every rendition so their + # timelines line up. + self._origin_us: int | None = None + self.published = [0] * len(renditions) + + async def advertised(self) -> None: + await self._advertised + + @property + def rendition_names(self) -> list[str]: + return [rendition.name for rendition in self._renditions] + + def fail(self, err: BaseException) -> None: + """End a pending `advertised` with the connection's failure.""" + if not self._advertised.done(): + failure = BridgeError(f"{self.name}: the bridge connection ended before the stream was advertised") + failure.__cause__ = err + self._advertised.set_exception(failure) + + def configure(self, config: Config) -> None: + if config.rendition >= len(self._renditions) or self._tracks[config.rendition] is not None: + raise BridgeError(f"{self.name}: unexpected config for rendition {config.rendition}") + rendition = self._renditions[config.rendition] + # The parameter sets resolve the catalog entry up front, so a viewer can + # subscribe before the first frame exists, which is what starts it. + self._tracks[config.rendition] = moq.media.TrackProducer.video( + self._broadcast, + moq.media.VideoInit( + format=moq.media.VideoFormat.AVC3, + data=config.init, + hint=moq.media.VideoHint( + coded=moq.media.Dimensions(width=rendition.width, height=rendition.height), + bitrate=rendition.bitrate, + framerate=float(rendition.framerate), + ), + ), + target=moq.media.Named(rendition.name), + ) + if all(track is not None for track in self._tracks) and not self._advertised.done(): + self._advertised.set_result(None) + + def publish(self, frame: Frame) -> None: + if frame.rendition >= len(self._tracks): + raise BridgeError(f"{self.name}: frame for rendition {frame.rendition}") + track = self._tracks[frame.rendition] + if track is None: + raise BridgeError(f"{self.name}: frame before config for rendition {frame.rendition}") + if self._origin_us is None: + self._origin_us = frame.timestamp_us + timestamp = timedelta(microseconds=max(0, frame.timestamp_us - self._origin_us)) + track.write_frame(frame.payload, timestamp) + # Live encoder output: records the handoff for the catalog's jitter. + track.flush(timestamp) + self.published[frame.rendition] += 1 + + async def watch_demand(self, on_demand: Callable[[bool], None] | None = None) -> None: + """Forward each rendition's subscribers to the bridge until cancelled. + + `on_demand` hears whether any rendition is wanted, before the bridge + starts rendering and after it stops, so what it prepares (the + simulator's renderer) is ready for the first picture. + """ + self._on_demand = on_demand + async with asyncio.TaskGroup() as group: + for index, track in enumerate(self._tracks): + assert track is not None, "watch_demand before advertised" + group.create_task(self._watch(index, track.demand()), name=f"demand:{self.name}:{index}") + + async def _watch(self, index: int, demand: moq.TrackDemand) -> None: + while True: + await demand.used() + self._set_demand(index, True) + try: + await demand.unused() + finally: + self._set_demand(index, False) + + def _set_demand(self, index: int, used: bool) -> None: + # A watcher cancelled before `finish` may still clear its bit; the bridge + # would refuse demand for a closed stream and drop the connection. + if self._finished: + return + mask = self._demand | (1 << index) if used else self._demand & ~(1 << index) + if mask == self._demand: + return + # A failed `on_demand` commits nothing and fails the watcher. + if not self._demand and self._on_demand is not None: + self._on_demand(True) + self._demand = mask + self._bridge.demand(self.id, mask) + if not mask and self._on_demand is not None: + self._on_demand(False) + + def keyframe(self, rendition: int) -> None: + self._bridge.keyframe(self.id, rendition) + + def finish(self) -> None: + """Stop encoding and end the tracks cleanly for subscribers. Idempotent: + the bridge refuses a second Close, which would drop the connection + every truck's video shares.""" + if self._finished: + return + self._finished = True + self._bridge.close(self.id) + for track in self._tracks: + if track is None: + continue + try: + track.finish() + # uniffi's stubs declare the error a plain class; at runtime it is an Exception. + except moq.Error as err: # pyright: ignore[reportGeneralTypeIssues] + log.debug("%s: finishing a video track: %s", self.name, err) + + +__all__ = [ + "Bridge", + "BridgeError", + "BridgeStream", + "Config", + "Error", + "Frame", + "Hello", + "Rendition", + "decode_event", + "encode_close", + "encode_demand", + "encode_hello", + "encode_keyframe", + "encode_open", + "read_event", +] diff --git a/demo/carla/sim/moq_carla_sim/drive.py b/demo/carla/sim/moq_carla_sim/drive.py new file mode 100644 index 00000000000..e764c1219d5 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/drive.py @@ -0,0 +1,245 @@ +"""The control safety gate. + +Every driver command passes through here: sanitize the axes, check the +single-driver lease, honour the latched e-stop. Nothing downstream may act on a +command this gate did not accept, so CARLA's actuation sits strictly below it, +exactly where a real vehicle-bus backend would. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field, replace +from enum import Enum +from typing import Literal + +SHIFT_MAX_THROTTLE = 0.01 + + +class Gear(str, Enum): + """Transmission gear, as the `control` and `status` tracks spell it.""" + + NEUTRAL = "neutral" + FORWARD = "forward" + REVERSE = "reverse" + + +def _clamp(value: float, low: float, high: float) -> float: + return max(low, min(high, value)) + + +@dataclass(frozen=True) +class DriveState: + """The actuation request: what the truck has been asked to do right now. + + The defaults are the safe resting state: stopped, brake on, neutral. + """ + + steering: float = 0.0 + throttle: float = 0.0 + brake: float = 1.0 + gear: Gear = Gear.NEUTRAL + + def sanitized(self) -> DriveState: + """Clamp analog axes into range. + + A misbehaving or malicious driver must never be able to request + out-of-range actuation. + """ + return replace( + self, + steering=_clamp(self.steering, -1.0, 1.0), + throttle=_clamp(self.throttle, 0.0, 1.0), + brake=_clamp(self.brake, 0.0, 1.0), + ) + + @staticmethod + def stopped() -> DriveState: + """The all-stop state used for e-stop and when no driver is connected.""" + return DriveState() + + +@dataclass(frozen=True) +class Accepted: + """A command the truck has accepted: sanitized, lease-checked, e-stop aware. + + This is the only thing an actuator may act on. + """ + + state: DriveState = field(default_factory=DriveState.stopped) + estopped: bool = False + + +@dataclass(frozen=True) +class TimestampEntry: + """One media-clock timestamp from the driver, in milliseconds.""" + + label: str + ts: float + + +CommandKind = Literal[ + "drive", + "estop", + "reset_estop", + "respawn", + "driver_left", + "watchdog_expired", +] + + +@dataclass(frozen=True) +class Command: + """A parsed driver command with the originating driver attached. + + `drive`, `estop`, `reset_estop`, and `respawn` arrive on the wire; + `driver_left` and `watchdog_expired` are synthesized locally. + + `driver_id` is the driver's path segment, which `status` echoes. `epoch` is + the route epoch its broadcast was announced under: the same id announced + under another epoch is another run of the driver, so it is a different + driver for the lease. + """ + + kind: CommandKind + driver_id: str = "" + epoch: str | None = None + sequence: int = 0 + state: DriveState | None = None + timestamps: tuple[TimestampEntry, ...] = () + + +class Drive: + """The truck's live control state machine. + + The first driver to send a command owns the truck until it disconnects or + its command lease expires. Other drivers cannot silently steal control. + + The lease binds to the driver's broadcast path and the epoch it was + announced under, so a driver whose broadcast ends or restarts loses it. + It is still cooperative, not enforced: the holder's id is echoed on the + public `status` track, so anyone allowed to publish there can announce at + that path under a newer epoch, which ends the holder's broadcast and frees + the lease for the newcomer. This stops two honest drivers colliding; it + does not stop a deliberate takeover. + """ + + def __init__(self) -> None: + self._driver: str | None = None + self._epoch: str | None = None + self._sequence: int | None = None + self._state = DriveState.stopped() + self._estopped = False + self._estop_by: str | None = None + + @property + def driver(self) -> str | None: + return self._driver + + @property + def sequence(self) -> int | None: + return self._sequence + + @property + def state(self) -> DriveState: + return self._state + + @property + def estopped(self) -> bool: + return self._estopped + + @property + def estop_by(self) -> str | None: + return self._estop_by + + def holds(self, command: Command) -> bool: + """Whether `command` comes from the run of the driver holding the lease.""" + return self._driver is not None and (self._driver, self._epoch) == (command.driver_id, command.epoch) + + def accepted(self) -> Accepted: + return Accepted(state=self._state, estopped=self._estopped) + + def synchronize(self, state: DriveState) -> bool: + """Adopt live vehicle feedback before an unclaimed manual handoff.""" + if self._driver is not None or self._estopped: + return False + self._state = state.sanitized() + return True + + def apply(self, command: Command) -> bool: + """Apply a command, returning whether it changed or refreshed state.""" + if command.kind == "drive": + if self._estopped or not (self._driver is None or self.holds(command)): + return False + claiming = self._driver is None + self._driver = command.driver_id + self._epoch = command.epoch + self._sequence = command.sequence + state = (command.state or DriveState.stopped()).sanitized() + if ( + state.gear is not self._state.gear + and not self._can_shift(state) + and not (claiming and self._can_initialize_takeover(self._state, state)) + ): + state = replace(state, gear=self._state.gear) + self._state = state + + elif command.kind == "estop": + was_estopped = self._estopped + # E-stop is a safety control anyone may trigger, so it always + # latches and brings the truck to a stop, but it must never transfer + # the driving lease to its sender. Otherwise a bystander could + # e-stop, then reset_estop, and drive off with a lease they never + # legitimately claimed. Only refresh the acknowledgement sequence + # when the sender already holds the lease, so a bystander's e-stop + # cannot masquerade as the authoritative command either. + if self.holds(command): + self._sequence = command.sequence + self._state = DriveState.stopped() + self._estopped = True + if not was_estopped: + self._estop_by = command.driver_id + + elif command.kind == "reset_estop": + if not self._estopped: + return False + # Reset clears the global latch without claiming or transferring the + # lease. Only the holder's sequence is authoritative for that lease. + if self.holds(command): + self._sequence = command.sequence + self._state = DriveState.stopped() + self._estopped = False + self._estop_by = None + + elif command.kind == "driver_left": + if not self.holds(command): + return False + self._clear_driver() + + elif command.kind == "watchdog_expired": + if self._driver is None: + return False + self._clear_driver() + + return True + + @staticmethod + def _can_shift(state: DriveState) -> bool: + """Require some brake and a released throttle for a gear change.""" + return state.brake > 0.0 and state.throttle <= SHIFT_MAX_THROTTLE + + @staticmethod + def _can_initialize_takeover(current: DriveState, requested: DriveState) -> bool: + """Let a new CARLA lease synchronize into forward without touching either pedal.""" + return ( + current.gear is Gear.NEUTRAL + and requested.gear is Gear.FORWARD + and requested.steering == 0.0 + and requested.throttle == 0.0 + and requested.brake == 0.0 + ) + + def _clear_driver(self) -> None: + self._driver = None + self._epoch = None + self._sequence = None + self._state = DriveState.stopped() diff --git a/demo/carla/sim/moq_carla_sim/handback.py b/demo/carla/sim/moq_carla_sim/handback.py new file mode 100644 index 00000000000..861595eeca8 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/handback.py @@ -0,0 +1,146 @@ +"""Steering a released truck onto a lane Traffic Manager will follow. + +Traffic Manager seeds a vehicle it takes back from the waypoint nearest its +position, heading be damned, and steers hard for it (`LocalizationStage::Update` +via `InMemoryMap::GetWaypoint`; the client API has no say in that seed). A truck +centred on a lane that runs its way is handed over without a twitch. One +straddling the centre line, angled, or inside a junction is aimed at the +oncoming or crossing lane and swerves at whatever speed it has. So a released +truck first drives itself onto such a lane, coasting, and only then lets Traffic +Manager have it. + +Pure geometry in CARLA's left-handed frame (x forward, y right, z up): steer is +positive to the right, and the sign of a 2D cross product says which side of the +truck a point lies on. Nothing here touches the simulator, so it is testable +without one. +""" + +from __future__ import annotations + +import math + +import carla + +# Traffic Manager takes a truck this close to a lane's centre line, and this well +# aligned with it, without a visible correction: the nearest waypoint is then on +# that lane, and the ones ahead of the truck are the ones it steers for. +LATERAL_TOLERANCE = 0.5 +HEADING_TOLERANCE = math.radians(8.0) + +# Pure pursuit aims at the lane two seconds ahead, bounded so a crawling truck +# still looks past its bumper and a fast one does not cut corners. Two seconds +# rather than one keeps the merge gentle: a 30 degree heading error at 36 km/h +# asks for about a third of the steering lock, not two thirds. The lane is +# walked to the target in steps, because `Waypoint.next` forks where the lane +# enters a junction and any one fork is an arbitrary exit; a target closer than +# the minimum means the junction is too near to merge before it. +LOOKAHEAD_SECONDS = 2.0 +LOOKAHEAD_MIN = 8.0 +LOOKAHEAD_MAX = 30.0 +LOOKAHEAD_STEP = 2.0 + +# The HGV, near enough: pure pursuit needs a wheelbase and the road-wheel angle +# that `steer=1.0` commands. +WHEELBASE = 4.5 +MAX_STEER = math.radians(35.0) + +# Below walking pace Traffic Manager's correction is the same slow pull-away +# every truck makes from its spawn point, so a truck this slow is handed over +# wherever it stands rather than driven around looking for a lane. +WALKING_PACE = 1.0 + +# How many driving lanes to consider either side of the nearest one. +LANE_SEARCH = 6 + + +def _dot(a, b) -> float: + return a.x * b.x + a.y * b.y + + +def _cross(a, b) -> float: + return a.x * b.y - a.y * b.x + + +def _length(a) -> float: + return math.hypot(a.x, a.y) + + +def aligned_lane(road_map: carla.Map, location: carla.Location, forward: carla.Vector3D) -> carla.Waypoint | None: + """The driving lane under `location` that runs closest to `forward`. + + `get_waypoint` returns the nearest lane by position, which for a truck near + the centre line is the oncoming one as often as its own. Walk the road's + driving lanes both ways from it and keep the best aligned. + """ + nearest = road_map.get_waypoint(location, project_to_road=True, lane_type=carla.LaneType.Driving) + if nearest is None: + return None + lanes = [nearest] + for sideways in ("get_left_lane", "get_right_lane"): + lane = getattr(nearest, sideways)() + while lane is not None and lane.lane_type == carla.LaneType.Driving and len(lanes) < LANE_SEARCH: + lanes.append(lane) + lane = getattr(lane, sideways)() + return max(lanes, key=lambda lane: _dot(lane.transform.get_forward_vector(), forward)) + + +def pursuit_steer(location: carla.Location, forward: carla.Vector3D, target: carla.Location) -> float: + """Pure-pursuit steering toward `target`, in CARLA's [-1, 1].""" + to_target = carla.Vector3D(x=target.x - location.x, y=target.y - location.y, z=0.0) + distance = math.hypot(to_target.x, to_target.y) + if distance == 0.0: + return 0.0 + alpha = math.atan2(_cross(forward, to_target), _dot(forward, to_target)) + delta = math.atan2(2.0 * WHEELBASE * math.sin(alpha), distance) + return max(-1.0, min(1.0, delta / MAX_STEER)) + + +def plan( + road_map: carla.Map, + transform: carla.Transform, + velocity: carla.Vector3D, + measured_steer: float, + *, + reversing: bool, +) -> carla.VehicleControl | None: + """The released truck's control for this tick, or None once it can be handed over.""" + speed = math.sqrt(velocity.x**2 + velocity.y**2 + velocity.z**2) + if speed <= WALKING_PACE: + return None + location = transform.location + forward = transform.get_forward_vector() + if reversing or _dot(velocity, forward) < 0.0: + # Nothing here merges backwards. Stop, then hand over from rest. + return carla.VehicleControl(brake=1.0, steer=measured_steer, reverse=reversing) + + lane = aligned_lane(road_map, location, forward) + if lane is None or lane.is_junction: + # Lanes cross inside a junction, so the nearest one means as little to + # this as it does to Traffic Manager. Coast through on the driver's + # steering and merge on the far side; the same below, when the junction + # is too close ahead to merge before it. + return carla.VehicleControl(throttle=0.0, brake=0.0, steer=measured_steer) + + lane_forward = lane.transform.get_forward_vector() + offset = carla.Vector3D(x=location.x - lane.transform.location.x, y=location.y - lane.transform.location.y, z=0.0) + lateral = _cross(lane_forward, offset) + # Forward vectors are unit length in 3D; on a grade their 2D shadows are not. + cosine = _dot(forward, lane_forward) / (_length(forward) * _length(lane_forward)) + heading = math.acos(max(-1.0, min(1.0, cosine))) + if abs(lateral) <= LATERAL_TOLERANCE and heading <= HEADING_TOLERANCE: + return None + + lookahead = max(LOOKAHEAD_MIN, min(LOOKAHEAD_MAX, speed * LOOKAHEAD_SECONDS)) + target = lane + walked = 0.0 + while walked < lookahead: + ahead = target.next(LOOKAHEAD_STEP) + if len(ahead) != 1 or ahead[0].is_junction: + break + target = ahead[0] + walked += LOOKAHEAD_STEP + if walked < LOOKAHEAD_MIN: + return carla.VehicleControl(throttle=0.0, brake=0.0, steer=measured_steer) + return carla.VehicleControl( + throttle=0.0, brake=0.0, steer=pursuit_steer(location, forward, target.transform.location) + ) diff --git a/demo/carla/sim/moq_carla_sim/main.py b/demo/carla/sim/moq_carla_sim/main.py new file mode 100644 index 00000000000..ac9642ea115 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/main.py @@ -0,0 +1,306 @@ +"""CLI entrypoint: one process, one CARLA world, every truck in it. + +Deliberately one process for every truck rather than one per truck. CARLA +advises a single command-sending client, one owner keeps Traffic Manager state +coherent, and the trucks have to share a world to see each other at all. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +import fcntl +import json +import logging +import os +import signal +import sys +import tempfile +from pathlib import Path +from typing import IO + +import moq + +from .bridge import Bridge, Rendition +from .runtime import TruckSession +from .watchdog import Watchdog +from .world import CameraConfig, Clock, World, bridge_stream + +log = logging.getLogger("moq_carla_sim") + +# The trucks this worker runs without `--truck`, which is how +# carla-worker.service runs it: the one list of trucks the demo is expected to +# show. +TRUCKS_FILE = Path(__file__).resolve().parent.parent / "trucks.json" + +# A local development relay, which needs no token. +DEFAULT_URL = "http://localhost:4443" + + +def default_trucks() -> list[str]: + trucks = json.loads(TRUCKS_FILE.read_text()) + if not isinstance(trucks, list) or not trucks or not all(isinstance(truck, str) and truck for truck in trucks): + raise ValueError(f"{TRUCKS_FILE} must be a non-empty list of truck names") + return trucks + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(prog="moq-carla-sim", description=__doc__) + parser.add_argument( + "--url", + default=os.environ.get("MOQ_URL", DEFAULT_URL), + # A hosted URL carries its JWT in the query, so prefer MOQ_URL over the + # flag: a command line is visible to every user on the host. + help=f"relay URL, with ?jwt=... when hosted (default: MOQ_URL, else {DEFAULT_URL})", + ) + parser.add_argument( + "--truck", + action="append", + dest="trucks", + default=None, + help="truck name; repeat for more than one (default: the list in trucks.json)", + ) + parser.add_argument("--camera", default="front", help="camera name in the broadcast path") + parser.add_argument("--location", default=None, help="human-readable label echoed in telemetry") + parser.add_argument("--carla-host", default="127.0.0.1") + parser.add_argument("--carla-port", type=int, default=2000) + parser.add_argument("--carla-timeout", type=float, default=30.0) + parser.add_argument("--traffic-manager-port", type=int, default=8000) + parser.add_argument("--width", type=int, default=1280) + parser.add_argument("--height", type=int, default=720) + parser.add_argument("--fps", type=int, default=30) + parser.add_argument( + "--bridge-socket", + default=os.environ.get("CARLA_BRIDGE_SOCKET") or default_bridge_socket(), + help="the simulator's GPU video bridge (default: CARLA_BRIDGE_SOCKET, or carla-bridge/bridge.sock " + "under XDG_RUNTIME_DIR, where server.sh puts it)", + ) + parser.add_argument("--log-level", default="info") + args = parser.parse_args(argv) + if not args.trucks: + args.trucks = default_trucks() + return args + + +def default_bridge_socket() -> str: + runtime_dir = os.environ.get("XDG_RUNTIME_DIR") or tempfile.gettempdir() + return str(Path(runtime_dir) / "carla-bridge" / "bridge.sock") + + +def renditions(camera: CameraConfig) -> list[Rendition]: + return [ + Rendition(rendition.name, rendition.width, rendition.height, rendition.bitrate, rendition.fps) + for rendition in camera.renditions() + ] + + +async def connect_bridge(path: str) -> Bridge: + """Connect to the bridge the simulator started when the cameras spawned.""" + try: + return await Bridge.connect(path) + except (FileNotFoundError, ConnectionRefusedError) as err: + raise RuntimeError( + f"no GPU video bridge at {path}: the cameras spawned, so is the simulator running with " + "-moq-bridge-socket at that path (`just carla server`)?" + ) from err + + +def broadcast_path(truck: str, camera: str) -> str: + return f"carla/{truck}/{camera}.hang" + + +def driver_prefix(truck: str) -> str: + """Where a truck's drivers publish, each at `{prefix}/{driverId}`.""" + return f"viewer/carla/{truck}" + + +# The one task allowed to end the run without failing it. +SHUTDOWN = "shutdown" + + +def claim_simulator(host: str, port: int) -> IO[str]: + """Hold a lock naming this simulator for as long as the returned file is open. + + One worker owns the world: `sweep` removes every vehicle in it, so a second + worker on the same simulator would destroy the first one's trucks, and the + first would then fail and restart into the same sweep. A manual `just carla + worker` beside the systemd unit is the usual way to get there. The lock is + per host so it covers only that case; it says nothing about a worker on + another machine, and neither does anything else here. + """ + runtime_dir = os.environ.get("XDG_RUNTIME_DIR") or tempfile.gettempdir() + path = Path(runtime_dir) / f"moq-carla-{host}-{port}.lock" + lock = path.open("a+") + try: + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError: + lock.close() + raise RuntimeError( + f"another worker already owns the simulator at {host}:{port} (lock {path}); " + "stop it first, it would otherwise lose its trucks to this one's sweep" + ) from None + return lock + + +def terminate(_signum: int, _frame: object) -> None: + """Turn SIGTERM into the KeyboardInterrupt SIGINT already is. + + Until `supervise` installs the loop's own handlers, the run is in blocking + CARLA calls: connecting, sweeping, spawning. Python's default SIGTERM + action ends the process there with no `finally`, leaving the freshly + spawned trucks in the world for the next run to sweep. Raising instead + unwinds through `run`'s cleanup, the same way Ctrl-C does. + """ + raise KeyboardInterrupt + + +async def session_closed(client: moq.Client) -> None: + """Raise once the relay session is over. + + `Session.closed()` resolves when the connection stops for good, by raising + its error or by returning after a local shutdown, which nothing here + performs while the trucks are running. Either way the broadcasts are gone + from the relay and the run has to end. + """ + session = client.session + if session is None: + raise RuntimeError("relay session is not connected") + await session.closed() + raise RuntimeError("relay session closed") + + +async def supervise(client: moq.Client, tasks: list[asyncio.Task[None]], clock: Clock, watchdog: Watchdog) -> None: + """Run until a truck stops, the relay session or the clock dies, or a signal arrives. + + The session is watched alongside the trucks because its death is invisible + from inside them: their tracks keep accepting frames, so the process goes on + looking healthy while the relay announces nothing, and systemd has no + failure to restart. Only raising gets us out of that state. The clock is + the same shape of failure: a world nobody ticks is frozen, and every truck + keeps looking healthy while publishing nothing. + + All of that assumes this loop still turns. The watchdog's pulse is what + proves it does; see `watchdog` for the hang it exists to catch. + """ + stop = asyncio.Event() + loop = asyncio.get_running_loop() + for sig in (signal.SIGINT, signal.SIGTERM): + loop.add_signal_handler(sig, stop.set) + + watchers = [ + asyncio.create_task(stop.wait(), name=SHUTDOWN), + asyncio.create_task(session_closed(client), name="session"), + asyncio.create_task(clock.wait_failed(), name="clock"), + asyncio.create_task(watchdog.pulse(), name="pulse"), + ] + + done, pending = await asyncio.wait([*tasks, *watchers], return_when=asyncio.FIRST_COMPLETED) + # Awaited, not just cancelled: each session releases its driver watcher on + # the way out, and an un-awaited cancel would leave that to loop teardown, + # after the world in `run` is already gone. + for task in pending: + task.cancel() + await asyncio.gather(*pending, return_exceptions=True) + # Surface whatever ended the process rather than exiting cleanly on a truck + # or a session that died: neither must read as a normal stop. + for task in done: + if task.get_name() != SHUTDOWN and not task.cancelled(): + task.result() + + +async def run(args: argparse.Namespace) -> None: + camera = CameraConfig(width=args.width, height=args.height, fps=args.fps) + + lock = claim_simulator(args.carla_host, args.carla_port) + world = World.connect(args.carla_host, args.carla_port, args.carla_timeout, args.traffic_manager_port, camera.fps) + sessions: list[TruckSession] = [] + # The RPC timeout bounds every blocking CARLA call, so a thread that has + # not moved in twice that long is hung, not slow. The clock idles a frame + # period between ticks on purpose, so that is not counted against it. + watchdog = Watchdog(2 * args.carla_timeout + 1 / camera.fps, world.clock.heartbeat) + # Spawning is inside the try: a spawn that fails partway has already put + # actors in the world, and the server outlives us, so they must still be + # removed or the next run spawns beside them. The clock starts first + # because a synchronous sweep and spawn only land on a tick. + try: + world.clock.start() + watchdog.start() + world.sweep() + world.spawn(args.trucks, camera, args.camera) + map_name = world.map_name() + # Every truck is in the world, so the clock no longer needs to run for + # its own sake: from here it follows viewer and driver demand. + world.ready() + bridge = await connect_bridge(args.bridge_socket) + # The only reader of the bridge's events, so it runs before any stream + # opens. It ending, for any reason, ends the run: every truck's video + # shares the connection. + events = asyncio.create_task(bridge.run(), name="bridge") + try: + async with moq.connect(args.url) as client: + try: + # One epoch for the run: a restarted worker announces every + # truck under a new one, which viewers see as a restart. + route = moq.Route(epoch=moq.mint_epoch()) + for truck in world.trucks: + broadcast = client.create_broadcast(broadcast_path(truck.name, args.camera)) + video = await bridge.open(bridge_stream(truck.name, args.camera), renditions(camera), broadcast) + session = TruckSession(truck, broadcast, video, args.location, map_name, world.clock, route) + sessions.append(session) + log.info( + "publishing %s, consuming %s/*", + broadcast_path(truck.name, args.camera), + driver_prefix(truck.name), + ) + + tasks = [ + asyncio.create_task( + session.run(client, driver_prefix(truck.name)), + name=f"truck:{truck.name}", + ) + for session, truck in zip(sessions, world.trucks) + ] + + await supervise(client, [*tasks, events], world.clock, watchdog) + finally: + # Inside the session, so the tracks end cleanly for + # subscribers rather than with the connection. + for session in sessions: + session.stop_video() + # Also inside the session, ahead of its close: the actors are + # the one thing that outlives this process, so they go before + # anything that could hang on a relay that has already gone, + # and before systemd's stop timeout turns that hang into a kill. + world.destroy() + finally: + events.cancel() + await asyncio.gather(events, return_exceptions=True) + bridge.disconnect() + finally: + # A no-op on the way out of a completed run; this is for a sweep, a + # spawn, or a connect that failed before the session was ever entered. + world.destroy() + # Armed through both destroys: a teardown that hangs is the same hang, + # and after a failure nothing but the watchdog would end it. + watchdog.stop() + lock.close() + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(argv) + logging.basicConfig( + level=args.log_level.upper(), + format="%(asctime)s %(levelname)-5s %(name)s: %(message)s", + ) + # The bindings log from Rust, which Python logging does not see; keep both + # layers at the same level. + moq.log_level(args.log_level.lower()) + signal.signal(signal.SIGTERM, terminate) + with contextlib.suppress(asyncio.CancelledError, KeyboardInterrupt): + asyncio.run(run(args)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/demo/carla/sim/moq_carla_sim/park.py b/demo/carla/sim/moq_carla_sim/park.py new file mode 100644 index 00000000000..f17ac321879 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/park.py @@ -0,0 +1,74 @@ +"""Park the renderer of a simulator no worker owns. + +The server outlives every client and boots with rendering on, so a simulator +sitting between workers draws frames nobody asked for. Measured on an +RTX 3070 Ti against an empty world with nothing connected: 174 W and 100% GPU +before, 26 W and 44% after, with process CPU down about half a core. The worker +asserts the same state on connect (see `World.__init__`); this is that +assertion for the gap before one arrives. + +Only `no_rendering_mode`. Synchronous mode is deliberately untouched: a +synchronous world nobody ticks is frozen for whatever connects next, and +`just carla benchmark` refuses a world that is already synchronous. +""" + +from __future__ import annotations + +import argparse +import logging +import sys + +from .main import claim_simulator +from .world import connect_client + +log = logging.getLogger(__name__) + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(prog="carla-park", description=__doc__) + parser.add_argument("--carla-host", default="127.0.0.1") + parser.add_argument("--carla-port", type=int, default=2000) + parser.add_argument("--carla-timeout", type=float, default=30.0) + parser.add_argument("--log-level", default="info") + return parser.parse_args(argv) + + +def park(host: str, port: int, timeout: float) -> bool: + """Disable rendering on an unowned simulator. True when it parked one. + + The worker's own lock decides ownership: a worker holding it is already + driving demand, and parking under it would black out a live viewer between + its `select_camera` and the sensor's next frame. + """ + try: + lock = claim_simulator(host, port) + except RuntimeError: + log.info("a worker owns %s:%d; leaving its rendering alone", host, port) + return False + + try: + world = connect_client(host, port, timeout).get_world() + settings = world.get_settings() + if settings.no_rendering_mode: + log.info("rendering already parked") + return True + settings.no_rendering_mode = True + world.apply_settings(settings) + log.info("rendering parked until a worker or a viewer needs it") + return True + finally: + lock.close() + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(argv) + logging.basicConfig( + level=args.log_level.upper(), + format="%(asctime)s %(levelname)-5s %(name)s: %(message)s", + ) + park(args.carla_host, args.carla_port, args.carla_timeout) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/demo/carla/sim/moq_carla_sim/publish.py b/demo/carla/sim/moq_carla_sim/publish.py new file mode 100644 index 00000000000..5b7f4d7628f --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/publish.py @@ -0,0 +1,374 @@ +"""MoQ wiring: video and status out, driver control in. + +The broadcast layout is the one `demo/carla/README.md` documents and the web +player speaks: + + carla/{truck}/{camera}.hang video (sd, hd) + status + viewer/carla/{truck}/{driverId} control +""" + +from __future__ import annotations + +import asyncio +import logging +import math +from dataclasses import dataclass +from typing import Any + +import moq + +from .drive import Command, DriveState, Gear, TimestampEntry + +log = logging.getLogger(__name__) + + +@dataclass(frozen=True) +class Pose: + """Where a truck is, in CARLA world meters. + + Deliberately the simulator's own top-down axes (x east, y south, yaw + clockwise from +x) rather than latitude and longitude: the shipped towns + carry a null OpenDRIVE georeference, so `transform_to_geolocation` returns + real WGS84 numbers for a meaningless place in the Gulf of Guinea. The road + map baked into the web player is in these same meters, so the two line up. + """ + + x: float + y: float + yaw: float + speed: float + + +@dataclass(frozen=True) +class Motion: + """How the truck actually responded, in its own frame. + + Acceleration in m/s^2 (longitudinal positive forward, lateral positive + right) and yaw rate in deg/s. Lateral acceleration is the number that rolls + a loaded truck over, and none of these can be derived from the command: + they are what the physics did with it. + """ + + yaw_rate: float + accel_lon: float + accel_lat: float + + +@dataclass(frozen=True) +class Collision: + """The most recent contact the vehicle's collision sensor reported. + + `at` is unix milliseconds at the instant contact began, and is what gives a + collision an identity on a snapshot track: without one, the retained + snapshot a late subscriber receives is indistinguishable from a fresh + impact, and a restarted producer reuses its predecessor's numbering. + + An absolute instant rather than an age, and the distinction is the whole + design. An age would redirty the snapshot on every publish for a parked + truck; this stays fixed until the next collision. It also means a viewer + who opened the page long afterwards ages it correctly, instead of timing it + from when that particular browser happened to first see it. + """ + + at: float + other: str + impulse: float + + +@dataclass(frozen=True) +class Telemetry: + """One consistent read of the vehicle: where it is, and how it responded. + + Grouped because they come from a single read of the actor and always travel + together. The wire keeps them as separate top-level `status` fields, which + is a contract; this struct is only the plumbing behind it. + """ + + pose: Pose + measured: DriveState + motion: Motion + collision: Collision | None + + +@dataclass(frozen=True) +class Status: + accepted: DriveState + estopped: bool + estop_by: str | None + autonomous: bool + driver: str | None + sequence: int | None + media_pipeline: dict[str, list[dict[str, Any]]] + location: str | None + map_name: str | None + telemetry: Telemetry | None + + +def status_payload(status: Status) -> dict[str, Any]: + """Build the `status` track payload. + + `mode` is `simulated` because accepted commands actuate a CARLA vehicle; + the player treats it as an open wire enum, so another value degrades to + `unknown` instead of blanking the tile. Who is steering is a separate + question and rides on `autonomy`. + + `accepted` is the command the gate let through; `measured`, `motion`, and + `collision` are what the vehicle did with it, and are present whatever is + driving. + """ + payload: dict[str, Any] = { + "accepted": { + "steering": status.accepted.steering, + "throttle": status.accepted.throttle, + "brake": status.accepted.brake, + "gear": status.accepted.gear.value, + }, + "mode": "simulated", + "capabilities": ["respawn"], + "autonomy": "autonomous" if status.autonomous else "manual", + "estopped": status.estopped, + "media_pipeline": status.media_pipeline, + } + # Omitted rather than null when absent; the player reads a missing field + # as unset. + if status.driver is not None: + payload["driver"] = status.driver + if status.estop_by is not None: + payload["estop_by"] = status.estop_by + if status.sequence is not None: + payload["sequence"] = status.sequence + if status.location is not None: + payload["location"] = status.location + if status.map_name is not None: + payload["map"] = status.map_name + if status.telemetry is not None: + # Everything below is rounded for the same reason: unrounded float noise + # from the physics engine would republish a "changed" snapshot for a + # parked truck forever. Centimetres and tenths of a degree for the pose, + # a tenth of a percent for a normalized control axis. + pose = status.telemetry.pose + payload["pose"] = { + "x": round(pose.x, 2), + "y": round(pose.y, 2), + "yaw": round(pose.yaw, 1), + "speed": round(pose.speed, 2), + } + measured = status.telemetry.measured + payload["measured"] = { + "steering": round(measured.steering, 3), + "throttle": round(measured.throttle, 3), + "brake": round(measured.brake, 3), + "gear": measured.gear.value, + } + motion = status.telemetry.motion + payload["motion"] = { + "yaw_rate": round(motion.yaw_rate, 1), + "accel_lon": round(motion.accel_lon, 2), + "accel_lat": round(motion.accel_lat, 2), + } + if status.telemetry.collision is not None: + collision = status.telemetry.collision + payload["collision"] = { + "at": round(collision.at), + "other": collision.other, + "impulse": round(collision.impulse, 1), + } + return payload + + +class StatusPublisher: + """The `status` track: DEFLATE-compressed JSON snapshots. + + Snapshot rather than stream, because a late joiner wants the truck's current + state, not the history of every command it ever accepted. + """ + + def __init__(self, broadcast: moq.BroadcastProducer) -> None: + self._producer = moq.json.SnapshotProducer(broadcast, broadcast.publish_track("status"), compression=True) + # Weak: watching demand neither keeps the track open nor locks it. + self._demand = self._producer.demand() + + def publish(self, payload: dict[str, Any]) -> None: + """Publish the latest status, failing the session if the track is gone. + + Deliberately not swallowed. `update` fails only on a producer that has + been closed, which never reopens, and status republishes on a 100 ms + timer, so catching here would retry a dead track ten times a second per + truck, forever, logging as it went. Status is the control echo, so a + truck that cannot answer is not one anybody should be steering: let it + reach the session, exactly as the video pump does with its own track. + """ + self._producer.update(payload) + + async def used(self) -> None: + await self._demand.used() + + async def unused(self) -> None: + await self._demand.unused() + + +def _parse_timestamps(raw: Any) -> tuple[TimestampEntry, ...]: + if not isinstance(raw, list): + return () + entries = [] + for item in raw: + if isinstance(item, dict) and "label" in item and "ts" in item: + timestamp = _number_or_none(item["ts"]) + if timestamp is not None: + entries.append(TimestampEntry(label=str(item["label"]), ts=timestamp)) + return tuple(entries) + + +def parse_command(driver_id: str, message: Any, epoch: str | None = None) -> Command | None: + """Turn one `control` track message from a driver run into a Command. + + Returns None for anything unrecognized. A driver is an untrusted publisher, + so a malformed message is dropped here rather than reaching the gate: the + axes are clamped downstream, but a wrong *shape* must not raise into the + control loop and take the truck's whole session with it. + """ + if not isinstance(message, dict): + return None + + kind = message.get("type") + sequence = int(_number(message.get("sequence"))) + timestamps = _parse_timestamps(message.get("timestamps")) + + if kind == "drive": + gear_raw = message.get("gear", Gear.NEUTRAL.value) + try: + gear = Gear(gear_raw) + except ValueError: + # An unknown gear is not a reason to drop the whole command; neutral + # is the safe reading of "we do not know what they asked for". + log.warning("%s: unknown gear %r, treating as neutral", driver_id, gear_raw) + gear = Gear.NEUTRAL + return Command( + kind="drive", + driver_id=driver_id, + epoch=epoch, + sequence=sequence, + state=DriveState( + steering=_number(message.get("steering")), + throttle=_number(message.get("throttle")), + brake=_number(message.get("brake")), + gear=gear, + ), + timestamps=timestamps, + ) + + if kind in ("estop", "reset_estop", "respawn"): + return Command(kind=kind, driver_id=driver_id, epoch=epoch, sequence=sequence, timestamps=timestamps) + + return None + + +def _number(value: Any) -> float: + """A JSON number, or 0.0 for anything else. + + `bool` is excluded explicitly because it is an `int` subclass in Python, so + a driver sending `true` would otherwise read as 1. + """ + return _number_or_none(value) or 0.0 + + +def _number_or_none(value: Any) -> float | None: + if not isinstance(value, (int, float)) or isinstance(value, bool): + return None + number = float(value) + return number if math.isfinite(number) else None + + +async def watch_drivers( + client: moq.Client, + prefix: str, + commands: asyncio.Queue[Command], +) -> None: + """Discover driver broadcasts at `{prefix}/{driverId}` and fan their commands in. + + Runs until cancelled. Each run of a driver, its path plus the route epoch it + announced under, gets its own task, so one slow or stuck driver cannot hold + up the others. A broadcast that ends, or restarts under another epoch, ends + its task, and with it the lease of that run; a restart starts a new task. + """ + drivers: dict[str, tuple[str | None, asyncio.Task[None]]] = {} + + def forget(driver_id: str, task: asyncio.Task[None]) -> None: + # Only this run's entry: a restart has already put its successor there. + current = drivers.get(driver_id) + if current is not None and current[1] is task: + del drivers[driver_id] + + try: + async with client.announced(prefix, filter="*") as announced: + async for event in announced: + # Every variant carries `announce`; uniffi's stubs type only the enum. + announce = event.announce # pyright: ignore[reportAttributeAccessIssue] + path = announce.prefix + driver_id = path.removeprefix(prefix + "/") + # The filter admits one segment below the prefix; anything else + # is a route that only overlaps it, not a driver's broadcast. + if driver_id == path or not driver_id or "/" in driver_id: + continue + epoch = announce.route.epoch + current = drivers.get(driver_id) + if isinstance(event, moq.AnnounceEventEnd): + if current is not None: + del drivers[driver_id] + current[1].cancel() + continue + if current is not None: + # Same run: the route only changed hops or cost. + if current[0] == epoch and not isinstance(event, moq.AnnounceEventRestart): + continue + current[1].cancel() + task = asyncio.create_task( + _pump_driver(driver_id, epoch, client, path, commands), + name=f"driver:{driver_id}", + ) + drivers[driver_id] = (epoch, task) + task.add_done_callback(lambda task, driver_id=driver_id: forget(driver_id, task)) + finally: + for _, task in drivers.values(): + task.cancel() + + +async def _pump_driver( + driver_id: str, + epoch: str | None, + client: moq.Client, + path: str, + commands: asyncio.Queue[Command], +) -> None: + """Feed one driver run's `control` track into the command queue. + + Always emits `driver_left` on the way out, however it leaves, so the gate + releases a lease even when the track ends abnormally. + """ + log.info("driver %s connected (epoch %s)", driver_id, epoch) + try: + broadcast = await client.request_broadcast(path) + control = moq.json.SnapshotConsumer(await broadcast.subscribe_track("control"), compression=True) + async for message in control: + command = parse_command(driver_id, message, epoch) + if command is not None: + await commands.put(command) + # uniffi's stubs declare the error a plain class; at runtime it is an Exception. + except moq.Error as err: # pyright: ignore[reportGeneralTypeIssues] + log.info("driver %s track ended: %s", driver_id, err) + finally: + log.info("driver %s disconnected (epoch %s)", driver_id, epoch) + await commands.put(Command(kind="driver_left", driver_id=driver_id, epoch=epoch)) + + +__all__ = [ + "StatusPublisher", + "Collision", + "Motion", + "Pose", + "Status", + "Telemetry", + "parse_command", + "status_payload", + "watch_drivers", +] diff --git a/demo/carla/sim/moq_carla_sim/roadmap.py b/demo/carla/sim/moq_carla_sim/roadmap.py new file mode 100644 index 00000000000..73f536be116 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/roadmap.py @@ -0,0 +1,177 @@ +"""Bake the running CARLA town's road network into the web player's map. + +Run once per town, against a running simulator, and commit the result: + + just carla map + +The output is a GeoJSON FeatureCollection of lane centrelines, but its +coordinates are CARLA world METERS (x east, y south), not WGS84 degrees. That is +deliberate: the shipped towns carry a null OpenDRIVE georeference, so +`transform_to_geolocation` would hand back real coordinates for a meaningless +place, and the trucks' `pose` telemetry is in these same meters. The player +projects both with one transform. Reprojecting onto a real basemap is a decision +about where the demo pretends to be, and belongs with whoever makes it. + +Lane centrelines rather than road edges because that is what `get_topology` +gives directly, and at town scale a bundle of centrelines reads as a road. +""" + +from __future__ import annotations + +import argparse +import json +import logging +import math +import sys +from pathlib import Path +from typing import Any + +log = logging.getLogger(__name__) + +# Metres between sampled waypoints along a lane, and the corridor within which +# the simplifier may then drop them again. 2 m tracks a tight junction curve; +# 0.5 m of error is invisible on a town-sized map but collapses straight roads +# from hundreds of points to two. +STEP = 2.0 +TOLERANCE = 0.5 + +# Waypoints to walk before abandoning a lane. `next` follows a ring road back +# into the same lane forever, so the walk needs a bound rather than a rule. +MAX_LANE_POINTS = 4000 + +Point = tuple[float, float] + + +def _segment_distance(point: Point, start: Point, end: Point) -> float: + """Perpendicular distance from `point` to the segment `start`-`end`.""" + dx, dy = end[0] - start[0], end[1] - start[1] + span = math.hypot(dx, dy) + if span == 0.0: + return math.hypot(point[0] - start[0], point[1] - start[1]) + return abs(dy * point[0] - dx * point[1] + end[0] * start[1] - end[1] * start[0]) / span + + +def simplify(points: list[Point], tolerance: float) -> list[Point]: + """Ramer-Douglas-Peucker: drop points no further than `tolerance` off the line. + + Iterative rather than recursive so a long straight lane cannot bottom out + the interpreter on its own geometry. + """ + if len(points) < 3: + return list(points) + + keep = [False] * len(points) + keep[0] = keep[-1] = True + stack = [(0, len(points) - 1)] + while stack: + first, last = stack.pop() + if last <= first + 1: + continue + index, worst = max( + ((i, _segment_distance(points[i], points[first], points[last])) for i in range(first + 1, last)), + key=lambda pair: pair[1], + ) + if worst > tolerance: + keep[index] = True + stack.append((first, index)) + stack.append((index, last)) + return [point for point, keep_it in zip(points, keep) if keep_it] + + +def lane_points(start: Any, step: float, limit: int = MAX_LANE_POINTS) -> list[Point]: + """Walk one lane from `start` until it ends or turns into a different lane.""" + lane = (start.road_id, start.section_id, start.lane_id) + waypoint = start + points = [(waypoint.transform.location.x, waypoint.transform.location.y)] + for _ in range(limit): + following = waypoint.next(step) + if not following: + break + waypoint = following[0] + if (waypoint.road_id, waypoint.section_id, waypoint.lane_id) != lane: + break + points.append((waypoint.transform.location.x, waypoint.transform.location.y)) + return points + + +def road_lines(road_map: Any, step: float = STEP, tolerance: float = TOLERANCE) -> list[list[Point]]: + """Every drivable lane in the map, as a simplified polyline. + + `get_topology` yields one entry per lane, so walking from each start covers + the network exactly once. + """ + lines = [] + for start, _end in road_map.get_topology(): + points = lane_points(start, step) + if len(points) < 2: + continue + lines.append(simplify(points, tolerance)) + return lines + + +def feature_collection(name: str, lines: list[list[Point]]) -> dict[str, Any]: + """Wrap lane polylines as GeoJSON, in CARLA meters (see the module docstring).""" + if not lines: + raise RuntimeError(f"{name} produced no drivable lanes") + xs = [x for line in lines for x, _ in line] + ys = [y for line in lines for _, y in line] + return { + "type": "FeatureCollection", + "name": name, + # Decimetres: finer than the map is ever drawn, and it halves the file. + "bbox": [round(min(xs), 1), round(min(ys), 1), round(max(xs), 1), round(max(ys), 1)], + "features": [ + { + "type": "Feature", + "properties": {"kind": "lane"}, + "geometry": { + "type": "MultiLineString", + "coordinates": [[[round(x, 1), round(y, 1)] for x, y in line] for line in lines], + }, + } + ], + } + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(prog="carla-roadmap", description=__doc__) + parser.add_argument("--carla-host", default="127.0.0.1") + parser.add_argument("--carla-port", type=int, default=2000) + parser.add_argument("--carla-timeout", type=float, default=30.0) + parser.add_argument("--step", type=float, default=STEP, help="metres between sampled waypoints") + parser.add_argument("--tolerance", type=float, default=TOLERANCE, help="metres of simplification error") + parser.add_argument( + "--out", + type=Path, + default=Path(__file__).resolve().parents[2] / "web/src/maps", + help="directory to write .json into", + ) + parser.add_argument("--log-level", default="info") + return parser.parse_args(argv) + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(argv) + logging.basicConfig(level=args.log_level.upper(), format="%(levelname)-5s %(name)s: %(message)s") + + # Imported here rather than at module scope so the pure geometry above stays + # testable without the CARLA wheel. + from .world import connect_client + + client = connect_client(args.carla_host, args.carla_port, args.carla_timeout) + road_map = client.get_world().get_map() + name = road_map.name.rsplit("/", 1)[-1] + + lines = road_lines(road_map, args.step, args.tolerance) + collection = feature_collection(name, lines) + + args.out.mkdir(parents=True, exist_ok=True) + path = args.out / f"{name}.json" + path.write_text(json.dumps(collection, separators=(",", ":")) + "\n") + points = sum(len(line) for line in lines) + log.info("wrote %s: %d lanes, %d points, %d KiB", path, len(lines), points, path.stat().st_size // 1024) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/demo/carla/sim/moq_carla_sim/runtime.py b/demo/carla/sim/moq_carla_sim/runtime.py new file mode 100644 index 00000000000..9711ed74a09 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/runtime.py @@ -0,0 +1,349 @@ +"""The per-truck control loop. + +One `TruckSession` per truck: it owns the safety gate, the MoQ broadcast, and +the truck's bridge stream, whose compressed video the bridge publishes into +that broadcast. +""" + +from __future__ import annotations + +import asyncio +import logging +import math +from typing import TYPE_CHECKING, Any + +import moq + +from .drive import Accepted, Command, Drive, TimestampEntry +from .publish import Pose, Status, StatusPublisher, Telemetry, status_payload, watch_drivers +from .world import drive_hold, status_hold + +if TYPE_CHECKING: + from .bridge import BridgeStream + from .world import Clock, Truck + +log = logging.getLogger(__name__) + +# How long the truck waits for the lease holder before releasing the lease. +# The web player heartbeats at 250 ms. +COMMAND_TIMEOUT = 1.0 + +# How often a session reports its published frame rate. +REPORT_INTERVAL = 10.0 + +# How often status republishes the vehicle's own telemetry, so map markers keep +# moving and measured feedback keeps arriving while nobody is driving. +TELEMETRY_INTERVAL = 0.1 + +# Pending driver commands held before publishers are made to wait. +COMMAND_QUEUE_DEPTH = 64 + +# An autonomous truck that has not moved this far in this long is wedged, not +# waiting: Traffic Manager would have deleted it, which is what the hero role +# forbids, so this is where a stuck truck gets unstuck. Town10's lights cycle in +# well under a minute, and the trucks queued behind a wedged one respawn with it +# rather than sit there once it is gone. Displacement rather than speed, because +# a truck grinding against a barrier reports velocity while going nowhere. +STUCK_TIMEOUT = 300.0 +STUCK_DISTANCE = 2.0 + + +class StuckDetector: + """Notices a truck that has stopped going anywhere. + + `update` anchors on the first pose it sees and reports stuck once the truck + has stayed within `distance` of that anchor for `timeout`. Moving that far + re-anchors and restarts the clock. + """ + + def __init__(self, timeout: float = STUCK_TIMEOUT, distance: float = STUCK_DISTANCE) -> None: + self._timeout = timeout + self._distance = distance + self._anchor: Pose | None = None + self._since = 0.0 + + def reset(self) -> None: + self._anchor = None + + def update(self, pose: Pose, now: float) -> bool: + anchor = self._anchor + if anchor is None or math.hypot(pose.x - anchor.x, pose.y - anchor.y) >= self._distance: + self._anchor = pose + self._since = now + return False + return now - self._since >= self._timeout + + +def latency_breakdown(timestamps: tuple[TimestampEntry, ...]) -> list[dict[str, Any]]: + """Per-stage deltas from the driver's media timestamps, in milliseconds.""" + return [ + {"label": f"{a.label}→{b.label}", "ms": max(0, int(b.ts - a.ts))} for a, b in zip(timestamps, timestamps[1:]) + ] + + +class TruckSession: + """One truck's gate, broadcast, and control loop.""" + + def __init__( + self, + truck: Truck, + broadcast: moq.BroadcastProducer, + video: BridgeStream, + location: str | None, + map_name: str | None, + clock: Clock, + route: moq.Route, + ) -> None: + self._truck = truck + self._video = video + self._clock = clock + self._location = location + self._map_name = map_name + self._drive = Drive() + self._status = StatusPublisher(broadcast) + # Bounded: drivers are untrusted publishers, so an unbounded queue is a + # memory-growth path under one that floods; a full queue instead blocks + # that driver's own task. + self._commands: asyncio.Queue[Command] = asyncio.Queue(maxsize=COMMAND_QUEUE_DEPTH) + self._media_pipeline: dict[str, list[dict[str, Any]]] = {} + self._deadline: float | None = None + self._stuck = StuckDetector() + # A broadcast starts unadvertised; the player discovers trucks by + # announcement, so advertise once the status and video tracks exist. + # The stream's are there already: opening it advertised them. The + # route carries the run's epoch, so viewers see a restarted worker as + # a restart rather than a stalled broadcast. + broadcast.announce(route) + + def stop_video(self) -> None: + """End the video tracks cleanly and stop the bridge encoding them.""" + self._video.finish() + + @property + def commands(self) -> asyncio.Queue[Command]: + return self._commands + + async def run(self, client: moq.Client, drivers: str) -> None: + """Consume driver commands and actuate until cancelled. + + Driver discovery runs in a task group rather than a bare task, so a + failure there fails the session. A detached task's exception is never + retrieved: the truck would keep publishing video and status while + silently accepting no driver ever again, which reads as healthy. + """ + self._publish() + async with asyncio.TaskGroup() as group: + watcher = group.create_task( + watch_drivers(client, drivers, self._commands), name=f"drivers:{self._truck.name}" + ) + # Video demand is what renders the world for this truck, and the + # bridge follows the same demand to pick its camera. + demand = group.create_task( + self._video.watch_demand(self._truck.set_video_demand), name=f"demand:{self._truck.name}" + ) + video = group.create_task(self._report_video(), name=f"video:{self._truck.name}") + telemetry = group.create_task(self._publish_telemetry(), name=f"telemetry:{self._truck.name}") + viewers = group.create_task(self._watch_status_demand(), name=f"viewers:{self._truck.name}") + try: + await self._loop() + finally: + # Before the tasks, so a truck on its way out cannot leave the + # world stepping for a driver it no longer has. + self._clock.release(drive_hold(self._truck.name)) + watcher.cancel() + video.cancel() + demand.cancel() + telemetry.cancel() + viewers.cancel() + + async def _loop(self) -> None: + while True: + command = await self._next_command() + if command.kind == "respawn": + # Respawn changes the simulated actor rather than the shared + # drive contract. Only the lease holder may move the truck. + if not self._drive.holds(command) or self._drive.estopped: + continue + self._truck.respawn() + self._drive = Drive() + self._deadline = None + self._media_pipeline.clear() + self._stuck.reset() + self._hold_clock() + self._publish() + continue + if command.kind == "drive" and self._drive.driver is None and self._truck.autonomous: + # The browser seeds its first command from the latest status, but + # the gate still holds its no-driver resting state. Synchronize the + # gear from fresher local feedback so the shift interlock does not + # turn a moving takeover into a neutral coast. + self._drive.synchronize(self._truck.telemetry().measured) + accepted = self._drive.apply(command) + changed = accepted + self._hold_clock() + + if command.kind in ("drive", "estop", "reset_estop"): + if accepted and self._drive.holds(command): + # Only the lease holder's accepted traffic refreshes the + # watchdog and its pipeline timing. A bystander's e-stop + # still latches, but must not extend the holder's lease, and + # an e-stopped holder's refused drive frames must not keep + # the lease alive forever. + self._media_pipeline[command.driver_id] = latency_breakdown(command.timestamps) + self._deadline = asyncio.get_running_loop().time() + COMMAND_TIMEOUT + elif command.kind == "driver_left" and accepted: + # Only the holder's run has a pipeline entry, so another run of + # the same driver id leaving must not drop it. + self._media_pipeline.pop(command.driver_id, None) + self._deadline = None + elif command.kind == "watchdog_expired" and accepted: + self._deadline = None + self._media_pipeline.clear() + log.warning("%s: control watchdog expired, returning to autonomy", self._truck.name) + + if not changed: + continue + + # Actuate before publishing, so the world and the status echo can + # never disagree about what was accepted. + self._actuate() + self._publish() + + async def _report_video(self) -> None: + """Log the published frame rate per rendition. + + A truck whose simulator cannot keep up still publishes, just at a lower + rate, so nothing else would say so. + """ + loop = asyncio.get_running_loop() + published = list(self._video.published) + since = loop.time() + while True: + await asyncio.sleep(REPORT_INTERVAL) + now = loop.time() + current = list(self._video.published) + rates = [(count - before) / (now - since) for count, before in zip(current, published)] + if any(rates): + log.info( + "%s: publishing %s", + self._truck.name, + ", ".join(f"{name}={rate:.1f} fps" for name, rate in zip(self._video.rendition_names, rates)), + ) + published, since = current, now + + async def _publish_telemetry(self) -> None: + """Republish on a timer so a truck nobody is driving still reports. + + The drive loop publishes only when the gate's accepted state changes, + and the vehicle's own telemetry moves independently of it: without this + an autonomous truck would pin its map marker wherever the last driver + let go of it, and report the pedals it was applying at that moment. + + Unbounded on purpose: a publish that fails raises out of this task and + into the session's task group rather than being retried, so the timer + cannot outlive the track it publishes to. + + The stuck watchdog rides on the same tick. It only ever fires for a + truck nobody holds: a stationary truck under a driver is the driver's + business, and an e-stopped one is latched on purpose. So does the + handback: a released truck steers itself onto a lane before Traffic + Manager takes it, and nothing else runs often enough to drive it. + """ + while True: + await asyncio.sleep(TELEMETRY_INTERVAL) + telemetry = self._truck.telemetry() + if self._drive.driver is None and not self._drive.estopped: + self._truck.release() + if ( + self._drive.driver is not None + or self._drive.estopped + or not self._truck.autonomous + or not self._clock.running + ): + # A parked world is not a stuck truck: nothing is meant to be + # moving, and respawning on that would fire every STUCK_TIMEOUT + # for as long as nobody watches. + self._stuck.reset() + elif self._stuck.update(telemetry.pose, asyncio.get_running_loop().time()): + log.warning("%s: no movement in %.0f s while autonomous, respawning", self._truck.name, STUCK_TIMEOUT) + self._truck.respawn() + self._stuck.reset() + self._publish(telemetry) + + async def _next_command(self) -> Command: + """The next driver command, or a synthesized watchdog expiry.""" + if self._deadline is None: + return await self._commands.get() + + timeout = self._deadline - asyncio.get_running_loop().time() + if timeout <= 0: + return Command(kind="watchdog_expired") + try: + return await asyncio.wait_for(self._commands.get(), timeout=timeout) + except asyncio.TimeoutError: + return Command(kind="watchdog_expired") + + async def _watch_status_demand(self) -> None: + """Step the world while anyone subscribes to this truck's status. + + The map draws every truck from `status`, not video, so parking on video + demand alone froze every marker under an open map. The release is in a + `finally` so a cancelled watcher cannot leave the world stepping. + """ + reason = status_hold(self._truck.name) + while True: + await self._status.used() + self._clock.hold(reason) + try: + await self._status.unused() + finally: + self._clock.release(reason) + + def _hold_clock(self) -> None: + """Step the world while this truck has a driver, whoever is watching. + + Video demand parks the clock, and the two do not have to agree: a driver + whose viewer has gone would otherwise steer a frozen world, with every + command accepted and nothing moving. An e-stop is deliberately not a + hold, even under a driver. It latches until reset, so holding for it + would keep the world stepping indefinitely for a truck that is meant to + be standing still. + """ + reason = drive_hold(self._truck.name) + if self._drive.driver is not None and not self._drive.estopped: + self._clock.hold(reason) + else: + self._clock.release(reason) + + def _actuate(self) -> None: + self._truck.actuate(self._drive.accepted(), has_driver=self._drive.driver is not None) + + def _publish(self, telemetry: Telemetry | None = None) -> None: + self._status.publish( + status_payload( + Status( + accepted=self._drive.state, + estopped=self._drive.estopped, + estop_by=self._drive.estop_by, + autonomous=self._truck.autonomous, + driver=self._drive.driver, + sequence=self._drive.sequence, + media_pipeline=self._media_pipeline, + location=self._location, + map_name=self._map_name, + telemetry=self._truck.telemetry() if telemetry is None else telemetry, + ) + ) + ) + + +__all__ = [ + "COMMAND_TIMEOUT", + "STUCK_DISTANCE", + "STUCK_TIMEOUT", + "TELEMETRY_INTERVAL", + "Accepted", + "StuckDetector", + "TruckSession", + "latency_breakdown", +] diff --git a/demo/carla/sim/moq_carla_sim/watchdog.py b/demo/carla/sim/moq_carla_sim/watchdog.py new file mode 100644 index 00000000000..e2246773154 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/watchdog.py @@ -0,0 +1,108 @@ +"""End the worker when it stops making progress without failing. + +CARLA's synchronous-mode Traffic Manager can deadlock `world.tick()` inside the +client library (carla-simulator/carla#9172), before the RPC whose timeout would +otherwise raise. The clock thread then blocks forever, the world freezes, and +the next blocking CARLA call from the event loop never returns either. Every +asyncio watcher in `supervise` is stuck behind that call, so the relay session +dies unnoticed while the video threads go on reporting 0 fps and systemd sees a +healthy process. Nothing in-process recovers from a deadlocked client library, +hence a thread of its own that trusts neither the clock nor the loop, and an +exit that skips every cleanup that could hang: systemd restarts the worker and +the next run sweeps whatever this one left in the world. +""" + +from __future__ import annotations + +import asyncio +import faulthandler +import logging +import os +import sys +import threading +import time +from typing import Callable + +log = logging.getLogger(__name__) + +# How often the event loop proves it is still turning. +PULSE_INTERVAL = 1.0 + + +class Heartbeat: + """A timestamp one thread refreshes and the watchdog reads. + + Unarmed until its first beat: a heartbeat nobody has started yet is not + stale, it is not being watched. + """ + + def __init__(self, name: str) -> None: + self.name = name + self._last: float | None = None + + def beat(self) -> None: + self._last = time.monotonic() + + def age(self) -> float: + if self._last is None: + return 0.0 + return time.monotonic() - self._last + + +def die(reason: str) -> None: + """Exit without unwinding, so nothing that hangs gets a say in the shutdown. + + The stacks are the only record of where the hang was, so they go out first. + """ + log.critical("%s; dumping every thread and exiting for systemd to restart", reason) + for handler in logging.getLogger().handlers: + handler.flush() + faulthandler.dump_traceback(all_threads=True) + sys.stderr.flush() + os._exit(1) + + +class Watchdog: + """Fail the process once any heartbeat is older than `stall` seconds. + + Watches its own event loop heartbeat alongside the ones handed in. Those + are armed at `start`; the loop's is armed by its first `pulse`, so a + startup spent in blocking CARLA calls before `supervise` runs, each bounded + by the RPC timeout but unbounded in number, counts against nobody. + """ + + def __init__(self, stall: float, *heartbeats: Heartbeat, fail: Callable[[str], None] = die) -> None: + self.loop = Heartbeat("event loop") + self._armed = heartbeats + self._heartbeats = (self.loop, *heartbeats) + self._stall = stall + # Check often enough that a stall is caught soon after the threshold, + # not up to a whole interval late. + self._interval = min(PULSE_INTERVAL, stall / 4) + self._fail = fail + self._stop = threading.Event() + self._thread = threading.Thread(target=self._run, name="watchdog", daemon=True) + + def start(self) -> None: + for heartbeat in self._armed: + heartbeat.beat() + self._thread.start() + + def stop(self) -> None: + self._stop.set() + if self._thread.is_alive(): + self._thread.join(timeout=5.0) + + async def pulse(self) -> None: + """Refresh the event loop heartbeat until cancelled.""" + while True: + self.loop.beat() + await asyncio.sleep(self._interval) + + def _run(self) -> None: + while not self._stop.wait(self._interval): + for heartbeat in self._heartbeats: + age = heartbeat.age() + if age > self._stall: + self._fail(f"{heartbeat.name} has not advanced in {age:.1f} s (limit {self._stall:.1f} s)") + return diff --git a/demo/carla/sim/moq_carla_sim/world.py b/demo/carla/sim/moq_carla_sim/world.py new file mode 100644 index 00000000000..605aa3773a5 --- /dev/null +++ b/demo/carla/sim/moq_carla_sim/world.py @@ -0,0 +1,976 @@ +"""The CARLA side: one world, several trucks, demand-gated cameras. + +Cameras never hand pixels to this process. Each feeds the GPU video bridge +inside the simulator (`demo/carla/bridge`), which renders them only while the +worker's stream wants video; see `bridge`. + +A single client process owns the world. CARLA advises one command-sending +client, and one owner keeps Traffic Manager state coherent, so every truck lives +here rather than in a process each. That is also the point of the demo: they +share a world and can see each other. + +Autonomy is the resting state. A truck nobody is driving runs on Traffic +Manager. Takeover adopts its latest measured controls so switching to manual +does not change steering or pedal demand underneath the driver. +""" + +from __future__ import annotations + +import asyncio +import logging +import math +import threading +import time +from dataclasses import dataclass +from typing import Callable + +import carla + +from . import handback +from .drive import Accepted, DriveState, Gear +from .publish import Collision, Motion, Pose, Telemetry +from .watchdog import Heartbeat + +log = logging.getLogger(__name__) + + +def connect_client(host: str, port: int, timeout: float) -> carla.Client: + """Connect to the simulator, refusing a client the server cannot speak to. + + Fail here rather than at the first spawn: a version mismatch produces + confusing missing-blueprint errors much further along. + """ + client = carla.Client(host, port) + client.set_timeout(timeout) + server = client.get_server_version() + local = client.get_client_version() + if server != local: + raise RuntimeError( + f"CARLA version mismatch: server {server}, client {local}. " + "The python wheel and the server image must match." + ) + log.info("connected to CARLA %s", server) + return client + + +# CARLA's HGV truck, shipped from 0.9.15 on. +TRUCK_BLUEPRINT = "vehicle.carlamotors.european_hgv" + +# Cab-height forward camera. The longitudinal position comes from each +# blueprint's bounding box: the HGV's origin is near its center, so a small +# fixed x offset would leave the sensor inside the cab. +CAMERA_HEIGHT = 2.8 +CAMERA_STANDOFF = 0.25 +CONVOY_SPACING = 12.0 + +# The preview rendition every truck marker on the map plays at once. +SD_HEIGHT = 240 + +# The camera attribute naming the bridge stream a camera renders for. Only the +# patched simulator build has it (demo/carla/sim/patches). +BRIDGE_ATTRIBUTE = "moq_bridge_stream" + +# How often the clock reports its tick durations, matching the video pump's +# throughput line so the two can be read together. +CLOCK_REPORT_INTERVAL = 10.0 + +# How long a spawn waits for the tick that lands its actor. The clock ticks at +# the frame period, so anything near this means it is not running. +SPAWN_TICK_TIMEOUT = 5.0 + +# CARLA reports a collision event for every frame contact persists, so a truck +# resting against a barrier would otherwise report thirty collisions a second. +# Continuing contact with the SAME actor inside this window is coalesced into +# the one collision it is, keeping its peak impulse. Striking something else is +# a new collision however soon it follows: scraping a barrier and then hitting a +# truck half a second later is two events, and folding the second into the first +# would hide it behind the first one's count and actor. +COLLISION_WINDOW = 1.0 + + +def bridge_stream(truck: str, camera: str) -> str: + """The bridge stream a truck's cameras render for, e.g. `truck1/front`.""" + return f"{truck}/{camera}" + + +def camera_transform(vehicle: carla.Vehicle) -> carla.Transform: + box = vehicle.bounding_box + front = box.location.x + box.extent.x + return carla.Transform(carla.Location(x=front + CAMERA_STANDOFF, z=CAMERA_HEIGHT)) + + +def nearby_spawn_points(points: list[carla.Transform], origin: carla.Location) -> list[carla.Transform]: + """Order map spawn points from nearest to farthest from `origin`.""" + return sorted( + points, + key=lambda point: ( + (point.location.x - origin.x) ** 2 + (point.location.y - origin.y) ** 2 + (point.location.z - origin.z) ** 2 + ), + ) + + +def free_spawn_point(points: list[carla.Transform], vehicles: list[carla.Vehicle], own_id: int) -> carla.Transform: + """Return the first candidate with a truck-length gap from every other vehicle.""" + + def separated(vehicle: carla.Vehicle, point: carla.Transform) -> bool: + if vehicle.id == own_id: + return True + location = vehicle.get_transform().location + distance = ( + (location.x - point.location.x) ** 2 + + (location.y - point.location.y) ** 2 + + (location.z - point.location.z) ** 2 + ) + return distance >= CONVOY_SPACING**2 + + for point in points: + if all(separated(vehicle, point) for vehicle in vehicles): + return point + raise RuntimeError(f"every one of the {len(points)} respawn points is occupied") + + +def _waypoint_key(waypoint: carla.Waypoint) -> tuple[int, int, int, float]: + return waypoint.road_id, waypoint.section_id, waypoint.lane_id, waypoint.s + + +def convoy_transform(road_map: carla.Map, lead: carla.Transform, position: int) -> carla.Transform: + """A road-aligned spawn `position` truck lengths behind the lead.""" + lead_waypoint = road_map.get_waypoint(lead.location) + choices = [ + waypoint + for waypoint in lead_waypoint.previous(CONVOY_SPACING * position) + if waypoint.road_id == lead_waypoint.road_id and waypoint.lane_id == lead_waypoint.lane_id + ] + if not choices: + raise RuntimeError("the lead truck is too close to a junction for the convoy") + return min(choices, key=_waypoint_key).transform + + +def convoy_anchor_points( + road_map: carla.Map, + points: list[carla.Transform], + followers: int, +) -> list[carla.Transform]: + """Spawn points with enough uninterrupted same-lane road behind them.""" + if followers == 0: + return points + anchors = [] + for point in points: + try: + convoy_transform(road_map, point, followers) + except RuntimeError: + continue + anchors.append(point) + if not anchors: + raise RuntimeError(f"the map has no spawn point with room for {followers + 1} trucks") + return anchors + + +@dataclass(frozen=True) +class CameraConfig: + """The encoded video ladder. + + The sd rendition is capped at `SD_HEIGHT` pixels high while preserving the + camera's aspect ratio. Both dimensions stay even because the encoder's + 4:2:0 planes require it. Bitrates are explicit because the encoder's resolution-derived + defaults are tuned for efficiency, while this teleoperation demo needs road + detail to survive motion, and every truck's sd plays at once on the + map, so this is the rendition that is always on screen. + """ + + width: int = 1280 + height: int = 720 + fps: int = 30 + sd_bitrate: int = 800_000 + hd_bitrate: int = 4_000_000 + + def renditions(self) -> tuple[RenditionConfig, ...]: + scale = min(1.0, SD_HEIGHT / self.height) + sd_width = max(2, int(self.width * scale) // 2 * 2) + sd_height = max(2, int(self.height * scale) // 2 * 2) + return ( + RenditionConfig( + name="sd", + width=sd_width, + height=sd_height, + fps=self.fps, + bitrate=self.sd_bitrate, + ), + RenditionConfig( + name="hd", + width=self.width, + height=self.height, + fps=self.fps, + bitrate=self.hd_bitrate, + ), + ) + + +@dataclass(frozen=True) +class RenditionConfig: + """One named camera rendition.""" + + name: str + width: int + height: int + fps: int + bitrate: int + + +class Truck: + """One vehicle plus its cameras, and the autonomy/manual switch between them. + + The cameras, one per rendition size, feed the bridge rather than this + process, and the bridge picks which of them renders. What the truck + controls is whether the shared world renders at all for it. + """ + + def __init__( + self, + name: str, + vehicle: carla.Vehicle, + cameras: list[carla.Sensor], + collision: carla.Sensor, + traffic_manager_port: int, + render_demand: Callable[[str, bool], None] | None = None, + *, + road_map: carla.Map, + ) -> None: + self.name = name + self._vehicle = vehicle + self._road_map = road_map + self._cameras = cameras + self._video = False + self._render_demand = render_demand + self._tm_port = traffic_manager_port + self._autonomous = False + self._spawn_transform = vehicle.get_transform() + + # Unlike the cameras, the collision sensor listens for the truck's whole + # life rather than following viewer demand. It emits only on contact, so + # it costs nothing while nothing happens, and the one thing an operator + # must not miss is a truck nobody was watching hitting something. + self._collision_sensor = collision + self._collision_lock = threading.Lock() + self._collision: Collision | None = None + self._collision_at = 0.0 + self._collision_actor: int | None = None + collision.listen(self._on_collision) + + self.engage_autonomy() + + def set_video_demand(self, demanded: bool) -> None: + """Render the shared world for this truck while anyone wants its video. + + CARLA captures nothing in no-rendering mode, so the stream turns this on + before telling the bridge and off after. + """ + if demanded == self._video: + return + if self._render_demand is not None: + self._render_demand(self.name, demanded) + self._video = demanded + log.info("%s: video %s", self.name, "wanted" if demanded else "parked") + + def _on_collision(self, event: carla.CollisionEvent) -> None: + """Record contact, on CARLA's sensor thread. + + Continuing contact with the same actor inside `COLLISION_WINDOW` is + coalesced into one collision carrying its peak impulse, and keeps + extending the window, so grinding along a barrier stays one event. + Anything else struck is a new collision immediately. + + Keyed on the actor's id rather than its `type_id`, which is a blueprint + name: two of the same model of car are one type and two collisions. + """ + impulse = event.normal_impulse + magnitude = math.sqrt(impulse.x**2 + impulse.y**2 + impulse.z**2) + actor = event.other_actor + # Monotonic for the coalescing window, which is a duration and must not + # move when the host clock is stepped; wall clock for the wire, which is + # an instant a browser on another machine has to age. + now = time.monotonic() + with self._collision_lock: + previous = self._collision + if ( + previous is not None + and self._collision_actor == actor.id + and now - self._collision_at < COLLISION_WINDOW + ): + # The timestamp stays at the start of contact: it identifies the + # collision, so moving it would republish one event as many. + self._collision = Collision( + at=previous.at, + other=previous.other, + impulse=max(previous.impulse, magnitude), + ) + else: + self._collision = Collision( + at=time.time() * 1000.0, + other=actor.type_id, + impulse=magnitude, + ) + log.warning("%s: collision with %s", self.name, self._collision.other) + self._collision_actor = actor.id + self._collision_at = now + + def telemetry(self) -> Telemetry: + """One consistent read of the vehicle: where it is, and how it responded. + + Every getter here reads the state the client received on the last tick + rather than issuing an RPC, so polling every truck at the status rate + costs the simulator nothing. + + `get_control` is the control the physics actually applied, which is + feedback rather than the command echo, and is populated whoever is + driving - including Traffic Manager. Acceleration and yaw rate come out + of the world frame and are projected onto the vehicle's own axes, since + what matters to a heavy truck is how hard it is being pushed sideways. + """ + transform = self._vehicle.get_transform() + velocity = self._vehicle.get_velocity() + control = self._vehicle.get_control() + acceleration = self._vehicle.get_acceleration() + angular = self._vehicle.get_angular_velocity() + # CARLA's own basis vectors rather than trigonometry on yaw: the world is + # left-handed with y pointing south, so hand-rolling the rotation is an + # easy way to publish lateral acceleration with the wrong sign. + forward = transform.get_forward_vector() + right = transform.get_right_vector() + + def project(vector: carla.Vector3D, axis: carla.Vector3D) -> float: + """Component of `vector` along a unit `axis`, in all three dimensions. + + The z terms are not optional padding: pitch tilts `forward` out of + the horizontal plane and roll tilts `right`, so dropping them + underreports exactly on the graded, banked roads where the + numbers matter. + """ + return vector.x * axis.x + vector.y * axis.y + vector.z * axis.z + + with self._collision_lock: + collision = self._collision + return Telemetry( + pose=Pose( + x=transform.location.x, + y=transform.location.y, + yaw=transform.rotation.yaw, + speed=math.sqrt(velocity.x**2 + velocity.y**2 + velocity.z**2), + ), + measured=DriveState( + steering=control.steer, + throttle=control.throttle, + brake=control.brake, + # CARLA has no neutral - `actuate` expresses it as zero throttle - + # so the measured gear is the direction the physics drove in. + gear=Gear.REVERSE if control.reverse else Gear.FORWARD, + ), + motion=Motion( + yaw_rate=angular.z, + accel_lon=project(acceleration, forward), + accel_lat=project(acceleration, right), + ), + collision=collision, + ) + + def engage_autonomy(self) -> None: + """Hand the truck to Traffic Manager where it stands. Idempotent.""" + if self._autonomous: + return + self._vehicle.set_autopilot(True, self._tm_port) + self._autonomous = True + log.info("%s: autonomy engaged", self.name) + + def release(self) -> None: + """Return a driverless truck to autonomy, merging onto a lane first. + + Idempotent: the drive loop calls this when the driver lets go, and the + telemetry timer keeps calling it until the truck is autonomous again. + Until then the truck coasts under `handback`'s steering; see that + module for why Traffic Manager cannot simply be given a moving truck. + """ + if self._autonomous: + return + measured = self._vehicle.get_control() + control = handback.plan( + self._road_map, + self._vehicle.get_transform(), + self._vehicle.get_velocity(), + measured.steer, + reversing=measured.reverse, + ) + if control is None: + self.engage_autonomy() + else: + self._vehicle.apply_control(control) + + def respawn(self) -> None: + """Return this actor to a free spawn point without breaking its sensors.""" + world = self._vehicle.get_world() + map_points = world.get_map().get_spawn_points() + candidates = [ + self._spawn_transform, + *nearby_spawn_points(map_points, self._spawn_transform.location), + ] + transform = free_spawn_point( + candidates, + list(world.get_actors().filter("vehicle.*")), + self._vehicle.id, + ) + if self._autonomous: + self._vehicle.set_autopilot(False, self._tm_port) + self._autonomous = False + self._vehicle.apply_control(carla.VehicleControl()) + self._vehicle.set_transform(transform) + self._vehicle.set_target_velocity(carla.Vector3D()) + self._vehicle.set_target_angular_velocity(carla.Vector3D()) + with self._collision_lock: + self._collision = None + self._collision_actor = None + self._collision_at = 0.0 + self.engage_autonomy() + log.info("%s: respawned", self.name) + + @property + def autonomous(self) -> bool: + return self._autonomous + + def _disengage_autonomy(self) -> None: + if not self._autonomous: + return + # Traffic Manager releases the vehicle where it is, still carrying its + # velocity. The takeover command preserves its latest measured controls. + self._vehicle.set_autopilot(False, self._tm_port) + self._autonomous = False + log.info("%s: autonomy disengaged, driver has control", self.name) + + def actuate(self, accepted: Accepted, *, has_driver: bool) -> None: + """Apply accepted state to the vehicle, or return it to autonomy. + + Only the gate's accepted state reaches CARLA. The three cases are + deliberately different, because they are not equally urgent: + + - E-stop is the one hard latch: full brake, autonomy off, and it stays + that way until an explicit reset. + - No driver means autonomy resumes, once the truck is somewhere Traffic + Manager can take it (see `release`). A lapsed lease or a closed tab + is a truck nobody is steering, not an emergency. + - A claim carrying only the resting state leaves Traffic Manager in + control rather than braking the truck during takeover. + - A driver that supplied input drives the accepted command state. + """ + if accepted.estopped: + self._disengage_autonomy() + self._vehicle.apply_control(carla.VehicleControl(throttle=0.0, brake=1.0, steer=0.0, hand_brake=True)) + return + + if not has_driver: + self.release() + return + + # A player without feedback yet claims with the resting state. Applying + # that frame would make every click brake an autonomous truck. + if self._autonomous and accepted.state == DriveState.stopped(): + return + + self._disengage_autonomy() + state = accepted.state + # CARLA has no neutral, so it is expressed as zero throttle: a truck in + # neutral coasts and still brakes and steers, rather than driving. + throttle = 0.0 if state.gear is Gear.NEUTRAL else state.throttle + self._vehicle.apply_control( + carla.VehicleControl( + throttle=throttle, + brake=state.brake, + steer=state.steering, + reverse=state.gear is Gear.REVERSE, + ) + ) + + def destroy(self) -> None: + """Tear down every sensor before the vehicle they are attached to. + + Cleanup keeps walking after a failed actor RPC so one sensor the server + already culled cannot leave the other sensor or vehicle behind. + """ + failure: RuntimeError | None = None + for sensor in (*self._cameras, self._collision_sensor): + for cleanup in (sensor.stop, sensor.destroy): + try: + cleanup() + except RuntimeError as err: + failure = failure or err + try: + self._vehicle.destroy() + except RuntimeError as err: + failure = failure or err + if failure is not None: + raise failure + + +def next_deadline(deadline: float, now: float, period: float) -> float: + """When the tick after the one just issued is due. + + Deadlines advance by the period from each other, not from `now`, so the + cadence does not drift by the tick's own duration. A tick that overran by + more than a whole period (a server hitch) re-anchors on `now` instead: + catching up would fire the missed ticks back to back, and a burst of frames + stamped a step apart is the very judder a fixed step exists to avoid. Sim + time simply runs that much behind the wall clock, which nothing depends on. + """ + deadline += period + if deadline < now - period: + return now + return deadline + + +# Why the clock is being stepped. `Clock` holds are keyed by reason so the +# startup gate, a camera, a map viewer and a driver can each keep the world +# running without one of them releasing on another's behalf. +STARTUP_HOLD = "startup" +RENDER_HOLD = "render" + + +def drive_hold(truck: str) -> str: + return f"drive:{truck}" + + +def status_hold(truck: str) -> str: + return f"status:{truck}" + + +class Clock: + """Drives the simulation one fixed step per wall-clock period. + + CARLA's own free-running mode stamps each camera frame with however long the + previous server tick took, and with `sensor_tick` quantizing on top of that + a nominal 30 fps camera delivered frames 11 ms and 53 ms apart in pairs. + The player paints by those stamps, so the judder is on screen whatever the + encoder or the network do. Synchronous mode with a fixed step makes every + frame exactly a period apart, and this thread supplies the ticks at that + period so sim time keeps pace with the wall clock. + + A tick failure is fatal for the session, the same as a lost video track: in + synchronous mode a world nobody ticks is frozen, and every truck would go on + looking healthy while publishing nothing. A tick that never returns is the + same frozen world with no failure to report, so each one that does return + beats `heartbeat` for the watchdog. + + Ticking is held rather than unconditional. Stepping physics and Traffic + Manager costs a full core even with rendering parked, so a world no viewer + and no driver needs stops stepping until one arrives. `hold` and `release` + name their reason so two holders cannot cancel each other out; see + `World.ready` for the one that covers startup. + """ + + def __init__(self, world: carla.World, fps: int) -> None: + self._world = world + self._period = 1.0 / fps + self.heartbeat = Heartbeat("simulation clock") + self._stop = threading.Event() + self._thread = threading.Thread(target=self._run, name="carla-clock", daemon=True) + self._failure_loop: asyncio.AbstractEventLoop | None = None + self._failure: asyncio.Future[BaseException] | None = None + # Held through `sweep` and `spawn`, which wait on ticks. `World.ready` + # drops it once every truck is in the world. + self._holds: set[str] = {STARTUP_HOLD} + self._holds_lock = threading.Lock() + self._wanted = threading.Event() + self._wanted.set() + + @property + def running(self) -> bool: + """Whether the world is currently being stepped.""" + return self._wanted.is_set() + + def hold(self, reason: str) -> None: + """Step the world until `reason` is released. Idempotent.""" + with self._holds_lock: + self._holds.add(reason) + self._wanted.set() + + def release(self, reason: str) -> None: + """Drop one hold, parking the world once the last one goes. Idempotent.""" + with self._holds_lock: + self._holds.discard(reason) + if not self._holds: + self._wanted.clear() + + def start(self) -> None: + self._failure_loop = asyncio.get_running_loop() + self._failure = self._failure_loop.create_future() + self._thread.start() + + async def wait_failed(self) -> None: + """Raise when the clock can no longer tick the world.""" + if self._failure is None: + raise RuntimeError("clock was not started") + failure = await self._failure + raise RuntimeError("simulation clock stopped") from failure + + def stop(self) -> None: + self._stop.set() + if self._thread.is_alive(): + self._thread.join(timeout=5.0) + if self._failure is not None and not self._failure.done(): + self._failure.cancel() + + def _run(self) -> None: + deadline = time.monotonic() + # Tick durations since the last report. A tick longer than the period is + # the server failing to render the active cameras in time, which shows + # up as a slow-motion truck and nothing else would name the cause. + ticks: list[float] = [] + reported = deadline + parked = False + while not self._stop.is_set(): + if not self._wanted.is_set(): + if not parked: + log.info("clock parked") + parked = True + # The thread is idle by design, not wedged, so it keeps beating: + # the watchdog exists for a `tick` that never returns, and would + # otherwise kill the worker a minute into every parked world. + # Waking each period rather than blocking also keeps `stop` + # responsive during shutdown. + self.heartbeat.beat() + self._wanted.wait(self._period) + # Whatever the pause cost, the next tick is due now rather than + # owed a burst of catch-up steps; `next_deadline` collapses a + # deadline this far behind to the current time. + reported = time.monotonic() + continue + if parked: + log.info("clock running") + parked = False + started = time.monotonic() + try: + self._world.tick() + except RuntimeError as err: + if self._failure_loop is not None: + self._failure_loop.call_soon_threadsafe(self._record_failure, err) + log.error("simulation tick failed, stopping: %s", err) + return + now = time.monotonic() + self.heartbeat.beat() + ticks.append(now - started) + if now - reported >= CLOCK_REPORT_INTERVAL: + late = sum(1 for tick in ticks if tick > self._period) + log.info( + "clock: %d ticks, mean %.1f ms, max %.1f ms, %d over the %.1f ms period", + len(ticks), + 1000 * sum(ticks) / len(ticks), + 1000 * max(ticks), + late, + 1000 * self._period, + ) + ticks.clear() + reported = now + deadline = next_deadline(deadline, now, self._period) + self._stop.wait(max(0.0, deadline - now)) + + def _record_failure(self, failure: BaseException) -> None: + if self._failure is not None and not self._failure.done(): + self._failure.set_result(failure) + + +class World: + """The shared CARLA world and the trucks spawned into it. + + The world runs in synchronous mode at a fixed step of `1 / fps`, ticked by + `clock`; see `Clock` for why. The mode is restored on `destroy`, because a + synchronous world with no client ticking it is frozen for the next one. + """ + + def __init__(self, client: carla.Client, traffic_manager_port: int, fps: int) -> None: + self._client = client + self._world = client.get_world() + self._tm = client.get_trafficmanager(traffic_manager_port) + self._tm_port = traffic_manager_port + self._map: carla.Map | None = None + self._rendering_trucks: set[str] = set() + self.trucks: list[Truck] = [] + # The server outlives this worker and may have been left rendering, or + # free-running, by a hard crash. Assert the idle state and the fixed + # step before doing any other world work. Traffic Manager setup can + # still fail after apply_settings has already frozen the world, so + # roll that back rather than leave the next client a world nobody ticks. + settings = self._world.get_settings() + settings.no_rendering_mode = True + settings.synchronous_mode = True + settings.fixed_delta_seconds = 1.0 / fps + self._world.apply_settings(settings) + try: + # Traffic Manager steps with the world, so a stalled tick stalls the + # autonomous trucks rather than leaving them to drive through a frozen + # frame. + self._tm.set_synchronous_mode(True) + except BaseException: + try: + settings = self._world.get_settings() + settings.synchronous_mode = False + settings.fixed_delta_seconds = 0.0 + self._world.apply_settings(settings) + except RuntimeError as err: + log.warning("failed to release synchronous mode after setup failed: %s", err) + raise + self.clock = Clock(self._world, fps) + + @classmethod + def connect(cls, host: str, port: int, timeout: float, traffic_manager_port: int, fps: int) -> World: + return cls(connect_client(host, port, timeout), traffic_manager_port, fps) + + def road_map(self) -> carla.Map: + """The town, fetched once. + + `get_map` downloads and parses the whole OpenDRIVE, and both spawning and + the map name want it, so hold on to it rather than paying twice at start. + """ + if self._map is None: + self._map = self._world.get_map() + return self._map + + def map_name(self) -> str: + """The loaded map's short name, e.g. `Town10HD_Opt`. + + CARLA reports it as a content path (`Carla/Maps/Town10HD_Opt`). The last + segment is what `just carla map` names the road file it bakes, + and what the player matches before drawing those roads under the trucks. + """ + return self.road_map().name.rsplit("/", 1)[-1] + + def _set_render_demand(self, name: str, demanded: bool) -> None: + """Render the shared world while at least one truck needs a camera.""" + next_trucks = set(self._rendering_trucks) + if demanded: + next_trucks.add(name) + else: + next_trucks.discard(name) + if next_trucks == self._rendering_trucks: + return + + was_rendering = bool(self._rendering_trucks) + will_render = bool(next_trucks) + if was_rendering != will_render: + self._set_rendering(will_render) + # Parking the renderer leaves physics and Traffic Manager stepping, + # which is most of a core on its own, so the clock follows the same + # demand. A driver or a map viewer holds it separately: see + # `TruckSession`. + if will_render: + self.clock.hold(RENDER_HOLD) + else: + self.clock.release(RENDER_HOLD) + self._rendering_trucks = next_trucks + + def ready(self) -> None: + """Let the world park now that every truck is spawned. + + `sweep` and `spawn` wait on ticks, so the clock is held from + construction until this drops the gate. Nothing has demanded a camera + yet at that point, so the usual next step is straight to parked. + """ + self.clock.release(STARTUP_HOLD) + + def _set_rendering(self, enabled: bool) -> None: + settings = self._world.get_settings() + no_rendering = not enabled + if settings.no_rendering_mode == no_rendering: + return + settings.no_rendering_mode = no_rendering + self._world.apply_settings(settings) + log.info("CARLA rendering %s", "enabled" if enabled else "parked") + + def sweep(self) -> None: + """Remove every vehicle a previous run left in the world, sensors first. + + The server outlives its clients, and Traffic Manager runs inside the + client, so a worker that died without `destroy` leaves its trucks frozen + wherever they were, holding whatever control they last had. They sit on + the roads the next run spawns onto, and a fresh truck drives up behind + one and waits there forever. This process is the world's only owner, so + every vehicle in it is ours to remove. + """ + actors = self._world.get_actors() + vehicles = list(actors.filter("vehicle.*")) + if not vehicles: + return + stale = {vehicle.id for vehicle in vehicles} + sensors = [ + sensor for sensor in actors.filter("sensor.*") if sensor.parent is not None and sensor.parent.id in stale + ] + for sensor in sensors: + for cleanup in (sensor.stop, sensor.destroy): + try: + cleanup() + except RuntimeError as err: + log.warning("failed to remove stale sensor %d: %s", sensor.id, err) + # Every vehicle gets its attempt before the first failure is raised, so + # one the server refuses does not leave the rest behind. A stale truck + # still in the world is the jam this is here to clear, so spawning + # beside it is not an option. + stuck: list[str] = [] + for vehicle in vehicles: + try: + if not vehicle.destroy(): + stuck.append(f"{vehicle.id}: server refused") + except RuntimeError as err: + stuck.append(f"{vehicle.id}: {err}") + if stuck: + raise RuntimeError("failed to remove stale vehicles: " + "; ".join(stuck)) + log.warning("removed %d vehicles and %d sensors left behind by a previous run", len(vehicles), len(sensors)) + # Destroys land on the next tick in synchronous mode. Spawn walks the + # map immediately after, so wait for that tick or it still sees them. + self._world.wait_for_tick(SPAWN_TICK_TIMEOUT) + + def spawn(self, names: list[str], camera: CameraConfig, camera_name: str) -> None: + """Spawn one truck per name into the shared world, cameras attached. + + The first truck anchors a same-lane convoy. Every later truck first tries + its position directly behind the lead, then falls back to the closest map + spawn points if the road is obstructed. CARLA rejects physical overlap. + + Each truck's cameras render for its bridge stream, `truck/camera_name`. + The simulator registers them with the bridge as they spawn, which is + what starts it listening for this worker. + """ + library = self._world.get_blueprint_library() + if not library.find("sensor.camera.rgb").has_attribute(BRIDGE_ATTRIBUTE): + raise RuntimeError( + f"the simulator's cameras have no {BRIDGE_ATTRIBUTE} attribute: the simulator " + "lacks the GPU video bridge. Build it with `just carla build` and pin CARLA_IMAGE." + ) + truck_bp = library.find(TRUCK_BLUEPRINT) + # Traffic Manager deletes stuck non-hero vehicles. Every truck must + # survive a jam until an operator takes over or respawns it; deleting + # one also invalidates its sensors and telemetry. Hero still supports + # autopilot and anchors streamed map tiles around the vehicle. + truck_bp.set_attribute("role_name", "hero") + + road_map = self.road_map() + points = road_map.get_spawn_points() + if len(points) < len(names): + raise RuntimeError(f"map has {len(points)} spawn points, need {len(names)}") + anchors = convoy_anchor_points(road_map, points, len(names) - 1) + + lead_transform: carla.Transform | None = None + for index, name in enumerate(names): + if lead_transform is None: + candidates = anchors + else: + convoy_point = convoy_transform(road_map, lead_transform, index) + candidates = [convoy_point, *nearby_spawn_points(points, convoy_point.location)] + + vehicle = self._spawn_vehicle(truck_bp, candidates) + # A synchronous spawn lands on the next tick, and the transform the + # convoy is laid out from is read back from that tick's snapshot. + self._world.wait_for_tick(SPAWN_TICK_TIMEOUT) + if index == 0: + lead_transform = vehicle.get_transform() + cameras: list[carla.Sensor] = [] + # Every sensor spawned so far, in spawn order, so the failure paths + # below can walk them without caring which kind each one is. + sensors: list[carla.Sensor] = [] + try: + for rendition in camera.renditions(): + camera_bp = library.find("sensor.camera.rgb") + camera_bp.set_attribute("image_size_x", str(rendition.width)) + camera_bp.set_attribute("image_size_y", str(rendition.height)) + # Every tick: the fixed step already is the frame period, and a + # tick-length `sensor_tick` on top would skip frames on rounding. + camera_bp.set_attribute("sensor_tick", "0.0") + camera_bp.set_attribute(BRIDGE_ATTRIBUTE, bridge_stream(name, camera_name)) + # The simulator refuses the spawn when the camera cannot + # reach the bridge, naming why in its log. + cameras.append(self._world.spawn_actor(camera_bp, camera_transform(vehicle), attach_to=vehicle)) + sensors.append(cameras[-1]) + # Attached at the vehicle origin: a collision sensor reports the + # actor's contacts, so where on it the sensor sits is irrelevant. + collision = self._world.spawn_actor( + library.find("sensor.other.collision"), carla.Transform(), attach_to=vehicle + ) + sensors.append(collision) + except BaseException: + # The vehicle is in the world already and `destroy` only walks + # the trucks it finished building, so failed sensors would + # otherwise leave it parked there for the next run. Every exit + # counts, a SIGTERM mid-RPC included, not just a refused spawn. + for sensor in sensors: + try: + sensor.destroy() + except RuntimeError as err: + log.warning("failed to clean up sensor after %s sensor spawn failed: %s", name, err) + try: + vehicle.destroy() + except RuntimeError as err: + log.warning("failed to clean up vehicle after %s sensor spawn failed: %s", name, err) + raise + try: + truck = Truck( + name, + vehicle, + cameras, + collision, + self._tm_port, + self._set_render_demand, + road_map=road_map, + ) + except BaseException: + # Construction enables autopilot before the Truck reaches + # `self.trucks`, so clean up every actor here rather than leave + # them invisible to `destroy()` on the persistent server. + cleanups = [ + *(cleanup for sensor in sensors for cleanup in (sensor.stop, sensor.destroy)), + vehicle.destroy, + ] + for cleanup in cleanups: + try: + cleanup() + except RuntimeError as err: + log.warning("failed to clean up after %s construction failed: %s", name, err) + raise + self.trucks.append(truck) + log.info("spawned %s (actor %d)", name, vehicle.id) + + def _spawn_vehicle(self, blueprint: carla.ActorBlueprint, points: list[carla.Transform]): + """Spawn at the first free point in the caller's preferred order. + + `try_spawn_actor` returns None when the point is occupied. `sweep` has + cleared the last run's trucks by now, so that is a convoy follower whose + spot is blocked; walking the ordered candidates finds it the nearest + free road, and still fails loudly if the map is genuinely full. + """ + for point in points: + vehicle = self._world.try_spawn_actor(blueprint, point) + if vehicle is not None: + return vehicle + raise RuntimeError(f"every one of the {len(points)} candidate spawn points is occupied") + + def destroy(self) -> None: + """Remove every actor this process spawned and hand the world back. + + The server outlives the client, so anything left behind stays in the + world and the next run spawns beside it. The world goes back to + free-running first: with the clock stopped nothing else would apply the + destroys, and a synchronous world with no client is frozen for whatever + connects next (`just carla map`, a hand-run client). + """ + self.clock.stop() + try: + self._tm.set_synchronous_mode(False) + settings = self._world.get_settings() + settings.synchronous_mode = False + settings.fixed_delta_seconds = 0.0 + self._world.apply_settings(settings) + except RuntimeError as err: + # A server already gone cannot be handed anything; the actors below + # are gone with it, and their own errors say so. + log.warning("failed to release synchronous mode: %s", err) + for truck in self.trucks: + try: + truck.destroy() + except RuntimeError as err: + # A truck already gone (server restarted, actor culled) must not + # stop the rest from being cleaned up. + log.warning("failed to destroy %s: %s", truck.name, err) + self.trucks.clear() diff --git a/demo/carla/sim/patches/README.md b/demo/carla/sim/patches/README.md new file mode 100644 index 00000000000..f9da1c3a9d6 --- /dev/null +++ b/demo/carla/sim/patches/README.md @@ -0,0 +1,120 @@ +# CARLA source builds + +The worker needs a CARLA simulator built from source with the patches here, +applied to clean CARLA commit `294096eb1c38eabf246e4f3a9cdab704e33a7f4c` +(release 0.9.16) and CARLA's UE4 engine fork at +`e9d9e60c85f643e10eeb03f42f61554d18dcb30f`. + +## The patches + +`rpc-idle-wait.patch` fixes an idle CPU spin. `FCarlaEngine::OnPreTick` loops +over `Server.RunSome(1u)` until the next synchronous tick cue, and +`carla::rpc::Server::SyncRunFor` resets its Asio context and calls +`run_for(1ms)` with no outstanding work guard. An empty context returns +immediately, so the game thread busy-spins between the worker's ticks. The patch +adds a slice-local [work guard](https://www.boost.org/doc/libs/1_84_0/doc/html/boost_asio/reference/io_context.html), +so each slice waits out its existing time budget for RPC arrivals, plus a +regression in CARLA's RPC suite that fails without it. + +Measured with `-nullrhi`, process and game-thread CPU from `/proc` jiffies after +a 30 s warmup: + +| State | Stock process | Stock game thread | Patched process | Patched game thread | +| --- | --- | --- | --- | --- | +| No client, 30 s | 133.1% | 90.3% | 33.6% | 21.8% | +| Rendering parked, 30 s | 133.2% | 89.9% | 28.1% | 17.7% | +| Synchronous 30 ticks/s, 10 s | 101.3% | | 4.4% | | + +Both advanced all 300 synchronous frames; mean tick RPC went from 0.47 to +1.14 ms, maximum 0.72 to 1.90 ms. Unreal's own frame caps (`-fps=30`, +`t.MaxFPS 30`) do not bound the idle server: CARLA's loop overrides both. + +The GPU video bridge is three pieces on the same revisions: + +- `bridge-camera.patch` (CARLA): the `moq_bridge_stream` attribute on + `sensor.camera.rgb`. Such a camera registers with the bridge at BeginPlay + (refusing its spawn when it cannot), ticks while the bridge wants it rather + than while a client listens, and hands its render target to the bridge + instead of `FPixelReader`. It also lists the MoqBridge module in + `Carla.uplugin`, loaded at `PostConfigInit`. +- `../plugin/MoqBridge` (copied into the Carla plugin with the bridge's C + header): enables `VK_KHR_external_memory_fd`, `VK_KHR_external_semaphore_fd` + and `VK_KHR_timeline_semaphore` on Unreal's device when the simulator runs + with `-moq-bridge-socket=`, allocates exportable slots on it, and records + each copy into Unreal's active command buffer, restoring the render target's + tracked layout, followed by an empty submission that signals the slot's + timeline. It loads `libcarla_bridge.so` from beside the executable. +- `engine-timeline-semaphore.patch` (engine): chains the timeline-semaphore + feature into `FVulkanDevice::CreateDevice` when its extension is enabled, + which no plugin hook reaches. + +## Building + +`just carla build` runs [`build.sh`](build.sh): clean CARLA plus +`rpc-idle-wait.patch`, `bridge-camera.patch` and the MoqBridge module, on the +engine plus `engine-timeline-semaphore.patch`, compiled by +[`compile.sh`](compile.sh) in the [builder image](builder.Containerfile) as +rootless UID 1000. The bridge library (`demo/carla/bridge`, a workspace member) +is built first, in a digest-pinned Debian bullseye Rust image, because the +published image is Ubuntu 20.04 with glibc 2.31 and bullseye has the same. The +[runtime image](runtime.Containerfile) overlays the executable, the library and +the four configuration files onto the published image, and the script prints +its tag, `localhost/moq-carla:0.9.16-bridge--` with the +first 12 hex of each SHA-256, both also image labels. It needs `gh` access to +the Epic-gated engine (GitHub serves it only to accounts linked to an Epic +account), about 40 GB, and takes roughly 20 minutes cold on a 32-core machine, +most of it the Shipping build. Private engine sources and generated binaries +are not distributed here. + +Everything it fetches and compiles stays in `~/.cache/moq-carla-build` +(`CARLA_BUILD` overrides it), with a log per run under `logs/`, so a re-run +resumes rather than starting over. A fetch lands in a staging directory renamed +into place only on success, so a failed one (no Epic authorization, a dropped +connection) never blocks the next run. A cached checkout may hold only its +patches, the module and the build's own scripted edits: [`sources.sh`](sources.sh) +refuses anything else rather than compile it into an image labelled as this +build. The build may share its host with a running simulator, so it runs at idle +CPU and I/O priority under a memory cap; `NINJA_JOBS`, `UE_JOBS` and +`BUILD_MEMORY` tune it. + +Unreal compiles the copy of `rpc/Server.h` that `BuildLibCarla.sh --server` +installs into `Plugins/Carla/CarlaDependencies`, not LibCarla's source, so +editing the source alone rebuilds the old behavior. `compile.sh` applies the +patch before that install and fails unless the installed header matches, then +runs the RPC suite, including the patch's `idle_sync_slice_waits_for_work`. +CARLA reports the version of a `ue4/` branch and otherwise its short +hash, which the worker refuses as a mismatch, so the checkout sits on +`ue4/0.9.16`. + +Pin the result with `CARLA_IMAGE` in `~/.config/moq/carla.env`, which +`carla-sim.service` reads and `just carla service-install` does not +overwrite; `server.sh` logs the image it resolved, and the worker refuses a +simulator without the bridge by name. + +### What the script does + +These are the steps `build.sh` and `compile.sh` automate, for anyone adapting +them. The builder is Ubuntu 22.04 with the packages in +[`builder.Containerfile`](builder.Containerfile); the engine installs its own +v17 clang 10.0.1 CentOS 7 SDK, and host clang is not used. + +1. Fetch engine dependencies with `Engine/Build/BatchFiles/Linux/GitDependencies.sh --force --exclude=Win32 --exclude=Win64 --exclude=Mac --exclude=Android --exclude=IOS --exclude=TVOS --exclude=HoloLens`. The outer setup script + combines `--force` with `--prompt` and silently skips dependency fetching. +2. CARLA's libpng 1.6.37 download moved under SourceForge's + `libpng/libpng16/older-releases/1.6.37/` directory, so that URL is updated in + `Util/BuildTools/Setup.sh`. Setup runs for Python 3.10, then + `BuildLibCarla.sh --server --release` and `BuildOSM2ODR.sh --build`. +3. Chrono, ROS2, PyTorch, CarSim and SimReady are disabled in + OptionalModules.ini, with Unity ON, as are the MDL/SimReady plugins in + CarlaUE4.uproject and the SimReady dependency in CarlaTools.uplugin. +4. The CarlaUE4 target is built directly from the engine checkout: + + ```sh + bash Engine/Build/BatchFiles/Linux/Build.sh CarlaUE4 Linux Shipping \ + -Project=/work/carla/Unreal/CarlaUE4/CarlaUE4.uproject -MaxParallelActions=8 + ``` + +The runtime uses the published image's cooked assets, with the executable and +the configuration files above replaced; no map recook is performed. Source +executables report 0.9.16 for client compatibility, so identify a build by its +hashes, never that version string alone. diff --git a/demo/carla/sim/patches/bridge-camera.patch b/demo/carla/sim/patches/bridge-camera.patch new file mode 100644 index 00000000000..fce7597747d --- /dev/null +++ b/demo/carla/sim/patches/bridge-camera.patch @@ -0,0 +1,219 @@ +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin b/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin +--- a/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin ++++ b/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin +@@ -21,6 +21,11 @@ + "AdditionalDependencies": [ + "Engine" + ] ++ }, ++ { ++ "Name": "MoqBridge", ++ "Type": "Runtime", ++ "LoadingPhase": "PostConfigInit" + } + ], + "Plugins": [ +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Carla.Build.cs b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Carla.Build.cs +--- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Carla.Build.cs ++++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Carla.Build.cs +@@ -115,6 +115,7 @@ + "PhysXVehicles", + "PhysXVehicleLib", + "Projects", ++ "MoqBridge", + "Slate", + "SlateCore", + "PhysicsCore", +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.h +--- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.h ++++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.h +@@ -72,6 +72,10 @@ + // Small interface to notify sensors when no clients are listening + virtual void OnLastClientDisconnected() {}; + ++ /// Every tick, on the game thread: whether a consumer other than a ++ /// streaming client wants this tick's data. Such a sensor ticks without one. ++ virtual bool UpdateExternalConsumer() { return false; } ++ + + void PostPhysTickInternal(UWorld *World, ELevelTick TickType, float DeltaSeconds); + +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.cpp +--- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.cpp ++++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/Sensor.cpp +@@ -76,7 +76,8 @@ + bClientsListening = true; + } + } +- if(!bClientsListening) ++ const bool bExternalConsumer = UpdateExternalConsumer(); ++ if(!bClientsListening && !bExternalConsumer) + { + return; + } +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SensorFactory.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SensorFactory.cpp +--- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SensorFactory.cpp ++++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SensorFactory.cpp +@@ -157,5 +157,5 @@ + } + } + UGameplayStatics::FinishSpawningActor(Sensor, Transform); +- return FActorSpawnResult{Sensor}; ++ return FActorSpawnResult{IsValid(Sensor) ? Sensor : nullptr}; + } +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h +--- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h ++++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h +@@ -13,6 +13,8 @@ + + #include "SceneCaptureCamera.generated.h" + ++class IMoqBridgeCamera; ++ + /// A sensor that captures images from the scene. + UCLASS() + class CARLA_API ASceneCaptureCamera : public AShaderBasedSensor +@@ -26,6 +28,8 @@ + + ASceneCaptureCamera(const FObjectInitializer &ObjectInitializer); + ++ void Set(const FActorDescription &Description) override; ++ + protected: + + virtual void SendGBufferTextures(FGBufferRequest& GBuffer) override; +@@ -37,6 +41,16 @@ + + virtual void OnFirstClientConnected() override; + virtual void OnLastClientDisconnected() override; ++ bool UpdateExternalConsumer() override; + + private: ++ ++ /// The MoQ bridge stream this camera renders for (`truck1/front`), from ++ /// the `moq_bridge_stream` attribute. Such a camera never sends pixels ++ /// to CARLA clients: its frames stay on the GPU and leave encoded. ++ FString BridgeStream; ++ ++ TSharedPtr Bridge; ++ ++ void CloseBridge(); + }; +diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +--- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp ++++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +@@ -10,15 +10,32 @@ + #include + + #include "Actor/ActorBlueprintFunctionLibrary.h" ++#include "MoqBridgeCamera.h" + + #include "Runtime/RenderCore/Public/RenderingThread.h" + + FActorDefinition ASceneCaptureCamera::GetSensorDefinition() + { + constexpr bool bEnableModifyingPostProcessEffects = true; +- return UActorBlueprintFunctionLibrary::MakeCameraDefinition( ++ FActorDefinition Definition = UActorBlueprintFunctionLibrary::MakeCameraDefinition( + TEXT("rgb"), + bEnableModifyingPostProcessEffects); ++ FActorVariation BridgeStream; ++ BridgeStream.Id = TEXT("moq_bridge_stream"); ++ BridgeStream.Type = EActorAttributeType::String; ++ BridgeStream.RecommendedValues = { TEXT("") }; ++ BridgeStream.bRestrictToRecommended = false; ++ Definition.Variations.Add(BridgeStream); ++ return Definition; ++} ++ ++void ASceneCaptureCamera::Set(const FActorDescription &Description) ++{ ++ Super::Set(Description); ++ BridgeStream = UActorBlueprintFunctionLibrary::RetrieveActorAttributeToString( ++ TEXT("moq_bridge_stream"), ++ Description.Variations, ++ TEXT("")); + } + + ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitializer) +@@ -31,6 +48,19 @@ + void ASceneCaptureCamera::BeginPlay() + { + Super::BeginPlay(); ++ if (BridgeStream.IsEmpty()) ++ { ++ return; ++ } ++ FString Error; ++ Bridge = IMoqBridgeCamera::Open(BridgeStream, *CaptureRenderTarget, Error); ++ if (!Bridge.IsValid()) ++ { ++ // Refuse the spawn: a bridge camera that cannot reach the bridge would ++ // otherwise sit in the world producing nothing. ++ UE_LOG(LogCarla, Error, TEXT("MoQ bridge camera for %s: %s"), *BridgeStream, *Error); ++ Destroy(); ++ } + } + + void ASceneCaptureCamera::OnFirstClientConnected() +@@ -43,9 +73,40 @@ + + void ASceneCaptureCamera::EndPlay(const EEndPlayReason::Type EndPlayReason) + { ++ CloseBridge(); + Super::EndPlay(EndPlayReason); + } + ++void ASceneCaptureCamera::CloseBridge() ++{ ++ if (!Bridge.IsValid()) ++ { ++ return; ++ } ++ // Every queued copy holds the camera; once they have run, this is the last ++ // reference, and dropping it closes the source before freeing its slots. ++ FlushRenderingCommands(); ++ Bridge.Reset(); ++} ++ ++bool ASceneCaptureCamera::UpdateExternalConsumer() ++{ ++ if (!Bridge.IsValid()) ++ { ++ return false; ++ } ++ const FString Error = Bridge->GetError(); ++ if (!Error.IsEmpty()) ++ { ++ // The bridge has told the worker; free the slots now rather than at ++ // destruction. ++ UE_LOG(LogCarla, Error, TEXT("MoQ bridge camera for %s stopped: %s"), *BridgeStream, *Error); ++ CloseBridge(); ++ return false; ++ } ++ return Bridge->IsWanted(); ++} ++ + void ASceneCaptureCamera::PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaSeconds) + { + TRACE_CPUPROFILER_EVENT_SCOPE(ASceneCaptureCamera::PostPhysTick); +@@ -62,6 +123,19 @@ + TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*ProfilerText); + } + ); ++ if (!BridgeStream.IsEmpty()) ++ { ++ // Pixels stay on the GPU: the capture renders into the target, and the ++ // bridge copies it out on the same queue. A camera whose bridge has ++ // stopped sends clients nothing either. ++ if (Bridge.IsValid() && HasActorBegunPlay() && !IsPendingKill()) ++ { ++ EnqueueRenderSceneImmediate(); ++ const double Seconds = GetEpisode().GetElapsedGameTime(); ++ Bridge->Capture(*CaptureRenderTarget, FCarlaEngine::GetFrameCounter(), uint64(Seconds * 1e6 + 0.5)); ++ } ++ return; ++ } + FPixelReader::SendPixelsInRenderThread(*this); + } + diff --git a/demo/carla/sim/patches/build.sh b/demo/carla/sim/patches/build.sh new file mode 100755 index 00000000000..3cfd7a9e464 --- /dev/null +++ b/demo/carla/sim/patches/build.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# Build the CARLA simulator image the worker needs from source: clean CARLA plus +# rpc-idle-wait.patch and the GPU bridge camera, on the engine plus its +# timeline-semaphore patch, compiled in a rootless Ubuntu 22.04 container, with +# the bridge library beside it, overlaid onto the published image. Prints the +# local tag to pin as CARLA_IMAGE. +# +# Needs the Epic-gated CarlaUnreal/UnrealEngine repo through `gh`, and about +# 40 GB. Re-running resumes: sources, the engine's dependency fetch, and +# every compiled step are kept in the workspace, which is deliberately not /tmp. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# The repository root, mounted read-only into both build containers: the bridge +# crate is a workspace member, and compile.sh reads the plugin and its header. +repo="$(cd "$here/../../../.." && pwd)" +work="${CARLA_BUILD:-$HOME/.cache/moq-carla-build}" + +carla_rev=294096eb1c38eabf246e4f3a9cdab704e33a7f4c +carla_release=0.9.16 +engine_rev=e9d9e60c85f643e10eeb03f42f61554d18dcb30f +builder=localhost/moq-carla-builder:22.04 +# The bridge library runs inside the published image, Ubuntu 20.04 with glibc +# 2.31, so it is built on Debian bullseye, which has the same glibc, with the +# image's own toolchain rather than the repository's patch-level pin. Not the +# slim image: the workspace unifies openh264 into moq-video, which needs g++. +rust=docker.io/library/rust:1.98.0-bullseye@sha256:58643a517df55089a44540d827eb9bfd8d5f121c249767be6e25f24b68c0563d + +# The build may share its host with a running simulator. It runs at idle CPU and +# I/O priority, and the memory cap makes an out-of-memory kill land in the build. +ninja_jobs="${NINJA_JOBS:-12}" +ue_jobs="${UE_JOBS:-10}" +memory="${BUILD_MEMORY:-36g}" + +mkdir -p "$work/logs" "$work/home" "$work/bridge" "$work/out" + +bash "$here/checkout.sh" "$work/carla" https://github.com/carla-simulator/carla.git "$carla_rev" +# CARLA names its version after a `ue4/` branch and otherwise after the +# short hash, which clients refuse as a version mismatch. Local edits survive. +git -C "$work/carla" checkout -q -B "ue4/$carla_release" +# Epic-gated: GitHub serves it only to accounts linked to an Epic account. +bash "$here/checkout.sh" "$work/engine" https://github.com/CarlaUnreal/UnrealEngine.git "$engine_rev" \ + -c credential.helper= -c 'credential.helper=!gh auth git-credential' + +podman build -q -t "$builder" -f "$here/builder.Containerfile" "$here" >/dev/null + +log="$work/logs/compile-$(date -u +%Y%m%dT%H%M%SZ).log" +echo "build: compiling the bridge library, log in $log" >&2 +podman run --rm --name moq-carla-bridge-build \ + --userns=keep-id --security-opt label=disable --memory="$memory" \ + -e CARGO_HOME=/work/bridge/cargo -e CARGO_TARGET_DIR=/work/bridge/target \ + -e RUSTUP_TOOLCHAIN=1.98.0 -e CARGO_BUILD_JOBS="$ninja_jobs" \ + -v "$work:/work" -v "$repo:/repo:ro" -w /repo \ + "$rust" nice -n 19 cargo build --locked --release -p moq-carla-bridge 2>&1 | tee "$log" >&2 +cp "$work/bridge/target/release/libcarla_bridge.so" "$work/out/" + +echo "build: compiling CARLA, log in $log" >&2 +# label=disable: relabeling the workspace for SELinux would walk tens of GB. +podman run --rm --name moq-carla-build \ + --userns=keep-id --security-opt label=disable --memory="$memory" \ + -e HOME=/work/home -e CARLA_RELEASE="$carla_release" \ + -e NINJA_JOBS="$ninja_jobs" -e UE_JOBS="$ue_jobs" \ + -v "$work:/work" -v "$repo:/repo:ro" \ + "$builder" nice -n 19 ionice -c3 bash /repo/demo/carla/sim/patches/compile.sh 2>&1 | tee -a "$log" >&2 + +sha="$(sha256sum "$work/out/CarlaUE4-Linux-Shipping" | cut -d' ' -f1)" +bridge_sha="$(sha256sum "$work/out/libcarla_bridge.so" | cut -d' ' -f1)" +tag="localhost/moq-carla:$carla_release-bridge-${sha:0:12}-${bridge_sha:0:12}" +podman build -q -t "$tag" --label "moq.carla.shipping-sha256=$sha" \ + --label "moq.carla.bridge-sha256=$bridge_sha" \ + -f "$here/runtime.Containerfile" "$work/out" >/dev/null +echo "build: $tag (CarlaUE4-Linux-Shipping sha256 $sha, libcarla_bridge.so sha256 $bridge_sha)" >&2 +echo "$tag" diff --git a/demo/carla/sim/patches/builder.Containerfile b/demo/carla/sim/patches/builder.Containerfile new file mode 100644 index 00000000000..db4fb380ca9 --- /dev/null +++ b/demo/carla/sim/patches/builder.Containerfile @@ -0,0 +1,16 @@ +# The CARLA 0.9.16 source builder: build.sh runs compile.sh in it. The engine +# brings its own clang 10 SDK and mono; these are what CARLA's Setup.sh and the +# engine's scripts still expect from the host. +FROM docker.io/library/ubuntu:22.04 + +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + autoconf automake build-essential ca-certificates cmake curl g++-12 git git-lfs \ + libjpeg-dev libpng-dev libsdl2-dev libtiff5-dev libtinfo5 libtool libvulkan1 libxml2 \ + ninja-build patch pkg-config python3 python3-dev python3-distro python3-pip \ + python3-setuptools python3-wheel rsync sudo unzip wget xz-utils zip \ + && rm -rf /var/lib/apt/lists/* + +# CARLA's scripts call bare `ninja`, which defaults to a job per core plus two. +# That is more clang processes than the build's memory limit holds. +RUN printf '#!/bin/sh\nexec /usr/bin/ninja -j "${NINJA_JOBS:?}" "$@"\n' >/usr/local/bin/ninja \ + && chmod +x /usr/local/bin/ninja diff --git a/demo/carla/sim/patches/checkout.sh b/demo/carla/sim/patches/checkout.sh new file mode 100755 index 00000000000..30ecacc31ff --- /dev/null +++ b/demo/carla/sim/patches/checkout.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# A shallow checkout of exactly one commit, for build.sh. A checkout already at +# that commit is left alone so a re-run keeps its build outputs. The fetch lands +# in a staging directory renamed into place only once it succeeds, so a failed +# fetch (no Epic authorization, a dropped connection) leaves nothing that blocks +# the next attempt. +set -euo pipefail + +dir="${1:?usage: checkout.sh [git-config-args...]}" +url="${2:?usage: checkout.sh [git-config-args...]}" +rev="${3:?usage: checkout.sh [git-config-args...]}" +shift 3 + +if [[ "$(git -C "$dir" rev-parse HEAD 2>/dev/null)" == "$rev" ]]; then + exit 0 +fi +if [[ -e "$dir" ]]; then + echo "checkout: $dir exists but is not at $rev; move it aside" >&2 + exit 1 +fi +staging="$dir.partial" +rm -rf "$staging" +git init -q "$staging" +git -C "$staging" "$@" fetch --depth 1 "$url" "$rev" +git -C "$staging" checkout -q --detach FETCH_HEAD +mv "$staging" "$dir" diff --git a/demo/carla/sim/patches/compile.sh b/demo/carla/sim/patches/compile.sh new file mode 100755 index 00000000000..cd2835720a3 --- /dev/null +++ b/demo/carla/sim/patches/compile.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +# Compile the CARLA Shipping executable: the RPC idle wait and the GPU bridge +# camera. Runs inside the builder container that build.sh starts, with the +# durable workspace at /work and this repository at /repo; see README.md. +# Every step is safe to re-run: the engine and CARLA scripts are incremental, +# and the two network-heavy engine steps leave a stamp. +set -euo pipefail + +engine=/work/engine +carla=/work/carla +stamps=/work/stamps +patches=/repo/demo/carla/sim/patches +project="$carla/Unreal/CarlaUE4" +mkdir -p "$stamps" + +export UE4_ROOT="$engine" +export CARLA_BUILD_NO_COLOR=1 + +step() { + echo "compile: $* ($(date -u +%FT%TZ))" >&2 +} + +# The engine carries one patch: the timeline-semaphore feature the bridge +# camera's slots need. Nothing else may be compiled into it. +step "preparing engine sources" +bash "$patches/sources.sh" "$engine" "$patches/engine-timeline-semaphore.patch" + +# Engine dependencies. The top-level Setup.sh passes --prompt, which combined +# with --force silently skips the fetch; call the fetcher directly. +if [[ ! -e "$stamps/engine-deps" ]]; then + step "fetching engine dependencies" + bash "$engine/Engine/Build/BatchFiles/Linux/GitDependencies.sh" --force \ + --exclude=Win32 --exclude=Win64 --exclude=Mac --exclude=Android \ + --exclude=IOS --exclude=TVOS --exclude=HoloLens "$project/Config/OptionalModules.ini" +python3 "$carla/Util/BuildTools/enable_simready_to_uproject.py" -f="$project/CarlaUE4.uproject" -p=MDL +python3 "$carla/Util/BuildTools/enable_simready_to_uproject.py" -f="$project/CarlaUE4.uproject" -p=SimReady +python3 "$carla/Util/BuildTools/enable_simready_to_uproject.py" \ + -f="$project/Plugins/CarlaTools/CarlaTools.uplugin" -p=SimReady +python3 "$carla/Util/BuildTools/enable_carsim_to_uproject.py" -f="$project/CarlaUE4.uproject" + +step "building CARLA dependencies" +bash "$carla/Util/BuildTools/Setup.sh" --python-version=3.10 +# Setup.sh generates the version the server reports to clients. +grep -Fq "return \"${CARLA_RELEASE:?}\";" "$carla/LibCarla/source/carla/Version.h" + +# The server build installs the patched rpc/Server.h into the plugin's +# CarlaDependencies, which is the copy Unreal compiles. +step "building LibCarla" +bash "$carla/Util/BuildTools/BuildLibCarla.sh" --server --release +installed="$project/Plugins/Carla/CarlaDependencies/include/carla/rpc/Server.h" +if ! cmp "$carla/LibCarla/source/carla/rpc/Server.h" "$installed"; then + echo "compile: $installed does not match the patched source" >&2 + exit 1 +fi +grep -Fq make_work_guard "$installed" + +# The RPC suite lives in the client configuration, which builds against the same +# header. The patch's regression fails without it. +step "testing LibCarla RPC" +bash "$carla/Util/BuildTools/BuildLibCarla.sh" --client --release +"$carla/PythonAPI/carla/dependencies/test/libcarla_test_client_release" --gtest_filter='rpc.*' + +step "building OSM2ODR and StreetMap" +bash "$carla/Util/BuildTools/BuildOSM2ODR.sh" --build +bash "$carla/Util/BuildTools/BuildUE4Plugins.sh" --build + +step "building CarlaUE4 Shipping" +( + cd "$engine" + bash Engine/Build/BatchFiles/Linux/Build.sh CarlaUE4 Linux Shipping \ + -Project="$project/CarlaUE4.uproject" -MaxParallelActions="${UE_JOBS:?}" +) + +# Everything the runtime image overlays onto the published one. +out=/work/out +mkdir -p "$out" +# The .sym is the executable's crash-log symbol table: the published one would +# name the wrong functions. +cp "$project/Binaries/Linux/CarlaUE4-Linux-Shipping" \ + "$project/Binaries/Linux/CarlaUE4-Linux-Shipping.sym" "$out/" +# Carla.uplugin lists the MoqBridge module, which is what loads it before +# the RHI. +cp "$project/Config/OptionalModules.ini" "$project/CarlaUE4.uproject" \ + "$project/Plugins/CarlaTools/CarlaTools.uplugin" "$project/Plugins/Carla/Carla.uplugin" "$out/" +step "done: $(sha256sum "$out/CarlaUE4-Linux-Shipping")" diff --git a/demo/carla/sim/patches/engine-timeline-semaphore.patch b/demo/carla/sim/patches/engine-timeline-semaphore.patch new file mode 100644 index 00000000000..8adb4b0fbc1 --- /dev/null +++ b/demo/carla/sim/patches/engine-timeline-semaphore.patch @@ -0,0 +1,22 @@ +diff --git a/Engine/Source/Runtime/VulkanRHI/Private/VulkanDevice.cpp b/Engine/Source/Runtime/VulkanRHI/Private/VulkanDevice.cpp +--- a/Engine/Source/Runtime/VulkanRHI/Private/VulkanDevice.cpp ++++ b/Engine/Source/Runtime/VulkanRHI/Private/VulkanDevice.cpp +@@ -353,6 +353,18 @@ + } + #endif + ++ // VK_KHR_timeline_semaphore is useless without its feature, and a plugin ++ // that enables the extension through VulkanRHIBridge has no way to add the ++ // feature to this chain itself. ++ VkPhysicalDeviceTimelineSemaphoreFeaturesKHR TimelineSemaphoreFeatures; ++ if (DeviceExtensions.ContainsByPredicate([](const ANSICHAR* Name) { return FCStringAnsi::Strcmp(Name, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME) == 0; })) ++ { ++ ZeroVulkanStruct(TimelineSemaphoreFeatures, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR); ++ TimelineSemaphoreFeatures.timelineSemaphore = VK_TRUE; ++ TimelineSemaphoreFeatures.pNext = const_cast(DeviceInfo.pNext); ++ DeviceInfo.pNext = &TimelineSemaphoreFeatures; ++ } ++ + // Create the device + VkResult Result = VulkanRHI::vkCreateDevice(Gpu, &DeviceInfo, VULKAN_CPU_ALLOCATOR, &Device); + if (Result == VK_ERROR_INITIALIZATION_FAILED) diff --git a/demo/carla/sim/patches/rpc-idle-wait.patch b/demo/carla/sim/patches/rpc-idle-wait.patch new file mode 100644 index 00000000000..2f7f642838d --- /dev/null +++ b/demo/carla/sim/patches/rpc-idle-wait.patch @@ -0,0 +1,40 @@ +diff --git a/LibCarla/source/carla/rpc/Server.h b/LibCarla/source/carla/rpc/Server.h +index 69dc6f8..f6fab6d 100644 +--- a/LibCarla/source/carla/rpc/Server.h ++++ b/LibCarla/source/carla/rpc/Server.h +@@ -11,6 +11,7 @@ + #include "carla/rpc/Metadata.h" + #include "carla/rpc/Response.h" + ++#include + #include + #include + +@@ -56,6 +57,9 @@ namespace rpc { + TRACE_CPUPROFILER_EVENT_SCOPE_STR(__FUNCTION__); + #include + #endif // LIBCARLA_INCLUDED_FROM_UE4 ++ // Keep the slice waiting for posted RPCs when its queue is empty. ++ // Otherwise the synchronous engine tick loop busy-spins between cues. ++ auto work = boost::asio::make_work_guard(_sync_io_context); + _sync_io_context.reset(); + _sync_io_context.run_for(duration.to_chrono()); + } +diff --git a/LibCarla/source/test/client/test_rpc.cpp b/LibCarla/source/test/client/test_rpc.cpp +index e007611..480e20c 100644 +--- a/LibCarla/source/test/client/test_rpc.cpp ++++ b/LibCarla/source/test/client/test_rpc.cpp +@@ -62,3 +62,13 @@ TEST(rpc, server_bind_sync_run_on_game_thread) { + std::cout << "game thread: run " << i << " slices.\n"; + ASSERT_TRUE(done); + } ++ ++TEST(rpc, idle_sync_slice_waits_for_work) { ++ Server server(TESTING_PORT); ++ for (auto attempt = 0; attempt < 2; ++attempt) { ++ const auto start = std::chrono::steady_clock::now(); ++ server.SyncRunFor(20ms); ++ // A generous lower bound separates waiting from an empty-queue return. ++ EXPECT_GE(std::chrono::steady_clock::now() - start, 10ms); ++ } ++} diff --git a/demo/carla/sim/patches/runtime.Containerfile b/demo/carla/sim/patches/runtime.Containerfile new file mode 100644 index 00000000000..b78993bec5a --- /dev/null +++ b/demo/carla/sim/patches/runtime.Containerfile @@ -0,0 +1,12 @@ +# The published 0.9.16 image's cooked assets with the source-built executable, +# its crash-log symbols, and the GPU bridge library it loads. +# The config files carry the build's optional modules, which differ from the +# published image's: without them, the executable looks for plugins it lacks. +# Carla.uplugin lists the MoqBridge module. +FROM docker.io/carlasim/carla@sha256:aaf1df22702780ece072069e23d03c4879b002ae028c79744b09c4c7ddbae953 + +COPY --chown=carla:carla CarlaUE4-Linux-Shipping CarlaUE4-Linux-Shipping.sym libcarla_bridge.so /workspace/CarlaUE4/Binaries/Linux/ +COPY --chown=carla:carla OptionalModules.ini /workspace/CarlaUE4/Config/ +COPY --chown=carla:carla CarlaUE4.uproject /workspace/CarlaUE4/ +COPY --chown=carla:carla CarlaTools.uplugin /workspace/CarlaUE4/Plugins/CarlaTools/ +COPY --chown=carla:carla Carla.uplugin /workspace/CarlaUE4/Plugins/Carla/ diff --git a/demo/carla/sim/patches/sources.sh b/demo/carla/sim/patches/sources.sh new file mode 100755 index 00000000000..702b40cb598 --- /dev/null +++ b/demo/carla/sim/patches/sources.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +# Put a checkout (CARLA or the engine) into the build's source state: its +# pinned commit plus the given patches, overlays and scripted edits, and +# nothing else. A cached checkout can carry other edits at the same commit +# (an experiment, a hand edit), and those would ship inside an +# image labelled as this build, so they are refused rather than compiled. +# +# sources.sh [--scripted ]... [--overlay ]... ... +# +# --scripted: a file the build rewrites itself later, reset here first. +# --overlay: a directory of this repository kept identical at , which the +# checkout does not track. +set -euo pipefail + +usage="usage: sources.sh [--scripted ]... [--overlay ]... ..." +checkout="${1:?$usage}" +shift +scripted=() +overlay_dirs=() +overlay_dests=() +patches=() +while (($#)); do + case "$1" in + --scripted) + scripted+=("${2:?$usage}") + shift 2 + ;; + --overlay) + overlay_dirs+=("$(cd "${2:?$usage}" && pwd)") + overlay_dests+=("${3:?$usage}") + shift 3 + ;; + *) + patches+=("$(cd "$(dirname "$1")" && pwd)/$(basename "$1")") + shift + ;; + esac +done +if ((${#patches[@]} == 0)); then + echo "$usage" >&2 + exit 1 +fi + +patched=() +for patch in "${patches[@]}"; do + while read -r _ _ file; do + patched+=("$file") + done < <(git -C "$checkout" apply --numstat "$patch") +done + +# Unreal Build Tool compiles every source file under a module, tracked or not, +# so untracked sources count as edits too, except inside an overlay. +under_overlay() { + local dest + for dest in "${overlay_dests[@]}"; do + [[ "$1" == "$dest"/* ]] && return 0 + done + return 1 +} +unexpected=$({ + git -C "$checkout" diff --name-only HEAD | + grep -vxF -f <(printf '%s\n' "${patched[@]}" "${scripted[@]}") || true + git -C "$checkout" ls-files --others --exclude-standard | + { grep -E '\.(c|cc|cpp|cxx|h|hh|hpp|hxx|inl|ipp|cs)$' || true; } | + while read -r file; do under_overlay "$file" || echo "$file"; done +}) +if [[ -n "$unexpected" ]]; then + printf 'sources: %s has edits this build does not make:\n%s\n' "$checkout" "$unexpected" >&2 + exit 1 +fi + +if ((${#scripted[@]})); then + git -C "$checkout" checkout -q HEAD -- "${scripted[@]}" +fi + +# Each patch applies once, onto files it finds pristine, so a checkout cached +# by an earlier build with fewer patches takes the new ones. +for patch in "${patches[@]}"; do + mapfile -t files < <(git -C "$checkout" apply --numstat "$patch" | cut -f3) + if ((${#files[@]} == 0)); then + echo "sources: $patch changes no file" >&2 + exit 1 + fi + if git -C "$checkout" diff --quiet HEAD -- "${files[@]}"; then + git -C "$checkout" apply "$patch" + fi +done +# The patched files must be exactly the commit plus the patches: rebuild that +# from the commit and compare, which also refuses a hand edit on top. +expected=$(mktemp -d) +trap 'rm -rf "$expected"' EXIT +# Its own repository, so `git apply` works relative to it even when the +# temporary directory sits inside another checkout. +git init -q "$expected" +for file in "${patched[@]}"; do + mkdir -p "$expected/$(dirname "$file")" + git -C "$checkout" show "HEAD:$file" >"$expected/$file" +done +(cd "$expected" && for patch in "${patches[@]}"; do git apply "$patch"; done) +for file in "${patched[@]}"; do + if ! cmp -s "$expected/$file" "$checkout/$file"; then + echo "sources: $checkout/$file differs from its patch" >&2 + exit 1 + fi +done + +# Overlays are synced by content, so an unchanged file keeps its timestamp and +# Unreal does not rebuild it. +for index in "${!overlay_dirs[@]}"; do + dir="${overlay_dirs[$index]}" + dest="$checkout/${overlay_dests[$index]}" + if git -C "$checkout" ls-files --error-unmatch "${overlay_dests[$index]}" >/dev/null 2>&1; then + echo "sources: overlay destination ${overlay_dests[$index]} is tracked by $checkout" >&2 + exit 1 + fi + mkdir -p "$dest" + while IFS= read -r -d '' file; do + mkdir -p "$dest/$(dirname "$file")" + cmp -s "$dir/$file" "$dest/$file" || cp "$dir/$file" "$dest/$file" + done < <(cd "$dir" && find . -type f -print0) + while IFS= read -r -d '' file; do + [[ -e "$dir/$file" ]] || rm "$dest/$file" + done < <(cd "$dest" && find . -type f -print0) +done diff --git a/demo/carla/sim/patches/sources.test.sh b/demo/carla/sim/patches/sources.test.sh new file mode 100755 index 00000000000..33a7180ae3d --- /dev/null +++ b/demo/carla/sim/patches/sources.test.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +# Offline test for sources.sh and checkout.sh against throwaway git repos: a +# cached checkout with edits the build does not make is refused, the patches +# apply once and re-run cleanly, an overlay is kept identical, and a failed +# fetch leaves nothing behind that blocks the next attempt. +set -euo pipefail +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' EXIT +export GIT_AUTHOR_NAME=t GIT_AUTHOR_EMAIL=t@t GIT_COMMITTER_NAME=t GIT_COMMITTER_EMAIL=t@t + +fail() { + echo "sources.test: $*" >&2 + exit 1 +} + +# A miniature CARLA tree holding the files the patch and the build touch. +repo="$tmp/carla" +git init -q "$repo" +mkdir -p "$repo/LibCarla/source/carla/rpc" "$repo/LibCarla/source/test/client" \ + "$repo/Util/BuildTools" "$repo/Unreal/CarlaUE4/Plugins/CarlaTools" "$repo/Unreal/CarlaUE4/Source" +printf 'void SyncRunFor() {\n run_for();\n}\n' >"$repo/LibCarla/source/carla/rpc/Server.h" +printf 'TEST(rpc, a) {}\n' >"$repo/LibCarla/source/test/client/test_rpc.cpp" +printf 'url=old\n' >"$repo/Util/BuildTools/Setup.sh" +printf '{}\n' >"$repo/Unreal/CarlaUE4/CarlaUE4.uproject" +printf '{}\n' >"$repo/Unreal/CarlaUE4/Plugins/CarlaTools/CarlaTools.uplugin" +printf 'sensor\n' >"$repo/Unreal/CarlaUE4/Source/Sensor.cpp" +git -C "$repo" add -A +git -C "$repo" commit -qm base +rev=$(git -C "$repo" rev-parse HEAD) + +# The patches under test: one touches the RPC files, the other the sensor. +work="$tmp/work" +git clone -q "$repo" "$work" +printf 'void SyncRunFor() {\n guard();\n run_for();\n}\n' >"$work/LibCarla/source/carla/rpc/Server.h" +printf 'TEST(rpc, a) {}\nTEST(rpc, idle) {}\n' >"$work/LibCarla/source/test/client/test_rpc.cpp" +patch="$tmp/rpc.patch" +git -C "$work" diff >"$patch" +git -C "$work" checkout -q -- . +printf 'sensor\nbridge\n' >"$work/Unreal/CarlaUE4/Source/Sensor.cpp" +camera="$tmp/camera.patch" +git -C "$work" diff >"$camera" +rm -rf "$work" + +# The plugin module the build copies into the checkout. +plugin="$tmp/plugin" +mkdir -p "$plugin/Private" +printf 'module\n' >"$plugin/Plugin.Build.cs" +printf 'camera\n' >"$plugin/Private/Camera.cpp" +dest=Unreal/CarlaUE4/Plugins/MoqBridge + +fresh() { + rm -rf "$tmp/co" + git clone -q "$repo" "$tmp/co" +} + +sources() { + bash "$here/sources.sh" "$tmp/co" --scripted Util/BuildTools/Setup.sh \ + --scripted Unreal/CarlaUE4/CarlaUE4.uproject \ + --scripted Unreal/CarlaUE4/Plugins/CarlaTools/CarlaTools.uplugin \ + --overlay "$plugin" "$dest" "$@" +} + +# Pristine: the patches apply, and a re-run with the scripted edits in place passes. +# Run from a subdirectory of another repository, where a bare `git apply` +# silently skips every path outside that subdirectory. +fresh +(cd "$repo/Util" && sources "$patch" "$camera") +grep -q guard "$tmp/co/LibCarla/source/carla/rpc/Server.h" || fail "patch was not applied" +grep -q bridge "$tmp/co/Unreal/CarlaUE4/Source/Sensor.cpp" || fail "second patch was not applied" +cmp -s "$plugin/Private/Camera.cpp" "$tmp/co/$dest/Private/Camera.cpp" || fail "overlay was not copied" +printf 'url=new\n' >"$tmp/co/Util/BuildTools/Setup.sh" +touch -d 2000-01-01 "$tmp/co/$dest/Plugin.Build.cs" +sources "$patch" "$camera" +grep -qx 'url=old' "$tmp/co/Util/BuildTools/Setup.sh" || fail "scripted file was not reset" +# An unchanged overlay file keeps its timestamp, so Unreal does not rebuild it. +[[ "$(stat -c %Y "$tmp/co/$dest/Plugin.Build.cs")" == "$(date -d 2000-01-01 +%s)" ]] || + fail "an unchanged overlay file was rewritten" + +# The overlay follows its source: a changed file is copied, a removed one goes. +printf 'camera v2\n' >"$plugin/Private/Camera.cpp" +printf 'stale\n' >"$tmp/co/$dest/Private/Stale.cpp" +sources "$patch" "$camera" +grep -qx 'camera v2' "$tmp/co/$dest/Private/Camera.cpp" || fail "a changed overlay file was not copied" +[[ ! -e "$tmp/co/$dest/Private/Stale.cpp" ]] || fail "a file gone from the overlay was kept" + +# A checkout cached by a build with fewer patches takes the new one. +fresh +sources "$patch" +sources "$patch" "$camera" +grep -q bridge "$tmp/co/Unreal/CarlaUE4/Source/Sensor.cpp" || fail "a new patch was not applied to a cached checkout" + +# Without the camera patch, its edit is one the build does not make. +if bash "$here/sources.sh" "$tmp/co" --scripted Util/BuildTools/Setup.sh \ + --scripted Unreal/CarlaUE4/CarlaUE4.uproject \ + --scripted Unreal/CarlaUE4/Plugins/CarlaTools/CarlaTools.uplugin "$patch" 2>"$tmp/err"; then + fail "accepted a patch it was not given" +fi +grep -q Sensor.cpp "$tmp/err" || fail "refusal did not name the patched file" + +# An edit outside what the build makes (an experiment left in a cached checkout) is refused. +fresh +printf 'readback\n' >>"$tmp/co/Unreal/CarlaUE4/Source/Sensor.cpp" +if sources "$patch" 2>"$tmp/err"; then + fail "accepted an unrelated source edit" +fi +grep -q Sensor.cpp "$tmp/err" || fail "refusal did not name the edited file" + +# So is an untracked source file, which Unreal would compile all the same. +fresh +printf 'readback\n' >"$tmp/co/Unreal/CarlaUE4/Source/Readback.cpp" +if sources "$patch" "$camera" 2>"$tmp/err"; then + fail "accepted an untracked source file" +fi +grep -q Readback.cpp "$tmp/err" || fail "refusal did not name the untracked file" + +# A patched file carrying more than the patch is refused too. +fresh +sources "$patch" "$camera" +printf '// extra\n' >>"$tmp/co/LibCarla/source/carla/rpc/Server.h" +if sources "$patch" "$camera" 2>/dev/null; then + fail "accepted a patched file with extra edits" +fi + +# A failed fetch leaves nothing behind, so the next attempt succeeds. +if bash "$here/checkout.sh" "$tmp/fetched" "file://$tmp/missing" "$rev" 2>/dev/null; then + fail "fetch from a missing repository succeeded" +fi +[[ ! -e "$tmp/fetched" ]] || fail "a failed fetch left $tmp/fetched behind" +bash "$here/checkout.sh" "$tmp/fetched" "file://$repo" "$rev" +[[ "$(git -C "$tmp/fetched" rev-parse HEAD)" == "$rev" ]] || fail "retry did not check out $rev" +# Already at the commit: left alone. +bash "$here/checkout.sh" "$tmp/fetched" "file://$tmp/missing" "$rev" + +echo "sources.test.sh: ok" diff --git a/demo/carla/sim/plugin/MoqBridge/MoqBridge.Build.cs b/demo/carla/sim/plugin/MoqBridge/MoqBridge.Build.cs new file mode 100644 index 00000000000..cc31a29f813 --- /dev/null +++ b/demo/carla/sim/plugin/MoqBridge/MoqBridge.Build.cs @@ -0,0 +1,26 @@ +// The CARLA demo's GPU video bridge, Unreal side: a module of the Carla plugin, +// copied into it by demo/carla/sim/patches/compile.sh. + +using System.IO; +using UnrealBuildTool; + +public class MoqBridge : ModuleRules +{ + public MoqBridge(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] { "Core", "Engine" }); + PrivateDependencyModuleNames.AddRange(new string[] { "RHI", "RenderCore", "VulkanRHI" }); + + // A capture records into Unreal's own Vulkan command buffers and reads its + // layout tracking, which only the RHI's private headers declare. They link + // because the Shipping target is monolithic. + string VulkanRHI = Path.Combine(EngineDirectory, "Source", "Runtime", "VulkanRHI", "Private"); + PrivateIncludePaths.AddRange(new string[] { + VulkanRHI, + Path.Combine(VulkanRHI, Target.Platform.ToString()), + }); + AddEngineThirdPartyPrivateStaticDependencies(Target, "Vulkan"); + } +} diff --git a/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeCamera.cpp b/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeCamera.cpp new file mode 100644 index 00000000000..49843cd58f0 --- /dev/null +++ b/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeCamera.cpp @@ -0,0 +1,609 @@ +// See MoqBridgeCamera.h. The protocol with the bridge library is the one +// carla_bridge.h documents, and demo/carla/bridge/tests/standin is its reference +// producer: this follows it step for step on Unreal's device and queue. + +#include "MoqBridgeCamera.h" + +#include "Engine/TextureRenderTarget2D.h" +#include "HAL/PlatformProcess.h" +#include "Misc/Paths.h" +#include "RenderUtils.h" +#include "RenderingThread.h" +#include "TextureResource.h" + +#include "VulkanRHIPrivate.h" +#include "VulkanContext.h" +#include "VulkanPendingState.h" + +#include "MoqBridgeSettings.h" +#include "carla_bridge.h" + +#include +#include +#include + +DEFINE_LOG_CATEGORY_STATIC(LogMoqBridge, Log, All); + +namespace +{ + /// Enough to render one picture while the bridge still converts the last + /// two; with none idle, a picture is dropped before anything encodes it. + constexpr uint32 SLOTS = 3; + + /// The library's entry points. It is loaded, not linked, so a stock launch + /// never needs it and a missing one is an error naming the path. + struct FApi + { + decltype(&carla_bridge_source_open) Open = nullptr; + decltype(&carla_bridge_source_import) Import = nullptr; + decltype(&carla_bridge_source_wanted) Wanted = nullptr; + decltype(&carla_bridge_source_acquire) Acquire = nullptr; + decltype(&carla_bridge_source_submit) Submit = nullptr; + decltype(&carla_bridge_source_cancel) Cancel = nullptr; + decltype(&carla_bridge_source_fail) Fail = nullptr; + decltype(&carla_bridge_source_close) Close = nullptr; + decltype(&carla_bridge_error) Error = nullptr; + + FString LastError() const + { + return UTF8_TO_TCHAR(Error()); + } + }; + + template + bool Resolve(void *Library, const char *Name, T &Out, FString &OutError) + { + Out = reinterpret_cast(dlsym(Library, Name)); + if (Out == nullptr) + { + OutError = FString::Printf(TEXT("the bridge library has no %s"), UTF8_TO_TCHAR(Name)); + return false; + } + return true; + } + + /// Loaded once per process, from `-moq-bridge-library=` or beside the + /// executable. Never unloaded: the bridge owns threads for the process's + /// life. + const FApi *LoadApi(FString &OutError) + { + static FCriticalSection Lock; + static bool bLoaded = false; + static FApi Api; + static FString Error; + + FScopeLock Scope(&Lock); + if (!bLoaded) + { + bLoaded = true; + FString Path; + if (!FParse::Value(FCommandLine::Get(), TEXT("moq-bridge-library="), Path)) + { + Path = FPaths::Combine(FPlatformProcess::BaseDir(), TEXT("libcarla_bridge.so")); + } + void *Library = dlopen(TCHAR_TO_UTF8(*Path), RTLD_NOW | RTLD_LOCAL); + if (Library == nullptr) + { + Error = FString::Printf(TEXT("load %s: %s"), *Path, UTF8_TO_TCHAR(dlerror())); + } + else if ( + !Resolve(Library, "carla_bridge_source_open", Api.Open, Error) || + !Resolve(Library, "carla_bridge_source_import", Api.Import, Error) || + !Resolve(Library, "carla_bridge_source_wanted", Api.Wanted, Error) || + !Resolve(Library, "carla_bridge_source_acquire", Api.Acquire, Error) || + !Resolve(Library, "carla_bridge_source_submit", Api.Submit, Error) || + !Resolve(Library, "carla_bridge_source_cancel", Api.Cancel, Error) || + !Resolve(Library, "carla_bridge_source_fail", Api.Fail, Error) || + !Resolve(Library, "carla_bridge_source_close", Api.Close, Error) || + !Resolve(Library, "carla_bridge_error", Api.Error, Error)) + { + Error = FString::Printf(TEXT("%s: %s"), *Path, *Error); + } + } + if (!Error.IsEmpty()) + { + OutError = Error; + return nullptr; + } + return &Api; + } + + /// Device entry points of the extensions the module enables. The loader + /// returns null for an extension the device was created without, which is + /// how a device missing one is refused here rather than misused. + struct FDeviceApi + { + PFN_vkGetMemoryFdKHR GetMemoryFd = nullptr; + PFN_vkGetSemaphoreFdKHR GetSemaphoreFd = nullptr; + PFN_vkWaitSemaphoresKHR WaitSemaphores = nullptr; + + bool Load(VkDevice Device, FString &OutError) + { + GetMemoryFd = reinterpret_cast( + VulkanRHI::vkGetDeviceProcAddr(Device, "vkGetMemoryFdKHR")); + GetSemaphoreFd = reinterpret_cast( + VulkanRHI::vkGetDeviceProcAddr(Device, "vkGetSemaphoreFdKHR")); + WaitSemaphores = reinterpret_cast( + VulkanRHI::vkGetDeviceProcAddr(Device, "vkWaitSemaphoresKHR")); + if (GetMemoryFd == nullptr || GetSemaphoreFd == nullptr || WaitSemaphores == nullptr) + { + OutError = TEXT("the Vulkan device lacks external memory, external semaphores or timeline " + "semaphores; is the MoqBridge module loaded and the engine patched?"); + return false; + } + return true; + } + }; + + struct FSlot + { + VkImage Image = VK_NULL_HANDLE; + VkDeviceMemory Memory = VK_NULL_HANDLE; + VkSemaphore Timeline = VK_NULL_HANDLE; + /// The last value a submission signals, which teardown waits for. + uint64_t Signaled = 0; + /// Whether the image holds a picture, so is in GENERAL rather than + /// UNDEFINED. Only the RHI thread touches it. + bool bWritten = false; + }; + + class FMoqBridgeCamera final + : public IMoqBridgeCamera, + public TSharedFromThis + { + public: + explicit FMoqBridgeCamera(const FApi &InApi) : Api(InApi) {} + + bool Init(const FString &Socket, const FString &Stream, uint32 Width, uint32 Height, FString &OutError) + { + Device = GVulkanRHI->GetDevice(); + const VkDevice Handle = Device->GetInstanceHandle(); + if (!DeviceApi.Load(Handle, OutError)) + { + return false; + } + + Source = Api.Open( + TCHAR_TO_UTF8(*Socket), + TCHAR_TO_UTF8(*Stream), + Device->GetDeviceIdProperties().deviceUUID, + Device->GetDeviceIdProperties().driverUUID, + Width, + Height, + CARLA_BRIDGE_BGRA, + SLOTS); + if (Source == nullptr) + { + OutError = FString::Printf(TEXT("open %s on %s: %s"), *Stream, *Socket, *Api.LastError()); + return false; + } + + VkPhysicalDeviceMemoryProperties Memory; + VulkanRHI::vkGetPhysicalDeviceMemoryProperties(Device->GetPhysicalHandle(), &Memory); + Slots.SetNum(SLOTS); + for (uint32 Index = 0; Index < SLOTS; ++Index) + { + if (!CreateSlot(Index, Width, Height, Memory, OutError)) + { + OutError = FString::Printf(TEXT("%s slot %u: %s"), *Stream, Index, *OutError); + return false; + } + } + return true; + } + + /// Close before freeing: the bridge returns once its encoders are done + /// with every slot. A copy submitted but never handed over (a failed submit) is + /// waited for through its own timeline, or through the device when even + /// its signal failed. + ~FMoqBridgeCamera() override + { + check(IsInGameThread()); + if (Source != nullptr) + { + Api.Close(Source); + } + if (Device == nullptr) + { + return; + } + const VkDevice Handle = Device->GetInstanceHandle(); + if (bUnsignaledCopy) + { + // Rendering commands are flushed, so nothing else submits meanwhile. + Device->WaitUntilIdle(); + } + for (FSlot &Slot : Slots) + { + if (Slot.Signaled > 0) + { + VkSemaphoreWaitInfoKHR Wait; + ZeroVulkanStruct(Wait, VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR); + Wait.semaphoreCount = 1; + Wait.pSemaphores = &Slot.Timeline; + Wait.pValues = &Slot.Signaled; + const VkResult Result = DeviceApi.WaitSemaphores(Handle, &Wait, UINT64_MAX); + if (Result != VK_SUCCESS) + { + // The device is gone; freeing is all that is left to do. + UE_LOG(LogMoqBridge, Error, TEXT("waiting for a slot's last copy: VkResult %d"), int32(Result)); + } + } + if (Slot.Timeline != VK_NULL_HANDLE) + { + VulkanRHI::vkDestroySemaphore(Handle, Slot.Timeline, nullptr); + } + if (Slot.Image != VK_NULL_HANDLE) + { + VulkanRHI::vkDestroyImage(Handle, Slot.Image, nullptr); + } + if (Slot.Memory != VK_NULL_HANDLE) + { + VulkanRHI::vkFreeMemory(Handle, Slot.Memory, nullptr); + } + } + } + + bool IsWanted() const override + { + return !bFailed.load(std::memory_order_acquire) && Api.Wanted(Source); + } + + FString GetError() const override + { + FScopeLock Scope(&ErrorLock); + return Error; + } + + void Capture(UTextureRenderTarget2D &Target, uint64 Frame, uint64 TimestampUs) override + { + check(IsInGameThread()); + FTextureRenderTargetResource *Resource = Target.GameThread_GetRenderTargetResource(); + if (Resource == nullptr) + { + Fail(TEXT("the render target has no resource")); + return; + } + // The camera rides along, so it outlives every copy still queued. + ENQUEUE_RENDER_COMMAND(MoqBridgeCapture)( + [Camera = AsShared(), Resource, Frame, TimestampUs](FRHICommandListImmediate &RHICmdList) + { + FTexture2DRHIRef Texture = Resource->GetRenderTargetTexture(); + // After everything the render thread has recorded so far, + // including the capture itself, on the thread that submits. + RHICmdList.EnqueueLambda( + [Camera, Texture, Frame, TimestampUs](FRHICommandListImmediate &) + { + Camera->Copy(Texture, Frame, TimestampUs); + }); + }); + } + + private: + bool CreateSlot( + uint32 Index, + uint32 Width, + uint32 Height, + const VkPhysicalDeviceMemoryProperties &Memory, + FString &OutError) + { + const VkDevice Handle = Device->GetInstanceHandle(); + FSlot &Slot = Slots[Index]; + + VkExternalMemoryImageCreateInfo External; + ZeroVulkanStruct(External, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO); + External.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; + VkImageCreateInfo Image; + ZeroVulkanStruct(Image, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO); + Image.pNext = &External; + Image.imageType = VK_IMAGE_TYPE_2D; + Image.format = VK_FORMAT_B8G8R8A8_UNORM; + Image.extent = {Width, Height, 1}; + Image.mipLevels = 1; + Image.arrayLayers = 1; + Image.samples = VK_SAMPLE_COUNT_1_BIT; + Image.tiling = VK_IMAGE_TILING_OPTIMAL; + Image.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT; + Image.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + Image.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + if (!Check(VulkanRHI::vkCreateImage(Handle, &Image, nullptr, &Slot.Image), TEXT("create the image"), OutError)) + { + return false; + } + + VkMemoryRequirements Requirements; + VulkanRHI::vkGetImageMemoryRequirements(Handle, Slot.Image, &Requirements); + int32 Type = -1; + for (uint32 Candidate = 0; Candidate < Memory.memoryTypeCount; ++Candidate) + { + if ((Requirements.memoryTypeBits & (1u << Candidate)) != 0 && + (Memory.memoryTypes[Candidate].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0) + { + Type = int32(Candidate); + break; + } + } + if (Type < 0) + { + OutError = TEXT("no device-local memory type for the image"); + return false; + } + VkMemoryDedicatedAllocateInfo Dedicated; + ZeroVulkanStruct(Dedicated, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO); + Dedicated.image = Slot.Image; + VkExportMemoryAllocateInfo Export; + ZeroVulkanStruct(Export, VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO); + Export.pNext = &Dedicated; + Export.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; + VkMemoryAllocateInfo Allocation; + ZeroVulkanStruct(Allocation, VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); + Allocation.pNext = &Export; + Allocation.allocationSize = Requirements.size; + Allocation.memoryTypeIndex = uint32(Type); + if (!Check(VulkanRHI::vkAllocateMemory(Handle, &Allocation, nullptr, &Slot.Memory), TEXT("allocate the image"), OutError) || + !Check(VulkanRHI::vkBindImageMemory(Handle, Slot.Image, Slot.Memory, 0), TEXT("bind the image"), OutError)) + { + return false; + } + + VkSemaphoreTypeCreateInfoKHR Kind; + ZeroVulkanStruct(Kind, VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR); + Kind.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE_KHR; + Kind.initialValue = 0; + VkExportSemaphoreCreateInfo ExportSemaphore; + ZeroVulkanStruct(ExportSemaphore, VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO); + ExportSemaphore.pNext = &Kind; + ExportSemaphore.handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT; + VkSemaphoreCreateInfo Semaphore; + ZeroVulkanStruct(Semaphore, VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO); + Semaphore.pNext = &ExportSemaphore; + if (!Check(VulkanRHI::vkCreateSemaphore(Handle, &Semaphore, nullptr, &Slot.Timeline), TEXT("create the timeline"), OutError)) + { + return false; + } + + int MemoryFd = -1; + int TimelineFd = -1; + VkMemoryGetFdInfoKHR MemoryInfo; + ZeroVulkanStruct(MemoryInfo, VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR); + MemoryInfo.memory = Slot.Memory; + MemoryInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; + if (!Check(DeviceApi.GetMemoryFd(Handle, &MemoryInfo, &MemoryFd), TEXT("export the image"), OutError)) + { + return false; + } + VkSemaphoreGetFdInfoKHR TimelineInfo; + ZeroVulkanStruct(TimelineInfo, VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR); + TimelineInfo.semaphore = Slot.Timeline; + TimelineInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT; + if (!Check(DeviceApi.GetSemaphoreFd(Handle, &TimelineInfo, &TimelineFd), TEXT("export the timeline"), OutError)) + { + close(MemoryFd); + return false; + } + // Consumes both descriptors whatever it returns. + if (Api.Import(Source, Index, MemoryFd, TimelineFd, Requirements.size, uint32(Type)) != 0) + { + OutError = FString::Printf(TEXT("import: %s"), *Api.LastError()); + return false; + } + return true; + } + + static bool Check(VkResult Result, const TCHAR *What, FString &OutError) + { + if (Result == VK_SUCCESS) + { + return true; + } + OutError = FString::Printf(TEXT("%s: VkResult %d"), What, int32(Result)); + return false; + } + + /// The RHI thread's half: carla_bridge.h's per-frame sequence, recorded + /// into Unreal's active command buffer after the capture. + void Copy(FRHITexture *Texture, uint64 Frame, uint64 TimestampUs) + { + if (bFailed.load(std::memory_order_acquire)) + { + return; + } + uint32 Index = 0; + uint64_t Ready = 0; + const int Acquired = Api.Acquire(Source, &Index, &Ready); + if (Acquired < 0) + { + Fail(FString::Printf(TEXT("acquire: %s"), *Api.LastError())); + return; + } + if (Acquired == 0) + { + // Every slot is still being encoded: drop this picture. + return; + } + FSlot &Slot = Slots[Index]; + + FVulkanCommandListContextImmediate &Context = Device->GetImmediateContext(); + FVulkanCommandBufferManager *Manager = Context.GetCommandBufferManager(); + FVulkanCmdBuffer *CmdBuffer = Manager->GetActiveCmdBuffer(); + if (!CmdBuffer->IsOutsideRenderPass()) + { + Abandon(Index, TEXT("the capture ended inside a render pass")); + return; + } + + // The render target stays in whatever layout Unreal tracks for it: the + // copy moves it to TRANSFER_SRC and back, so the tracking stays true. + const VkImage Target = FVulkanTextureBase::Cast(Texture)->Surface.Image; + FVulkanImageLayout *Tracked = Context.GetLayoutManager().GetFullLayout(Target); + if (Tracked == nullptr || !Tracked->AreAllSubresourcesSameLayout() || + Tracked->MainLayout == VK_IMAGE_LAYOUT_UNDEFINED) + { + Abandon(Index, TEXT("the render target has no single tracked layout")); + return; + } + const VkImageLayout Layout = Tracked->MainLayout; + + VkImageSubresourceRange Range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; + auto Barrier = [&Range](VkImage Image, VkImageLayout From, VkImageLayout To, VkAccessFlags Src, VkAccessFlags Dst) + { + VkImageMemoryBarrier Out; + ZeroVulkanStruct(Out, VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER); + Out.oldLayout = From; + Out.newLayout = To; + Out.srcAccessMask = Src; + Out.dstAccessMask = Dst; + Out.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + Out.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + Out.image = Image; + Out.subresourceRange = Range; + return Out; + }; + const VkCommandBuffer Commands = CmdBuffer->GetHandle(); + // After every earlier use of both images on this queue: the capture + // that wrote the target, and the last copy into the slot. + const VkImageMemoryBarrier Before[] = { + Barrier(Target, Layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT), + Barrier(Slot.Image, Slot.bWritten ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT), + }; + VulkanRHI::vkCmdPipelineBarrier( + Commands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, + 0, nullptr, 0, nullptr, UE_ARRAY_COUNT(Before), Before); + VkImageCopy Region; + FMemory::Memzero(Region); + Region.srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; + Region.dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; + const FIntVector Size = Texture->GetSizeXYZ(); + Region.extent = {uint32(Size.X), uint32(Size.Y), 1}; + VulkanRHI::vkCmdCopyImage( + Commands, Target, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + Slot.Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &Region); + // The slot is left in GENERAL for the encoder; the target goes back to its + // tracked layout for whatever Unreal does with it next. + const VkImageMemoryBarrier After[] = { + Barrier(Target, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, Layout, + 0, VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT), + Barrier(Slot.Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT), + }; + VulkanRHI::vkCmdPipelineBarrier( + Commands, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, + 0, nullptr, 0, nullptr, UE_ARRAY_COUNT(After), After); + Slot.bWritten = true; + + // Unreal's submission cannot signal a timeline value, so an empty one + // follows it on the same queue: a signal covers every command submitted + // before it. + Manager->SubmitActiveCmdBuffer(); + Manager->PrepareForNewActiveCommandBuffer(); + VkTimelineSemaphoreSubmitInfoKHR Timeline; + ZeroVulkanStruct(Timeline, VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR); + Timeline.signalSemaphoreValueCount = 1; + Timeline.pSignalSemaphoreValues = &Ready; + VkSubmitInfo Submit; + ZeroVulkanStruct(Submit, VK_STRUCTURE_TYPE_SUBMIT_INFO); + Submit.pNext = &Timeline; + Submit.signalSemaphoreCount = 1; + Submit.pSignalSemaphores = &Slot.Timeline; + const VkResult Result = VulkanRHI::vkQueueSubmit( + Device->GetGraphicsQueue()->GetHandle(), 1, &Submit, VK_NULL_HANDLE); + if (Result != VK_SUCCESS) + { + // The copy is already on the queue with no timeline value to wait + // for, so teardown waits for the whole device instead. + bUnsignaledCopy = true; + Abandon(Index, FString::Printf(TEXT("signal the slot: VkResult %d"), int32(Result))); + return; + } + Slot.Signaled = Ready; + + if (Api.Submit(Source, Index, Frame, TimestampUs) != 0) + { + Fail(FString::Printf(TEXT("submit: %s"), *Api.LastError())); + } + } + + /// Hand an acquired slot back unused, then stop. + void Abandon(uint32 Index, const FString &Why) + { + if (Api.Cancel(Source, Index) != 0) + { + Fail(FString::Printf(TEXT("%s; cancel: %s"), *Why, *Api.LastError())); + return; + } + Fail(Why); + } + + void Fail(const FString &Why) + { + { + FScopeLock Scope(&ErrorLock); + if (!Error.IsEmpty()) + { + return; + } + Error = Why; + } + bFailed.store(true, std::memory_order_release); + UE_LOG(LogMoqBridge, Error, TEXT("camera stopped: %s"), *Why); + // The worker would otherwise go on waiting for this camera's video. + if (Api.Fail(Source, TCHAR_TO_UTF8(*Why)) != 0) + { + UE_LOG(LogMoqBridge, Error, TEXT("reporting it: %s"), *Api.LastError()); + } + } + + const FApi &Api; + FDeviceApi DeviceApi; + FVulkanDevice *Device = nullptr; + CarlaBridgeSource *Source = nullptr; + TArray Slots; + std::atomic bFailed{false}; + /// A copy reached the queue but its timeline signal did not. Set on the + /// RHI thread, read by the destructor after rendering commands flush. + bool bUnsignaledCopy = false; + mutable FCriticalSection ErrorLock; + FString Error; + }; +} + +TSharedPtr IMoqBridgeCamera::Open( + const FString &Stream, + const UTextureRenderTarget2D &Target, + FString &OutError) +{ + check(IsInGameThread()); + FString Socket; + if (!MoqBridge::GetSocket(Socket)) + { + OutError = TEXT("the simulator was started without -moq-bridge-socket="); + return nullptr; + } + if (GDynamicRHI == nullptr || FCString::Strcmp(GDynamicRHI->GetName(), TEXT("Vulkan")) != 0) + { + OutError = TEXT("the bridge needs the Vulkan RHI"); + return nullptr; + } + if (Target.GetFormat() != PF_B8G8R8A8) + { + OutError = FString::Printf(TEXT("the render target is %s, not B8G8R8A8"), GetPixelFormatString(Target.GetFormat())); + return nullptr; + } + const FApi *Api = LoadApi(OutError); + if (Api == nullptr) + { + return nullptr; + } + // A camera that fails partway is freed by its destructor, which closes + // whatever it registered. + TSharedRef Camera = MakeShared(*Api); + if (!Camera->Init(Socket, Stream, Target.SizeX, Target.SizeY, OutError)) + { + return nullptr; + } + UE_LOG(LogMoqBridge, Log, TEXT("%s: %dx%d camera on %s"), *Stream, Target.SizeX, Target.SizeY, *Socket); + return Camera; +} diff --git a/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeModule.cpp b/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeModule.cpp new file mode 100644 index 00000000000..cbc5b297942 --- /dev/null +++ b/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeModule.cpp @@ -0,0 +1,35 @@ +// Loaded at PostConfigInit, before the RHI exists, so the Vulkan device is +// created with what the bridge shares slots through: exportable memory and +// timeline semaphores. The engine patch next to this plugin turns the +// timeline-semaphore feature on once its extension is enabled. + +#include "CoreMinimal.h" +#include "Modules/ModuleManager.h" +#include "VulkanRHIBridge.h" +#include "VulkanRHIPrivate.h" + +#include "MoqBridgeSettings.h" + +class FMoqBridgeModule : public IModuleInterface +{ +public: + void StartupModule() override + { + // Only a simulator started for the bridge changes its device; stock + // launches stay stock. + FString Socket; + if (!MoqBridge::GetSocket(Socket)) + { + return; + } + VulkanRHIBridge::AddEnabledDeviceExtensionsAndLayers( + { + VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, + VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, + VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, + }, + {}); + } +}; + +IMPLEMENT_MODULE(FMoqBridgeModule, MoqBridge) diff --git a/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeSettings.h b/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeSettings.h new file mode 100644 index 00000000000..bf97a0e6853 --- /dev/null +++ b/demo/carla/sim/plugin/MoqBridge/Private/MoqBridgeSettings.h @@ -0,0 +1,17 @@ +// The simulator's command-line options for the bridge. + +#pragma once + +#include "CoreMinimal.h" +#include "Misc/CommandLine.h" +#include "Misc/Parse.h" + +namespace MoqBridge +{ + /// `-moq-bridge-socket=PATH`: where the bridge listens for the worker. + /// Without it the simulator is stock and no camera can use the bridge. + inline bool GetSocket(FString &Out) + { + return FParse::Value(FCommandLine::Get(), TEXT("moq-bridge-socket="), Out) && !Out.IsEmpty(); + } +} diff --git a/demo/carla/sim/plugin/MoqBridge/Public/MoqBridgeCamera.h b/demo/carla/sim/plugin/MoqBridge/Public/MoqBridgeCamera.h new file mode 100644 index 00000000000..ba189d7751f --- /dev/null +++ b/demo/carla/sim/plugin/MoqBridge/Public/MoqBridgeCamera.h @@ -0,0 +1,44 @@ +// One CARLA camera feeding the demo's GPU video bridge (demo/carla/bridge). +// +// The bridge library is loaded at runtime and listens on the socket named by +// `-moq-bridge-socket=`. Each frame the camera's render target is copied on +// Unreal's own Vulkan queue into an exportable image that the bridge's encoder +// imports on the same device, converts, scales, and encodes. Pixels never +// leave the GPU, and there is no CPU path: a failure stops the camera, and the +// bridge reports it to the worker. + +#pragma once + +#include "CoreMinimal.h" + +class UTextureRenderTarget2D; + +class MOQBRIDGE_API IMoqBridgeCamera +{ +public: + /// Register `Target`'s camera as a source of `Stream` (the worker's + /// broadcast, e.g. "truck1/front") and allocate its slots on Unreal's + /// device. Game thread, once the render target is initialized. Null with + /// `OutError` set on failure. + static TSharedPtr Open( + const FString &Stream, + const UTextureRenderTarget2D &Target, + FString &OutError); + + /// Closes the source, which waits until the GPU is done with every slot, + /// then frees them. Game thread, with no capture pending: flush rendering + /// commands before dropping the last reference. + virtual ~IMoqBridgeCamera() = default; + + /// Whether the bridge wants this camera's pictures now: render only if so. + /// False once the camera has failed. + virtual bool IsWanted() const = 0; + + /// Why the camera stopped, or empty while it works. + virtual FString GetError() const = 0; + + /// Copy `Target` into a free slot and hand it to the encoder, after the + /// rendering enqueued before this call. Game thread. `TimestampUs` is the + /// simulation time of the picture. + virtual void Capture(UTextureRenderTarget2D &Target, uint64 Frame, uint64 TimestampUs) = 0; +}; diff --git a/demo/carla/sim/pyproject.toml b/demo/carla/sim/pyproject.toml new file mode 100644 index 00000000000..505c49c58f3 --- /dev/null +++ b/demo/carla/sim/pyproject.toml @@ -0,0 +1,47 @@ +# The CARLA worker. Not published: a demo, run from the repo. +# +# moq's bindings are deliberately NOT listed here. venv.sh installs them from +# this checkout's py/ (moq-ffi built by maturin, moq-rs editable), so the +# worker always runs the bindings of the tree it ships in, never a PyPI release. +[project] +name = "moq-carla-sim" +version = "0.1.0" +description = "A CARLA world of simulated trucks published over MoQ, steerable from the browser." +requires-python = ">=3.12,<3.13" +dependencies = [ + # CARLA ships wheels for cp310-cp312 only, which is what pins the + # interpreter above. + "carla==0.9.16", +] + +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +packages = ["moq_carla_sim"] + +[tool.ruff] +line-length = 120 +target-version = "py312" + +[tool.ruff.lint] +select = ["E", "F", "W", "I"] + +[tool.ruff.format] +quote-style = "double" + +# Collected from the root uv workspace's dev tools rather than the CARLA venv: +# tests/conftest.py stubs `moq` and `carla`, so the package imports from source. +[tool.pytest.ini_options] +testpaths = ["tests"] +pythonpath = ["."] + +# Type-checks the worker against the in-tree moq wrapper source, so an API +# change there fails the gate instead of crashing at runtime. carla exists only +# in the CARLA venv; typings/ stands in for it. +[tool.pyright] +include = ["moq_carla_sim"] +extraPaths = ["../../../py/moq-rs"] +pythonVersion = "3.12" +reportMissingModuleSource = false diff --git a/demo/carla/sim/python.sh b/demo/carla/sim/python.sh new file mode 100755 index 00000000000..40df128b089 --- /dev/null +++ b/demo/carla/sim/python.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# +# Run the CARLA worker's venv interpreter with an environment its wheels can +# actually load. Every entry point that runs the worker or a CARLA client goes +# through here, so the two fixes below live in one place. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +venv="$here/.venv" + +if [[ ! -x "$venv/bin/python" ]]; then + echo "python.sh: no venv; run 'just carla venv' first." >&2 + exit 1 +fi + +# 1. The devshell exports a PYTHONPATH into its own Python's site-packages. A +# venv does not override it, so a 3.12 interpreter would import packages +# built for another version and fail somewhere unrelated. +export PYTHONPATH= + +# 2. manylinux wheels (CARLA's client and moq's own cdylib) link libstdc++ and +# libz, which under Nix are in no default loader path. Ask the compiler on +# PATH where they are rather than hardcoding store hashes that move with +# every nixpkgs bump. A library it cannot place is left to the host's loader. +libs=() +for lib in libstdc++.so.6 libz.so.1; do + found="$(g++ -print-file-name="$lib")" + # g++ echoes the bare name back when it cannot place the library. + [[ "$found" == /* ]] && libs+=("$(dirname "$found")") +done +if [[ ${#libs[@]} -eq 0 ]]; then + echo "python.sh: g++ cannot locate libstdc++ or libz; run inside the devshell." >&2 + exit 1 +fi + +# No NVIDIA driver: the simulator encodes, and the worker only republishes. +LD_LIBRARY_PATH="$( + IFS=: + echo "${libs[*]}" +)${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export LD_LIBRARY_PATH + +exec "$venv/bin/python" "$@" diff --git a/demo/carla/sim/python.test.sh b/demo/carla/sim/python.test.sh new file mode 100755 index 00000000000..ef7c00b3825 --- /dev/null +++ b/demo/carla/sim/python.test.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# Offline regression for python.sh's loader environment. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +scratch="$(mktemp -d)" +trap 'rm -rf "$scratch"' EXIT + +cp "$here/python.sh" "$scratch/python.sh" +mkdir -p "$scratch/.venv/bin" "$scratch/bin" + +cat >"$scratch/.venv/bin/python" <<'EOF' +#!/usr/bin/env bash +printf '%s|%s\n' "$PYTHONPATH" "$LD_LIBRARY_PATH" +EOF +chmod +x "$scratch/.venv/bin/python" + +# A compiler that places libstdc++ but not libz, as the devshell's does. +cat >"$scratch/bin/g++" <<'EOF' +#!/usr/bin/env bash +case "$1" in +-print-file-name=libstdc++.so.6) echo /gcc/lib/libstdc++.so.6 ;; +*) echo "${1#-print-file-name=}" ;; +esac +EOF +chmod +x "$scratch/bin/g++" + +# The libraries the compiler found go first; nothing else, the NVIDIA driver +# included, since the worker never encodes. The devshell's PYTHONPATH is cleared. +actual="$(PATH="$scratch/bin:$PATH" PYTHONPATH=/devshell LD_LIBRARY_PATH=/existing "$scratch/python.sh")" +expected="|/gcc/lib:/existing" +if [[ "$actual" != "$expected" ]]; then + echo "python.test: expected $expected, got $actual" >&2 + exit 1 +fi + +# A compiler that places neither is refused rather than run against the host's. +cat >"$scratch/bin/g++" <<'EOF' +#!/usr/bin/env bash +echo "${1#-print-file-name=}" +EOF +if PATH="$scratch/bin:$PATH" "$scratch/python.sh" >/dev/null 2>&1; then + echo "python.test: ran without locating libstdc++ or libz" >&2 + exit 1 +fi + +echo "python.test: ok" diff --git a/demo/carla/sim/server.sh b/demo/carla/sim/server.sh new file mode 100755 index 00000000000..56b9f0b3878 --- /dev/null +++ b/demo/carla/sim/server.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +# +# Run the CARLA simulator on the local GPU, in podman. +# +# CARLA is distributed as an Unreal Engine build against Ubuntu's driver stack, +# so a container is the only sane way to run it on Fedora/NixOS. It renders +# offscreen and speaks its RPC on :2000; the worker (`just carla worker`) is a +# client and can be restarted independently. +set -euo pipefail + +# Stock upstream by default. The worker needs the patched build (patches/: the +# GPU video bridge and the RPC work guard), a local image from `just carla +# build`, so it is selected by pinning CARLA_IMAGE rather than shipped here; put +# that pin in ~/.config/moq/carla.env, which carla-sim.service reads. The +# resolved image is logged below, so a pin that went missing is visible. The +# worker refuses a stock simulator by name. +image="${CARLA_IMAGE:-docker.io/carlasim/carla:0.9.16}" +name="${CARLA_NAME:-carla}" +port="${CARLA_PORT:-2000}" +# Where the bridge inside the simulator listens for the worker; the worker's +# --bridge-socket defaults to the same path. +bridge_dir="${CARLA_BRIDGE_DIR:-${XDG_RUNTIME_DIR:-/tmp}/carla-bridge}" + +if ! command -v podman >/dev/null 2>&1; then + echo "carla: podman not found." >&2 + exit 1 +fi + +# The GPU reaches the container through a CDI device generated by +# nvidia-container-toolkit. Check its referenced entries and hook before pulling +# the 8.6 GB image: a spec generated through a bare `nix shell` embeds an +# unrooted store path that breaks after Nix GC even though the YAML still exists. +# nvidia-ctk writes every device node, mount, and hook as a YAML list item +# (`- path:` / `- hostPath:`), and the hook's `path:` is the only bare key. +shopt -s nullglob +specs=(/etc/cdi/*nvidia* /var/run/cdi/*nvidia* "${XDG_CONFIG_HOME:-$HOME/.config}"/cdi/*nvidia*) +shopt -u nullglob + +valid_spec= +for spec in "${specs[@]}"; do + valid=1 + entry_seen=0 + hook_seen=0 + while IFS= read -r host_path; do + case "$host_path" in + *nvidia-ctk | *nvidia-cdi-hook) ;; + *) entry_seen=1 ;; + esac + if [[ ! -e "$host_path" ]]; then + valid=0 + break + fi + done < <(sed -nE 's/^[[:space:]]*(- )?(path|hostPath):[[:space:]]+([^[:space:]]+)[[:space:]]*$/\3/p' "$spec") + while IFS= read -r hook; do + hook_seen=1 + if [[ ! -x "$hook" ]]; then + valid=0 + break + fi + done < <(sed -nE 's/^[[:space:]]*(- )?path:[[:space:]]+([^[:space:]]*nvidia-(ctk|cdi-hook))[[:space:]]*$/\2/p' "$spec") + if [[ "$valid" -eq 1 && "$entry_seen" -eq 1 && "$hook_seen" -eq 1 ]]; then + valid_spec="$spec" + break + fi +done + +if [[ -z "$valid_spec" ]]; then + cat >&2 <<-'EOF' + carla: the nvidia.com/gpu CDI device is missing or stale. Set it up with: + + just carla cdi + + Then point Podman at it by adding to ~/.config/containers/containers.conf: + + [engine] + cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi", "/.config/cdi"] + EOF + exit 1 +fi + +# Name the resolved image in the journal, so a pin that has quietly gone back +# to stock is visible rather than showing up only as idle CPU. +digest="$(podman image inspect --format '{{.Digest}}' "$image" 2>/dev/null || true)" +echo "carla: image $image (${digest:-not pulled yet})" >&2 + +# --security-opt label=disable: SELinux denies a container access to +# /dev/nvidia* even though the nodes are mode 0666, and the failure looks like a +# missing driver rather than a denial. The alternative is a host-wide +# `setsebool -P container_use_devices 1`, which needs root. +# +# --net=host: the worker connects to the RPC port and the traffic manager port, +# and CARLA hands out further ports at runtime. +# +# --userns=keep-id: the image's carla user is UID 1000, and keeping IDs makes +# it this user, so the bridge's socket in the shared directory is one the +# worker may connect to. The directory stays private to this user. +# The name is the service's ownership boundary. --replace lets systemd adopt a +# manually started or orphaned simulator container instead of retrying forever on a +# name collision; it never touches another container name. +# +# The engine binary directly, not the image's CarlaUE4.sh: that wrapper runs +# the binary without exec, leaving a shell as container PID 1 that ignores +# SIGTERM, so a stop would sit through systemd's timeout and leave the +# simulator running. As PID 1 the engine gets the signal and exits in a few +# seconds. +# Override the image entrypoint too: wrappers can silently append quality or +# experimental flags after the launcher's arguments. +mkdir -p "$bridge_dir" +chmod 700 "$bridge_dir" +exec podman run --rm --replace --name "$name" \ + --security-opt label=disable \ + --device nvidia.com/gpu=all \ + --net=host \ + --userns=keep-id \ + -v "$bridge_dir:$bridge_dir" \ + --entrypoint /workspace/CarlaUE4/Binaries/Linux/CarlaUE4-Linux-Shipping \ + "$image" \ + CarlaUE4 -RenderOffScreen -nosound -carla-rpc-port="$port" -quality-level=Epic \ + -moq-bridge-socket="$bridge_dir/bridge.sock" diff --git a/demo/carla/sim/server.test.sh b/demo/carla/sim/server.test.sh new file mode 100755 index 00000000000..7103bfcf41b --- /dev/null +++ b/demo/carla/sim/server.test.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# Offline regression for the CARLA container lifecycle contract. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT + +mkdir -p "$tmp/bin" "$tmp/config/cdi" +cat >"$tmp/bin/podman" <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +printf '%s\n' "$@" >"${CARLA_TEST_PODMAN_ARGS:?}" +EOF +chmod +x "$tmp/bin/podman" + +: >"$tmp/config/cdi/nvidia.yaml" +if PATH="$tmp/bin:$PATH" XDG_CONFIG_HOME="$tmp/config" bash "$here/server.sh" >"$tmp/empty.out" 2>&1; then + echo "empty CDI spec unexpectedly accepted" >&2 + exit 1 +fi +grep -Fq 'just carla cdi' "$tmp/empty.out" + +touch "$tmp/device" +# The fixtures mirror nvidia-ctk's layout: entries are YAML list items, the +# hook's path is a bare key under `- hookName:`. +printf -- '- hostPath: %s\n path: %s\n' "$tmp/device" "$tmp/missing/nvidia-ctk" >"$tmp/config/cdi/nvidia.yaml" +if PATH="$tmp/bin:$PATH" XDG_CONFIG_HOME="$tmp/config" bash "$here/server.sh" >"$tmp/stale.out" 2>&1; then + echo "stale CDI hook unexpectedly accepted" >&2 + exit 1 +fi +grep -Fq 'just carla cdi' "$tmp/stale.out" + +touch "$tmp/bin/nvidia-ctk" +chmod +x "$tmp/bin/nvidia-ctk" +printf -- '- hostPath: %s\n path: %s\n' "$tmp/device" "$tmp/bin/nvidia-ctk" >"$tmp/config/cdi/nvidia.yaml" +PATH="$tmp/bin:$PATH" \ + XDG_CONFIG_HOME="$tmp/config" \ + XDG_RUNTIME_DIR="$tmp/run" \ + CARLA_TEST_PODMAN_ARGS="$tmp/podman.args" \ + bash "$here/server.sh" + +grep -Fxq -- '--rm' "$tmp/podman.args" +grep -Fxq -- '--replace' "$tmp/podman.args" +grep -Fxq -- '--device' "$tmp/podman.args" +grep -Fxq -- 'nvidia.com/gpu=all' "$tmp/podman.args" +grep -Fxq -- 'docker.io/carlasim/carla:0.9.16' "$tmp/podman.args" +# The launcher owns both the executable and quality. An image entrypoint must +# not silently append experimental flags or lower the graphics preset. +grep -Fxq -- '--entrypoint' "$tmp/podman.args" +grep -Fxq -- '-quality-level=Epic' "$tmp/podman.args" +# The engine must be container PID 1 so SIGTERM reaches it; the image's +# CarlaUE4.sh wrapper would swallow it. +grep -Fxq -- '/workspace/CarlaUE4/Binaries/Linux/CarlaUE4-Linux-Shipping' "$tmp/podman.args" +if grep -Fq 'CarlaUE4.sh' "$tmp/podman.args"; then + echo "server.sh runs the engine through the image's wrapper script" >&2 + exit 1 +fi + +# The bridge listens in a directory the worker shares, as the same user, at the +# path the worker defaults to. +grep -Fxq -- '--userns=keep-id' "$tmp/podman.args" +grep -Fxq -- "$tmp/run/carla-bridge:$tmp/run/carla-bridge" "$tmp/podman.args" +grep -Fxq -- "-moq-bridge-socket=$tmp/run/carla-bridge/bridge.sock" "$tmp/podman.args" +[[ "$(stat -c %a "$tmp/run/carla-bridge")" == 700 ]] + +printf 'CARLA server lifecycle test: ok\n' diff --git a/demo/carla/sim/systemd/carla-sim.service b/demo/carla/sim/systemd/carla-sim.service new file mode 100644 index 00000000000..b03808429c5 --- /dev/null +++ b/demo/carla/sim/systemd/carla-sim.service @@ -0,0 +1,31 @@ +[Unit] +Description=CARLA simulator +Documentation=file://@CARLA_REPO@/demo/carla/README.md + +[Service] +Type=simple +Environment=CARLA_REPO=@CARLA_REPO@ +# Optional, and the same file the worker reads. CARLA_IMAGE belongs here rather +# than in a systemd drop-in, so reinstalling the units cannot silently return +# the simulator to the stock image and its idle game-thread spin. +EnvironmentFile=-%E/moq/carla.env +ExecStart=@NIX_BIN@ develop --accept-flake-config ${CARLA_REPO} --command just --justfile ${CARLA_REPO}/justfile carla server +# The server boots with rendering on and outlives every client, so a simulator +# waiting for its worker draws frames nobody asked for: 174 W and 100% GPU on +# an RTX 3070 Ti, against 26 W and 44% parked. `carla park` no-ops when a worker +# already owns the world. Both lines are `-`: this is an optimization, never a +# verdict on the simulator, and an unparked one still works. Failing the unit +# here would restart-loop the container on a slow boot instead. +ExecStartPost=-@NIX_BIN@ develop --accept-flake-config ${CARLA_REPO} --command just --justfile ${CARLA_REPO}/justfile carla wait-port 127.0.0.1 2000 600 +ExecStartPost=-@NIX_BIN@ develop --accept-flake-config ${CARLA_REPO} --command just --justfile ${CARLA_REPO}/justfile carla park +# just reports a recipe killed by SIGTERM as exit 143 rather than dying of +# the signal, which systemd would otherwise log as a failed stop. +SuccessExitStatus=143 +Restart=on-failure +RestartSec=10s +RestartSteps=4 +RestartMaxDelaySec=2min +# The gate above runs inside the start timeout, which defaults to 90s, and also +# covers the one-time 8.6 GB image pull. +TimeoutStartSec=6min +TimeoutStopSec=45s diff --git a/demo/carla/sim/systemd/carla-worker.service b/demo/carla/sim/systemd/carla-worker.service new file mode 100644 index 00000000000..3edbc45bc8c --- /dev/null +++ b/demo/carla/sim/systemd/carla-worker.service @@ -0,0 +1,31 @@ +[Unit] +Description=CARLA MoQ worker +Documentation=file://@CARLA_REPO@/demo/carla/README.md +Wants=carla-sim.service +After=carla-sim.service + +[Service] +Type=simple +Environment=CARLA_REPO=@CARLA_REPO@ +# MOQ_URL lives here, so a JWT in it stays off the command line. +EnvironmentFile=%E/moq/carla.env +# After= only orders the container's *start*; the simulator answers RPC seconds +# to a minute later. Without this gate the worker spends a 30s client timeout +# and a restart backoff on every cold boot. It also covers the one-time 8.6 GB +# image pull, up to the start timeout; Restart=on-failure retries if that +# expires anyway. +ExecStartPre=@NIX_BIN@ develop --accept-flake-config ${CARLA_REPO} --command just --justfile ${CARLA_REPO}/justfile carla wait-port 127.0.0.1 2000 600 +ExecStart=@NIX_BIN@ develop --accept-flake-config ${CARLA_REPO} --command just --justfile ${CARLA_REPO}/justfile carla worker +# just reports a recipe killed by SIGTERM as exit 143 rather than dying of +# the signal, which systemd would otherwise log as a failed stop. +SuccessExitStatus=143 +Restart=on-failure +RestartSec=10s +RestartSteps=4 +RestartMaxDelaySec=2min +# The gate above runs inside the start timeout, which defaults to 90s. +TimeoutStartSec=6min +TimeoutStopSec=30s + +[Install] +WantedBy=default.target diff --git a/demo/carla/sim/systemd/install-user-service.sh b/demo/carla/sim/systemd/install-user-service.sh new file mode 100755 index 00000000000..c0b9f6c95b1 --- /dev/null +++ b/demo/carla/sim/systemd/install-user-service.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Install the CARLA simulator and worker as rootless systemd user services. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo="$(git -C "$here" rev-parse --show-toplevel)" +unit_dir="${CARLA_SYSTEMD_USER_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user}" +env_dir="${CARLA_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/moq}" +systemctl_bin="${SYSTEMCTL:-systemctl}" + +if [[ ! "$repo" =~ ^/[A-Za-z0-9._/-]+$ ]]; then + echo "service install: unsupported repository path: $repo" >&2 + exit 1 +fi +nix_bin="$(command -v nix)" || { + echo "service install: nix is not available in PATH" >&2 + exit 1 +} +if [[ ! "$nix_bin" =~ ^/[A-Za-z0-9._/-]+$ ]]; then + echo "service install: unsupported nix path: $nix_bin" >&2 + exit 1 +fi + +install -d -m 0700 "$unit_dir" "$env_dir" + +for name in carla-sim.service carla-worker.service; do + template="$(<"$here/$name")" + template="${template//@CARLA_REPO@/$repo}" + template="${template//@NIX_BIN@/$nix_bin}" + install -m 0600 /dev/null "$unit_dir/$name" + printf '%s\n' "$template" >"$unit_dir/$name" +done + +"$systemctl_bin" --user daemon-reload + +cat < + CARLA_IMAGE=localhost/moq-carla: + +The token is a demo-project JWT scoped to publish carla/** and subscribe +viewer/carla/**. For local development, MOQ_URL=http://localhost:4443 needs +no token. + +Then run: + just carla service-enable +EOF diff --git a/demo/carla/sim/systemd/install-user-service.test.sh b/demo/carla/sim/systemd/install-user-service.test.sh new file mode 100755 index 00000000000..07487faa492 --- /dev/null +++ b/demo/carla/sim/systemd/install-user-service.test.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# Offline regression for the rootless CARLA systemd installer. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo="$(git -C "$here" rev-parse --show-toplevel)" +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT + +mkdir -p "$tmp/bin" +cat >"$tmp/bin/systemctl" <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +printf '%s\n' "$*" >"${CARLA_SYSTEMCTL_LOG:?}" +EOF +cat >"$tmp/bin/nix" <<'EOF' +#!/usr/bin/env bash +exit 1 +EOF +chmod +x "$tmp/bin/systemctl" "$tmp/bin/nix" +nix_bin="$tmp/bin/nix" + +space_repo="$tmp/repo space" +git init -q "$space_repo" +cp -R "$here" "$space_repo/systemd" +if CARLA_SYSTEMD_USER_DIR="$tmp/space-units" \ + CARLA_CONFIG_DIR="$tmp/space-config" \ + PATH="$tmp/bin:$PATH" \ + SYSTEMCTL="$tmp/bin/systemctl" \ + bash "$space_repo/systemd/install-user-service.sh" >"$tmp/space.out" 2>&1; then + echo "installer accepted a repository path that breaks unit syntax" >&2 + exit 1 +fi +grep -Fq 'unsupported repository path' "$tmp/space.out" + +CARLA_SYSTEMD_USER_DIR="$tmp/units" \ + CARLA_CONFIG_DIR="$tmp/config" \ + CARLA_SYSTEMCTL_LOG="$tmp/systemctl.log" \ + PATH="$tmp/bin:$PATH" \ + SYSTEMCTL="$tmp/bin/systemctl" \ + bash "$here/install-user-service.sh" >"$tmp/install.out" + +# The printed settings are what an operator copies: a scoped token for the +# hosted relay, the locally built image, and the tokenless local relay. +grep -Fxq ' MOQ_URL=https://cdn.moq.dev/demo?jwt=' "$tmp/install.out" +grep -Fxq ' CARLA_IMAGE=localhost/moq-carla:' "$tmp/install.out" +grep -Fq 'scoped to publish carla/** and subscribe' "$tmp/install.out" +grep -Fq 'viewer/carla/**. For local development, MOQ_URL=http://localhost:4443 needs' "$tmp/install.out" +test "$(stat -c %a "$tmp/units")" = 700 +test "$(stat -c %a "$tmp/config")" = 700 +test "$(stat -c %a "$tmp/units/carla-sim.service")" = 600 +test "$(stat -c %a "$tmp/units/carla-worker.service")" = 600 +grep -Fq "Environment=CARLA_REPO=$repo" "$tmp/units/carla-sim.service" +grep -Fq "Environment=CARLA_REPO=$repo" "$tmp/units/carla-worker.service" +grep -Fxq "ExecStart=$nix_bin develop --accept-flake-config \${CARLA_REPO} --command just --justfile \${CARLA_REPO}/justfile carla server" "$tmp/units/carla-sim.service" +grep -Fxq "ExecStart=$nix_bin develop --accept-flake-config \${CARLA_REPO} --command just --justfile \${CARLA_REPO}/justfile carla worker" "$tmp/units/carla-worker.service" +# The worker must not race the simulator's RPC port on a cold boot. +grep -Fxq "ExecStartPre=$nix_bin develop --accept-flake-config \${CARLA_REPO} --command just --justfile \${CARLA_REPO}/justfile carla wait-port 127.0.0.1 2000 600" "$tmp/units/carla-worker.service" +# A simulator waiting for its worker renders frames nobody asked for, so every +# start parks it. Both steps are optional: neither is a verdict on the server. +grep -Fxq "ExecStartPost=-$nix_bin develop --accept-flake-config \${CARLA_REPO} --command just --justfile \${CARLA_REPO}/justfile carla wait-port 127.0.0.1 2000 600" "$tmp/units/carla-sim.service" +grep -Fxq "ExecStartPost=-$nix_bin develop --accept-flake-config \${CARLA_REPO} --command just --justfile \${CARLA_REPO}/justfile carla park" "$tmp/units/carla-sim.service" +# The CARLA_IMAGE pin lives in the shared env file, so reinstalling the units +# cannot silently return the simulator to the stock image. +grep -Fq 'EnvironmentFile=-%E/moq/carla.env' "$tmp/units/carla-sim.service" +if grep -E '^ExecStartPost=[^-]' "$tmp/units/carla-sim.service"; then + echo "a parking step can fail the simulator unit into a restart loop" >&2 + exit 1 +fi +if grep -Fq '@CARLA_REPO@' "$tmp/units/carla-sim.service" || + grep -Fq '@NIX_BIN@' "$tmp/units/carla-sim.service" || + grep -Fq '@CARLA_REPO@' "$tmp/units/carla-worker.service" || + grep -Fq '@NIX_BIN@' "$tmp/units/carla-worker.service"; then + echo "installed unit retained a placeholder" >&2 + exit 1 +fi +grep -Fxq -- '--user daemon-reload' "$tmp/systemctl.log" + +if command -v systemd-analyze >/dev/null; then + systemd-analyze verify \ + "$tmp/units/carla-sim.service" "$tmp/units/carla-worker.service" +fi + +printf 'CARLA user service installer test: ok\n' diff --git a/demo/carla/sim/tests/conftest.py b/demo/carla/sim/tests/conftest.py new file mode 100644 index 00000000000..34ac3561510 --- /dev/null +++ b/demo/carla/sim/tests/conftest.py @@ -0,0 +1,109 @@ +"""Lightweight stand-ins for runtime-only modules used during unit collection.""" + +import sys +import uuid +from types import ModuleType, SimpleNamespace + +import pytest + + +class MoqError(Exception): + pass + + +class AnnounceEvent: + """One announcement event; the subclass names which kind, as in moq's.""" + + def __init__(self, announce: SimpleNamespace) -> None: + self.announce = announce + + +class AnnounceEventStart(AnnounceEvent): + pass + + +class AnnounceEventUpdate(AnnounceEvent): + pass + + +class AnnounceEventEnd(AnnounceEvent): + pass + + +class AnnounceEventRestart(AnnounceEvent): + pass + + +class SnapshotProducer: + """Records every published value; demand comes from the wrapped track.""" + + def __init__(self, broadcast: object, track: SimpleNamespace, *, compression: bool = False) -> None: + self.track = track + self.compression = compression + self.values: list[object] = [] + + def demand(self) -> object: + return self.track.demand() + + def update(self, value: object) -> None: + self.values.append(value) + + +class SnapshotConsumer: + """Yields whatever the wrapped fake track yields, already parsed.""" + + def __init__(self, track: object, *, compression: bool = False) -> None: + assert compression, "control is DEFLATE-compressed" + self._track = track + + def __aiter__(self): + return aiter(self._track) + + +moq = ModuleType("moq") +moq.Error = MoqError +moq.AnnounceEventStart = AnnounceEventStart +moq.AnnounceEventUpdate = AnnounceEventUpdate +moq.AnnounceEventEnd = AnnounceEventEnd +moq.AnnounceEventRestart = AnnounceEventRestart +moq.Route = lambda **kwargs: SimpleNamespace(**kwargs) +moq.mint_epoch = lambda: str(uuid.uuid4()) + +moq_json = ModuleType("moq.json") +moq_json.SnapshotProducer = SnapshotProducer +moq_json.SnapshotConsumer = SnapshotConsumer +moq.json = moq_json + +moq_media = ModuleType("moq.media") +moq_media.VideoFormat = SimpleNamespace(AVC3="avc3") +moq_media.VideoInit = lambda **kwargs: SimpleNamespace(**kwargs) +moq_media.VideoHint = lambda **kwargs: SimpleNamespace(**kwargs) +moq_media.Dimensions = lambda **kwargs: SimpleNamespace(**kwargs) +moq_media.Named = lambda name=None: SimpleNamespace(name=name) +moq.media = moq_media + +sys.modules["moq"] = moq +sys.modules["moq.json"] = moq_json +sys.modules["moq.media"] = moq_media + +carla = ModuleType("carla") +carla.Location = lambda **kwargs: SimpleNamespace(**kwargs) +# `carla.Transform()` with no arguments is the identity transform, which is how +# a sensor is attached at its parent actor's origin. +carla.Transform = lambda location=None, rotation=None, **_kwargs: SimpleNamespace(location=location, rotation=rotation) +carla.Vector3D = lambda **kwargs: SimpleNamespace(**kwargs) +carla.VehicleControl = lambda **kwargs: SimpleNamespace(**kwargs) +carla.LaneType = SimpleNamespace(Driving="driving") +sys.modules["carla"] = carla + + +@pytest.fixture(params=[False, True], ids=["ordinary", "deep-temp-root"]) +def bridge_socket(tmp_path, request: pytest.FixtureRequest, monkeypatch: pytest.MonkeyPatch) -> str: + # AF_UNIX bounds the path passed to bind/connect, not the resolved location. + # A relative filename works even under a deep devshell/pytest temporary root. + root = tmp_path + if request.param: + root = tmp_path / ("nested" * 20) # The component alone exceeds AF_UNIX's 108-byte Linux limit. + root.mkdir() + monkeypatch.chdir(root) + return "bridge.sock" diff --git a/demo/carla/sim/tests/test_aerial.py b/demo/carla/sim/tests/test_aerial.py new file mode 100644 index 00000000000..e8964204675 --- /dev/null +++ b/demo/carla/sim/tests/test_aerial.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +import math +from types import SimpleNamespace +from unittest.mock import Mock + +import pytest + +from moq_carla_sim.aerial import calibration, capture + + +def test_footprint_contains_roads_and_preserves_world_axes() -> None: + roads = [-114.2, -68.7, 110.0, 141.1] + camera, bbox = calibration(roads) + assert camera.x == pytest.approx(-2.1) + assert camera.y == pytest.approx(36.2) + assert camera.pitch == -90 + assert camera.yaw == -90 + assert bbox == pytest.approx([-144.2, -105.9, 140.0, 178.3]) + assert bbox[0] < roads[0] < roads[2] < bbox[2] + assert bbox[1] < roads[1] < roads[3] < bbox[3] + + # Independent ray projection: a down-facing camera's right/up vectors are + # (1, 0, 0)/(0, -1, 0) at yaw -90, keeping the road map's x/y orientation. + half_width = camera.z * math.tan(math.radians(camera.fov / 2)) + for x, y, expected in [(bbox[0], bbox[1], (0, 0)), (bbox[2], bbox[3], (1, 1))]: + pixel = ((x - camera.x) / (2 * half_width) + 0.5, (y - camera.y) / (2 * half_width) + 0.5) + assert pixel == pytest.approx(expected) + + +def test_ground_height_changes_altitude_without_changing_footprint() -> None: + baseline, footprint = calibration([0, 0, 100, 200], padding=10, fov=40) + elevated, elevated_footprint = calibration([0, 0, 100, 200], padding=10, ground_z=70, fov=40) + assert elevated.z == pytest.approx(baseline.z + 70) + assert elevated_footprint == footprint + assert (elevated.z - 70) * math.tan(math.radians(20)) == pytest.approx(110) + + +@pytest.mark.parametrize("bbox", [[], [0, 0, 0, 1], [0, 1, 1, 0], [0, 0, math.nan, 2]]) +def test_rejects_invalid_bounds(bbox: list[float]) -> None: + with pytest.raises(ValueError): + calibration(bbox) + + +@pytest.mark.parametrize("options", [{"padding": -1}, {"fov": 0}, {"fov": math.nan}, {"ground_z": math.inf}]) +def test_rejects_invalid_camera_options(options: dict[str, float]) -> None: + with pytest.raises(ValueError): + calibration([0, 0, 1, 1], **options) + + +def fake_world(monkeypatch: pytest.MonkeyPatch) -> tuple[Mock, Mock]: + import carla + + monkeypatch.setattr(carla, "Rotation", lambda **values: SimpleNamespace(**values), raising=False) + sensor = Mock(id=123) + sensor.destroy.return_value = True + world = Mock() + world.get_settings.return_value = SimpleNamespace(no_rendering_mode=False) + world.spawn_actor.return_value = sensor + return world, sensor + + +def test_capture_timeout_removes_only_its_sensor(monkeypatch: pytest.MonkeyPatch) -> None: + world, sensor = fake_world(monkeypatch) + camera, _ = calibration([0, 0, 10, 10]) + with pytest.raises(TimeoutError): + capture(world, camera, 256, 0.001) + sensor.stop.assert_called_once() + sensor.destroy.assert_called_once() + world.tick.assert_not_called() + world.apply_settings.assert_not_called() + world.get_actors.assert_not_called() + + +def test_listener_failure_still_destroys_sensor(monkeypatch: pytest.MonkeyPatch) -> None: + world, sensor = fake_world(monkeypatch) + sensor.listen.side_effect = RuntimeError("stream unavailable") + sensor.stop.side_effect = RuntimeError("stop unavailable") + camera, _ = calibration([0, 0, 10, 10]) + with pytest.raises(RuntimeError, match="stop unavailable"): + capture(world, camera, 256, 1) + sensor.destroy.assert_called_once() + + +def test_parked_renderer_does_not_spawn_or_change_settings(monkeypatch: pytest.MonkeyPatch) -> None: + world, _ = fake_world(monkeypatch) + world.get_settings.return_value.no_rendering_mode = True + camera, _ = calibration([0, 0, 10, 10]) + with pytest.raises(RuntimeError, match="rendering is parked"): + capture(world, camera, 256, 1) + world.spawn_actor.assert_not_called() + world.apply_settings.assert_not_called() diff --git a/demo/carla/sim/tests/test_benchmark.py b/demo/carla/sim/tests/test_benchmark.py new file mode 100644 index 00000000000..d1489d341fb --- /dev/null +++ b/demo/carla/sim/tests/test_benchmark.py @@ -0,0 +1,85 @@ +import time +from types import SimpleNamespace + +import pytest + +from moq_carla_sim.benchmark import Frames, main, measure, require_idle, summary + + +def test_delivery_uses_frame_identity_not_callback_count(): + frames = Frames() + started = time.monotonic() + for number in (9, 10, 10, 12, 13): + frames.receive(SimpleNamespace(frame=number)) + result = frames.finish(dict.fromkeys((10, 11, 12), started), time.monotonic()) + assert (result["delivered"], result["missing"], result["duplicates"]) == (2, [11], 1) + assert result["callback_delay_max_ms"] >= 0 + + +def test_camera_without_callbacks_reports_failure(): + result = Frames().finish({10: time.monotonic()}, time.monotonic()) + assert result["delivered"] == 0 + assert result["missing"] == [10] + assert result["callback_delay_p95_ms"] is None + + +def test_tick_rate_does_not_hide_tail_stalls(): + result = summary([0.01] * 19 + [0.1]) + assert result["tick_fps"] > 30 + assert result["over_30fps_budget"] == 1 + assert result["max_ms"] == 100 + assert result["p95_ms"] == 10 + + +@pytest.mark.parametrize("synchronous,actors", [(True, []), (False, [object()])]) +def test_refuses_an_owned_world(synchronous, actors): + world = SimpleNamespace( + get_settings=lambda: SimpleNamespace(synchronous_mode=synchronous), + wait_for_tick=lambda _: None, + get_actors=lambda: SimpleNamespace(filter=lambda _: actors), + ) + with pytest.raises(RuntimeError, match="benchmark requires"): + require_idle(world, 1) + + +def test_waits_for_actor_snapshot_before_accepting_empty_world(): + actors = [] + world = SimpleNamespace( + get_settings=lambda: SimpleNamespace(synchronous_mode=False), + wait_for_tick=lambda _: actors.append(object()), + get_actors=lambda: SimpleNamespace(filter=lambda _: actors), + ) + with pytest.raises(RuntimeError, match="empty server"): + require_idle(world, 1) + + +def test_spawn_failure_restores_clock_even_when_actor_cleanup_fails(): + events = [] + blueprint = SimpleNamespace(set_attribute=lambda *_: None) + + def spawn(*args, **kwargs): + if "attach_to" in kwargs: + raise RuntimeError("sensor spawn failed") + return SimpleNamespace( + id=1, set_simulate_physics=lambda _: None, destroy=lambda: events.append("destroy vehicle") or False + ) + + world = SimpleNamespace( + get_settings=lambda: SimpleNamespace(synchronous_mode=False, no_rendering_mode=True), + wait_for_tick=lambda _: None, + get_actors=lambda: SimpleNamespace(filter=lambda _: []), + apply_settings=lambda settings: events.append((settings.synchronous_mode, settings.no_rendering_mode)), + get_blueprint_library=lambda: SimpleNamespace(find=lambda _: blueprint), + get_map=lambda: SimpleNamespace(get_spawn_points=lambda: [object()]), + spawn_actor=spawn, + ) + with pytest.raises(RuntimeError, match="failed to destroy"): + measure(SimpleNamespace(get_world=lambda: world), 1, 320, 180, 1, 1, 1, True) + assert events == [(True, False), "destroy vehicle", (False, True)] + + +@pytest.mark.parametrize("args", [["--ticks", "0"], ["--timeout", "nan"], ["--sizes", "1280"], ["--cameras", "-1"]]) +def test_rejects_invalid_inputs_before_connecting(args): + with pytest.raises(SystemExit) as error: + main(args) + assert error.value.code == 2 diff --git a/demo/carla/sim/tests/test_bridge.py b/demo/carla/sim/tests/test_bridge.py new file mode 100644 index 00000000000..0156629af24 --- /dev/null +++ b/demo/carla/sim/tests/test_bridge.py @@ -0,0 +1,378 @@ +import asyncio +import struct +from datetime import timedelta +from types import SimpleNamespace + +import moq +import pytest + +from moq_carla_sim import bridge +from moq_carla_sim.bridge import ( + Bridge, + BridgeError, + Config, + Error, + Frame, + Hello, + Rendition, + decode_event, + encode_close, + encode_demand, + encode_hello, + encode_keyframe, + encode_open, + read_event, +) + +# Shared with demo/carla/bridge/src/protocol.rs: both sides must produce and accept +# exactly these bytes. +HELLO_HEX = "03000000010100" +OPEN_HEX = "2c00000002070000000c00747275636b312f66726f6e740102007364aa010000f000000000350c00000000001e000000" +DEMAND_HEX = "06000000030700000002" +KEYFRAME_HEX = "06000000040700000001" +CLOSE_HEX = "050000000507000000" +EVENT_HELLO_HEX = "03000000810100" +CONFIG_HEX = "0f000000820700000000050000000000000167" +FRAME_HEX = "20000000830700000001d204000000000000404b4c000000000001050000000000000165" +ERROR_HEX = "0b00000084000000000400626f6f6d" + +SD = Rendition("sd", 426, 240, 800_000, 30) +HD = Rendition("hd", 1280, 720, 4_000_000, 30) + + +def test_requests_match_the_shared_vectors() -> None: + assert encode_hello(1).hex() == HELLO_HEX + assert encode_open(7, "truck1/front", [SD]).hex() == OPEN_HEX + assert encode_demand(7, 0b10).hex() == DEMAND_HEX + assert encode_keyframe(7, 1).hex() == KEYFRAME_HEX + assert encode_close(7).hex() == CLOSE_HEX + + +def _decode(hex: str): + wire = bytes.fromhex(hex) + (length,) = struct.unpack(" None: + assert _decode(EVENT_HELLO_HEX) == Hello(1) + assert _decode(CONFIG_HEX) == Config(7, 0, bytes([0, 0, 0, 1, 0x67])) + assert _decode(FRAME_HEX) == Frame(7, 1, 1234, 5_000_000, True, bytes([0, 0, 0, 1, 0x65])) + assert _decode(ERROR_HEX) == Error(0, "boom") + + +@pytest.mark.parametrize( + "hex", + [ + "0400000083070000", # truncated frame + "0400000081010000", # trailing bytes after a hello + "0100000099", # unknown kind + # keyframe flag of 2 + "20000000830700000001d204000000000000404b4c000000000002050000000000000165", + ], +) +def test_rejects_malformed_events(hex: str) -> None: + with pytest.raises(BridgeError): + _decode(hex) + + +def _reader(data: bytes) -> asyncio.StreamReader: + reader = asyncio.StreamReader() + reader.feed_data(data) + reader.feed_eof() + return reader + + +def test_read_event_distinguishes_a_clean_end_from_a_torn_message() -> None: + async def scenario() -> None: + assert await read_event(_reader(b"")) is None + with pytest.raises(BridgeError): + await read_event(_reader(bytes.fromhex(FRAME_HEX)[:10])) + with pytest.raises(BridgeError): + await read_event(_reader(bytes.fromhex("00000000"))) + assert await read_event(_reader(bytes.fromhex(ERROR_HEX))) == Error(0, "boom") + + asyncio.run(scenario()) + + +class FakeDemand: + def __init__(self) -> None: + self.used_event = asyncio.Event() + self.unused_event = asyncio.Event() + + async def used(self) -> None: + await self.used_event.wait() + + async def unused(self) -> None: + await self.unused_event.wait() + + +def microseconds(timestamp: timedelta) -> int: + return timestamp // timedelta(microseconds=1) + + +class FakeTrack: + def __init__(self, init: bytes, name: str, hint) -> None: + self.init = init + self.name = name + self.hint = hint + self.frames: list[tuple[bytes, int]] = [] + self.flushed: list[int] = [] + self.finished = False + self.demand_handle = FakeDemand() + + def demand(self) -> FakeDemand: + return self.demand_handle + + def write_frame(self, payload: bytes, timestamp: timedelta) -> None: + self.frames.append((payload, microseconds(timestamp))) + + def flush(self, timestamp: timedelta) -> None: + self.flushed.append(microseconds(timestamp)) + + def finish(self) -> None: + self.finished = True + + +class FakeBroadcast: + def __init__(self) -> None: + self.tracks: dict[str, FakeTrack] = {} + + def video(self, init, target) -> FakeTrack: + assert init.format == "avc3" + self.tracks[target.name] = FakeTrack(init.data, target.name, init.hint) + return self.tracks[target.name] + + +@pytest.fixture(autouse=True) +def media_tracks(monkeypatch: pytest.MonkeyPatch) -> None: + def video(broadcast: FakeBroadcast, init, *, target) -> FakeTrack: + return broadcast.video(init, target) + + monkeypatch.setattr(moq.media, "TrackProducer", SimpleNamespace(video=video), raising=False) + + +def _message(kind: int, body: bytes) -> bytes: + return struct.pack(" bytes: + return _message(0x82, struct.pack(" bytes: + body = struct.pack(" tuple[int, bytes]: + (length,) = struct.unpack(" None: + self.connected: asyncio.Future[tuple[asyncio.StreamReader, asyncio.StreamWriter]] = ( + asyncio.get_running_loop().create_future() + ) + + async def serve(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: + kind, body = await _request(reader) + assert (kind, body) == (0x01, struct.pack(" tuple[Bridge, asyncio.StreamReader, asyncio.StreamWriter, asyncio.Server]: + fake = FakeBridge() + path = bridge_socket + server = await asyncio.start_unix_server(fake.serve, path) + client = await Bridge.connect(path) + reader, writer = await fake.connected + return client, reader, writer, server + + +def test_stream_advertises_publishes_and_forwards_demand(bridge_socket) -> None: + async def scenario() -> None: + client, reader, writer, server = await _connected(bridge_socket) + broadcast = FakeBroadcast() + async with asyncio.TaskGroup() as group: + run = group.create_task(client.run()) + opening = group.create_task(client.open("truck1/front", [SD, HD], broadcast)) + + kind, body = await _request(reader) + assert _message(kind, body) == encode_open(1, "truck1/front", [SD, HD]) + writer.write(_config(1, 0, b"\x00\x00\x00\x01\x67sd")) + writer.write(_config(1, 1, b"\x00\x00\x00\x01\x67hd")) + stream = await opening + + # Both tracks exist, with their parameter sets, before any frame. + assert broadcast.tracks["sd"].init.endswith(b"sd") + assert broadcast.tracks["hd"].hint.coded.width == 1280 + assert broadcast.tracks["hd"].hint.bitrate == 4_000_000 + + demand = group.create_task(stream.watch_demand()) + broadcast.tracks["hd"].demand_handle.used_event.set() + assert await _request(reader) == (0x03, struct.pack(" None: + async def scenario() -> None: + client, _reader, writer, server = await _connected(bridge_socket) + writer.close() + with pytest.raises(BridgeError, match="closed"): + await client.run() + server.close() + + asyncio.run(scenario()) + + +def test_frames_for_unknown_streams_are_protocol_errors(bridge_socket) -> None: + async def scenario() -> None: + client, _reader, writer, server = await _connected(bridge_socket) + writer.write(_frame(9, 0, 1, 0, True, b"x")) + with pytest.raises(BridgeError, match="unknown stream"): + await client.run() + server.close() + + asyncio.run(scenario()) + + +def test_an_open_racing_a_bridge_error_fails_instead_of_hanging(bridge_socket) -> None: + async def scenario() -> None: + client, reader, writer, server = await _connected(bridge_socket) + run = asyncio.create_task(client.run()) + opening = asyncio.create_task(client.open("truck1/front", [SD, HD], FakeBroadcast())) + assert (await _request(reader))[0] == 0x02 + # The bridge fails before it sends the stream's parameter sets. + writer.write(_message(0x84, struct.pack(" None: + async def scenario() -> None: + client, reader, writer, server = await _connected(bridge_socket) + run = asyncio.create_task(client.run()) + opening = asyncio.create_task(client.open("truck1/front", [SD], FakeBroadcast())) + assert (await _request(reader))[0] == 0x02 + writer.write(_config(1, 0, b"\x00\x00\x00\x01\x67sd")) + stream = await opening + + stream.finish() + stream.finish() + assert await _request(reader) == (0x05, struct.pack(" None: + async def scenario() -> None: + client, reader, writer, server = await _connected(bridge_socket) + run = asyncio.create_task(client.run()) + broadcast = FakeBroadcast() + opening = asyncio.create_task(client.open("truck1/front", [SD, HD], broadcast)) + assert (await _request(reader))[0] == 0x02 + writer.write(_config(1, 0, b"\x00\x00\x00\x01\x67sd")) + writer.write(_config(1, 1, b"\x00\x00\x00\x01\x67hd")) + stream = await opening + + # The simulator renders nothing in no-rendering mode, so the world is + # rendering before the bridge is asked for a picture, and stays so + # until the bridge has been told nobody wants one. + order: list[str] = [] + sent = client._send + client._send = lambda message: (order.append(f"demand {message[-1]:02b}"), sent(message)) + demand = asyncio.create_task(stream.watch_demand(lambda wanted: order.append(f"render {wanted}"))) + sd, hd = broadcast.tracks["sd"].demand_handle, broadcast.tracks["hd"].demand_handle + sd.used_event.set() + hd.used_event.set() + await _request(reader) + await _request(reader) + sd.used_event.clear() + sd.unused_event.set() + hd.used_event.clear() + hd.unused_event.set() + await _request(reader) + await _request(reader) + assert order == [ + "render True", + "demand 01", + "demand 11", + "demand 10", + "demand 00", + "render False", + ] + demand.cancel() + run.cancel() + await asyncio.gather(demand, run, return_exceptions=True) + server.close() + + asyncio.run(scenario()) diff --git a/demo/carla/sim/tests/test_drive.py b/demo/carla/sim/tests/test_drive.py new file mode 100644 index 00000000000..8a2b96a9142 --- /dev/null +++ b/demo/carla/sim/tests/test_drive.py @@ -0,0 +1,234 @@ +"""The control safety gate's contract.""" + +from moq_carla_sim.drive import Command, Drive, DriveState, Gear + + +def drive(driver_id: str, sequence: int, throttle: float) -> Command: + return Command( + kind="drive", + driver_id=driver_id, + sequence=sequence, + state=DriveState(throttle=throttle, brake=0.0), + ) + + +def estop(driver_id: str, sequence: int) -> Command: + return Command(kind="estop", driver_id=driver_id, sequence=sequence) + + +def reset(driver_id: str, sequence: int) -> Command: + return Command(kind="reset_estop", driver_id=driver_id, sequence=sequence) + + +def test_first_driver_keeps_control() -> None: + state = Drive() + assert state.apply(drive("first", 1, 0.5)) + assert not state.apply(drive("second", 2, 1.0)) + assert state.driver == "first" + assert state.state.throttle == 0.5 + + +def test_the_lease_belongs_to_one_run_of_a_driver() -> None: + """A driver id announced under another epoch is another driver: it cannot + steer while the first run holds the lease, nor release it.""" + state = Drive() + first = Command(kind="drive", driver_id="abc", epoch="e1", sequence=1, state=DriveState(throttle=0.5, brake=0.0)) + second = Command(kind="drive", driver_id="abc", epoch="e2", sequence=1, state=DriveState(throttle=1.0, brake=0.0)) + assert state.apply(first) + assert not state.apply(second) + assert state.state.throttle == 0.5 + assert not state.apply(Command(kind="driver_left", driver_id="abc", epoch="e2")) + assert state.driver == "abc" + + # The first run leaving frees the lease for the second. + assert state.apply(Command(kind="driver_left", driver_id="abc", epoch="e1")) + assert state.driver is None + assert state.apply(second) + assert state.holds(second) + assert state.driver == "abc" + + +def test_estop_latches_until_explicit_reset() -> None: + state = Drive() + assert state.apply(drive("driver", 1, 1.0)) + assert state.apply(estop("driver", 2)) + assert state.estopped + assert not state.apply(drive("driver", 3, 1.0)) + assert state.state == DriveState.stopped() + assert state.apply(reset("driver", 4)) + assert not state.estopped + assert state.state == DriveState.stopped() + + +def test_watchdog_stops_and_releases_driver() -> None: + state = Drive() + assert state.apply(drive("driver", 1, 1.0)) + assert state.apply(Command(kind="watchdog_expired")) + assert state.driver is None + assert state.sequence is None + assert state.state == DriveState.stopped() + + +def test_disconnect_does_not_clear_estop() -> None: + state = Drive() + assert state.apply(drive("driver", 1, 1.0)) + assert state.apply(estop("driver", 2)) + assert state.estopped + assert state.driver == "driver" + + # The driver disconnects: the lease releases but the latch must persist, so + # the truck stays stopped until an explicit reset. + assert state.apply(Command(kind="driver_left", driver_id="driver")) + assert state.estopped + assert state.driver is None + + +def test_estop_from_a_bystander_latches_without_transferring_the_lease() -> None: + state = Drive() + assert state.apply(drive("first", 1, 0.5)) + + # Anyone may hit the big red button, so the latch must engage... + assert state.apply(estop("second", 2)) + assert state.estopped + assert state.estop_by == "second" + + # ...but the lease stays with "first", and the bystander's sequence is not + # recorded as the authoritative command. + assert state.driver == "first" + assert state.sequence == 1 + + # The holder heartbeat is acknowledged without replacing the actor that + # originally latched the stop. + assert state.apply(estop("first", 3)) + assert state.estop_by == "second" + assert state.sequence == 3 + + # Anyone may clear the global latch, but doing so neither transfers the + # lease nor records the bystander's sequence as authoritative. + assert state.apply(reset("second", 4)) + assert not state.estopped + assert state.estop_by is None + assert state.driver == "first" + assert state.sequence == 3 + assert not state.apply(drive("second", 5, 1.0)) + + +def test_estop_from_holder_refreshes_the_acknowledgement_sequence() -> None: + state = Drive() + assert state.apply(drive("holder", 5, 0.3)) + assert state.sequence == 5 + + # The holder's own e-stop is acknowledged (sequence advances) and it keeps + # the lease. + assert state.apply(estop("holder", 6)) + assert state.estopped + assert state.sequence == 6 + assert state.driver == "holder" + + +def test_axes_are_clamped_into_range() -> None: + state = Drive() + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=1, + state=DriveState(steering=-4.0, throttle=9.0, brake=-1.0, gear=Gear.FORWARD), + ) + ) + accepted = state.state + assert accepted.steering == -1.0 + assert accepted.throttle == 1.0 + assert accepted.brake == 0.0 + # Clamping happens before the interlock, so invalid pedal values cannot + # smuggle a gear change through. + assert accepted.gear is Gear.NEUTRAL + + +def test_unclaimed_gate_can_synchronize_with_vehicle_feedback() -> None: + state = Drive() + measured = DriveState(steering=-0.4, throttle=0.6, brake=0.2, gear=Gear.REVERSE) + + assert state.synchronize(measured) + assert state.state == measured + assert state.apply(Command(kind="drive", driver_id="driver", sequence=1, state=measured)) + assert state.state == measured + + assert not state.synchronize(DriveState.stopped()) + assert state.state == measured + + +def test_new_lease_can_initialize_a_zero_pedal_forward_takeover() -> None: + state = Drive() + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=1, + state=DriveState(throttle=0.0, brake=0.0, gear=Gear.FORWARD), + ) + ) + assert state.state == DriveState(throttle=0.0, brake=0.0, gear=Gear.FORWARD) + + # Once the lease exists, zero pedals cannot bypass the normal shift gate. + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=2, + state=DriveState(throttle=0.0, brake=0.0, gear=Gear.REVERSE), + ) + ) + assert state.state.gear is Gear.FORWARD + + +def test_gear_change_requires_brake_and_released_throttle() -> None: + state = Drive() + + # Establish the lease without invoking CARLA's one-time forward takeover sync. + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=1, + state=DriveState(throttle=0.0, brake=0.0, gear=Gear.NEUTRAL), + ) + ) + + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=2, + state=DriveState(throttle=0.0, brake=0.0, gear=Gear.FORWARD), + ) + ) + assert state.state.gear is Gear.NEUTRAL + + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=3, + state=DriveState(throttle=0.01, brake=0.001, gear=Gear.FORWARD), + ) + ) + assert state.state.gear is Gear.FORWARD + + assert state.apply( + Command( + kind="drive", + driver_id="driver", + sequence=4, + state=DriveState(throttle=0.02, brake=1.0, gear=Gear.REVERSE), + ) + ) + assert state.state.gear is Gear.FORWARD + + +def test_resting_state_is_stopped_with_the_brake_on() -> None: + # A truck nobody is driving must hold the brake rather than coast. + resting = Drive() + assert resting.driver is None + assert resting.state == DriveState(steering=0.0, throttle=0.0, brake=1.0, gear=Gear.NEUTRAL) + assert not resting.estopped diff --git a/demo/carla/sim/tests/test_handback.py b/demo/carla/sim/tests/test_handback.py new file mode 100644 index 00000000000..4e6edd574cd --- /dev/null +++ b/demo/carla/sim/tests/test_handback.py @@ -0,0 +1,149 @@ +"""The lane-merge a released truck performs before Traffic Manager takes it. + +Geometry in CARLA's frame: x forward, y to the right, steer positive right. +""" + +from __future__ import annotations + +import math +from types import SimpleNamespace + +from moq_carla_sim import handback + + +def vector(x: float = 0.0, y: float = 0.0, z: float = 0.0) -> SimpleNamespace: + return SimpleNamespace(x=x, y=y, z=z) + + +def lane( + x: float, + y: float, + yaw: float = 0.0, + *, + left=None, + right=None, + lane_type: str = "driving", + junction: bool = False, +) -> SimpleNamespace: + """A waypoint on a straight lane through (x, y) heading `yaw` degrees.""" + forward = vector(math.cos(math.radians(yaw)), math.sin(math.radians(yaw))) + return SimpleNamespace( + transform=SimpleNamespace(location=vector(x, y), get_forward_vector=lambda: forward), + lane_type=lane_type, + is_junction=junction, + get_left_lane=lambda: left, + get_right_lane=lambda: right, + next=lambda distance: [lane(x + forward.x * distance, y + forward.y * distance, yaw)], + ) + + +def road_map(nearest) -> SimpleNamespace: + return SimpleNamespace(get_waypoint=lambda _location, **_kwargs: nearest) + + +def transform(x: float, y: float, yaw: float = 0.0) -> SimpleNamespace: + forward = vector(math.cos(math.radians(yaw)), math.sin(math.radians(yaw))) + return SimpleNamespace(location=vector(x, y), get_forward_vector=lambda: forward) + + +def test_aligned_lane_prefers_the_lane_running_the_trucks_way_over_the_nearest() -> None: + # Two-way road: the nearest lane is oncoming, its neighbour across the + # centre line runs with the truck. + own = lane(0.0, 3.5, 0.0) + oncoming = lane(0.0, 0.0, 180.0, right=own) + + picked = handback.aligned_lane(road_map(oncoming), vector(0.0, 0.5), vector(1.0, 0.0)) + + assert picked is own + + +def test_aligned_lane_stops_walking_at_a_non_driving_lane() -> None: + shoulder = lane(0.0, -3.5, 0.0, lane_type="shoulder") + own = lane(0.0, 0.0, 90.0, left=shoulder) + + assert handback.aligned_lane(road_map(own), vector(), vector(1.0, 0.0)) is own + + +def test_centred_and_aligned_truck_is_handed_over() -> None: + control = handback.plan(road_map(lane(0.0, 0.0)), transform(0.0, 0.3, 4.0), vector(10.0), 0.2, reversing=False) + assert control is None + + +def test_offset_truck_steers_toward_the_lane_side() -> None: + # Lane runs +x through y=0; the truck sits 2 m to its left (-y), so the + # lane is to its right: positive steer, and the mirror case negative. + right = handback.plan(road_map(lane(0.0, 0.0)), transform(0.0, -2.0), vector(10.0), 0.0, reversing=False) + left = handback.plan(road_map(lane(0.0, 0.0)), transform(0.0, 2.0), vector(10.0), 0.0, reversing=False) + + assert 0.0 < right.steer <= 1.0 + assert left.steer == -right.steer + assert right.throttle == 0.0 and right.brake == 0.0 + + +def test_angled_truck_on_the_centre_line_steers_back() -> None: + # Centred but pointing 30 degrees left of the lane: steer right, gently. + control = handback.plan( + road_map(lane(0.0, 0.0)), transform(0.0, 0.0, -30.0), vector(8.7, -5.0), 0.0, reversing=False + ) + + assert 0.0 < control.steer < 0.5 + + +def test_junction_is_coasted_through_on_the_drivers_steering() -> None: + control = handback.plan( + road_map(lane(0.0, 0.0, junction=True)), transform(0.0, 3.0, 45.0), vector(7.0, 7.0), -0.4, reversing=False + ) + + assert control.steer == -0.4 + assert control.throttle == 0.0 and control.brake == 0.0 + + +def test_junction_too_close_ahead_is_coasted_toward_on_the_drivers_steering() -> None: + # The lane forks 4 m ahead: any fork is an arbitrary exit, so merging + # toward it could be the very swerve this avoids. + forking = lane(0.0, 0.0) + forking.next = lambda distance: [lane(distance, 0.0), lane(distance, 0.0, 45.0)] + + control = handback.plan(road_map(forking), transform(0.0, 2.0), vector(10.0), 0.3, reversing=False) + + assert control.steer == 0.3 + + +def test_target_stops_short_of_a_junction_far_enough_ahead() -> None: + # Straight lane for 12 m, then a junction: the merge aims at 12 m, not 20. + straight = lane(0.0, 0.0) + + def stepped(distance: float): + point = lane(distance, 0.0) + point.is_junction = distance > 12.0 + point.next = lambda step: [stepped(distance + step)] + return point + + straight.next = lambda distance: [stepped(distance)] + near = handback.plan(road_map(straight), transform(0.0, 2.0), vector(10.0), 0.0, reversing=False) + far = handback.plan(road_map(lane(0.0, 0.0)), transform(0.0, 2.0), vector(10.0), 0.0, reversing=False) + + assert near.steer < 0.0 and far.steer < 0.0 + assert near.steer < far.steer + + +def test_walking_pace_is_handed_over_wherever_it_is() -> None: + assert handback.plan(road_map(lane(0.0, 0.0)), transform(0.0, 5.0, 90.0), vector(0.9), 0.0, reversing=False) is None + + +def test_reversing_truck_brakes_to_a_stop_first() -> None: + control = handback.plan(road_map(lane(0.0, 0.0)), transform(0.0, 0.0), vector(-4.0), 0.1, reversing=True) + + assert control.brake == 1.0 + assert control.reverse is True + + +def test_pursuit_steer_is_zero_straight_ahead_signed_by_side_and_clamped() -> None: + at = vector() + forward = vector(1.0, 0.0) + assert handback.pursuit_steer(at, forward, vector(10.0, 0.0)) == 0.0 + assert handback.pursuit_steer(at, forward, vector(10.0, 3.0)) > 0.0 + assert handback.pursuit_steer(at, forward, vector(10.0, -3.0)) < 0.0 + # A target almost beside the truck asks for more lock than it has. + assert handback.pursuit_steer(at, forward, vector(1.0, 5.0)) == 1.0 + assert handback.pursuit_steer(at, forward, vector(1.0, -5.0)) == -1.0 diff --git a/demo/carla/sim/tests/test_main.py b/demo/carla/sim/tests/test_main.py new file mode 100644 index 00000000000..8ccad470e98 --- /dev/null +++ b/demo/carla/sim/tests/test_main.py @@ -0,0 +1,232 @@ +import asyncio +import json +from pathlib import Path +from types import SimpleNamespace + +import pytest + +from moq_carla_sim import main as main_module +from moq_carla_sim.main import broadcast_path, default_trucks, driver_prefix, parse_args +from moq_carla_sim.watchdog import Heartbeat + + +def test_default_trucks_are_the_checked_in_list() -> None: + expected = json.loads(main_module.TRUCKS_FILE.read_text()) + assert expected + assert parse_args(["--url", "http://localhost:4443"]).trucks == expected + + +def test_default_trucks_refuses_a_malformed_list(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + for body in ("[]", '["truck1", ""]', '{"trucks": ["truck1"]}'): + path = tmp_path / "trucks.json" + path.write_text(body) + monkeypatch.setattr(main_module, "TRUCKS_FILE", path) + with pytest.raises(ValueError, match="non-empty list of truck names"): + default_trucks() + + +def test_relay_url_defaults_from_environment(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("MOQ_URL", "https://relay.example.test/demo?jwt=secret") + assert parse_args([]).url == "https://relay.example.test/demo?jwt=secret" + + +def test_relay_url_defaults_to_the_local_relay(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("MOQ_URL", raising=False) + assert parse_args([]).url == "http://localhost:4443" + + +def test_paths_match_the_player() -> None: + assert broadcast_path("truck1", "front") == "carla/truck1/front.hang" + assert driver_prefix("truck1") == "viewer/carla/truck1" + + +def test_log_level_configures_python_and_rust(monkeypatch: pytest.MonkeyPatch) -> None: + levels = [] + + async def fake_run(args: SimpleNamespace) -> None: + levels.append(args.log_level) + + monkeypatch.setattr(main_module.moq, "log_level", levels.append, raising=False) + monkeypatch.setattr(main_module, "run", fake_run) + + assert main_module.main(["--url", "http://localhost:4443", "--log-level", "debug"]) == 0 + assert levels == ["debug", "debug"] + + +def test_bridge_socket_defaults_to_where_the_server_puts_it(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("CARLA_BRIDGE_SOCKET", raising=False) + monkeypatch.setenv("XDG_RUNTIME_DIR", "/run/user/1000") + assert parse_args(["--url", "x"]).bridge_socket == "/run/user/1000/carla-bridge/bridge.sock" + monkeypatch.setenv("CARLA_BRIDGE_SOCKET", "/elsewhere.sock") + assert parse_args(["--url", "x"]).bridge_socket == "/elsewhere.sock" + + +def test_a_missing_bridge_says_how_the_simulator_must_run(bridge_socket) -> None: + with pytest.raises(RuntimeError, match="-moq-bridge-socket"): + asyncio.run(main_module.connect_bridge(bridge_socket)) + + +async def never_fails() -> None: + await asyncio.Event().wait() + + +def supervise_with(closed, clock_failed=never_fails) -> tuple[BaseException | None, asyncio.Task]: + """Run `supervise` against a truck that never ends and a session that does. + + Returns whatever ended the run plus the truck task, so a test can assert it + was cancelled and awaited rather than left to loop teardown. + """ + + async def scenario() -> tuple[BaseException | None, asyncio.Task]: + client = SimpleNamespace(session=SimpleNamespace(closed=closed)) + clock = SimpleNamespace(wait_failed=clock_failed) + watchdog = SimpleNamespace(pulse=never_fails) + truck = asyncio.create_task(asyncio.Event().wait(), name="truck:truck1") + try: + await asyncio.wait_for(main_module.supervise(client, [truck], clock, watchdog), timeout=1.0) + except BaseException as err: # noqa: BLE001 - the test asserts on it + return err, truck + return None, truck + + return asyncio.run(scenario()) + + +def test_dead_session_ends_the_run() -> None: + """A session that stops for good must fail the process, not be ignored. + + The trucks keep running against a dead session: their tracks accept frames + and no task ever finishes, so without this the relay announces nothing while + systemd sees a healthy worker. + """ + + async def closed() -> None: + return None + + err, truck = supervise_with(closed) + assert isinstance(err, RuntimeError) + assert "relay session closed" in str(err) + assert truck.cancelled() + + +def test_dead_session_surfaces_the_transport_error() -> None: + async def closed() -> None: + raise main_module.moq.Error("UnexpectedEnd") + + err, _ = supervise_with(closed) + assert isinstance(err, main_module.moq.Error) + assert "UnexpectedEnd" in str(err) + + +def test_stopped_clock_ends_the_run() -> None: + """A world nobody ticks is frozen, and nothing else would notice.""" + + async def closed() -> None: + await asyncio.Event().wait() + + async def clock_failed() -> None: + raise RuntimeError("simulation clock stopped") + + err, truck = supervise_with(closed, clock_failed) + assert isinstance(err, RuntimeError) + assert "simulation clock stopped" in str(err) + assert truck.cancelled() + + +def test_second_worker_on_the_same_simulator_is_refused(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + + first = main_module.claim_simulator("127.0.0.1", 2000) + with pytest.raises(RuntimeError, match="another worker already owns the simulator at 127.0.0.1:2000"): + main_module.claim_simulator("127.0.0.1", 2000) + # A different simulator is a different world. + main_module.claim_simulator("127.0.0.1", 2001).close() + + first.close() + main_module.claim_simulator("127.0.0.1", 2000).close() + + +def test_sigterm_unwinds_like_ctrl_c(monkeypatch: pytest.MonkeyPatch) -> None: + """Before the loop's handlers exist, SIGTERM must reach `run`'s cleanup.""" + handlers = {} + monkeypatch.setattr(main_module.signal, "signal", lambda signum, handler: handlers.__setitem__(signum, handler)) + monkeypatch.setattr(main_module.moq, "log_level", lambda _level: None, raising=False) + + async def fake_run(_args) -> None: + handlers[main_module.signal.SIGTERM](main_module.signal.SIGTERM, None) + + monkeypatch.setattr(main_module, "run", fake_run) + + assert main_module.main(["--url", "http://localhost:4443"]) == 0 + + +def test_actors_are_destroyed_before_the_relay_session_closes(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + """The actors outlive the process; a relay close that hangs must not stand between them and cleanup.""" + events: list[str] = [] + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + + class FakeWorld: + trucks: list = [] + + def __init__(self) -> None: + self.clock = SimpleNamespace(start=lambda: events.append("clock.start"), heartbeat=Heartbeat("clock")) + + def sweep(self) -> None: + events.append("sweep") + + def spawn(self, _names, _camera, _camera_name) -> None: + events.append("spawn") + + def map_name(self) -> str: + return "Town" + + def ready(self) -> None: + events.append("ready") + + def destroy(self) -> None: + events.append("destroy") + + class FakeConnect: + async def __aenter__(self): + events.append("session.open") + return SimpleNamespace() + + async def __aexit__(self, *_exc) -> None: + events.append("session.close") + + async def fake_supervise(_client, _tasks, _clock, _watchdog) -> None: + events.append("supervise") + + class FakeBridge: + async def run(self) -> None: + await asyncio.Event().wait() + + def disconnect(self) -> None: + events.append("bridge.disconnect") + + async def fake_connect_bridge(_path: str) -> FakeBridge: + events.append("bridge.connect") + return FakeBridge() + + monkeypatch.setattr(main_module.World, "connect", staticmethod(lambda *_args: FakeWorld())) + monkeypatch.setattr(main_module, "connect_bridge", fake_connect_bridge) + monkeypatch.setattr(main_module.moq, "connect", lambda _url: FakeConnect(), raising=False) + monkeypatch.setattr(main_module, "supervise", fake_supervise) + + asyncio.run(main_module.run(parse_args(["--url", "http://localhost:4443"]))) + + assert events == [ + "clock.start", + "sweep", + "spawn", + # The clock is only allowed to park once every truck is in the world: + # `sweep` and `spawn` both wait on ticks. + "ready", + # The cameras are in the world, so the simulator's bridge is listening. + "bridge.connect", + "session.open", + "supervise", + "destroy", + "session.close", + "bridge.disconnect", + "destroy", + ] diff --git a/demo/carla/sim/tests/test_park.py b/demo/carla/sim/tests/test_park.py new file mode 100644 index 00000000000..b47d5dc4903 --- /dev/null +++ b/demo/carla/sim/tests/test_park.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +from types import SimpleNamespace + +import pytest + +from moq_carla_sim import park as park_module + + +def fake_world(no_rendering: bool) -> SimpleNamespace: + settings = SimpleNamespace(no_rendering_mode=no_rendering) + world = SimpleNamespace( + settings=settings, + applied=[], + get_settings=lambda: settings, + ) + world.apply_settings = lambda value: world.applied.append(value.no_rendering_mode) + return world + + +def patch_client(monkeypatch: pytest.MonkeyPatch, world: SimpleNamespace) -> None: + monkeypatch.setattr(park_module, "connect_client", lambda *_args: SimpleNamespace(get_world=lambda: world)) + + +def test_park_disables_rendering_on_an_unowned_simulator(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + world = fake_world(no_rendering=False) + patch_client(monkeypatch, world) + + assert park_module.park("127.0.0.1", 2000, 30.0) + assert world.applied == [True] + + +def test_park_leaves_a_worker_owned_simulator_alone(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + """Parking under a live worker would black out a viewer mid-stream.""" + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + world = fake_world(no_rendering=False) + patch_client(monkeypatch, world) + + from moq_carla_sim.main import claim_simulator + + worker = claim_simulator("127.0.0.1", 2000) + try: + assert not park_module.park("127.0.0.1", 2000, 30.0) + assert world.applied == [] + finally: + worker.close() + + +def test_park_releases_the_lock_so_the_worker_can_start(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + patch_client(monkeypatch, fake_world(no_rendering=False)) + + from moq_carla_sim.main import claim_simulator + + assert park_module.park("127.0.0.1", 2000, 30.0) + claim_simulator("127.0.0.1", 2000).close() + + +def test_park_is_idempotent(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + world = fake_world(no_rendering=True) + patch_client(monkeypatch, world) + + assert park_module.park("127.0.0.1", 2000, 30.0) + assert world.applied == [] + + +def test_park_never_touches_synchronous_mode(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + """A synchronous world nobody ticks is frozen for carla-map and the benchmark.""" + monkeypatch.setenv("XDG_RUNTIME_DIR", str(tmp_path)) + world = fake_world(no_rendering=False) + world.settings.synchronous_mode = False + world.settings.fixed_delta_seconds = 0.0 + patch_client(monkeypatch, world) + + park_module.park("127.0.0.1", 2000, 30.0) + + assert world.settings.synchronous_mode is False + assert world.settings.fixed_delta_seconds == 0.0 diff --git a/demo/carla/sim/tests/test_publish.py b/demo/carla/sim/tests/test_publish.py new file mode 100644 index 00000000000..a11b638ef53 --- /dev/null +++ b/demo/carla/sim/tests/test_publish.py @@ -0,0 +1,305 @@ +import asyncio +from types import SimpleNamespace + +import moq +import pytest + +from moq_carla_sim import publish +from moq_carla_sim.drive import Command, Drive, DriveState, Gear, TimestampEntry +from moq_carla_sim.publish import ( + Collision, + Motion, + Pose, + Status, + Telemetry, + parse_command, + status_payload, +) + + +def status(**overrides) -> Status: + """A status with nothing set, so each test names only what it is about.""" + defaults = dict( + accepted=DriveState.stopped(), + estopped=False, + estop_by=None, + autonomous=False, + driver=None, + sequence=None, + media_pipeline={}, + location=None, + map_name=None, + telemetry=None, + ) + return Status(**{**defaults, **overrides}) + + +def telemetry(**overrides) -> Telemetry: + defaults = dict( + pose=Pose(x=0.0, y=0.0, yaw=0.0, speed=0.0), + measured=DriveState.stopped(), + motion=Motion(yaw_rate=0.0, accel_lon=0.0, accel_lat=0.0), + collision=None, + ) + return Telemetry(**{**defaults, **overrides}) + + +def test_malformed_timestamp_does_not_drop_driver_command() -> None: + command = parse_command( + "driver", + { + "type": "drive", + "sequence": 7, + "throttle": 0.5, + "timestamps": [ + {"label": "bad-null", "ts": None}, + {"label": "bad-string", "ts": "12"}, + {"label": "received", "ts": 12.5}, + ], + }, + ) + + assert command is not None + assert command.sequence == 7 + assert command.timestamps == (TimestampEntry(label="received", ts=12.5),) + + +def test_respawn_command_is_carla_only_control_input() -> None: + command = parse_command("driver", {"type": "respawn", "sequence": 8}) + + assert command is not None + assert command.kind == "respawn" + assert command.driver_id == "driver" + assert command.sequence == 8 + + +def test_status_names_the_driver_that_latched_estop() -> None: + payload = status_payload(status(estopped=True, estop_by="bystander", driver="holder", sequence=4)) + + assert payload["driver"] == "holder" + assert payload["estop_by"] == "bystander" + assert payload["mode"] == "simulated" + assert payload["capabilities"] == ["respawn"] + + +def test_status_carries_the_map_and_a_rounded_pose() -> None: + payload = status_payload( + status( + autonomous=True, + map_name="Town10HD_Opt", + telemetry=telemetry(pose=Pose(x=12.3456, y=-78.9012, yaw=180.06, speed=9.87654)), + ) + ) + + assert payload["map"] == "Town10HD_Opt" + assert payload["pose"] == {"x": 12.35, "y": -78.9, "yaw": 180.1, "speed": 9.88} + + +def test_status_reports_measured_feedback_beside_the_accepted_command() -> None: + """The pair is the point: what was asked for, and what the vehicle did.""" + payload = status_payload( + status( + accepted=DriveState(steering=0.5, throttle=0.4, brake=0.0, gear=Gear.FORWARD), + telemetry=telemetry( + measured=DriveState(steering=0.31234, throttle=0.38765, brake=0.0, gear=Gear.FORWARD), + motion=Motion(yaw_rate=4.567, accel_lon=1.2345, accel_lat=-2.3456), + ), + ) + ) + + assert payload["accepted"]["steering"] == 0.5 + assert payload["measured"] == { + "steering": 0.312, + "throttle": 0.388, + "brake": 0.0, + "gear": "forward", + } + assert payload["motion"] == {"yaw_rate": 4.6, "accel_lon": 1.23, "accel_lat": -2.35} + + +def test_status_carries_a_collision_until_a_later_one_replaces_it() -> None: + """An absolute instant is what makes an event visible on a snapshot track.""" + payload = status_payload( + status( + telemetry=telemetry(collision=Collision(at=1756334400123.4, other="vehicle.tesla.model3", impulse=4210.55)) + ) + ) + + assert payload["collision"] == { + "at": 1756334400123, + "other": "vehicle.tesla.model3", + "impulse": 4210.6, + } + + +def test_status_omits_everything_a_producer_has_none_of() -> None: + payload = status_payload(status()) + + for absent in ("map", "pose", "measured", "motion", "collision"): + assert absent not in payload + + +def test_status_omits_only_the_collision_a_truck_has_not_had() -> None: + payload = status_payload(status(telemetry=telemetry())) + + assert "collision" not in payload + assert "measured" in payload + assert "motion" in payload + + +def test_a_closed_status_track_fails_the_session() -> None: + """Status republishes on a timer, so a swallowed failure would spin forever.""" + + def closed(_payload: object) -> None: + raise moq.Error("track closed") + + publisher = publish.StatusPublisher.__new__(publish.StatusPublisher) + publisher._producer = SimpleNamespace(update=closed) + + with pytest.raises(moq.Error): + publisher.publish({}) + + +class Announcements: + """A scripted announcement stream. `send` returns once the watcher has + handled the event and come back for the next one.""" + + def __init__(self) -> None: + self._events: asyncio.Queue = asyncio.Queue() + self._idle = asyncio.Event() + + async def __aenter__(self): + return self + + async def __aexit__(self, *_exc) -> None: + pass + + def __aiter__(self): + return self + + async def __anext__(self): + if self._events.empty(): + self._idle.set() + event = await self._events.get() + self._idle.clear() + return event + + async def send(self, kind: type, path: str, epoch: str | None) -> None: + self._idle.clear() + self._events.put_nowait(kind(SimpleNamespace(prefix=path, route=SimpleNamespace(epoch=epoch)))) + await self._idle.wait() + + +class Drivers: + """A relay holding driver broadcasts: each request serves one drive command + numbered by how many requests came before it, then stays open.""" + + def __init__(self) -> None: + self.announcements = Announcements() + self.requested: list[str] = [] + + def announced(self, prefix: str, *, filter: str): + assert (prefix, filter) == ("viewer/carla/truck1", "*") + return self.announcements + + async def request_broadcast(self, path: str): + self.requested.append(path) + sequence = len(self.requested) + + async def control(): + yield {"type": "drive", "sequence": sequence, "throttle": 0.5} + await asyncio.Event().wait() + + async def subscribe_track(name: str): + assert name == "control" + return control() + + return SimpleNamespace(subscribe_track=subscribe_track) + + +async def watching(scenario) -> None: + """Run `scenario(relay, commands, gate)` against a live `watch_drivers`.""" + relay = Drivers() + commands: asyncio.Queue = asyncio.Queue() + watcher = asyncio.create_task(publish.watch_drivers(relay, "viewer/carla/truck1", commands)) + try: + await scenario(relay, commands, Drive()) + finally: + watcher.cancel() + with pytest.raises(asyncio.CancelledError): + await watcher + + +async def next_command(commands: asyncio.Queue, gate: Drive): + command = await asyncio.wait_for(commands.get(), timeout=1) + gate.apply(command) + return command + + +def test_a_driver_run_keeps_the_lease_across_route_updates() -> None: + """An update is the same run re-priced: no second subscription, no release.""" + + async def scenario(relay: Drivers, commands: asyncio.Queue, gate: Drive) -> None: + await relay.announcements.send(moq.AnnounceEventStart, "viewer/carla/truck1/abc", "e1") + command = await next_command(commands, gate) + assert (command.kind, command.driver_id, command.epoch) == ("drive", "abc", "e1") + assert gate.driver == "abc" + + await relay.announcements.send(moq.AnnounceEventUpdate, "viewer/carla/truck1/abc", "e1") + assert commands.empty() + assert gate.driver == "abc" + assert relay.requested == ["viewer/carla/truck1/abc"] + + asyncio.run(watching(scenario)) + + +def test_a_driver_whose_broadcast_ends_loses_the_lease() -> None: + async def scenario(relay: Drivers, commands: asyncio.Queue, gate: Drive) -> None: + await relay.announcements.send(moq.AnnounceEventStart, "viewer/carla/truck1/abc", "e1") + await next_command(commands, gate) + assert gate.driver == "abc" + + await relay.announcements.send(moq.AnnounceEventEnd, "viewer/carla/truck1/abc", "e1") + left = await next_command(commands, gate) + assert (left.kind, left.epoch) == ("driver_left", "e1") + assert gate.driver is None + + asyncio.run(watching(scenario)) + + +@pytest.mark.parametrize("kind", ["restart", "update"]) +def test_a_driver_that_restarts_under_a_new_epoch_is_a_new_driver(kind: str) -> None: + """The old run's lease ends with it, even though the path and id are the same. + + A new epoch is a restart whether the relay says so or reports it as an update. + """ + event = moq.AnnounceEventRestart if kind == "restart" else moq.AnnounceEventUpdate + + async def scenario(relay: Drivers, commands: asyncio.Queue, gate: Drive) -> None: + await relay.announcements.send(moq.AnnounceEventStart, "viewer/carla/truck1/abc", "e1") + await next_command(commands, gate) + + await relay.announcements.send(event, "viewer/carla/truck1/abc", "e2") + received = [await next_command(commands, gate) for _ in range(2)] + assert {(command.kind, command.epoch) for command in received} == {("driver_left", "e1"), ("drive", "e2")} + assert relay.requested == ["viewer/carla/truck1/abc"] * 2 + + # Whichever order those two arrived in, the new run holds the lease + # by its next command, and the old run can no longer release it. + assert not gate.holds(Command(kind="drive", driver_id="abc", epoch="e1")) + gate.apply(Command(kind="drive", driver_id="abc", epoch="e2", sequence=3, state=DriveState())) + assert gate.holds(Command(kind="drive", driver_id="abc", epoch="e2")) + assert not gate.apply(Command(kind="driver_left", driver_id="abc", epoch="e1")) + assert gate.driver == "abc" + + asyncio.run(watching(scenario)) + + +def test_only_direct_children_of_the_prefix_are_drivers() -> None: + async def scenario(relay: Drivers, commands: asyncio.Queue, gate: Drive) -> None: + await relay.announcements.send(moq.AnnounceEventStart, "viewer/carla", None) + await relay.announcements.send(moq.AnnounceEventStart, "viewer/carla/truck1/abc/deeper", None) + await relay.announcements.send(moq.AnnounceEventStart, "viewer/carla/truck10", None) + assert relay.requested == [] + + asyncio.run(watching(scenario)) diff --git a/demo/carla/sim/tests/test_roadmap.py b/demo/carla/sim/tests/test_roadmap.py new file mode 100644 index 00000000000..7425ae94440 --- /dev/null +++ b/demo/carla/sim/tests/test_roadmap.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +from types import SimpleNamespace + +import pytest + +from moq_carla_sim.roadmap import feature_collection, lane_points, road_lines, simplify + + +def waypoint(x: float, y: float, lane: tuple[int, int, int], following: list | None = None) -> SimpleNamespace: + ahead = following or [] + return SimpleNamespace( + road_id=lane[0], + section_id=lane[1], + lane_id=lane[2], + transform=SimpleNamespace(location=SimpleNamespace(x=x, y=y)), + next=lambda _step: ahead, + ) + + +def test_simplify_collapses_a_straight_run_to_its_ends() -> None: + straight = [(float(x), 0.0) for x in range(50)] + + assert simplify(straight, 0.5) == [(0.0, 0.0), (49.0, 0.0)] + + +def test_simplify_keeps_a_corner_outside_the_tolerance() -> None: + corner = [(0.0, 0.0), (5.0, 2.0), (10.0, 0.0)] + + assert simplify(corner, 0.5) == corner + # The same corner inside a wider corridor is a straight line. + assert simplify(corner, 3.0) == [(0.0, 0.0), (10.0, 0.0)] + + +def test_lane_walk_stops_where_the_lane_does() -> None: + lane = (1, 0, -1) + third = waypoint(4.0, 0.0, lane) + second = waypoint(2.0, 0.0, lane, [third]) + first = waypoint(0.0, 0.0, lane, [second]) + + assert lane_points(first, 2.0) == [(0.0, 0.0), (2.0, 0.0), (4.0, 0.0)] + + +def test_lane_walk_does_not_follow_the_next_lane() -> None: + other = waypoint(2.0, 0.0, (2, 0, -1)) + first = waypoint(0.0, 0.0, (1, 0, -1), [other]) + + assert lane_points(first, 2.0) == [(0.0, 0.0)] + + +def test_lane_walk_bounds_a_ring_road() -> None: + lane = (1, 0, -1) + looping = waypoint(0.0, 0.0, lane) + looping.next = lambda _step: [looping] + + assert len(lane_points(looping, 2.0, limit=10)) == 11 + + +def test_road_lines_drops_a_lane_too_short_to_draw() -> None: + lane = (1, 0, -1) + stub = waypoint(0.0, 0.0, lane) + end = waypoint(10.0, 0.0, lane) + drawable = waypoint(0.0, 5.0, lane, [end]) + + assert road_lines(SimpleNamespace(get_topology=lambda: [(stub, stub), (drawable, end)])) == [ + [(0.0, 5.0), (10.0, 0.0)] + ] + + +def test_feature_collection_bounds_every_lane() -> None: + collection = feature_collection("Town10HD_Opt", [[(0.0, 0.0), (10.04, 5.0)], [(-3.0, 2.0), (1.0, -8.0)]]) + + assert collection["name"] == "Town10HD_Opt" + assert collection["bbox"] == [-3.0, -8.0, 10.0, 5.0] + assert collection["features"][0]["geometry"]["coordinates"][0] == [[0.0, 0.0], [10.0, 5.0]] + + +def test_a_map_with_no_drivable_lane_is_an_error() -> None: + with pytest.raises(RuntimeError, match="no drivable lanes"): + feature_collection("Empty", []) diff --git a/demo/carla/sim/tests/test_runtime.py b/demo/carla/sim/tests/test_runtime.py new file mode 100644 index 00000000000..87fd587a0bc --- /dev/null +++ b/demo/carla/sim/tests/test_runtime.py @@ -0,0 +1,530 @@ +import asyncio +import contextlib +from types import SimpleNamespace + +import pytest + +from moq_carla_sim import runtime +from moq_carla_sim.drive import Command, Drive, DriveState, Gear +from moq_carla_sim.publish import Pose +from moq_carla_sim.runtime import StuckDetector + + +class FakeClock: + """Records holds so a test can assert what keeps the world stepping.""" + + def __init__(self, running: bool = True) -> None: + self.held: set[str] = set() + self.running = running + + def hold(self, reason: str) -> None: + self.held.add(reason) + + def release(self, reason: str) -> None: + self.held.discard(reason) + + +class DemandPublisher: + def __init__(self) -> None: + self.use = asyncio.Event() + self.unuse = asyncio.Event() + self.cuts = 0 + + async def used(self) -> None: + await self.use.wait() + self.use.clear() + + async def unused(self) -> None: + await self.unuse.wait() + self.unuse.clear() + + def cut(self) -> None: + self.cuts += 1 + + +def test_takeover_synchronizes_gate_with_current_vehicle_controls() -> None: + async def scenario() -> None: + measured = DriveState(steering=-0.3, throttle=0.7, brake=0.0, gear=Gear.FORWARD) + commands = asyncio.Queue() + commands.put_nowait(Command(kind="drive", driver_id="driver", sequence=1, state=measured)) + + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace( + name="truck1", + autonomous=True, + telemetry=lambda: SimpleNamespace(measured=measured), + ) + session._drive = Drive() + session._commands = commands + session._deadline = None + session._media_pipeline = {} + session._actuate = lambda: None + session._publish = lambda: None + + task = asyncio.create_task(session._loop()) + try: + for _ in range(10): + if session._drive.driver is not None: + break + await asyncio.sleep(0) + assert session._drive.driver == "driver" + assert session._drive.state == measured + finally: + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + + asyncio.run(scenario()) + + +def test_only_unestopped_lease_holder_can_respawn_truck() -> None: + async def scenario() -> None: + commands = asyncio.Queue() + commands.put_nowait(Command(kind="respawn", driver_id="bystander", sequence=2)) + commands.put_nowait(Command(kind="respawn", driver_id="holder", sequence=3)) + commands.put_nowait(Command(kind="reset_estop", driver_id="holder", sequence=4)) + commands.put_nowait(Command(kind="respawn", driver_id="holder", sequence=5)) + respawns: list[str] = [] + published: list[bool] = [] + + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace(name="truck1", respawn=lambda: respawns.append("truck1")) + session._drive = Drive() + session._stuck = StuckDetector() + assert session._drive.apply(Command(kind="drive", driver_id="holder", sequence=1, state=DriveState())) + assert session._drive.apply(Command(kind="estop", driver_id="bystander", sequence=2)) + session._commands = commands + session._deadline = None + session._media_pipeline = {"holder": []} + session._actuate = lambda: None + session._publish = lambda: published.append(True) + + task = asyncio.create_task(session._loop()) + try: + for _ in range(10): + if respawns: + break + await asyncio.sleep(0) + assert respawns == ["truck1"] + assert session._drive.driver is None + assert session._media_pipeline == {} + assert published == [True, True] + finally: + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + + asyncio.run(scenario()) + + +def test_video_demand_renders_the_world_for_the_truck(monkeypatch: pytest.MonkeyPatch) -> None: + """The stream's demand is what turns the simulator's renderer on for a truck.""" + + async def wait_forever(*_args: object) -> None: + await asyncio.Event().wait() + + async def scenario() -> None: + demanded: list[bool] = [] + watching = asyncio.Event() + + async def watch_demand(on_demand) -> None: + on_demand(True) + on_demand(False) + watching.set() + await asyncio.Event().wait() + + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace(name="truck1", set_video_demand=demanded.append) + session._commands = asyncio.Queue() + session._video = SimpleNamespace(watch_demand=watch_demand, published=[0, 0], rendition_names=["sd", "hd"]) + session._status = DemandPublisher() + session._publish = lambda: None + session._loop = wait_forever + monkeypatch.setattr(runtime, "watch_drivers", wait_forever) + + run = asyncio.create_task(session.run(SimpleNamespace(), "viewer/carla/truck1")) + await watching.wait() + run.cancel() + await asyncio.gather(run, return_exceptions=True) + assert demanded == [True, False] + + asyncio.run(scenario()) + + +def test_session_exits_when_its_video_demand_fails(monkeypatch: pytest.MonkeyPatch) -> None: + """A world that cannot start rendering for a viewer fails the session.""" + + async def wait_forever(*_args: object) -> None: + await asyncio.Event().wait() + + async def fail_demand(_on_demand) -> None: + raise RuntimeError("CARLA rejected settings") + + async def scenario() -> None: + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace(name="truck1", set_video_demand=lambda _demanded: None) + session._commands = asyncio.Queue() + session._video = SimpleNamespace(watch_demand=fail_demand, published=[0], rendition_names=["hd"]) + session._status = DemandPublisher() + session._publish = lambda: None + session._loop = wait_forever + monkeypatch.setattr(runtime, "watch_drivers", wait_forever) + + with pytest.raises(ExceptionGroup) as failure: + await session.run(SimpleNamespace(), "viewer/carla/truck1") + + assert len(failure.value.exceptions) == 1 + assert str(failure.value.exceptions[0]) == "CARLA rejected settings" + + asyncio.run(scenario()) + + +def test_status_republishes_on_a_timer_so_telemetry_keeps_arriving( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """An autonomous truck publishes no accepted-state change, but still drives.""" + + async def scenario() -> None: + published: list[int] = [] + slept: list[float] = [] + + async def sleep(delay: float) -> None: + slept.append(delay) + if len(slept) == 3: + raise asyncio.CancelledError + + monkeypatch.setattr(runtime.asyncio, "sleep", sleep) + session = telemetry_session(pose=lambda: Pose(x=0.0, y=0.0, yaw=0.0, speed=0.0)) + session._publish = lambda _telemetry: published.append(len(published)) + + with pytest.raises(asyncio.CancelledError): + await session._publish_telemetry() + + assert slept == [runtime.TELEMETRY_INTERVAL] * 3 + assert len(published) == 2 + + asyncio.run(scenario()) + + +def telemetry_session(pose, *, autonomous: bool = True) -> runtime.TruckSession: + """A session with just what the telemetry timer touches, at the resting state.""" + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace( + name="truck1", + autonomous=autonomous, + telemetry=lambda: SimpleNamespace(pose=pose()), + respawn=lambda: None, + release=lambda: None, + ) + session._drive = Drive() + session._stuck = StuckDetector() + return session + + +def test_telemetry_timer_keeps_releasing_a_driverless_truck(monkeypatch: pytest.MonkeyPatch) -> None: + """The handback merges over several ticks, so the timer must revisit it.""" + + async def scenario() -> None: + ticks = 0 + releases = 0 + + async def sleep(_delay: float) -> None: + nonlocal ticks + ticks += 1 + if ticks > 5: + raise asyncio.CancelledError + + def release() -> None: + nonlocal releases + releases += 1 + + monkeypatch.setattr(runtime.asyncio, "sleep", sleep) + session = telemetry_session(pose=lambda: Pose(x=0.0, y=0.0, yaw=0.0, speed=8.0), autonomous=False) + session._truck.release = release + session._publish = lambda _telemetry: None + + with pytest.raises(asyncio.CancelledError): + await session._publish_telemetry() + assert releases == 5 + + # A held or e-stopped truck is not driverless, and stays off autonomy. + for hold in (holding, estopped_by_bystander): + ticks = releases = 0 + session = telemetry_session(pose=lambda: Pose(x=0.0, y=0.0, yaw=0.0, speed=0.0), autonomous=False) + session._truck.release = release + session._publish = lambda _telemetry: None + hold(session._drive) + with pytest.raises(asyncio.CancelledError): + await session._publish_telemetry() + assert releases == 0 + + asyncio.run(scenario()) + + +def test_stuck_detector_fires_only_after_the_timeout_without_displacement() -> None: + detector = StuckDetector(timeout=300.0, distance=2.0) + parked = Pose(x=10.0, y=10.0, yaw=0.0, speed=0.0) + + assert not detector.update(parked, now=0.0) + assert not detector.update(parked, now=299.9) + # Grinding sideways against a barrier stays inside the window. + assert not detector.update(Pose(x=11.0, y=10.0, yaw=0.0, speed=0.3), now=299.9) + assert detector.update(parked, now=300.0) + + # Getting clear re-anchors and restarts the clock. + assert not detector.update(Pose(x=12.0, y=10.0, yaw=0.0, speed=0.0), now=301.0) + assert not detector.update(Pose(x=12.0, y=10.0, yaw=0.0, speed=0.0), now=600.0) + assert detector.update(Pose(x=12.0, y=10.0, yaw=0.0, speed=0.0), now=601.0) + + +def test_autonomous_truck_wedged_for_the_timeout_is_respawned(monkeypatch: pytest.MonkeyPatch) -> None: + async def scenario() -> None: + clock = 0.0 + respawns: list[float] = [] + published: list[Pose] = [] + + async def sleep(delay: float) -> None: + nonlocal clock + clock += delay + if clock > runtime.STUCK_TIMEOUT + 1.0: + raise asyncio.CancelledError + + monkeypatch.setattr(runtime.asyncio, "sleep", sleep) + loop = asyncio.get_running_loop() + monkeypatch.setattr(loop, "time", lambda: clock) + + wedged = Pose(x=5.0, y=5.0, yaw=0.0, speed=0.0) + session = telemetry_session(pose=lambda: wedged) + session._truck.respawn = lambda: respawns.append(clock) + session._publish = lambda telemetry: published.append(telemetry.pose) + + with pytest.raises(asyncio.CancelledError): + await session._publish_telemetry() + + assert len(respawns) == 1 + assert runtime.STUCK_TIMEOUT <= respawns[0] < runtime.STUCK_TIMEOUT + 1.0 + # Status keeps flowing through the whole wait, and after the respawn. + assert len(published) > respawns[0] / runtime.TELEMETRY_INTERVAL + + asyncio.run(scenario()) + + +def holding(drive: Drive) -> None: + """A driver parked with the brake on.""" + assert drive.apply(Command(kind="drive", driver_id="holder", sequence=1, state=DriveState(brake=1.0))) + + +def estopped_by_bystander(drive: Drive) -> None: + """A bystander's e-stop outlives the lease it never held.""" + assert drive.apply(Command(kind="estop", driver_id="bystander", sequence=1)) + assert drive.driver is None and drive.estopped + + +@pytest.mark.parametrize("hold", [holding, estopped_by_bystander]) +def test_stuck_watchdog_leaves_a_held_or_estopped_truck_alone(monkeypatch: pytest.MonkeyPatch, hold) -> None: + async def scenario() -> None: + clock = 0.0 + respawns: list[float] = [] + + async def sleep(delay: float) -> None: + nonlocal clock + clock += delay + if clock > 2 * runtime.STUCK_TIMEOUT: + raise asyncio.CancelledError + + monkeypatch.setattr(runtime.asyncio, "sleep", sleep) + loop = asyncio.get_running_loop() + monkeypatch.setattr(loop, "time", lambda: clock) + + wedged = Pose(x=5.0, y=5.0, yaw=0.0, speed=0.0) + session = telemetry_session(pose=lambda: wedged, autonomous=False) + session._truck.respawn = lambda: respawns.append(clock) + session._publish = lambda _telemetry: None + hold(session._drive) + + with pytest.raises(asyncio.CancelledError): + await session._publish_telemetry() + + assert respawns == [] + + asyncio.run(scenario()) + + +def test_session_announces_with_the_run_epoch_after_populating_tracks() -> None: + """The player lists trucks from announcements, and a broadcast starts + unadvertised, so a session that never announces is invisible. The route + carries the run's epoch so a restarted worker reads as a restart.""" + calls: list[object] = [] + broadcast = SimpleNamespace( + publish_track=lambda name: calls.append(name) or SimpleNamespace(demand=SimpleNamespace), + announce=lambda route: calls.append(route), + ) + route = SimpleNamespace(epoch="0190b2a4-0000-7000-8000-000000000000") + + # The video tracks were advertised when the bridge stream opened. + runtime.TruckSession(SimpleNamespace(name="truck1"), broadcast, SimpleNamespace(), None, None, FakeClock(), route) + + assert calls == ["status", route] + + +def test_a_driver_keeps_the_world_stepping_with_nobody_watching() -> None: + """Video demand and the lease are independent; the gate must hold for both.""" + + async def scenario() -> None: + commands = asyncio.Queue() + commands.put_nowait(Command(kind="drive", driver_id="holder", sequence=1, state=DriveState(throttle=0.5))) + + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace(name="truck1", autonomous=False) + session._drive = Drive() + session._commands = commands + session._deadline = None + session._media_pipeline = {} + session._stuck = StuckDetector() + session._actuate = lambda: None + session._publish = lambda: None + + with contextlib.suppress(asyncio.TimeoutError): + await asyncio.wait_for(session._loop(), timeout=0.1) + + assert session._clock.held == {"drive:truck1"} + + # The watchdog hands the truck back, and the hold goes with the lease. + session._commands.put_nowait(Command(kind="watchdog_expired")) + with contextlib.suppress(asyncio.TimeoutError): + await asyncio.wait_for(session._loop(), timeout=0.1) + + assert session._clock.held == set() + + asyncio.run(scenario()) + + +def test_a_parked_world_is_not_a_stuck_truck(monkeypatch: pytest.MonkeyPatch) -> None: + """Nothing is meant to be moving, so respawning on it would fire forever.""" + + async def scenario() -> None: + clock = 0.0 + respawns: list[float] = [] + + async def sleep(delay: float) -> None: + nonlocal clock + clock += delay + if clock > runtime.STUCK_TIMEOUT * 2: + raise asyncio.CancelledError + + monkeypatch.setattr(runtime.asyncio, "sleep", sleep) + loop = asyncio.get_running_loop() + monkeypatch.setattr(loop, "time", lambda: clock) + + session = telemetry_session(pose=lambda: Pose(x=5.0, y=5.0, yaw=0.0, speed=0.0)) + session._clock = FakeClock(running=False) + session._truck.respawn = lambda: respawns.append(clock) + session._publish = lambda _telemetry: None + + with pytest.raises(asyncio.CancelledError): + await session._publish_telemetry() + + assert respawns == [] + + asyncio.run(scenario()) + + +def test_a_status_subscriber_keeps_the_world_stepping() -> None: + """The map draws positions from `status`, so an open map must not freeze.""" + + async def scenario() -> None: + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace(name="truck1") + session._status = DemandPublisher() + watcher = asyncio.create_task(session._watch_status_demand()) + + async def expect_held(held: set[str]) -> None: + for _ in range(10): + if session._clock.held == held: + return + await asyncio.sleep(0) + pytest.fail(f"holds never became {held}, still {session._clock.held}") + + try: + session._status.use.set() + await expect_held({"status:truck1"}) + session._status.unuse.set() + await expect_held(set()) + session._status.use.set() + await expect_held({"status:truck1"}) + finally: + watcher.cancel() + with contextlib.suppress(asyncio.CancelledError): + await watcher + # Cancelled mid-subscription, as a session shutting down would be. + assert session._clock.held == set() + + asyncio.run(scenario()) + + +def test_an_estopped_holder_neither_steps_the_world_nor_keeps_its_lease( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """A latched truck stands still, so its refused frames must let the lease lapse.""" + + async def scenario() -> None: + now = 0.0 + loop = asyncio.get_running_loop() + monkeypatch.setattr(loop, "time", lambda: now) + published: list[bool] = [] + + session = runtime.TruckSession.__new__(runtime.TruckSession) + session._clock = FakeClock() + session._truck = SimpleNamespace(name="truck1", autonomous=False) + session._drive = Drive() + session._commands = asyncio.Queue() + session._deadline = None + session._media_pipeline = {} + session._actuate = lambda: None + session._publish = lambda: published.append(True) + + async def settle(count: int) -> None: + for _ in range(10): + if len(published) == count: + return + await asyncio.sleep(0) + pytest.fail(f"expected {count} publishes, saw {len(published)}") + + task = asyncio.create_task(session._loop()) + try: + session._commands.put_nowait( + Command(kind="drive", driver_id="holder", sequence=1, state=DriveState(brake=1.0)) + ) + await settle(1) + assert session._clock.held == {"drive:truck1"} + + session._commands.put_nowait(Command(kind="estop", driver_id="holder", sequence=2)) + await settle(2) + assert session._drive.driver == "holder" + assert session._clock.held == set() + assert session._deadline == runtime.COMMAND_TIMEOUT + + # The holder keeps sending and the gate refuses every frame. A + # bystander's e-stop publishes without refreshing the lease, which + # marks the refused frame as processed. + now = runtime.COMMAND_TIMEOUT / 2 + session._commands.put_nowait( + Command(kind="drive", driver_id="holder", sequence=3, state=DriveState(throttle=0.5)) + ) + session._commands.put_nowait(Command(kind="estop", driver_id="bystander", sequence=1)) + await settle(3) + assert session._deadline == runtime.COMMAND_TIMEOUT + assert session._clock.held == set() + finally: + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + + asyncio.run(scenario()) diff --git a/demo/carla/sim/tests/test_watchdog.py b/demo/carla/sim/tests/test_watchdog.py new file mode 100644 index 00000000000..8a3daeef64a --- /dev/null +++ b/demo/carla/sim/tests/test_watchdog.py @@ -0,0 +1,87 @@ +import asyncio +import time + +from moq_carla_sim.watchdog import Heartbeat, Watchdog + + +def test_a_stale_heartbeat_ends_the_process() -> None: + """A clock thread that never returns from `world.tick()` beats nothing.""" + + async def scenario() -> list[str]: + failures: list[str] = [] + clock = Heartbeat("simulation clock") + watchdog = Watchdog(0.1, clock, fail=failures.append) + watchdog.start() + pulse = asyncio.create_task(watchdog.pulse()) + try: + deadline = time.monotonic() + 2.0 + while not failures and time.monotonic() < deadline: + await asyncio.sleep(0.01) + finally: + pulse.cancel() + watchdog.stop() + return failures + + failures = asyncio.run(scenario()) + assert failures and failures[0].startswith("simulation clock has not advanced") + + +def test_a_blocked_event_loop_is_a_stall_even_while_the_clock_ticks() -> None: + """The loop's own heartbeat is watched, since every asyncio watcher is stuck behind a blocked loop.""" + + async def scenario() -> list[str]: + failures: list[str] = [] + clock = Heartbeat("simulation clock") + watchdog = Watchdog(0.1, clock, fail=failures.append) + watchdog.start() + pulse = asyncio.create_task(watchdog.pulse()) + try: + await asyncio.sleep(0.05) + # A blocking call on the loop thread: nothing awaits, so the pulse + # cannot run, while the clock keeps beating from its own thread. + deadline = time.monotonic() + 0.5 + while time.monotonic() < deadline: + clock.beat() + time.sleep(0.01) + finally: + pulse.cancel() + watchdog.stop() + return failures + + failures = asyncio.run(scenario()) + assert failures and failures[0].startswith("event loop has not advanced") + + +def test_a_worker_making_progress_is_left_alone() -> None: + async def scenario() -> list[str]: + failures: list[str] = [] + clock = Heartbeat("simulation clock") + watchdog = Watchdog(0.1, clock, fail=failures.append) + watchdog.start() + pulse = asyncio.create_task(watchdog.pulse()) + try: + for _ in range(20): + clock.beat() + await asyncio.sleep(0.025) + finally: + pulse.cancel() + watchdog.stop() + return failures + + assert asyncio.run(scenario()) == [] + + +def test_the_loop_is_watched_only_once_its_pulse_starts() -> None: + """Startup runs blocking CARLA calls before `supervise` schedules the pulse; that is not a stall.""" + failures: list[str] = [] + clock = Heartbeat("simulation clock") + watchdog = Watchdog(0.05, clock, fail=failures.append) + watchdog.start() + try: + deadline = time.monotonic() + 0.3 + while time.monotonic() < deadline: + clock.beat() + time.sleep(0.01) + finally: + watchdog.stop() + assert failures == [] diff --git a/demo/carla/sim/tests/test_world.py b/demo/carla/sim/tests/test_world.py new file mode 100644 index 00000000000..e21ef29628e --- /dev/null +++ b/demo/carla/sim/tests/test_world.py @@ -0,0 +1,922 @@ +from __future__ import annotations + +import asyncio +from types import SimpleNamespace + +import pytest + +from moq_carla_sim import world as world_module +from moq_carla_sim.drive import Accepted, DriveState, Gear +from moq_carla_sim.publish import Collision, Motion, Pose +from moq_carla_sim.world import ( + CAMERA_STANDOFF, + COLLISION_WINDOW, + CONVOY_SPACING, + SPAWN_TICK_TIMEOUT, + CameraConfig, + Clock, + Truck, + World, + camera_transform, + convoy_anchor_points, + convoy_transform, + free_spawn_point, + nearby_spawn_points, + next_deadline, +) + + +def vector(x: float = 0.0, y: float = 0.0, z: float = 0.0) -> SimpleNamespace: + return SimpleNamespace(x=x, y=y, z=z) + + +def fake_sensor(events: list[str] | None = None, name: str = "sensor") -> SimpleNamespace: + """A sensor whose lifecycle calls are recorded, or ignored.""" + record = (lambda call: events.append(f"{name}.{call}")) if events is not None else (lambda _call: None) + return SimpleNamespace( + listen=lambda _callback: record("listen"), + stop=lambda: record("stop"), + destroy=lambda: record("destroy"), + ) + + +def fake_traffic_manager(modes: list[bool] | None = None) -> SimpleNamespace: + return SimpleNamespace(set_synchronous_mode=lambda sync: modes is not None and modes.append(sync)) + + +def fake_vehicle(**overrides) -> SimpleNamespace: + """A stationary vehicle pointing along +x, applying nothing.""" + defaults = dict( + id=1, + set_autopilot=lambda *_args: None, + get_transform=lambda: SimpleNamespace( + location=vector(), + rotation=SimpleNamespace(yaw=0.0), + get_forward_vector=lambda: vector(x=1.0), + get_right_vector=lambda: vector(y=1.0), + ), + get_velocity=lambda: vector(), + get_acceleration=lambda: vector(), + get_angular_velocity=lambda: vector(), + get_control=lambda: SimpleNamespace(steer=0.0, throttle=0.0, brake=0.0, reverse=False), + ) + vehicle = SimpleNamespace(**{**defaults, **overrides}) + if "get_world" not in overrides: + vehicle.get_world = lambda: SimpleNamespace( + get_map=lambda: SimpleNamespace(get_spawn_points=lambda: [vehicle.get_transform()]), + get_actors=lambda: SimpleNamespace(filter=lambda _pattern: [vehicle]), + ) + return vehicle + + +def test_camera_config_builds_240p_sd_and_720p_hd_by_default() -> None: + assert CameraConfig().renditions() == ( + world_module.RenditionConfig(name="sd", width=426, height=240, fps=30, bitrate=800_000), + world_module.RenditionConfig(name="hd", width=1280, height=720, fps=30, bitrate=4_000_000), + ) + + +def test_pose_reports_world_metres_and_speed() -> None: + vehicle = fake_vehicle( + get_transform=lambda: SimpleNamespace( + location=vector(x=12.5, y=-3.25), + rotation=SimpleNamespace(yaw=90.0), + get_forward_vector=lambda: vector(y=1.0), + get_right_vector=lambda: vector(x=-1.0), + ), + get_velocity=lambda: vector(x=3.0, y=4.0), + ) + + telemetry = Truck("truck1", vehicle, [], fake_sensor(), 8000, road_map=SimpleNamespace()).telemetry() + + assert telemetry.pose == Pose(x=12.5, y=-3.25, yaw=90.0, speed=5.0) + + +def test_measured_control_is_what_the_physics_applied_not_the_command() -> None: + """`get_control` is populated whoever is driving, Traffic Manager included.""" + vehicle = fake_vehicle(get_control=lambda: SimpleNamespace(steer=-0.4, throttle=0.6, brake=0.0, reverse=True)) + + measured = Truck("truck1", vehicle, [], fake_sensor(), 8000, road_map=SimpleNamespace()).telemetry().measured + + assert (measured.steering, measured.throttle, measured.brake) == (-0.4, 0.6, 0.0) + assert measured.gear is Gear.REVERSE + + +def test_respawn_returns_to_spawn_and_reengages_autonomy() -> None: + events: list[object] = [] + spawn = SimpleNamespace( + name="spawn", + location=vector(), + rotation=SimpleNamespace(yaw=0.0), + get_forward_vector=lambda: vector(x=1.0), + get_right_vector=lambda: vector(y=1.0), + ) + vehicle = fake_vehicle( + get_transform=lambda: spawn, + set_autopilot=lambda enabled, port: events.append(("autopilot", enabled, port)), + apply_control=lambda _control: events.append("control.reset"), + set_transform=lambda transform: events.append(("transform", transform)), + set_target_velocity=lambda _velocity: events.append("velocity.reset"), + set_target_angular_velocity=lambda _velocity: events.append("angular.reset"), + ) + truck = Truck("truck1", vehicle, [], fake_sensor(), 8000, road_map=SimpleNamespace()) + truck._collision = Collision(at=1.0, other="barrier", impulse=2.0) + events.clear() + + truck.respawn() + + assert events == [ + ("autopilot", False, 8000), + "control.reset", + ("transform", spawn), + "velocity.reset", + "angular.reset", + ("autopilot", True, 8000), + ] + assert truck.autonomous + assert truck.telemetry().collision is None + + +def test_acceleration_is_projected_onto_the_vehicles_own_axes() -> None: + """A truck facing south feels a westward push as acceleration to its right.""" + vehicle = fake_vehicle( + get_transform=lambda: SimpleNamespace( + location=vector(), + rotation=SimpleNamespace(yaw=90.0), + get_forward_vector=lambda: vector(y=1.0), + get_right_vector=lambda: vector(x=-1.0), + ), + get_acceleration=lambda: vector(x=-3.0, y=2.0), + get_angular_velocity=lambda: vector(z=7.5), + ) + + assert Truck("truck1", vehicle, [], fake_sensor(), 8000, road_map=SimpleNamespace()).telemetry().motion == Motion( + yaw_rate=7.5, accel_lon=2.0, accel_lat=3.0 + ) + + +def test_acceleration_on_a_grade_keeps_its_vertical_component() -> None: + """A road that is graded and banked is where the z terms live.""" + # Nose up a 3-4-5 grade: forward tilts out of the horizontal plane, and the + # truck accelerating along that slope has acceleration pointing up it too. + vehicle = fake_vehicle( + get_transform=lambda: SimpleNamespace( + location=vector(), + rotation=SimpleNamespace(yaw=0.0), + get_forward_vector=lambda: vector(x=0.8, z=0.6), + get_right_vector=lambda: vector(y=1.0), + ), + get_acceleration=lambda: vector(x=4.0, z=3.0), + ) + + motion = Truck("truck1", vehicle, [], fake_sensor(), 8000, road_map=SimpleNamespace()).telemetry().motion + + # 4.0*0.8 + 3.0*0.6; dropping the vertical term would report 3.2. + assert motion.accel_lon == pytest.approx(5.0) + + +class Contacts: + """Drive `_on_collision` with both clocks under the test's control.""" + + def __init__(self, truck: Truck, patch: pytest.MonkeyPatch) -> None: + self.truck = truck + self.monotonic = 100.0 + self.wall = 1756334400000.0 + patch.setattr(world_module.time, "monotonic", lambda: self.monotonic) + patch.setattr(world_module.time, "time", lambda: self.wall / 1000.0) + + def advance(self, seconds: float) -> None: + self.monotonic += seconds + self.wall += seconds * 1000.0 + + def hit(self, magnitude: float, other: str, actor: int = 1) -> None: + self.truck._on_collision( + SimpleNamespace( + normal_impulse=vector(x=magnitude), + other_actor=SimpleNamespace(id=actor, type_id=other), + ) + ) + + +def test_continuous_contact_is_one_collision_with_its_peak_impulse() -> None: + """CARLA emits an event per frame of contact; a barrier is not 30 crashes.""" + truck = Truck("truck1", fake_vehicle(), [], fake_sensor(), 8000, road_map=SimpleNamespace()) + + with pytest.MonkeyPatch.context() as patch: + contacts = Contacts(truck, patch) + started = contacts.wall + contacts.hit(400.0, "static.sidewalk") + contacts.advance(COLLISION_WINDOW / 2) + contacts.hit(900.0, "static.sidewalk") + contacts.advance(COLLISION_WINDOW / 2) + contacts.hit(100.0, "static.sidewalk") + # The timestamp stays at the start of contact: moving it forward as the + # scrape continues would republish one collision as a stream of them. + assert truck.telemetry().collision == Collision(at=started, other="static.sidewalk", impulse=900.0) + + # Contact keeps extending the window, so only a real gap starts a second. + contacts.advance(COLLISION_WINDOW * 2) + assert truck.telemetry().collision.at == started + contacts.hit(50.0, "vehicle.tesla.model3", actor=2) + assert truck.telemetry().collision == Collision(at=contacts.wall, other="vehicle.tesla.model3", impulse=50.0) + + +def test_striking_something_else_is_a_new_collision_however_soon() -> None: + """Scrape a barrier, then hit a truck: two events, not one.""" + truck = Truck("truck1", fake_vehicle(), [], fake_sensor(), 8000, road_map=SimpleNamespace()) + + with pytest.MonkeyPatch.context() as patch: + contacts = Contacts(truck, patch) + contacts.hit(400.0, "static.guardrail", actor=7) + contacts.advance(COLLISION_WINDOW / 4) + contacts.hit(50.0, "vehicle.carlamotors.european_hgv", actor=9) + + # The second is quieter and well inside the window, so a time-only + # window would have hidden it behind the guardrail's own event. + assert truck.telemetry().collision == Collision( + at=contacts.wall, other="vehicle.carlamotors.european_hgv", impulse=50.0 + ) + + +def test_two_of_the_same_model_are_two_collisions() -> None: + """The window keys on the actor's id; `type_id` is a blueprint name.""" + truck = Truck("truck1", fake_vehicle(), [], fake_sensor(), 8000, road_map=SimpleNamespace()) + + with pytest.MonkeyPatch.context() as patch: + contacts = Contacts(truck, patch) + contacts.hit(100.0, "vehicle.tesla.model3", actor=3) + first = truck.telemetry().collision + contacts.advance(COLLISION_WINDOW / 4) + contacts.hit(100.0, "vehicle.tesla.model3", actor=4) + + assert truck.telemetry().collision.at != first.at + + +def test_a_truck_that_has_hit_nothing_reports_no_collision() -> None: + truck = Truck("truck1", fake_vehicle(), [], fake_sensor(), 8000, road_map=SimpleNamespace()) + assert truck.telemetry().collision is None + + +def test_camera_sits_beyond_vehicle_front() -> None: + vehicle = SimpleNamespace( + bounding_box=SimpleNamespace( + location=SimpleNamespace(x=0.01), + extent=SimpleNamespace(x=3.97), + ) + ) + + transform = camera_transform(vehicle) + + assert transform.location.x == 0.01 + 3.97 + CAMERA_STANDOFF + assert transform.location.z == 2.8 + + +def test_nearby_spawn_points_cluster_around_first_truck() -> None: + def point(x: float, y: float) -> SimpleNamespace: + return SimpleNamespace(location=SimpleNamespace(x=x, y=y, z=0.0)) + + far = point(100.0, 100.0) + closest = point(12.0, 10.0) + anchor = point(10.0, 10.0) + middle = point(20.0, 10.0) + + ordered = nearby_spawn_points([far, closest, anchor, middle], SimpleNamespace(x=10.0, y=10.0, z=0.0)) + + assert ordered == [anchor, closest, middle, far] + + +def test_free_spawn_point_skips_an_original_occupied_by_another_truck() -> None: + original = SimpleNamespace(location=vector()) + fallback = SimpleNamespace(location=vector(x=20.0)) + occupying = SimpleNamespace(id=2, get_transform=lambda: original) + + assert free_spawn_point([original, fallback], [occupying], own_id=1) is fallback + + +def test_convoy_transform_places_trucks_behind_lead_in_same_lane() -> None: + lead = SimpleNamespace(location="lead") + follower = SimpleNamespace( + road_id=1, + section_id=0, + lane_id=-1, + s=88.0, + transform=SimpleNamespace(location="follower", rotation="same lane"), + ) + lead_waypoint = SimpleNamespace( + road_id=1, lane_id=-1, previous=lambda distance: [follower] if distance == 2 * CONVOY_SPACING else [] + ) + road_map = SimpleNamespace(get_waypoint=lambda location: lead_waypoint if location == "lead" else None) + + transform = convoy_transform(road_map, lead, 2) + + assert transform is follower.transform + + +def test_convoy_anchor_points_exclude_junction_crossings() -> None: + safe = SimpleNamespace(location="safe") + junction = SimpleNamespace(location="junction") + safe_follower = SimpleNamespace( + road_id=1, + section_id=0, + lane_id=-1, + s=0.0, + transform=SimpleNamespace(), + ) + waypoints = { + "safe": SimpleNamespace(road_id=1, lane_id=-1, previous=lambda _distance: [safe_follower]), + "junction": SimpleNamespace(road_id=2, lane_id=-1, previous=lambda _distance: [safe_follower]), + } + road_map = SimpleNamespace(get_waypoint=lambda location: waypoints[location]) + + assert convoy_anchor_points(road_map, [junction, safe], followers=1) == [safe] + + +def test_resting_claim_preserves_autonomy_until_driver_input() -> None: + autopilot = [] + controls = [] + vehicle = fake_vehicle( + set_autopilot=lambda enabled, port: autopilot.append((enabled, port)), + apply_control=controls.append, + ) + camera = fake_sensor() + truck = Truck("truck1", vehicle, [camera, camera], fake_sensor(), 8000, road_map=SimpleNamespace()) + + truck.actuate(Accepted(state=DriveState.stopped()), has_driver=True) + + assert truck.autonomous + assert autopilot == [(True, 8000)] + assert controls == [] + + truck.actuate( + Accepted(state=DriveState(throttle=0.2, brake=0.0, gear=Gear.FORWARD)), + has_driver=True, + ) + + assert not truck.autonomous + assert autopilot[-1] == (False, 8000) + assert controls[-1].throttle == 0.2 + + +def test_released_truck_merges_onto_its_lane_before_autonomy_resumes() -> None: + autopilot = [] + controls = [] + # A lane along +x through y=0; the truck starts 2 m to its left at speed. + forward = vector(x=1.0) + + def ahead(distance: float) -> SimpleNamespace: + return SimpleNamespace( + transform=SimpleNamespace(location=vector(x=distance), get_forward_vector=lambda: forward), + is_junction=False, + next=lambda step: [ahead(distance + step)], + ) + + lane = SimpleNamespace( + transform=SimpleNamespace(location=vector(), get_forward_vector=lambda: forward), + lane_type="driving", + is_junction=False, + get_left_lane=lambda: None, + get_right_lane=lambda: None, + next=lambda distance: [ahead(distance)], + ) + location = vector(y=-2.0) + vehicle = fake_vehicle( + set_autopilot=lambda enabled, port: autopilot.append((enabled, port)), + apply_control=controls.append, + get_transform=lambda: SimpleNamespace( + location=location, + rotation=SimpleNamespace(yaw=0.0), + get_forward_vector=lambda: forward, + get_right_vector=lambda: vector(y=1.0), + ), + get_velocity=lambda: vector(x=10.0), + get_control=lambda: SimpleNamespace(steer=0.4, throttle=0.6, brake=0.0, reverse=False), + ) + camera = fake_sensor() + road_map = SimpleNamespace(get_waypoint=lambda _location, **_kwargs: lane) + truck = Truck("truck1", vehicle, [camera, camera], fake_sensor(), 8000, road_map=road_map) + truck.actuate(Accepted(state=DriveState(throttle=0.6, steering=0.4, gear=Gear.FORWARD)), has_driver=True) + assert not truck.autonomous + + # Letting go off the lane coasts toward it rather than handing Traffic + # Manager a truck it would swerve. + truck.actuate(Accepted(state=DriveState.stopped()), has_driver=False) + + assert not truck.autonomous + assert autopilot == [(True, 8000), (False, 8000)] + assert controls[-1].steer > 0.0 + assert controls[-1].throttle == 0.0 and controls[-1].brake == 0.0 + + # On the lane: autonomy resumes, once. + location.y = 0.2 + truck.release() + assert truck.autonomous + assert autopilot[-1] == (True, 8000) + + truck.release() + assert autopilot.count((True, 8000)) == 2 + + +def test_truck_video_demand_renders_without_listening_to_a_camera() -> None: + events: list[str] = [] + demand: list[tuple[str, bool]] = [] + cameras = [fake_sensor(events, name) for name in ("sd", "hd")] + # The collision sensor listens for the truck's life. The cameras never do: + # their pictures go to the bridge, not to this process. + truck = Truck( + "truck1", + fake_vehicle(), + cameras, + fake_sensor(events, "collision"), + 8000, + lambda name, demanded: demand.append((name, demanded)), + road_map=SimpleNamespace(), + ) + + truck.set_video_demand(True) + truck.set_video_demand(True) + truck.set_video_demand(False) + + assert events == ["collision.listen"] + assert demand == [("truck1", True), ("truck1", False)] + + +def test_world_renders_only_while_any_truck_camera_is_demanded() -> None: + applied: list[bool] = [] + settings = SimpleNamespace(no_rendering_mode=False) + carla_world = SimpleNamespace( + get_settings=lambda: settings, + apply_settings=lambda value: applied.append(value.no_rendering_mode), + ) + client = SimpleNamespace( + get_world=lambda: carla_world, + get_trafficmanager=lambda _port: fake_traffic_manager(), + ) + world = World(client, 8000, 30) + trucks = [ + Truck( + name, + fake_vehicle(), + [fake_sensor(), fake_sensor()], + fake_sensor(), + 8000, + world._set_render_demand, + road_map=SimpleNamespace(), + ) + for name in ("truck1", "truck2") + ] + + trucks[0].set_video_demand(True) + trucks[1].set_video_demand(True) + trucks[0].set_video_demand(False) + trucks[1].set_video_demand(False) + + # Initial idle, first viewer, and last viewer only. Demand changing while + # another truck is visible does not flap the world. + assert applied == [True, False, True] + + +def test_failed_render_transition_does_not_commit_demand() -> None: + no_rendering = True + attempts = 0 + + def get_settings() -> SimpleNamespace: + return SimpleNamespace(no_rendering_mode=no_rendering) + + def apply_settings(settings: SimpleNamespace) -> None: + nonlocal attempts, no_rendering + attempts += 1 + # The first apply is the constructor's fixed-step setup; fail the demand one. + if attempts == 2: + raise RuntimeError("CARLA rejected settings") + no_rendering = settings.no_rendering_mode + + client = SimpleNamespace( + get_world=lambda: SimpleNamespace( + get_settings=get_settings, + apply_settings=apply_settings, + ), + get_trafficmanager=lambda _port: fake_traffic_manager(), + ) + world = World(client, 8000, 30) + + with pytest.raises(RuntimeError, match="CARLA rejected settings"): + world._set_render_demand("truck1", True) + + assert world._rendering_trucks == set() + assert no_rendering + + world._set_render_demand("truck1", True) + + assert world._rendering_trucks == {"truck1"} + assert not no_rendering + + +def test_truck_constructor_failure_cleans_spawned_actors( + monkeypatch: pytest.MonkeyPatch, +) -> None: + events = [] + blueprint = SimpleNamespace(set_attribute=lambda *_args: None, has_attribute=lambda _name: True) + transform = SimpleNamespace(location=SimpleNamespace(x=0.0, y=0.0, z=0.0)) + vehicle = SimpleNamespace( + id=1, + bounding_box=SimpleNamespace(location=SimpleNamespace(x=0.0), extent=SimpleNamespace(x=4.0)), + get_transform=lambda: transform, + destroy=lambda: events.append("vehicle.destroy"), + ) + sensors = iter(fake_sensor(events, name) for name in ("sd", "hd", "collision")) + carla_world = SimpleNamespace( + get_blueprint_library=lambda: SimpleNamespace(find=lambda _name: blueprint), + get_map=lambda: SimpleNamespace(get_spawn_points=lambda: [transform]), + try_spawn_actor=lambda _blueprint, _transform: vehicle, + wait_for_tick=lambda _timeout: None, + spawn_actor=lambda *_args, **_kwargs: next(sensors), + ) + world = World.__new__(World) + world._world = carla_world + world._tm_port = 8000 + world._map = None + world.trucks = [] + monkeypatch.setattr( + world_module, + "Truck", + lambda *_args, **_kwargs: (_ for _ in ()).throw(RuntimeError("autopilot failed")), + ) + + with pytest.raises(RuntimeError, match="autopilot failed"): + world.spawn(["truck1"], world_module.CameraConfig(), "front") + + assert events == [ + "sd.stop", + "sd.destroy", + "hd.stop", + "hd.destroy", + "collision.stop", + "collision.destroy", + "vehicle.destroy", + ] + + +@pytest.mark.parametrize("interrupt", [RuntimeError("collision spawn failed"), KeyboardInterrupt()]) +def test_sensor_spawn_failure_attempts_every_cleanup(interrupt: BaseException) -> None: + """A refused spawn and a SIGTERM mid-RPC both leave the vehicle in the world unless cleaned here.""" + events = [] + blueprint = SimpleNamespace(set_attribute=lambda *_args: None, has_attribute=lambda _name: True) + transform = SimpleNamespace(location=SimpleNamespace(x=0.0, y=0.0, z=0.0)) + vehicle = SimpleNamespace( + id=1, + bounding_box=SimpleNamespace(location=SimpleNamespace(x=0.0), extent=SimpleNamespace(x=4.0)), + get_transform=lambda: transform, + destroy=lambda: events.append("vehicle.destroy"), + ) + + def fail_sensor_destroy() -> None: + events.append("sd.destroy") + raise RuntimeError("sensor already gone") + + # The collision sensor is spawned last, so its failure is the case where + # cameras are already in the world and one of them refuses to be destroyed. + spawned = iter( + ( + SimpleNamespace(destroy=fail_sensor_destroy), + SimpleNamespace(destroy=lambda: events.append("hd.destroy")), + interrupt, + ) + ) + + def spawn_actor(*_args, **_kwargs): + result = next(spawned) + if isinstance(result, BaseException): + raise result + return result + + carla_world = SimpleNamespace( + get_blueprint_library=lambda: SimpleNamespace(find=lambda _name: blueprint), + get_map=lambda: SimpleNamespace(get_spawn_points=lambda: [transform]), + try_spawn_actor=lambda _blueprint, _transform: vehicle, + wait_for_tick=lambda _timeout: None, + spawn_actor=spawn_actor, + ) + world = World.__new__(World) + world._world = carla_world + world._tm_port = 8000 + world._map = None + world.trucks = [] + + with pytest.raises(type(interrupt)): + world.spawn(["truck1"], world_module.CameraConfig(), "front") + + assert events == ["sd.destroy", "hd.destroy", "vehicle.destroy"] + + +def test_every_truck_is_protected_from_traffic_manager_idle_deletion( + monkeypatch: pytest.MonkeyPatch, +) -> None: + # CARLA 0.9.16's ALSM excludes role_name=hero from stuck-vehicle deletion. + # Capture the role at spawn, before the shared blueprint is reused. + attributes: dict[str, str] = {} + roles: list[str] = [] + blueprint = SimpleNamespace(set_attribute=attributes.__setitem__, has_attribute=lambda _name: True) + transform = SimpleNamespace(location=vector()) + + def spawn_vehicle(_blueprint, _transform): + roles.append(attributes["role_name"]) + return fake_vehicle( + id=len(roles), + bounding_box=SimpleNamespace(location=vector(), extent=vector(x=4)), + ) + + world = World.__new__(World) + world._world = SimpleNamespace( + get_blueprint_library=lambda: SimpleNamespace(find=lambda _name: blueprint), + get_map=lambda: SimpleNamespace(get_spawn_points=lambda: [transform] * 3), + try_spawn_actor=spawn_vehicle, + wait_for_tick=lambda _timeout: None, + spawn_actor=lambda *_args, **_kwargs: fake_sensor(), + ) + world._tm_port = 8000 + world._map = None + world.trucks = [] + monkeypatch.setattr(world_module, "convoy_anchor_points", lambda _map, points, _count: points) + monkeypatch.setattr(world_module, "convoy_transform", lambda *_args: transform) + + world.spawn(["truck1", "truck2", "truck3"], CameraConfig(), "front") + + assert roles == ["hero", "hero", "hero"] + assert all(truck._autonomous for truck in world.trucks) + + +def spawning_world(blueprint: SimpleNamespace, spawn_actor) -> World: + transform = SimpleNamespace(location=vector()) + world = World.__new__(World) + world._world = SimpleNamespace( + get_blueprint_library=lambda: SimpleNamespace(find=lambda _name: blueprint), + get_map=lambda: SimpleNamespace(get_spawn_points=lambda: [transform]), + try_spawn_actor=lambda _blueprint, _transform: fake_vehicle( + bounding_box=SimpleNamespace(location=vector(), extent=vector(x=4)), + destroy=lambda: None, + ), + wait_for_tick=lambda _timeout: None, + spawn_actor=spawn_actor, + ) + world._tm_port = 8000 + world._map = None + world.trucks = [] + return world + + +def test_each_camera_renders_for_its_trucks_bridge_stream() -> None: + attributes: dict[str, str] = {} + streams: list[str] = [] + blueprint = SimpleNamespace(set_attribute=attributes.__setitem__, has_attribute=lambda _name: True) + + def spawn_actor(*_args, **_kwargs): + streams.append(attributes.get(world_module.BRIDGE_ATTRIBUTE, "")) + return fake_sensor() + + spawning_world(blueprint, spawn_actor).spawn(["truck1"], CameraConfig(), "front") + + # One camera per rendition, then the collision sensor. + assert streams[:2] == ["truck1/front", "truck1/front"] + + +def test_a_simulator_without_the_bridge_is_refused_before_spawning() -> None: + spawned: list[object] = [] + blueprint = SimpleNamespace(set_attribute=lambda *_args: None, has_attribute=lambda _name: False) + world = spawning_world(blueprint, lambda *args, **_kwargs: spawned.append(args)) + + with pytest.raises(RuntimeError, match="lacks the GPU video bridge"): + world.spawn(["truck1"], CameraConfig(), "front") + + assert spawned == [] + assert world.trucks == [] + + +def test_sweep_removes_stale_vehicles_and_their_sensors_only() -> None: + """A previous run's trucks and cameras go; an unattached sensor is not ours.""" + events: list[str] = [] + ticks: list[float] = [] + + def actor(name: str, parent=None) -> SimpleNamespace: + return SimpleNamespace( + id=hash(name) & 0xFFFF, + parent=parent, + stop=lambda: events.append(f"{name}.stop"), + destroy=lambda: events.append(f"{name}.destroy") is None, + ) + + stale = [actor("truck1"), actor("truck2")] + sensors = [actor("truck1.camera", stale[0]), actor("truck2.collision", stale[1]), actor("aerial")] + + def fail_stop() -> None: + events.append("truck1.camera.stop") + raise RuntimeError("already culled") + + sensors[0].stop = fail_stop + actors = {"vehicle.*": stale, "sensor.*": sensors} + world = World.__new__(World) + world._world = SimpleNamespace( + get_actors=lambda: SimpleNamespace(filter=lambda pattern: actors[pattern]), + wait_for_tick=lambda timeout: ticks.append(timeout), + ) + + world.sweep() + + assert events == [ + "truck1.camera.stop", + "truck1.camera.destroy", + "truck2.collision.stop", + "truck2.collision.destroy", + "truck1.destroy", + "truck2.destroy", + ] + # Destroys land on the next tick in synchronous mode, before spawn walks the map. + assert ticks == [SPAWN_TICK_TIMEOUT] + + +def test_sweep_of_an_empty_world_touches_nothing() -> None: + world = World.__new__(World) + world._world = SimpleNamespace(get_actors=lambda: SimpleNamespace(filter=lambda _pattern: [])) + + world.sweep() + + +def test_sweep_fails_startup_when_a_stale_vehicle_survives() -> None: + """A truck the server refuses to remove is the jam itself; try them all, then fail.""" + destroyed: list[int] = [] + stale = [ + SimpleNamespace(id=1, destroy=lambda: False), + SimpleNamespace(id=2, destroy=lambda: (_ for _ in ()).throw(RuntimeError("timed out"))), + SimpleNamespace(id=3, destroy=lambda: destroyed.append(3) is None), + ] + actors = {"vehicle.*": stale, "sensor.*": []} + world = World.__new__(World) + world._world = SimpleNamespace(get_actors=lambda: SimpleNamespace(filter=lambda pattern: actors[pattern])) + + with pytest.raises(RuntimeError, match="1: server refused; 2: timed out"): + world.sweep() + + assert destroyed == [3] + + +def test_world_opens_synchronous_at_the_frame_period_and_hands_it_back() -> None: + applied: list[tuple[bool, float, bool]] = [] + settings = SimpleNamespace(no_rendering_mode=False, synchronous_mode=False, fixed_delta_seconds=0.0) + tm_modes: list[bool] = [] + client = SimpleNamespace( + get_world=lambda: SimpleNamespace( + get_settings=lambda: settings, + apply_settings=lambda value: applied.append( + (value.synchronous_mode, value.fixed_delta_seconds, value.no_rendering_mode) + ), + ), + get_trafficmanager=lambda _port: fake_traffic_manager(tm_modes), + ) + + world = World(client, 8000, 30) + assert applied == [(True, 1 / 30, True)] + assert tm_modes == [True] + + world.destroy() + assert applied[-1] == (False, 0.0, True) + assert tm_modes == [True, False] + + +def test_traffic_manager_setup_failure_restores_free_running() -> None: + """A TM that refuses sync must not leave the persistent world frozen.""" + applied: list[tuple[bool, float, bool]] = [] + settings = SimpleNamespace(no_rendering_mode=False, synchronous_mode=False, fixed_delta_seconds=0.0) + + def apply_settings(value: SimpleNamespace) -> None: + applied.append((value.synchronous_mode, value.fixed_delta_seconds, value.no_rendering_mode)) + settings.synchronous_mode = value.synchronous_mode + settings.fixed_delta_seconds = value.fixed_delta_seconds + settings.no_rendering_mode = value.no_rendering_mode + + def set_synchronous_mode(sync: bool) -> None: + if sync: + raise RuntimeError("Traffic Manager unavailable") + + client = SimpleNamespace( + get_world=lambda: SimpleNamespace(get_settings=lambda: settings, apply_settings=apply_settings), + get_trafficmanager=lambda _port: SimpleNamespace(set_synchronous_mode=set_synchronous_mode), + ) + + with pytest.raises(RuntimeError, match="Traffic Manager unavailable"): + World(client, 8000, 30) + + assert applied == [(True, 1 / 30, True), (False, 0.0, True)] + assert (settings.synchronous_mode, settings.fixed_delta_seconds) == (False, 0.0) + + +def test_next_deadline_keeps_cadence_from_the_previous_deadline() -> None: + # A tick that finished early or late leaves the next deadline untouched. + assert next_deadline(10.0, 10.01, 0.1) == pytest.approx(10.1) + assert next_deadline(10.0, 10.09, 0.1) == pytest.approx(10.1) + + +def test_next_deadline_reanchors_after_a_hitch_instead_of_bursting() -> None: + # A tick that overran by more than a period does not owe the missed ticks. + assert next_deadline(10.0, 10.25, 0.1) == pytest.approx(10.25) + + +def test_clock_failure_reaches_the_session() -> None: + def tick() -> None: + raise RuntimeError("server gone") + + async def scenario() -> None: + clock = Clock(SimpleNamespace(tick=tick), 30) + clock.start() + try: + with pytest.raises(RuntimeError, match="simulation clock stopped") as err: + await asyncio.wait_for(clock.wait_failed(), timeout=1.0) + assert "server gone" in str(err.value.__cause__) + finally: + clock.stop() + + asyncio.run(scenario()) + + +def test_clock_is_held_until_every_truck_is_spawned() -> None: + """`sweep` and `spawn` wait on ticks, so the world must step through them.""" + clock = Clock(SimpleNamespace(tick=lambda: None), 30) + assert clock.running + + clock.release(world_module.STARTUP_HOLD) + + assert not clock.running + + +def test_clock_follows_camera_demand() -> None: + settings = SimpleNamespace(no_rendering_mode=False) + carla_world = SimpleNamespace( + get_settings=lambda: settings, + apply_settings=lambda value: setattr(settings, "no_rendering_mode", value.no_rendering_mode), + ) + client = SimpleNamespace( + get_world=lambda: carla_world, + get_trafficmanager=lambda _port: fake_traffic_manager(), + ) + world = World(client, 8000, 30) + world.ready() + + assert not world.clock.running + + world._set_render_demand("truck1", True) + assert world.clock.running + + # A second viewer must not let the first one's departure park the world. + world._set_render_demand("truck2", True) + world._set_render_demand("truck1", False) + assert world.clock.running + + world._set_render_demand("truck2", False) + assert not world.clock.running + + +def test_holds_do_not_release_on_each_others_behalf() -> None: + clock = Clock(SimpleNamespace(tick=lambda: None), 30) + clock.release(world_module.STARTUP_HOLD) + + clock.hold(world_module.RENDER_HOLD) + clock.hold(world_module.drive_hold("truck1")) + clock.release(world_module.RENDER_HOLD) + + # Nobody is watching, but a driver still holds the lease: freezing here + # would accept the driver's commands and move nothing. + assert clock.running + + clock.release(world_module.drive_hold("truck1")) + assert not clock.running + + +def test_parked_clock_keeps_beating_so_the_watchdog_lets_it_rest() -> None: + """A parked clock is idle by design; the watchdog only exists for a wedged one.""" + ticks = 0 + + def tick() -> None: + nonlocal ticks + ticks += 1 + + async def scenario() -> None: + clock = Clock(SimpleNamespace(tick=tick), 30) + clock.release(world_module.STARTUP_HOLD) + clock.start() + try: + for _ in range(100): + if clock.heartbeat.age() > 0.0: + break + await asyncio.sleep(0.01) + # Parked, but still proving the thread is alive. + assert clock.heartbeat.age() < 0.5 + assert ticks == 0 + + clock.hold(world_module.RENDER_HOLD) + for _ in range(100): + if ticks: + break + await asyncio.sleep(0.01) + assert ticks > 0 + finally: + clock.stop() + + asyncio.run(scenario()) diff --git a/demo/carla/sim/trucks.json b/demo/carla/sim/trucks.json new file mode 100644 index 00000000000..f071f4059b3 --- /dev/null +++ b/demo/carla/sim/trucks.json @@ -0,0 +1 @@ +["truck1", "truck2"] diff --git a/demo/carla/sim/typings/carla.pyi b/demo/carla/sim/typings/carla.pyi new file mode 100644 index 00000000000..e27843e5338 --- /dev/null +++ b/demo/carla/sim/typings/carla.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/demo/carla/sim/venv.sh b/demo/carla/sim/venv.sh new file mode 100755 index 00000000000..5e7c7fed765 --- /dev/null +++ b/demo/carla/sim/venv.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# Create (or refresh) the CARLA worker's virtualenv. +# +# Python 3.12 exactly: CARLA 0.9.16 publishes wheels for cp310-cp312 only. +# +# moq comes from this checkout's py/ rather than PyPI, so the worker always +# runs the bindings of the tree it ships in: moq-ffi built by maturin from +# rs/moq-ffi, and the pure-Python moq-rs wrapper installed editable over it. +set -euo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo="$(cd "$here/../../.." && pwd)" +venv="$here/.venv" + +# The devshell exports a PYTHONPATH into its own Python's site-packages. A venv +# does not override it, so a 3.12 interpreter would import packages built for +# another version and fail somewhere unrelated. python.sh does the same. +export PYTHONPATH= + +uv venv --allow-existing --python 3.12 "$venv" + +# The worker and its CARLA client wheel. +uv pip install --python "$venv/bin/python" --quiet -e "$here" + +# maturin comes from the root workspace's locked dev tools, the same one +# `just py` builds with, but installs into this venv: VIRTUAL_ENV picks the +# target. Release, since this is the runtime the worker publishes through. +uv sync --project "$repo" --locked --no-install-workspace --quiet +( + cd "$repo/py/moq-ffi" + VIRTUAL_ENV="$venv" "$repo/.venv/bin/maturin" develop --locked --release --uv +) + +# --no-deps: moq-rs depends on moq-ffi, which maturin just installed from this +# tree; resolving it again would fetch a release from PyPI over it. +uv pip install --python "$venv/bin/python" --quiet --no-deps -e "$repo/py/moq-rs" + +echo "venv: ready at $venv" >&2 diff --git a/demo/carla/web/bunfig.toml b/demo/carla/web/bunfig.toml new file mode 100644 index 00000000000..b0b3f89b138 --- /dev/null +++ b/demo/carla/web/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["./test/worklet.ts"] diff --git a/demo/carla/web/index.html b/demo/carla/web/index.html new file mode 100644 index 00000000000..0489e974d1b --- /dev/null +++ b/demo/carla/web/index.html @@ -0,0 +1,54 @@ + + + + + + CARLA · MoQ demo + + + +
+

MoQ CARLA

+ + Connecting… +
+ + +
+
+ +
+
+ +
+ + + + +
+
+
+
Controls

Select a vehicle, then choose Take control or use a drive key. W throttle · S brake · A / D steer · C center · Space / G gear while braking.

E emergency stop · R reset stop · Esc release control, then return to the map. Keyboard inputs hold when released.

Plug in a steering wheel and turn it to connect. Select its name in the header to calibrate. Move it with the throttle released to take over.

A generic MoQ relay carries the video, telemetry, and controls.
+ + + diff --git a/demo/carla/web/package.json b/demo/carla/web/package.json new file mode 100644 index 00000000000..080643287be --- /dev/null +++ b/demo/carla/web/package.json @@ -0,0 +1,27 @@ +{ + "name": "@moq/demo-carla", + "private": true, + "type": "module", + "version": "0.1.0", + "description": "MoQ CARLA Demo - Drive simulated vehicles over MoQ", + "license": "(MIT OR Apache-2.0)", + "scripts": { + "dev": "vite --open", + "build": "vite build", + "check": "tsc --noEmit", + "test": "bun test" + }, + "dependencies": { + "@moq/json": "workspace:^", + "@moq/net": "workspace:^", + "@moq/watch": "workspace:^", + "zod": "^4.6.5" + }, + "devDependencies": { + "@types/bun": "^1.4.2", + "rolldown": "^1.2.12", + "typescript": "7.0.2", + "vite": "^8.3.2", + "wrangler": "^4.147.0" + } +} diff --git a/demo/carla/web/src/calibration.css b/demo/carla/web/src/calibration.css new file mode 100644 index 00000000000..35a506d9df4 --- /dev/null +++ b/demo/carla/web/src/calibration.css @@ -0,0 +1,105 @@ +#wheel-cal { + position: fixed; + inset: 0; + z-index: 10; + background: rgba(0, 0, 0, 0.75); + display: flex; + align-items: center; + justify-content: center; + padding: 1.25rem; +} +#wheel-cal[hidden] { + display: none; +} +.cal-box { + background: var(--panel); + border: 1px solid var(--accent); + border-radius: 8px; + padding: 1.1rem; + width: min(30rem, 100%); + display: flex; + flex-direction: column; + gap: 0.7rem; +} +.cal-box h2 { + font-size: 0.9rem; + color: var(--accent); + letter-spacing: 0.04em; +} +.cal-device { + font-size: 0.72rem; +} +.cal-progress { + font-size: 0.66rem; + color: var(--muted); + text-transform: uppercase; + letter-spacing: 0.06em; +} +.cal-prompt { + font-size: 0.8rem; + line-height: 1.5; +} +.cal-live { + font-size: 0.66rem; + color: var(--muted); + background: #000; + border-radius: 4px; + padding: 0.4rem 0.5rem; + overflow-x: auto; + white-space: nowrap; +} +.cal-warn { + font-size: 0.7rem; + color: var(--danger); +} +.cal-actions { + display: flex; + gap: 0.5rem; +} +.cal-actions button { + font: + 0.7rem ui-monospace, + monospace; + color: var(--text); + background: #000; + border: 1px solid var(--line); + border-radius: 4px; + padding: 0.3rem 0.7rem; + cursor: pointer; +} +.cal-actions button:hover { + border-color: var(--muted); +} +.cal-actions .cal-capture { + border-color: var(--accent); + color: var(--accent); +} +.cal-actions .cal-cancel { + margin-left: auto; +} +.cal-safety { + display: flex; + align-items: center; + gap: 0.6rem; + border-top: 1px solid var(--line); + padding-top: 0.7rem; + font-size: 0.66rem; + color: var(--muted); + line-height: 1.4; +} +.cal-safety .estop-btn { + font: + 600 0.68rem ui-monospace, + monospace; + letter-spacing: 0.06em; + color: #fff; + background: var(--danger); + border: 1px solid var(--danger); + border-radius: 4px; + padding: 0.25rem 0.6rem; + cursor: pointer; + flex: none; +} +.cal-safety .estop-btn:hover { + background: #c53437; +} diff --git a/demo/carla/web/src/feedback.test.ts b/demo/carla/web/src/feedback.test.ts new file mode 100644 index 00000000000..e3c4b1a762d --- /dev/null +++ b/demo/carla/web/src/feedback.test.ts @@ -0,0 +1,71 @@ +import { describe, expect, test } from "bun:test"; +import { COLLISION_ALERT_MS, collisionAge, collisionLabel, DIVERGENCE, diverged, divergence } from "./feedback.ts"; +import type { DriveState } from "./schemas.ts"; + +const REST: DriveState = { steering: 0, throttle: 0, brake: 1, gear: "neutral" }; + +describe("divergence", () => { + test("is measured minus requested, per axis", () => { + const gap = divergence( + { steering: 0.5, throttle: 0.4, brake: 0, gear: "forward" }, + { steering: 0.3, throttle: 0.45, brake: 0, gear: "forward" }, + ); + expect(gap.steering).toBeCloseTo(-0.2); + expect(gap.throttle).toBeCloseTo(0.05); + expect(gap.worst).toBeCloseTo(0.2); + expect(gap.gear).toBe(false); + }); + + test("ignores lag smaller than an actuator always has", () => { + const gap = divergence(REST, { ...REST, brake: 1 - DIVERGENCE / 2 }); + expect(diverged(gap)).toBe(false); + }); + + test("names only the axes that are actually apart", () => { + const gap = divergence( + { steering: 0.6, throttle: 0.5, brake: 0, gear: "forward" }, + { steering: 0.1, throttle: 0.49, brake: 0, gear: "forward" }, + ); + expect(diverged(gap)).toBe(true); + }); + + test("calls a truck driving the wrong way a divergence on its own", () => { + const gap = divergence( + { steering: 0, throttle: 0, brake: 0, gear: "forward" }, + { steering: 0, throttle: 0, brake: 0, gear: "reverse" }, + ); + expect(gap.gear).toBe(true); + expect(diverged(gap)).toBe(true); + }); + + test("does not fault a neutral request the simulator cannot express", () => { + // CARLA has no neutral: it holds the direction and applies zero throttle. + const gap = divergence(REST, { ...REST, gear: "forward" }); + expect(gap.gear).toBe(false); + expect(diverged(gap)).toBe(false); + }); +}); + +describe("labels", () => { + test("scales a collision impulse into kN·s", () => { + const hit = { at: 1_000_000, other: "vehicle.tesla.model3", impulse: 4210.5 }; + expect(collisionLabel(hit, 0)).toBe("vehicle.tesla.model3 · 4.2 kN·s · just now"); + expect(collisionLabel(hit, COLLISION_ALERT_MS + 4000)).toBe("vehicle.tesla.model3 · 4.2 kN·s · 12s ago"); + expect(collisionLabel({ ...hit, impulse: 640.4 }, 0)).toBe("vehicle.tesla.model3 · 640 N·s · just now"); + }); +}); + +describe("collisionAge", () => { + const hit = { at: 1_000_000, other: "static.guardrail", impulse: 100 }; + + test("ages against the truck's own timestamp, not when this player saw it", () => { + // A viewer that opens the page three minutes late still sees three + // minutes, rather than treating the retained snapshot as a fresh crash. + expect(collisionAge(hit, 1_180_000)).toBe(180_000); + }); + + test("clamps a truck whose clock runs ahead of the viewer's", () => { + expect(collisionAge(hit, 999_000)).toBe(0); + expect(collisionLabel(hit, collisionAge(hit, 999_000))).toContain("just now"); + }); +}); diff --git a/demo/carla/web/src/feedback.ts b/demo/carla/web/src/feedback.ts new file mode 100644 index 00000000000..34a1cfcbaa9 --- /dev/null +++ b/demo/carla/web/src/feedback.ts @@ -0,0 +1,84 @@ +/** + * Measured feedback: what the vehicle did, against what the driver asked for. + * + * The `accepted` state on the status track is command acknowledgement - the + * gate repeating what it let through. `measured`, `motion`, and `collision` are + * the vehicle's own response, so everything here is about the gap between the + * two, which is the only thing a teleoperator can act on. + * + * Pure formatting and arithmetic, deliberately: the rendering that uses it + * (canvas overlay, telemetry rows) is browser-tested, and this is the part with + * decisions in it. + * + * @module + */ +import type { Collision, DriveState } from "./schemas.ts"; + +/** + * How far apart the requested and measured axes have to be before the player + * calls it a divergence. + * + * Not a tolerance hiding a bug: an actuator tracking a command always lags it, + * and a heavy vehicle lags it a lot. Below this the two rails are the same line + * on screen anyway, so highlighting it would mean the mismatch warning is lit + * whenever the truck is moving, which is the same as no warning at all. + */ +export const DIVERGENCE = 0.08; + +/** One axis of the request/response gap. */ +export interface Divergence { + steering: number; + throttle: number; + brake: number; + /** True when the vehicle is driving in a direction nobody asked for. */ + gear: boolean; + /** The largest axis error, for deciding whether to say anything at all. */ + worst: number; +} + +/** Signed measured-minus-requested error per axis. */ +export function divergence(requested: DriveState, measured: DriveState): Divergence { + const steering = measured.steering - requested.steering; + const throttle = measured.throttle - requested.throttle; + const brake = measured.brake - requested.brake; + // CARLA has no neutral - it drives a neutral request as zero throttle in the + // direction it was already facing - so a neutral request can never disagree + // with the direction the physics reports. + const gear = requested.gear !== "neutral" && measured.gear !== requested.gear; + return { + steering, + throttle, + brake, + gear, + worst: Math.max(Math.abs(steering), Math.abs(throttle), Math.abs(brake)), + }; +} + +/** Whether the gap is worth drawing attention to. */ +export function diverged(gap: Divergence): boolean { + return gap.gear || gap.worst >= DIVERGENCE; +} + +/** How long a collision stays called out on the tile. */ +export const COLLISION_ALERT_MS = 8000; + +/** + * How long ago the collision happened, by the truck's clock against ours. + * + * Clamped at zero because the two are clocks on different machines: a truck + * running slightly ahead would otherwise produce a negative age, and a + * collision dated in the future reads worse than one that just happened. + */ +export function collisionAge(collision: Collision, now: number): number { + return Math.max(0, now - collision.at); +} + +/** The last collision, aged against the viewer's clock. */ +export function collisionLabel(collision: Collision, ageMs: number): string { + const impulse = + collision.impulse >= 1000 + ? `${(collision.impulse / 1000).toFixed(1)} kN·s` + : `${Math.round(collision.impulse)} N·s`; + const age = ageMs < COLLISION_ALERT_MS ? "just now" : `${Math.round(ageMs / 1000)}s ago`; + return `${collision.other} · ${impulse} · ${age}`; +} diff --git a/demo/carla/web/src/guides.test.ts b/demo/carla/web/src/guides.test.ts new file mode 100644 index 00000000000..b2ad5df9627 --- /dev/null +++ b/demo/carla/web/src/guides.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, test } from "bun:test"; +import { longitudinalIndicator } from "./guides.ts"; +import type { DriveState } from "./schemas.ts"; + +function drive(patch: Partial): DriveState { + return { steering: 0, throttle: 0, brake: 0, gear: "forward", ...patch }; +} + +describe("longitudinal indicator", () => { + test("uses the truck's measured pedal instead of the request", () => { + const indicator = longitudinalIndicator(drive({ throttle: 0.8 }), drive({ throttle: 0.35 })); + expect(indicator).toMatchObject({ pedal: "throttle", amount: 0.35, source: "actual" }); + }); + + test("points forward throttle away and reverse throttle back", () => { + const forward = longitudinalIndicator(undefined, drive({ throttle: 0.5 })); + const reverse = longitudinalIndicator(undefined, drive({ throttle: 0.5, gear: "reverse" })); + expect(forward?.to).toBeGreaterThan(forward?.from ?? 0); + expect(reverse?.to).toBeLessThan(reverse?.from ?? 0); + }); + + test("braking points against the selected gear", () => { + const forward = longitudinalIndicator(undefined, drive({ brake: 0.5 })); + const reverse = longitudinalIndicator(undefined, drive({ brake: 0.5, gear: "reverse" })); + expect(forward?.to).toBeLessThan(forward?.from ?? 0); + expect(reverse?.to).toBeGreaterThan(reverse?.from ?? 0); + }); + + test("shows braking during a brief pedal overlap", () => { + expect(longitudinalIndicator(undefined, drive({ throttle: 0.7, brake: 0.2 }))).toMatchObject({ + pedal: "brake", + amount: 0.2, + }); + }); +}); diff --git a/demo/carla/web/src/guides.ts b/demo/carla/web/src/guides.ts new file mode 100644 index 00000000000..a78fb80d6f6 --- /dev/null +++ b/demo/carla/web/src/guides.ts @@ -0,0 +1,237 @@ +/** + * Backup-camera-style steering guides projected onto the video. + * + * Two curved rails that bend with a steering angle. The same projection draws + * the driver's **requested input** (a local preview of what is being sent) and + * the truck's **measured** steering off the status track, so the gap between + * them is a shape on the road rather than two numbers to subtract. + * + * @module + */ +import type { DriveState } from "./schemas.ts"; + +export interface GuideStyle { + /** Stroke color (CSS). */ + color: string; + /** Line width in CSS pixels. */ + width: number; + /** Dash pattern, or empty for solid. */ + dash?: number[]; + /** Overall opacity. */ + alpha?: number; +} + +// How far the far end of the rails swings sideways at full lock, as a fraction +// of width. Tuned to read like a reversing camera, not a literal kinematic model. +const CURVE_GAIN = 0.34; + +// Vertical extent of the projected ground plane (fractions of canvas height). +const Y_NEAR = 0.98; +const Y_FAR = 0.46; +// Half-width of the wheel track at the near and far ends (fractions of width). +const HALF_NEAR = 0.36; +const HALF_FAR = 0.06; + +const SEGMENTS = 48; + +/** One rail point. */ +interface Pt { + x: number; + y: number; +} + +/** Sample the left and right rails for a given steering angle. */ +function rails(w: number, h: number, steering: number): { left: Pt[]; right: Pt[] } { + const cx = w / 2; + const left: Pt[] = []; + const right: Pt[] = []; + for (let i = 0; i < SEGMENTS; i++) { + const t = i / (SEGMENTS - 1); + // Perspective: rails converge and rise toward the horizon. + const y = (Y_NEAR + (Y_FAR - Y_NEAR) * t) * h; + const half = (HALF_NEAR + (HALF_FAR - HALF_NEAR) * t) * w; + // Lateral swing grows with distance (t²) so the rails curve, not shear. + const shift = steering * CURVE_GAIN * t * t * w; + left.push({ x: cx - half + shift, y }); + right.push({ x: cx + half + shift, y }); + } + return { left, right }; +} + +function stroke(ctx: CanvasRenderingContext2D, pts: Pt[]) { + ctx.beginPath(); + pts.forEach((p, i) => { + if (i) ctx.lineTo(p.x, p.y); + else ctx.moveTo(p.x, p.y); + }); + ctx.stroke(); +} + +/** Draw one trajectory (two rails). */ +export function drawGuide(ctx: CanvasRenderingContext2D, w: number, h: number, drive: DriveState, style: GuideStyle) { + const { left, right } = rails(w, h, drive.steering); + + ctx.save(); + ctx.globalAlpha = style.alpha ?? 1; + ctx.lineJoin = "round"; + ctx.lineCap = "round"; + ctx.lineWidth = style.width; + ctx.strokeStyle = style.color; + ctx.setLineDash(style.dash ?? []); + stroke(ctx, left); + stroke(ctx, right); + ctx.restore(); +} + +/** + * Shade the ground between the requested trajectory and the measured one. + * + * The wedge is the difference itself: it closes to nothing while the truck is + * tracking, and opens toward the side the truck is actually going. Drawing it + * is what stops two nearly-identical curves from reading as one. + */ +export function drawDivergence( + ctx: CanvasRenderingContext2D, + w: number, + h: number, + requested: DriveState, + measured: DriveState, + style: { color: string; alpha?: number }, +) { + const want = rails(w, h, requested.steering); + const got = rails(w, h, measured.steering); + + ctx.save(); + ctx.globalAlpha = style.alpha ?? 1; + ctx.fillStyle = style.color; + for (const [a, b] of [ + [want.left, got.left], + [want.right, got.right], + ]) { + ctx.beginPath(); + a.forEach((p, i) => { + if (i) ctx.lineTo(p.x, p.y); + else ctx.moveTo(p.x, p.y); + }); + for (let i = b.length - 1; i >= 0; i--) ctx.lineTo(b[i].x, b[i].y); + ctx.closePath(); + ctx.fill(); + } + ctx.restore(); +} + +function pointAt(pts: Pt[], progress: number): Pt { + const position = Math.max(0, Math.min(1, progress)) * (pts.length - 1); + const before = Math.floor(position); + const after = Math.min(pts.length - 1, before + 1); + const mix = position - before; + return { + x: pts[before].x + (pts[after].x - pts[before].x) * mix, + y: pts[before].y + (pts[after].y - pts[before].y) * mix, + }; +} + +/** Sample a rail in either direction, including an exact endpoint. */ +function portion(pts: Pt[], from: number, to: number): Pt[] { + const count = Math.max(2, Math.ceil(Math.abs(to - from) * (pts.length - 1)) + 1); + return Array.from({ length: count }, (_, i) => pointAt(pts, from + ((to - from) * i) / (count - 1))); +} + +function centerline(left: Pt[], right: Pt[]): Pt[] { + return left.map((point, index) => ({ + x: (point.x + right[index].x) / 2, + y: (point.y + right[index].y) / 2, + })); +} + +function arrow(ctx: CanvasRenderingContext2D, pts: Pt[], color: string, width: number) { + if (pts.length < 2) return; + const tip = pts[pts.length - 1]; + const previous = pts[pts.length - 2]; + const angle = Math.atan2(tip.y - previous.y, tip.x - previous.x); + const size = width * 1.55; + + ctx.save(); + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + ctx.strokeStyle = "rgba(0, 0, 0, 0.72)"; + ctx.lineWidth = width + 4; + stroke(ctx, pts); + ctx.strokeStyle = color; + ctx.lineWidth = width; + stroke(ctx, pts); + ctx.translate(tip.x, tip.y); + ctx.rotate(angle); + ctx.fillStyle = "rgba(0, 0, 0, 0.72)"; + ctx.beginPath(); + ctx.moveTo(size + 3, 0); + ctx.lineTo(-size, size * 0.72 + 2); + ctx.lineTo(-size, -size * 0.72 - 2); + ctx.closePath(); + ctx.fill(); + ctx.fillStyle = color; + ctx.beginPath(); + ctx.moveTo(size, 0); + ctx.lineTo(-size, size * 0.72); + ctx.lineTo(-size, -size * 0.72); + ctx.closePath(); + ctx.fill(); + ctx.restore(); +} + +export interface LongitudinalIndicator { + pedal: "throttle" | "brake"; + amount: number; + from: number; + to: number; + source: "actual" | "requested"; +} + +function pedal(drive: DriveState): Pick { + // Braking wins if a physical controller briefly reports both pedals. + return drive.brake > 0 + ? { pedal: "brake", amount: Math.max(0, Math.min(1, drive.brake)) } + : { pedal: "throttle", amount: Math.max(0, Math.min(1, drive.throttle)) }; +} + +/** Resolve the one arrow shown by the HUD, preferring the truck's measured state. */ +export function longitudinalIndicator( + requested: DriveState | undefined, + measured: DriveState | undefined, +): LongitudinalIndicator | undefined { + const drive = measured ?? requested; + if (!drive) return undefined; + const value = pedal(drive); + const reversing = drive.gear === "reverse"; + const pointsAway = value.pedal === "throttle" ? !reversing : reversing; + const start = pointsAway ? 0.1 : 0.9; + const end = start + (pointsAway ? 0.8 : -0.8) * value.amount; + return { ...value, from: start, to: end, source: measured ? "actual" : "requested" }; +} + +/** Draw one centered pedal arrow, using measured truck feedback when available. */ +export function drawDriveHud( + ctx: CanvasRenderingContext2D, + w: number, + h: number, + requested: DriveState | undefined, + measured: DriveState | undefined, +) { + const indicator = longitudinalIndicator(requested, measured); + if (!indicator) return; + const drive = measured ?? requested; + if (!drive) return; + const scale = Math.max(0.78, Math.min(1.15, w / 900)); + const { left, right } = rails(w, h, drive.steering); + const middle = centerline(left, right); + const throttleColor = "#39d353"; + const brakeColor = "#ff4d55"; + const arrowColor = + indicator.source === "requested" ? "#50c8ff" : indicator.pedal === "throttle" ? throttleColor : brakeColor; + const barWidth = 7 * scale; + + ctx.save(); + if (indicator.amount > 0) arrow(ctx, portion(middle, indicator.from, indicator.to), arrowColor, barWidth); + + ctx.restore(); +} diff --git a/demo/carla/web/src/hint.test.ts b/demo/carla/web/src/hint.test.ts new file mode 100644 index 00000000000..454e8c5e391 --- /dev/null +++ b/demo/carla/web/src/hint.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, test } from "bun:test"; +import { type ControlHintState, controlHint } from "./hint.ts"; + +const active: ControlHintState = { + active: true, + focused: true, + estopped: false, + status: "pending", + driverId: "mine", + wheel: false, +}; + +describe("controlHint", () => { + test("distinguishes an unavailable status track from a pending lease", () => { + expect(controlHint(active)).toBe("Requesting control…"); + expect(controlHint({ ...active, status: "unavailable", statusDriver: "mine" })).toBe( + "Vehicle status lost · Control unconfirmed", + ); + }); + + test("reports another lease holder once status is available", () => { + expect(controlHint({ ...active, status: "available", statusDriver: "theirs" })).toBe("Driven by theirs"); + }); + + test("reminds both input sources about the shift interlock", () => { + const mine = { ...active, status: "available" as const, statusDriver: "mine" }; + expect(controlHint(mine)).toContain("Brake + G shifts"); + expect(controlHint({ ...mine, wheel: true })).toContain("Brake before shifting"); + }); + + test("names the e-stop actor independently of the lease holder", () => { + expect(controlHint({ ...active, estopped: true, estopBy: "bystander", statusDriver: "holder" })).toBe( + "Stopped by bystander - R to reset", + ); + expect(controlHint({ ...active, active: false, focused: false, estopped: true, estopBy: "bystander" })).toBe( + "Stopped by bystander - Reset to resume", + ); + }); + + test("preserves preview and focus without requesting control", () => { + expect(controlHint({ ...active, active: false, focused: false })).toBe("Open camera"); + expect(controlHint({ ...active, active: false })).toBe("Waiting for vehicle status"); + expect(controlHint({ ...active, active: false, status: "available", statusDriver: "theirs" })).toBe( + "Driven by theirs", + ); + expect(controlHint({ ...active, active: false, status: "unavailable" })).toBe( + "Control unavailable · Esc to leave", + ); + }); +}); diff --git a/demo/carla/web/src/hint.ts b/demo/carla/web/src/hint.ts new file mode 100644 index 00000000000..5ef977b9430 --- /dev/null +++ b/demo/carla/web/src/hint.ts @@ -0,0 +1,33 @@ +export interface ControlHintState { + active: boolean; + focused: boolean; + estopped: boolean; + estopBy?: string; + status: "pending" | "available" | "unavailable"; + driverId?: string; + statusDriver?: string; + wheel: boolean; +} + +/** Describe the control state without confusing a dead status track for a pending lease. */ +export function controlHint(state: ControlHintState): string { + if (state.estopped) { + const actor = state.estopBy ? ` by ${state.estopBy}` : ""; + const action = state.focused ? "R to reset" : "Reset to resume"; + return `Stopped${actor} - ${action}`; + } + if (!state.active && !state.focused) return "Open camera"; + if (!state.active && state.status === "unavailable") { + return "Control unavailable · Esc to leave"; + } + if (!state.active && state.statusDriver) return `Driven by ${state.statusDriver}`; + if (!state.active && state.status === "pending") return "Waiting for vehicle status"; + if (!state.active) return "Take control to drive"; + if (state.status === "unavailable") return "Vehicle status lost · Control unconfirmed"; + if (!state.driverId || !state.statusDriver) return "Requesting control…"; + if (state.statusDriver !== state.driverId) return `Driven by ${state.statusDriver}`; + if (state.wheel) { + return "Wheel · Brake before shifting · Esc to release"; + } + return "W/S pedals · A/D steer · Brake + G shifts · Esc to release"; +} diff --git a/demo/carla/web/src/input.test.ts b/demo/carla/web/src/input.test.ts new file mode 100644 index 00000000000..df33d609522 --- /dev/null +++ b/demo/carla/web/src/input.test.ts @@ -0,0 +1,241 @@ +import { describe, expect, test } from "bun:test"; +import { + applyKeys, + canShift, + changed, + type DriveTarget, + longitudinalAxis, + moveToward, + REST, + stepDrive, + takeoverState, +} from "./input.ts"; +import type { DriveState } from "./schemas.ts"; + +const DT = 1 / 60; + +describe("takeoverState", () => { + test("adopts the vehicle's measured controls", () => { + const measured: DriveState = { steering: -0.4, throttle: 0.6, brake: 0.2, gear: "reverse" }; + expect(takeoverState(measured)).toEqual(measured); + expect(takeoverState(measured)).not.toBe(measured); + }); + + test("coasts in forward before the first measured feedback", () => { + expect(takeoverState(undefined)).toEqual({ + steering: 0, + throttle: 0, + brake: 0, + gear: "forward", + }); + }); +}); + +function run(state: DriveState, keys: string[] = [], seconds = 1): DriveState { + const held = new Set(keys); + let s = { ...state }; + for (let t = 0; t < seconds; t += DT) { + s = { ...s, ...applyKeys(s, held, DT) }; + } + return s; +} + +describe("applyKeys", () => { + test("holds everything with no input", () => { + const s = run({ steering: -0.4, throttle: 0.6, brake: 0.2, gear: "forward" }, [], 5); + expect(s.steering).toBeCloseTo(-0.4); + expect(s.throttle).toBeCloseTo(0.6); + expect(s.brake).toBeCloseTo(0.2); + }); + + test("resting brake never drops without input", () => { + expect(run({ ...REST }, [], 5).brake).toBe(1); + }); + + test("steering holds its angle when the key is released", () => { + const turned = run({ ...REST }, ["d"], 1); + expect(turned.steering).toBeGreaterThan(0.2); + expect(run(turned, [], 5).steering).toBe(turned.steering); + }); + + test("steering is slew-limited, not instant", () => { + // A tap responds visibly, while full lock still requires a deliberate hold. + expect(run({ ...REST }, ["d"], 0.25).steering).toBeGreaterThan(0.1); + expect(run({ ...REST }, ["d"], 1).steering).toBeLessThan(0.75); + expect(run({ ...REST }, ["d"], 2).steering).toBeLessThan(1); + expect(run({ ...REST }, ["d"], 2.5).steering).toBe(1); + }); + + test("C recenters the steering gradually", () => { + const turned = run({ ...REST }, ["a"], 5); + expect(turned.steering).toBe(-1); + const centering = run(turned, ["c"], 1); + expect(centering.steering).toBeGreaterThan(-1); + expect(centering.steering).toBeLessThan(0); + expect(run(turned, ["c"], 5).steering).toBe(0); + }); + + test("opposite steering keys cancel", () => { + expect(run({ ...REST }, ["a", "d"], 2).steering).toBe(0); + }); + + test("W releases the resting brake promptly, then ramps throttle", () => { + const firstFrame = applyKeys({ ...REST }, new Set(["w"]), DT); + expect(firstFrame.brake).toBeGreaterThan(0); + expect(firstFrame.brake).toBeLessThan(1); + expect(firstFrame.throttle).toBe(0); + + const early = run({ ...REST }, ["w"], 1); + expect(early.brake).toBe(0); + expect(early.throttle).toBeGreaterThan(0.05); + expect(early.throttle).toBeLessThan(0.2); + const late = run({ ...REST }, ["w"], 4); + expect(late.brake).toBe(0); + expect(late.throttle).toBe(1); + }); + + test("W slews an applied brake off before rebuilding throttle", () => { + const braking: DriveState = { steering: 0, throttle: 0, brake: 0.6, gear: "forward" }; + const firstFrame = applyKeys(braking, new Set(["w"]), DT); + expect(firstFrame.brake).toBeGreaterThan(0); + expect(firstFrame.brake).toBeLessThan(braking.brake); + expect(firstFrame.throttle).toBe(0); + + let released = braking; + while (released.brake > 0) { + released = { ...released, ...applyKeys(released, new Set(["w"]), DT) }; + expect(released.throttle).toBe(0); + } + expect(applyKeys(released, new Set(["w"]), DT).throttle).toBeGreaterThan(0); + }); + + test("W drains wheel pedal overlap before releasing the brake", () => { + const wheel: DriveState = { steering: 0, throttle: 0.6, brake: 0.4, gear: "forward" }; + const firstFrame = applyKeys(wheel, new Set(["w"]), DT); + expect(firstFrame.throttle).toBeLessThan(wheel.throttle); + expect(firstFrame.brake).toBe(wheel.brake); + + let normalized = wheel; + while (normalized.throttle > 0) { + normalized = { ...normalized, ...applyKeys(normalized, new Set(["w"]), DT) }; + expect(normalized.brake).toBe(wheel.brake); + } + const releasing = applyKeys(normalized, new Set(["w"]), DT); + expect(releasing.throttle).toBe(0); + expect(releasing.brake).toBeLessThan(wheel.brake); + }); + + test("S cuts throttle before braking, and wins over W", () => { + const rolling: DriveState = { steering: 0, throttle: 1, brake: 0, gear: "forward" }; + const early = run({ ...rolling }, ["w", "s"], 0.5); + expect(early.throttle).toBeLessThan(1); + expect(early.brake).toBe(0); + const late = run({ ...rolling }, ["w", "s"], 10); + expect(late.throttle).toBe(0); + expect(late.brake).toBe(1); + }); +}); + +describe("longitudinalAxis", () => { + test("follows brake release before throttle application", () => { + expect(longitudinalAxis({ throttle: 0.5, brake: 1 }, new Set(["w"]))).toBe("throttle"); + expect(longitudinalAxis({ throttle: 0, brake: 1 }, new Set(["w"]))).toBe("brake"); + expect(longitudinalAxis({ throttle: 0, brake: 0 }, new Set(["w"]))).toBe("throttle"); + }); + + test("follows throttle release before brake application", () => { + expect(longitudinalAxis({ throttle: 0.5, brake: 0 }, new Set(["s"]))).toBe("throttle"); + expect(longitudinalAxis({ throttle: 0, brake: 0 }, new Set(["s"]))).toBe("brake"); + }); + + test("matches S winning over W", () => { + expect(longitudinalAxis({ throttle: 0.5, brake: 0 }, new Set(["w", "s"]))).toBe("throttle"); + }); +}); + +describe("moveToward", () => { + test("does not overshoot", () => { + expect(moveToward(0.9, 1, 0.5)).toBe(1); + expect(moveToward(0.1, 0, 0.5)).toBe(0); + }); +}); + +describe("changed", () => { + test("ignores sub-epsilon wiggle", () => { + expect(changed({ ...REST }, { steering: 0.005, throttle: 0, brake: 1 })).toBe(false); + expect(changed({ ...REST }, { steering: 0.05, throttle: 0, brake: 1 })).toBe(true); + }); +}); + +describe("canShift", () => { + test("requires released throttle and any amount of brake", () => { + expect(canShift({ throttle: 0, brake: 0.001 })).toBe(true); + expect(canShift({ throttle: 0.01, brake: 1 })).toBe(true); + expect(canShift({ throttle: 0.02, brake: 1 })).toBe(false); + expect(canShift({ throttle: 0, brake: 0 })).toBe(false); + }); +}); + +describe("stepDrive", () => { + function target(state: DriveState = { ...REST }) { + const calls: Array> = []; + let cur = state; + let stopped = false; + const t: DriveTarget = { + drive: { peek: () => cur }, + estopped: { peek: () => stopped }, + setDrive(patch) { + calls.push(patch); + cur = { ...cur, ...patch }; + }, + }; + return { + t, + calls, + get: () => cur, + stop: () => { + stopped = true; + }, + }; + } + + // One frame of steering at 120 Hz is 0.45/120 = 0.00375, under the publish + // epsilon, so a loop that skipped sub-epsilon frames would discard every one + // and held keys would move nothing. Integration must reach the target + // regardless of size. + test("commits a frame whose delta is under the publish epsilon", () => { + const { t, calls, get } = target(); + const dt = 1 / 120; + const next = applyKeys(get(), new Set(["d"]), dt); + expect(changed(get(), next)).toBe(false); // below the epsilon, by construction + stepDrive(t, next); + expect(calls).toHaveLength(1); + expect(get().steering).toBeGreaterThan(0); + }); + + test("accumulates a full second of 60 Hz frames", () => { + const { t, get } = target(); + const dt = 1 / 60; + for (let i = 0; i < 60; i++) stepDrive(t, applyKeys(get(), new Set(["d"]), dt)); + expect(get().steering).toBeCloseTo(0.45, 2); + }); + + test("auto-selects forward while the truck begins releasing its brake", () => { + const { t, get } = target(); + stepDrive(t, { steering: 0, throttle: 0, brake: 0.975 }); + expect(get()).toEqual({ steering: 0, throttle: 0, brake: 0.975, gear: "forward" }); + }); + + test("does not auto-shift once the truck has fully released the brake", () => { + const { t, get } = target({ ...REST, brake: 0.1 }); + stepDrive(t, { steering: 0, throttle: 0, brake: 0 }); + expect(get().gear).toBe("neutral"); + }); + + test("a latched e-stop swallows the frame", () => { + const { t, calls, get, stop } = target(); + stop(); + stepDrive(t, applyKeys(get(), new Set(["d"]), 1 / 60)); + expect(calls).toHaveLength(0); + }); +}); diff --git a/demo/carla/web/src/input.ts b/demo/carla/web/src/input.ts new file mode 100644 index 00000000000..c93f293f7b6 --- /dev/null +++ b/demo/carla/web/src/input.ts @@ -0,0 +1,154 @@ +/** + * Pure keyboard-to-drive-state helpers. + * + * The simulated vehicles are heavy trucks: inputs are deliberate, slew-limited + * nudges, and axes **hold** their position when the keys are released - steering + * does not snap back to center and the throttle does not drop to zero. The only + * instant transition is e-stop (handled elsewhere), which latches into REST. + * + * @module + */ + +import type { DriveState } from "./schemas.ts"; + +/** The truck's safe resting state. */ +export const REST: DriveState = { steering: 0, throttle: 0, brake: 1, gear: "neutral" }; + +/** Initial manual handoff: preserve live feedback, or coast when none exists. */ +export function takeoverState(measured: DriveState | undefined): DriveState { + return measured ? { ...measured } : { steering: 0, throttle: 0, brake: 0, gear: "forward" }; +} + +/** Slew rates in normalized units per second. Heavy responses, with fast safety actions. */ +export const RATES = { + /** Steering: full lock takes ~2.2 s of held key. */ + steer: 0.45, + /** Recentering (C) is a touch quicker than turning further. */ + steerCenter: 0.65, + /** Throttle takes 2.5 s to build from idle to full. */ + throttleUp: 0.4, + /** ...and backs off faster than it builds. */ + throttleDown: 1.2, + /** Brake release is deliberate: full to clear takes ~0.67 s. */ + brakeDown: 1.5, + /** Brakes apply quickly (safety), */ + brakeUp: 1.5, +}; + +/** A gear change requires some brake and a released throttle. */ +export const SHIFT_MAX_THROTTLE = 0.01; + +/** Mirror the truck-side gear interlock so rejected shifts get immediate UI feedback. */ +export function canShift(state: Pick): boolean { + return state.brake > 0 && state.throttle <= SHIFT_MAX_THROTTLE; +} + +/** Move `current` toward `target` by at most `step`, without overshooting. */ +export function moveToward(current: number, target: number, step: number): number { + if (Math.abs(target - current) <= step) return target; + return current + Math.sign(target - current) * step; +} + +/** + * Integrate the held keys into the next analog state over `dt` seconds. + * + * - `A`/`D` (or arrows) slew the steering toward full lock; releasing holds + * the current angle, and `C` slews it back to center. + * - `W` first drains any throttle/brake overlap from a wheel, then releases the + * brake promptly and builds throttle. + * - `S` first eases the throttle off, then applies brake (so it always wins + * over `W`). + * - No keys: everything holds where it is. + */ +export function applyKeys( + current: DriveState, + held: ReadonlySet, + dt: number, +): Pick { + let { steering, throttle, brake } = current; + + const left = held.has("a") || held.has("arrowleft"); + const right = held.has("d") || held.has("arrowright"); + const accelerating = held.has("w") || held.has("arrowup"); + const braking = held.has("s") || held.has("arrowdown"); + + if (left !== right) { + const dir = right ? 1 : -1; + steering = Math.max(-1, Math.min(1, steering + dir * RATES.steer * dt)); + } else if (held.has("c")) { + steering = moveToward(steering, 0, RATES.steerCenter * dt); + } + + if (braking) { + // Ease off the throttle before touching the brakes. + if (throttle > 0) { + throttle = moveToward(throttle, 0, RATES.throttleDown * dt); + } else { + brake = moveToward(brake, 1, RATES.brakeUp * dt); + } + } else if (accelerating) { + // A wheel can apply both pedals independently. Drain that overlap before + // releasing the brake, then finish braking before building throttle. + if (throttle > 0 && brake > 0) { + throttle = moveToward(throttle, 0, RATES.throttleDown * dt); + } else if (brake > 0) { + brake = moveToward(brake, 0, RATES.brakeDown * dt); + } else { + throttle = moveToward(throttle, 1, RATES.throttleUp * dt); + } + } + + return { steering, throttle, brake }; +} + +/** The longitudinal axis the held keys will move next, matching {@link applyKeys}' phase ordering. */ +export function longitudinalAxis( + current: Pick, + held: ReadonlySet, +): "throttle" | "brake" | undefined { + const accelerating = held.has("w") || held.has("arrowup"); + const braking = held.has("s") || held.has("arrowdown"); + if (braking) return current.throttle > 0 ? "throttle" : "brake"; + if (accelerating) { + if (current.throttle > 0 && current.brake > 0) return "throttle"; + return current.brake > 0 ? "brake" : "throttle"; + } + return undefined; +} + +/** Return whether an analog state differs enough to publish. */ +export function changed(current: DriveState, next: Pick): boolean { + const epsilon = 0.01; + return ( + Math.abs(current.steering - next.steering) > epsilon || + Math.abs(current.throttle - next.throttle) > epsilon || + Math.abs(current.brake - next.brake) > epsilon + ); +} + +/** The subset of `Truck` the control loop drives, so the loop is testable without one. */ +export interface DriveTarget { + readonly drive: { peek(): DriveState }; + readonly estopped: { peek(): boolean }; + setDrive(patch: Partial): void; +} + +/** + * One frame of the control loop. + * + * Hands the integrated state to the target UNCONDITIONALLY. Gating this on a + * per-frame delta would freeze steering: at 120 Hz, one frame moves 0.45/120 = + * 0.00375, under the publish epsilon, so every frame would be discarded. + * Throttling belongs on the wire (see `Truck.setDrive`), which measures against + * the last state actually sent. The truck shifts itself into forward on the + * first brake-release frame, while the brake is still applied, so W/pedal + * acceleration works without bypassing the gear interlock. + */ +export function stepDrive(target: DriveTarget, next: Pick): void { + if (target.estopped.peek()) return; + const current = target.drive.peek(); + const requested = { ...current, ...next }; + const gear = + current.gear === "neutral" && next.brake < current.brake && canShift(requested) ? "forward" : undefined; + target.setDrive(gear ? { ...next, gear } : next); +} diff --git a/demo/carla/web/src/interaction.test.ts b/demo/carla/web/src/interaction.test.ts new file mode 100644 index 00000000000..ab72a00a4ee --- /dev/null +++ b/demo/carla/web/src/interaction.test.ts @@ -0,0 +1,107 @@ +import { describe, expect, test } from "bun:test"; +import { focusFromHash, hashWithFocus, Interaction } from "./interaction.ts"; + +describe("Interaction", () => { + test("focuses a truck without taking control", () => { + const interaction = new Interaction(); + interaction.focus("truck1/front"); + expect(interaction.focused.peek()).toBe("truck1/front"); + expect(interaction.driving.peek()).toBeUndefined(); + }); + + test("only drive intent for the focused truck takes control", () => { + const interaction = new Interaction(); + expect(interaction.takeDrive("truck1/front")).toBe(false); + expect(interaction.driving.peek()).toBeUndefined(); + + interaction.focus("truck1/front"); + expect(interaction.takeDrive("truck1/front")).toBe(true); + expect(interaction.driving.peek()).toBe("truck1/front"); + }); + + test("the control button toggles the focused truck", () => { + const interaction = new Interaction("truck1/front"); + interaction.toggleDrive("truck1/front"); + expect(interaction.driving.peek()).toBe("truck1/front"); + interaction.toggleDrive("truck1/front"); + expect(interaction.driving.peek()).toBeUndefined(); + }); + + test("release keeps focus so a second escape can leave the view", () => { + const interaction = new Interaction("truck1/front"); + interaction.takeDrive("truck1/front"); + expect(interaction.releaseDrive()).toBe(true); + expect(interaction.driving.peek()).toBeUndefined(); + expect(interaction.focused.peek()).toBe("truck1/front"); + expect(interaction.releaseDrive()).toBe(false); + }); + + test("releases control when focus is left or changed", () => { + const interaction = new Interaction("truck1/front"); + interaction.toggleDrive("truck1/front"); + interaction.focus("truck2/front"); + expect(interaction.driving.peek()).toBeUndefined(); + + interaction.toggleDrive("truck2/front"); + interaction.focus(undefined); + expect(interaction.driving.peek()).toBeUndefined(); + }); + + test("clears control when an unfocused truck disappears", () => { + const interaction = new Interaction(); + // Exercise cleanup independently of focus, as if navigation already moved. + interaction.driving.set("truck1/front"); + expect(interaction.remove("truck1/front")).toBe(false); + expect(interaction.driving.peek()).toBeUndefined(); + }); + + test("targets a focused viewer's truck for modal e-stop", () => { + const interaction = new Interaction("truck1/front"); + expect(interaction.driving.peek()).toBeUndefined(); + expect(interaction.safetyTarget()).toBe("truck1/front"); + }); +}); + +describe("focus URL state", () => { + test("round trips a broadcast id", () => { + const hash = hashWithFocus("", "truck1/front"); + expect(hash).toBe("#truck=truck1%2Ffront"); + expect(focusFromHash(hash)).toBe("truck1/front"); + }); + + test("preserves unrelated fragment parameters", () => { + expect(hashWithFocus("#other=1", "truck2/front")).toBe("#other=1&truck=truck2%2Ffront"); + expect(hashWithFocus("#other=1&truck=truck2%2Ffront", undefined)).toBe("#other=1"); + }); + + test("treats an empty focus as preview", () => { + expect(focusFromHash("#truck=")).toBeUndefined(); + expect(hashWithFocus("#truck=truck1%2Ffront", undefined)).toBe(""); + }); +}); + +test("hover cannot claim control and duplicate URL focus does not erase a keyboard preview", () => { + const state = new Interaction(); + state.hovered.set("truck1/front"); + state.focus(undefined); + expect(state.hovered.peek()).toBe("truck1/front"); + expect(state.driving.peek()).toBeUndefined(); + state.focus("truck2/front"); + expect(state.hovered.peek()).toBeUndefined(); + expect(state.driving.peek()).toBeUndefined(); + state.hovered.set("truck1/front"); + state.remove("truck1/front"); + expect(state.hovered.peek()).toBeUndefined(); +}); + +test("a retracted truck loses preview, focus, and control before re-announcement", () => { + const state = new Interaction("truck1/front"); + state.takeDrive("truck1/front"); + state.hovered.set("truck1/front"); + expect(state.remove("truck1/front")).toBe(true); + expect(state.focused.peek()).toBeUndefined(); + expect(state.driving.peek()).toBeUndefined(); + expect(state.hovered.peek()).toBeUndefined(); + state.focus("truck1/front"); + expect(state.driving.peek()).toBeUndefined(); +}); diff --git a/demo/carla/web/src/interaction.ts b/demo/carla/web/src/interaction.ts new file mode 100644 index 00000000000..d39bdfffd56 --- /dev/null +++ b/demo/carla/web/src/interaction.ts @@ -0,0 +1,77 @@ +import * as Moq from "@moq/net"; + +const FOCUS_PARAM = "truck"; + +/** Preview, focus, and drive state shared by fleet navigation and truck sessions. */ +export class Interaction { + readonly focused: Moq.Signals.Signal; + readonly hovered = new Moq.Signals.Signal(undefined); + readonly driving = new Moq.Signals.Signal(undefined); + + constructor(focused?: string) { + this.focused = new Moq.Signals.Signal(focused); + } + + /** Focus a truck for viewing. Leaving or changing focus releases control. */ + focus(id: string | undefined) { + const active = this.driving.peek(); + if (active && active !== id) this.driving.set(undefined); + if (this.focused.peek() !== id) this.hovered.set(undefined); + this.focused.set(id); + } + + /** Take control of the focused truck, including from a drive-intent key. */ + takeDrive(id: string): boolean { + if (this.focused.peek() !== id) return false; + this.driving.set(id); + return true; + } + + /** Release control without leaving the focused view. */ + releaseDrive(): boolean { + if (!this.driving.peek()) return false; + this.driving.set(undefined); + return true; + } + + /** Take or release control of the focused truck from the explicit button. */ + toggleDrive(id: string) { + if (this.driving.peek() === id) { + this.releaseDrive(); + } else { + this.takeDrive(id); + } + } + + /** Drop every local state tied to a truck that disappeared. */ + remove(id: string): boolean { + if (this.hovered.peek() === id) this.hovered.set(undefined); + if (this.driving.peek() === id) this.driving.set(undefined); + if (this.focused.peek() !== id) return false; + this.focused.set(undefined); + return true; + } + + /** Truck whose e-stop must remain reachable through a covering modal. */ + safetyTarget(): string | undefined { + return this.focused.peek() ?? this.driving.peek(); + } +} + +/** Read the focused truck from the URL fragment. */ +export function focusFromHash(hash: string): string | undefined { + const value = new URLSearchParams(hash.replace(/^#/, "")).get(FOCUS_PARAM); + return value || undefined; +} + +/** Return a fragment with the focused truck changed and other state preserved. */ +export function hashWithFocus(hash: string, truck: string | undefined): string { + const params = new URLSearchParams(hash.replace(/^#/, "")); + if (truck) { + params.set(FOCUS_PARAM, truck); + } else { + params.delete(FOCUS_PARAM); + } + const value = params.toString(); + return value ? `#${value}` : ""; +} diff --git a/demo/carla/web/src/main.ts b/demo/carla/web/src/main.ts new file mode 100644 index 00000000000..0d7bb143998 --- /dev/null +++ b/demo/carla/web/src/main.ts @@ -0,0 +1,1196 @@ +/** + * A steering player for vehicles simulated in CARLA. + * + * Connects to the relay, discovers camera broadcasts by announcement (like + * moq-boy), renders each on a map with a video preview, and lets you take + * control of one vehicle with the keyboard or a steering wheel. The + * {@link Truck} backend publishes a `control` track and subscribes to the + * vehicle's `status` track for round-trip confirmation. + * + * @module + */ + +import * as Moq from "@moq/net"; +import { COLLISION_ALERT_MS, collisionAge, collisionLabel, diverged, divergence } from "./feedback.ts"; +import { drawDivergence, drawDriveHud, drawGuide } from "./guides.ts"; +import { controlHint } from "./hint.ts"; +import { applyKeys, canShift, REST, stepDrive } from "./input.ts"; +import { focusFromHash, hashWithFocus, Interaction } from "./interaction.ts"; +import { + expandToAspect, + fitPoints, + fleetTown, + mapView, + needsRefit, + pathData, + project, + type RoadMap, + scaleBar, + type View, + viewBox, +} from "./map.ts"; +import { loadRoadMap } from "./maps/index.ts"; +import { CAMERAS, parseCamera } from "./paths.ts"; +import { presence } from "./presence.ts"; +import type { Collision, Gear, Pose, TruckStatus } from "./schemas.ts"; +import { nextGear, shiftGear, Truck } from "./truck.ts"; +import { + applyWheel, + arbitrate, + Calibration, + failSafe, + type InputSource, + shortName, + Wheel, + type WheelSample, +} from "./wheel.ts"; + +const RELAY_URL = import.meta.env.VITE_RELAY_URL ?? "http://localhost:4443"; + +const preview = import.meta.env.DEV && new URLSearchParams(location.search).has("preview"); +const connection = new Moq.Connection({ enabled: !preview, url: new URL(RELAY_URL) }); +const interaction = new Interaction(focusFromHash(window.location.hash)); +const { driving, focused, hovered } = interaction; +const signals = new Moq.Signals.Effect(); + +/** Required template nodes fail at startup instead of silently losing a control. */ +function required(selector: string, parent: ParentNode = document): T { + const element = parent.querySelector(selector); + if (!element) throw new Error(`Missing UI element: ${selector}`); + return element; +} + +const els = { + conn: document.getElementById("conn") as HTMLSpanElement, + map: document.getElementById("map") as HTMLDivElement, + roads: document.querySelector("#roads") as SVGSVGElement, + markers: document.getElementById("markers") as HTMLDivElement, + scale: document.getElementById("scale") as HTMLDivElement, + note: document.getElementById("map-note") as HTMLDivElement, + offline: document.getElementById("offline") as HTMLDivElement, + backdrop: document.getElementById("backdrop") as HTMLDivElement, + wheel: document.getElementById("wheel") as HTMLButtonElement, + cal: document.getElementById("wheel-cal") as HTMLDivElement, + inspector: document.getElementById("inspector") as HTMLDivElement, +}; + +els.backdrop.addEventListener("click", () => navigateFocus(undefined)); + +// --- Connection status indicator. --- +signals.run((effect) => { + const state = effect.get(connection.status); + els.conn.textContent = preview + ? "Local preview" + : state === "connected" + ? "Connected" + : state === "connecting" + ? "Connecting…" + : "Disconnected"; + els.conn.dataset.state = preview ? "preview" : state; +}); + +// --- Discovery: maintain a Truck per announced camera broadcast. --- +const tiles = new Map(); +const vehicles = new Moq.Signals.Signal(0); + +signals.run((effect) => { + // Connection retracts old announcements on disconnect, so stale trucks are removed + // and a returning truck cannot inherit an abandoned control session. + const announced = connection.announced(CAMERAS); + effect.cleanup(() => announced.close()); + effect.spawn(async () => { + for (;;) { + const entry = await effect.race(announced.next()); + if (!entry) break; + + // A broad route can cover the scope without naming one camera. + if (!parseCamera(entry.prefix)) continue; + + // A restart is a new simulator instance on the same path; the watch + // broadcast follows it, so only an end removes the tile. + if (entry.kind !== "end" && !tiles.has(entry.prefix)) { + const truck = new Truck({ broadcastId: entry.prefix, connection, driving, focused, hovered }); + tiles.set(entry.prefix, new TruckTile(truck)); + vehicles.set(tiles.size); + refreshFocusLayout(); + } else if (entry.kind === "end") { + const tile = tiles.get(entry.prefix); + tile?.dispose(); + tiles.delete(entry.prefix); + vehicles.set(tiles.size); + if (tile && interaction.remove(tile.truck.id)) navigateFocus(undefined); + refreshFocusLayout(); + } + } + }); +}); + +// --- Offline state: say why the map is empty instead of showing nothing. --- +signals.run((effect) => { + const state = presence(effect.get(connection.status), effect.get(vehicles)); + els.offline.hidden = state === "online"; + const [title, text] = els.offline.children; + if (state === "offline") { + title.textContent = "Simulator offline"; + text.replaceChildren( + "The simulated vehicles run in CARLA on a workstation and appear here as soon as it is publishing. ", + "Check back later, or run your own with the ", + link("CARLA demo", "https://github.com/moq-dev/moq/tree/main/demo/carla"), + ".", + ); + } else { + title.textContent = "Connecting to the relay…"; + text.replaceChildren(); + } +}); + +function link(text: string, href: string): HTMLAnchorElement { + const a = document.createElement("a"); + a.href = href; + a.textContent = text; + return a; +} + +function hasTruck(id: string | undefined): boolean { + for (const tile of tiles.values()) if (tile.truck.id === id) return true; + return false; +} + +// --- The map. --- +// +// Roads and truck markers share one coordinate system: CARLA world metres, as +// published on `status.pose` and baked by the simulator's roadmap module. `fitted` is +// the rectangle we want to show; `view` is that rectangle widened to the map +// box's own aspect ratio, which is what lets an SVG viewBox in metres and +// markers positioned in percent agree on where a truck is. +const poses = new Map(); +const towns = new Map(); +let shownTown: string | undefined; +let roadMap: RoadMap | undefined; +let wantedMap: string | undefined; +let unreadableMap: string | undefined; +let fitted: View | undefined; +let fittedFleet = ""; +let view: View | undefined; + +/** + * Adopt the fleet's town, drawing its roads if they were baked. + * + * `undefined` is a town in its own right - the fleet reporting none, because the + * last one left or its status lapsed. It has to drop the roads too: a pose-only + * truck would otherwise be projected onto the departed town's coordinates, and + * an empty map would keep drawing streets nobody is on. + */ +async function useRoadMap(name: string | undefined) { + if (wantedMap === name) return; + wantedMap = name; + // Drop the old town before the load rather than after it: an await that + // fails, or loses the race to another town, would otherwise leave the + // previous map drawn under trucks that are somewhere else entirely. + useRoads(undefined); + if (name === undefined) return; + + let loaded: RoadMap | undefined; + try { + loaded = await loadRoadMap(name); + } catch (err) { + // Deliberately no retry. Status arrives at 10 Hz, so releasing the name + // here would turn telemetry into a tight retry timer, and would re-clear + // `fitted` on every tick. A reload is the supervisor that can actually + // re-establish this, so say the chunk failed rather than reporting a town + // that IS baked as if it were not. + console.warn(`failed to load the road map for ${name}:`, err); + if (wantedMap === name) unreadableMap = name; + // The refit above already painted the note, back when this town still + // looked merely unbaked. Repaint it: status snapshots dedupe, so a parked + // fleet may never publish again to trigger one. + scheduleRefit(); + return; + } + // Another town won the race while this one loaded: it owns the map now. + if (wantedMap !== name) return; + useRoads(loaded); +} + +/** + * Adopt a town's roads, dropping the view the previous town fixed. + * + * `fitted` has to go with them. It came from the old town's bounds, or from + * trucks driving around inside them, and neither describes where these trucks + * are: without this, a fleet that lands inside the old extent leaves + * `needsRefit` false and gets projected against the wrong town. + */ +function useRoads(map: RoadMap | undefined) { + roadMap = map; + unreadableMap = undefined; + fitted = undefined; + els.roads.querySelector("#lane-geometry")?.setAttribute("d", map ? pathData(map) : ""); + const image = required("#aerial-image"); + image.removeAttribute("href"); + els.roads.dataset.aerial = String(Boolean(map?.aerial)); + if (map?.aerial) { + const { bbox, image: url } = map.aerial; + image.setAttribute("x", String(bbox[0])); + image.setAttribute("y", String(bbox[1])); + image.setAttribute("width", String(bbox[2] - bbox[0])); + image.setAttribute("height", String(bbox[3] - bbox[1])); + image.setAttribute("href", url); + } + scheduleRefit(); +} + +let refitting = false; + +/** + * Coalesce refits into the next frame. + * + * Every truck republishes its pose ten times a second, and a refit measures the + * map before positioning markers. Doing that per pose would interleave + * layout reads and writes all frame; once a frame reads everything, then moves + * everything. + */ +function scheduleRefit() { + if (refitting) return; + refitting = true; + requestAnimationFrame(() => { + refitting = false; + refitMap(); + }); +} + +/** + * Recompute the view and put every truck on it. + * + * A baked town fixes the view, so the map holds still while the trucks drive + * across it. Without one the view fits the trucks themselves, on the two + * triggers below. + */ +function refitMap() { + // One map, one town. A relay can carry trucks from more than one CARLA world, + // and their coordinates are unrelated, so projecting them together would + // place someone confidently in the wrong place. Show the majority's town and + // hide everyone else, like a truck with no position yet. + shownTown = fleetTown(towns.values()); + void useRoadMap(shownTown); + + const points = [...poses.entries()].filter(([id]) => onShownMap(id)).map(([, pose]) => pose); + // Two triggers, deliberately different. A truck joining or leaving is a + // discrete event that always refits: one that left should not keep the view + // zoomed out around where it was, and the last one leaving has to clear the + // view rather than leave an empty extent behind. Trucks MOVING refit only + // once one nears an edge, or the map slides under the driver at 10 Hz. + const fleet = [...poses.keys()].filter(onShownMap).sort().join(" "); + if (roadMap) { + fitted = mapView(roadMap, 0.06); + } else if (fleet !== fittedFleet || needsRefit(fitted, points)) { + fitted = fitPoints(points); + } + fittedFleet = fleet; + + const box = els.map.getBoundingClientRect(); + view = fitted && box.height > 0 ? expandToAspect(fitted, box.width / box.height) : undefined; + + if (view) els.roads.setAttribute("viewBox", viewBox(view)); + els.roads.style.visibility = view && roadMap ? "visible" : "hidden"; + refreshScale(); + refreshNote(); + + for (const tile of tiles.values()) tile.place(); +} + +/** Whether this truck's coordinates belong to the town the map is showing. */ +function onShownMap(id: string): boolean { + const town = towns.get(id); + return town === undefined || town === shownTown; +} + +function refreshScale() { + els.scale.hidden = !view; + if (!view) return; + const { metres, fraction } = scaleBar(view); + els.scale.style.width = `${fraction * 100}%`; + (els.scale.querySelector(".label") as HTMLElement).textContent = `${metres} m`; +} + +let note = ""; + +function code(text: string): HTMLElement { + const el = document.createElement("code"); + el.textContent = text; + return el; +} + +/** Say why the map is bare, rather than leaving an empty box. */ +function refreshNote() { + // A refit runs every frame a truck moves, so rebuild the note's nodes only + // when what it has to say changes. + const key = !view + ? "position" + : roadMap + ? "" + : unreadableMap + ? `unreadable:${unreadableMap}` + : wantedMap + ? `unbaked:${wantedMap}` + : ""; + if (key !== note) { + note = key; + if (key === "position") { + els.note.textContent = "Waiting for a truck to report where it is…"; + } else if (key.startsWith("unreadable:")) { + els.note.replaceChildren( + "The road map for ", + code(unreadableMap ?? ""), + " did not load - reload the page to try again.", + ); + } else if (key.startsWith("unbaked:")) { + els.note.replaceChildren( + "Road imagery unavailable for ", + code(wantedMap ?? ""), + ". Showing truck positions only.", + ); + } + } + // Before any truck is online, the offline state already says why. + els.note.hidden = key === "" || (key === "position" && tiles.size === 0); +} + +// The map's aspect ratio decides how wide the view has to be, so a resize is a +// refit rather than just a repaint. +new ResizeObserver(scheduleRefit).observe(els.map); + +// --- Navigation: preview -> focus -> drive. --- + +let cameraChooser: HTMLDialogElement | undefined; + +function closeCameraChooser() { + cameraChooser?.remove(); + cameraChooser = undefined; +} + +/** A shared map position must still expose every camera to mouse and touch. */ +function selectMarker(tile: TruckTile) { + closeCameraChooser(); + const pin = required(".pin", tile.root); + const bounds = pin.getBoundingClientRect(); + const neighbours = [...tiles.values()].filter((candidate) => { + if (candidate.root.hidden) return false; + const other = required(".pin", candidate.root).getBoundingClientRect(); + return ( + bounds.left < other.right && + bounds.right > other.left && + bounds.top < other.bottom && + bounds.bottom > other.top + ); + }); + if (neighbours.length < 2) { + navigateFocus(tile.truck.id); + return; + } + const dialog = document.createElement("dialog"); + dialog.className = "camera-chooser"; + dialog.setAttribute("aria-label", "Select camera"); + for (const neighbour of neighbours) { + const button = document.createElement("button"); + button.type = "button"; + button.textContent = neighbour.truck.id.replace("/", " · "); + button.addEventListener("click", () => navigateFocus(neighbour.truck.id)); + dialog.appendChild(button); + } + const cancel = document.createElement("button"); + cancel.type = "button"; + cancel.textContent = "Cancel"; + const dismiss = () => { + closeCameraChooser(); + if (pin.isConnected) pin.focus(); + }; + cancel.addEventListener("click", dismiss); + dialog.addEventListener("cancel", (event) => { + event.preventDefault(); + dismiss(); + }); + dialog.appendChild(cancel); + document.body.appendChild(dialog); + cameraChooser = dialog; + dialog.showModal(); +} + +function navigateFocus(id: string | undefined) { + const hash = hashWithFocus(window.location.hash, id); + if (hash !== window.location.hash) window.location.hash = hash; + applyFocus(id); +} + +function applyFocus(id: string | undefined) { + closeCameraChooser(); + if (focused.peek() !== id) clearKeys(); + interaction.focus(id); + refreshFocusLayout(); +} + +let previousFocus: string | undefined; +function refreshFocusLayout() { + const id = focused.peek(); + const open = hasTruck(id); + els.backdrop.hidden = !open; + for (const el of document.querySelectorAll("header, main, footer")) el.inert = open; + if (id !== previousFocus) { + const last = previousFocus; + previousFocus = id; + requestAnimationFrame(() => { + if (open) els.inspector.querySelector(".close-btn")?.focus(); + else if (last) [...tiles.values()].find((tile) => tile.truck.id === last)?.focusMarker(); + }); + } + // Keep markers aligned when the layout changes. + scheduleRefit(); +} + +window.addEventListener("hashchange", () => applyFocus(focusFromHash(window.location.hash))); + +// --- Keyboard steering for the active truck. --- +const held = new Moq.Signals.Signal>(new Set()); +const shiftBlocked = new Moq.Signals.Signal(undefined); +let shiftBlockedTimer: number | undefined; +const KEY = (e: KeyboardEvent) => e.key.toLowerCase(); +const DRIVE_KEYS = ["w", "a", "s", "d", "c", "arrowup", "arrowdown", "arrowleft", "arrowright"]; + +function holdKey(key: string) { + if (held.peek().has(key)) return; + held.set(new Set([...held.peek(), key])); +} + +function releaseKey(key: string) { + if (!held.peek().has(key)) return; + const next = new Set(held.peek()); + next.delete(key); + held.set(next); +} + +function clearKeys() { + if (held.peek().size > 0) held.set(new Set()); +} + +window.addEventListener("keydown", (e) => { + // The native chooser owns navigation and button activation while it is open. + if (cameraChooser) return; + // The calibration dialog owns the driving keys while it's up, so that + // working the pedals to bind them can't also steer. E-stop is the exception: + // an unavailable e-stop is a hazard, while a spurious one is an annoyance, + // so E keeps working here and the dialog carries its own button. + if (calibration) { + if (e.key === "Escape") closeCalibration(); + if (KEY(e) === "e") safetyTruck()?.emergencyStop(); + e.preventDefault(); + return; + } + const k = KEY(e); + if (k === "e") { + safetyTruck()?.emergencyStop(); + e.preventDefault(); + return; + } + if (e.metaKey || e.ctrlKey || e.altKey) return; + if (k === "tab" && hasTruck(focused.peek())) { + const controls = [...els.inspector.querySelectorAll("button:not(:disabled), summary")].filter( + (el) => el.getClientRects().length > 0, + ); + const first = controls[0]; + const last = controls[controls.length - 1]; + if (e.shiftKey && document.activeElement === first) { + last?.focus(); + e.preventDefault(); + } else if (!e.shiftKey && document.activeElement === last) { + first?.focus(); + e.preventDefault(); + } + return; + } + if (k === "escape") { + clearKeys(); + if (!interaction.releaseDrive() && focused.peek()) navigateFocus(undefined); + e.preventDefault(); + return; + } + if (k === "g" || k === " ") { + // Keep native Space activation for STOP and map navigation. In the + // driving view it shifts even if Take control or Close still has focus. + if ( + k === " " && + e.target instanceof HTMLElement && + (e.target.closest(".estop-btn, input, select, textarea") || + (!focused.peek() && e.target.closest("button, summary"))) + ) + return; + e.preventDefault(); + if (e.repeat) return; + const t = intentTruck(); + if (t) requestGear(t, nextGear(t.drive.peek().gear as Gear)); + return; + } + if (k === "r" && !e.repeat) { + truckById(focused.peek())?.resetEstop(); + e.preventDefault(); + return; + } + if (DRIVE_KEYS.includes(k)) { + intentTruck(); + holdKey(k); + // Reaching for the keyboard takes the axes back from the wheel, which + // otherwise holds them at wherever the rim and pedals happen to sit. + source.set("keyboard"); + e.preventDefault(); + } +}); +window.addEventListener("keyup", (e) => releaseKey(KEY(e))); +window.addEventListener("blur", clearKeys); + +function activeTruck(): Truck | undefined { + return truckById(driving.peek()); +} + +/** Claim the focused truck for an input that expresses driving intent. */ +function intentTruck(): Truck | undefined { + const id = focused.peek(); + const truck = truckById(id); + if (!id || !truck) return undefined; + if (driving.peek() !== id && !truck.beginTakeover()) return undefined; + if (!interaction.takeDrive(id)) return undefined; + return truck; +} + +function safetyTruck(): Truck | undefined { + return truckById(interaction.safetyTarget()); +} + +function truckById(id: string | undefined): Truck | undefined { + for (const tile of tiles.values()) if (tile.truck.id === id) return tile.truck; + return undefined; +} + +/** Apply the client-side half of the truck's authoritative gear interlock. */ +function requestGear(truck: Truck, gear: Gear) { + if (!canShift(truck.drive.peek())) { + shiftBlocked.set(truck.id); + if (shiftBlockedTimer !== undefined) window.clearTimeout(shiftBlockedTimer); + shiftBlockedTimer = window.setTimeout(() => shiftBlocked.set(undefined), 2000); + return; + } + if (shiftBlocked.peek() === truck.id) shiftBlocked.set(undefined); + truck.setDrive({ gear }); +} + +// --- Steering wheel (Gamepad API). --- +// +// Only one source drives the axes at a time. The keyboard holds them by +// default; a connected wheel takes over once it actually moves, and only with +// the throttle released, so a pedal resting under a foot can never be what +// hands it control. Any drive key takes the axes straight back. +const wheel = new Wheel(); +const source = new Moq.Signals.Signal("keyboard"); + +/** + * Advance the arbitration, failing the truck safe if an armed wheel vanished. + * + * Unplugging mid-drive must not silently become a held keyboard command: the + * driver has lost the device that was setting throttle, so cut it here rather + * than letting {@link applyKeys} hold it. Fires once on the transition, so the + * keyboard is free to drive normally afterwards. + */ +function updateSource(sample: WheelSample | undefined) { + const { source: next, lost } = arbitrate(source.peek(), sample); + source.set(next); + if (!lost) return; + // A key held from before the wheel armed is still in `held`, and applyKeys + // runs later this same frame - without this it would start easing the brake + // back off the instant the fail-safe applied it. + clearKeys(); + const truck = activeTruck(); + if (truck && !truck.estopped.peek()) truck.setDrive(failSafe(truck.drive.peek())); +} + +function wheelButtons(sample: WheelSample) { + const truck = activeTruck(); + // E-stop is the documented exception to arbitration: any source may latch it + // at any time. Gear is a drive command, so it follows the active source - + // a bumped paddle must not shift a truck being driven from the keyboard. + if (sample.pressed.has("estop")) truck?.estop(); + if (!truck || truck.estopped.peek() || source.peek() !== "wheel") return; + const gear = truck.drive.peek().gear as Gear; + if (sample.pressed.has("gearUp")) requestGear(truck, shiftGear(gear, 1)); + if (sample.pressed.has("gearDown")) requestGear(truck, shiftGear(gear, -1)); +} + +// Integrate the active input source into the drive state ~60 Hz. The interval +// fallback keeps input (and therefore the control heartbeat's payload) +// advancing when rAF is paused, e.g. in a hidden or embedded tab. +let lastFrame = performance.now(); + +function step() { + const now = performance.now(); + const dt = Math.min((now - lastFrame) / 1000, 0.1); + lastFrame = now; + + const sample = wheel.poll(); + refreshWheel(); + + // Calibration reads the raw device, so nothing it sees should reach a truck. + if (calibration) { + const pad = wheel.pad(); + if (pad) calibration.update(pad); + refreshCalibration(); + return; + } + + // Arbitrate before reading the buttons: the gear gate below consults the + // active source, which must already reflect this frame's sample. + updateSource(sample); + // Moving an armed wheel is drive intent just like pressing a drive key. The + // arbitration throttle gate has already run, so a depressed accelerator can + // never be the movement that claims the truck. + if (!driving.peek() && sample?.moved && source.peek() === "wheel") intentTruck(); + if (sample) wheelButtons(sample); + + const truck = activeTruck(); + if (truck) { + const cur = truck.drive.peek(); + const next = + source.peek() === "wheel" && sample ? applyWheel(cur, sample, dt) : applyKeys(cur, held.peek(), dt); + stepDrive(truck, next); + } +} + +function tick() { + step(); + requestAnimationFrame(tick); +} +requestAnimationFrame(tick); +setInterval(step, 250); + +// --- Wheel status chip + calibration dialog. --- +let calibration: Calibration | undefined; +let lastWheelLabel = ""; + +const calEls = { + device: els.cal.querySelector(".cal-device") as HTMLDivElement, + progress: els.cal.querySelector(".cal-progress") as HTMLDivElement, + prompt: els.cal.querySelector(".cal-prompt") as HTMLParagraphElement, + live: els.cal.querySelector(".cal-live") as HTMLDivElement, + warn: els.cal.querySelector(".cal-warn") as HTMLDivElement, + capture: els.cal.querySelector(".cal-capture") as HTMLButtonElement, + skip: els.cal.querySelector(".cal-skip") as HTMLButtonElement, + cancel: els.cal.querySelector(".cal-cancel") as HTMLButtonElement, + estop: els.cal.querySelector(".cal-estop") as HTMLButtonElement, +}; + +els.wheel.addEventListener("click", () => openCalibration()); +// The modal covers the tile's e-stop, so it has to carry its own. +calEls.estop.addEventListener("click", () => safetyTruck()?.emergencyStop()); +calEls.cancel.addEventListener("click", () => closeCalibration()); +calEls.skip.addEventListener("click", () => { + calibration?.skip(); + finishCalibration(); +}); +calEls.capture.addEventListener("click", () => { + // A failed capture means the control didn't move far enough to tell apart + // from the rest snapshot; leave the step up and say so. + if (calibration && !calibration.capture()) { + calEls.warn.hidden = false; + return; + } + calEls.warn.hidden = true; + finishCalibration(); +}); + +/** Reflect the connected wheel in the header chip. */ +function refreshWheel() { + const id = wheel.id; + if (!id) { + els.wheel.hidden = true; + lastWheelLabel = ""; + return; + } + const label = `${shortName(id)}${wheel.calibrated ? "" : " · uncalibrated"}`; + if (label !== lastWheelLabel) { + els.wheel.textContent = label; + els.wheel.title = `${id} - click to calibrate`; + lastWheelLabel = label; + } + els.wheel.hidden = false; + els.wheel.dataset.driving = String(source.peek() === "wheel"); +} + +function openCalibration() { + if (!wheel.pad()) return; + calibration = new Calibration(); + // The wheel has to re-arm afterwards, since the axes it reports now mean + // something different than they did a moment ago. + source.set("keyboard"); + clearKeys(); + // Calibration means working the pedals for reasons that have nothing to do + // with driving, and the dialog suppresses the normal control loop, so park + // the truck before it goes up rather than leaving whatever was commanded to + // keep heartbeating out for the duration. + activeTruck()?.setDrive({ ...REST }); + calEls.warn.hidden = true; + els.cal.hidden = false; + refreshCalibration(); +} + +function closeCalibration() { + calibration = undefined; + els.cal.hidden = true; +} + +/** Save and close once the last step is bound, otherwise redraw the dialog. */ +function finishCalibration() { + if (!calibration) return; + if (!calibration.done) { + refreshCalibration(); + return; + } + const profile = calibration.result(); + if (profile) wheel.save(profile); + closeCalibration(); +} + +function refreshCalibration() { + const cal = calibration; + if (!cal) return; + if (cal.done) { + finishCalibration(); + return; + } + + const step = cal.step; + if (!step) return; + + calEls.device.textContent = wheel.id ? shortName(wheel.id) : "wheel disconnected"; + calEls.progress.textContent = `step ${cal.index + 1} of ${cal.total}`; + calEls.prompt.textContent = step.prompt; + // Button steps bind on the press itself - there is no free hand for Capture. + calEls.capture.hidden = step.kind === "button"; + calEls.skip.hidden = !step.optional; + + const pad = wheel.pad(); + calEls.live.textContent = pad + ? pad.axes.map((value, index) => `a${index} ${value.toFixed(2)}`).join(" ") + : "no signal from the wheel"; +} + +// --- A rendered tile bound to one Truck. --- +class TruckTile { + readonly truck: Truck; + readonly root: HTMLDivElement; + readonly #signals = new Moq.Signals.Effect(); + #overlay!: HTMLCanvasElement; + #arrow!: HTMLElement; + readonly #card: HTMLDivElement; + readonly #panel = document.createElement("div"); + // The last collision the truck reported, held across a status dropout. + #collision?: Collision; + + constructor(truck: Truck) { + this.truck = truck; + this.root = document.createElement("div"); + this.root.className = "truck"; + this.root.innerHTML = ` + +
+
+ +
Connecting
+ + Waiting for camera +
+
Throttle
+
Brake
+
+
km/h
+
MeasuredInput
+
+
+
+ +
+ + + +
+
+
+ +
Diagnostics
Control round trip
Camera pipeline
+
+
+
+
`; + this.root.hidden = true; + els.markers.appendChild(this.root); + this.#card = this.root.querySelector(".card") as HTMLDivElement; + this.#panel.className = "truck"; + els.inspector.appendChild(this.#panel); + + const canvas = this.root.querySelector("canvas:not(.overlay)") as HTMLCanvasElement; + truck.setCanvas(canvas); + this.#overlay = this.root.querySelector("canvas.overlay") as HTMLCanvasElement; + this.#arrow = this.root.querySelector(".pin .arrow") as HTMLElement; + + this.root.addEventListener("click", () => selectMarker(this)); + for (const target of [this.root]) { + target.addEventListener("pointerenter", (event) => { + if (event.pointerType !== "touch") hovered.set(truck.id); + }); + target.addEventListener("pointerleave", () => { + if (hovered.peek() === truck.id) hovered.set(undefined); + }); + target.addEventListener("focusin", () => hovered.set(truck.id)); + target.addEventListener("focusout", (event) => { + if ( + !(event.relatedTarget instanceof Node && target.contains(event.relatedTarget)) && + hovered.peek() === truck.id + ) + hovered.set(undefined); + }); + } + required(".close-btn", this.root).addEventListener("click", (event) => { + event.stopPropagation(); + navigateFocus(undefined); + }); + + const name = this.root.querySelector(".name"); + const control = this.root.querySelector(".control-btn") as HTMLButtonElement | null; + const respawn = this.root.querySelector(".respawn-btn") as HTMLButtonElement | null; + const estop = this.root.querySelector(".estop-btn"); + if (!name || !control || !respawn || !estop) + throw new Error("truck tile template is missing required controls"); + name.textContent = truck.id.replace("/", " · "); + required(".pin", this.root).setAttribute("aria-label", `Open ${truck.id} on map`); + required(".pin-label", this.root).textContent = truck.id.split("/")[0]; + + control.addEventListener("click", (e) => { + e.stopPropagation(); + if (this.truck.active.peek()) { + interaction.releaseDrive(); + } else if (this.truck.beginTakeover()) { + interaction.takeDrive(truck.id); + } + }); + + respawn.addEventListener("click", (e) => { + e.stopPropagation(); + this.truck.respawn(); + }); + + // E-stop is a safety control anyone may trigger, so it lives on every tile + // and works whether or not you hold the lease. stopPropagation keeps the + // click from also navigating into this tile's focused view. + estop.addEventListener("click", (e) => { + e.stopPropagation(); + this.truck.toggleEmergencyStop(); + }); + + this.#bind(); + } + + /** + * Move this marker to the reported position, hiding it until there is one. + * + * Markers and their hover previews follow the reported position. A focused + * truck's card lives in the inspector, so focus works either way. + */ + place() { + const pose = onShownMap(this.truck.id) ? poses.get(this.truck.id) : undefined; + this.root.hidden = !pose || !view; + if (!pose || !view) return; + + const { left, top } = project(view, pose); + this.root.style.left = `${left}%`; + this.root.style.top = `${top}%`; + // CARLA yaw is clockwise from +x, and so is a CSS rotation drawn on a map + // whose y grows downward, so this needs no conversion. + this.#arrow.style.transform = `rotate(${pose.yaw}deg)`; + } + + #bind() { + const q = (s: string) => (s === ".card" ? this.#card : (this.#card.querySelector(s) as HTMLElement)); + + // The map's inputs: where this truck is, and which town it is in. + this.#signals.run((effect) => { + const status = effect.get(this.truck.status); + if (status?.map) { + towns.set(this.truck.id, status.map); + } else { + towns.delete(this.truck.id); + } + if (status?.pose) { + poses.set(this.truck.id, status.pose); + } else { + poses.delete(this.truck.id); + } + q(".speed-value").textContent = status?.pose ? String(Math.round(status.pose.speed * 3.6)) : "–"; + scheduleRefit(); + }); + + // Preview, focus, and drive each have a distinct visual and action. + this.#signals.run((effect) => { + const isFocused = effect.get(focused) === this.truck.id; + const active = effect.get(this.truck.active); + this.root.dataset.focused = String(isFocused); + this.root.dataset.active = String(active); + this.#panel.dataset.focused = String(isFocused); + this.#panel.dataset.active = String(active); + const cardParent = isFocused ? this.#panel : this.root; + if (this.#card.parentElement !== cardParent) cardParent.appendChild(this.#card); + const isHovered = effect.get(hovered) === this.truck.id && !effect.get(focused); + this.root.dataset.preview = String(isHovered); + q(".card").hidden = !isFocused && !isHovered; + q(".card").setAttribute("role", isFocused ? "dialog" : "region"); + q(".card").setAttribute("aria-label", this.truck.id); + q(".card").setAttribute("aria-modal", String(isFocused)); + q(".guide-key").hidden = !active; + const status = effect.get(this.truck.status); + const controlButton = q(".control-btn") as HTMLButtonElement; + controlButton.textContent = active ? "Release control" : "Take control"; + // Status carries the measured takeover state. Never guess while it is unavailable. + controlButton.disabled = !active && !status; + const respawnButton = q(".respawn-btn") as HTMLButtonElement; + const driverId = effect.get(this.truck.driverId); + const estopped = effect.get(this.truck.estopped) || Boolean(status?.estopped); + respawnButton.hidden = !isFocused; + respawnButton.disabled = + effect.get(this.truck.respawning) || !active || !driverId || status?.driver !== driverId || estopped; + // Latched if either side thinks so: the local signal reacts + // instantly, the status echo is authoritative (see resetEstop). + const stopButton = q(".estop-btn") as HTMLButtonElement; + const stopParent = q(isFocused ? ".actions" : ".video-wrap"); + if (stopButton.parentElement !== stopParent) stopParent.appendChild(stopButton); + stopButton.textContent = estopped ? "RESET E-STOP" : isFocused ? "E-STOP" : "STOP"; + stopButton.dataset.reset = String(estopped); + // Reset waits for the authoritative echo so a fast second click cannot + // replace the stop command before the truck receives and latches it. + stopButton.disabled = estopped && !status?.estopped; + stopButton.title = estopped + ? "Clear the confirmed e-stop latch and return an unclaimed truck to autonomy" + : "Emergency stop · E"; + const statusState = effect.get(this.truck.statusState); + q(".hint").hidden = + !active && + !estopped && + statusState === "available" && + !status?.driver && + effect.get(shiftBlocked) !== this.truck.id; + q(".hint").textContent = + effect.get(shiftBlocked) === this.truck.id + ? "shift blocked - release throttle and apply the brake" + : controlHint({ + active, + focused: isFocused, + estopped, + estopBy: status?.estop_by, + status: statusState, + driverId, + statusDriver: status?.driver, + wheel: effect.get(source) === "wheel", + }); + }); + + // Camera readiness is separate from telemetry and control ownership. + this.#signals.run((effect) => { + const visible = + effect.get(focused) === this.truck.id || + (!effect.get(focused) && effect.get(hovered) === this.truck.id); + const frame = effect.get(this.truck.videoDecoder.out.frame); + const stalled = effect.get(this.truck.videoDecoder.out.stalled); + const live = visible && Boolean(frame) && !stalled; + q(".badge").textContent = live ? "Live" : frame ? "Interrupted" : "Connecting"; + q(".video-state").textContent = frame ? "Camera interrupted" : "Waiting for camera"; + q(".badge").dataset.live = String(live); + q(".video-state").hidden = live; + }); + + this.#signals.run((effect) => { + const s = effect.get(this.truck.status); + const measured = s?.measured; + const input = effect.get(this.truck.drive); + const active = effect.get(this.truck.active); + for (const pedal of ["throttle", "brake"] as const) { + q(`.${pedal}`).textContent = measured ? `${Math.round(measured[pedal] * 100)}%` : "–"; + const meter = q(`.${pedal}-meter`) as HTMLMeterElement; + meter.hidden = !measured; + meter.value = measured?.[pedal] ?? 0; + q(`.${pedal}-request`).hidden = !active || !measured; + q(`.${pedal}-request`).style.left = `${Math.max(0, Math.min(1, input[pedal])) * 100}%`; + } + q(".gear").textContent = measured + ? measured.gear === "forward" + ? "D" + : measured.gear === "reverse" + ? "R" + : "N" + : "–"; + q(".gear").setAttribute("aria-label", measured ? `Gear: ${measured.gear}` : "Gear unavailable"); + q(".mode").textContent = !s + ? "No status" + : s.estopped + ? "Stopped" + : s.autonomy === "autonomous" + ? "Autonomous" + : s.autonomy === "manual" + ? "Manual" + : "Unknown"; + q(".mode").className = `mode${s?.estopped ? " estopped" : ""}`; + const me = effect.get(this.truck.driverId); + const mine = me ? s?.media_pipeline[me] : undefined; + const roundTrip = effect.get(this.truck.roundTripMs); + q(".rtt").textContent = roundTrip == null ? "Not measured" : `${Math.round(roundTrip)} ms`; + q(".lat").textContent = mine?.length + ? mine.map((l) => `${l.label} ${l.ms} ms`).join(" · ") + : "Not measured"; + this.#renderCollision(s); + }); + + // Overlay: your requested input (cyan, dashed) against the truck's + // measured steering (white, solid), with the gap between them shaded. + this.#signals.run((effect) => { + effect.get(this.truck.drive); + effect.get(this.truck.active); + effect.get(this.truck.status); + effect.get(focused); + this.#drawOverlay(); + }); + + // A collision's age is wall clock, not a status field, so it needs its own + // tick: without one the callout would freeze on a truck that stops moving + // and therefore stops changing its snapshot. + this.#signals.interval(() => this.#renderCollision(this.truck.status.peek()), 1000); + + // Repaint on layout/resize (the initial effect run happens before layout, + // so the overlay has zero size until the first observation fires). + const ro = new ResizeObserver(() => this.#drawOverlay()); + ro.observe(this.#overlay); + this.#signals.cleanup(() => ro.disconnect()); + } + + /** + * Show the truck's last collision, and call out a recent one. + * + * The age comes off the collision's own timestamp, so this holds no state + * beyond the last value the truck sent: every viewer ages the same impact + * the same way, whenever it joined, and a reload does not resurrect it as + * news the way locally-timed decay did. + * + * Takes the whole status because a missing collision means two different + * things. No status at all is a dropout - the signal goes undefined on every + * reconnect - and the last collision is held through it. A status that is + * present and omits the field is a truck that has hit nothing, including a + * restarted producer, and clears it. + */ + #renderCollision(status: TruckStatus | undefined) { + if (status) this.#collision = status.collision; + const q = (s: string) => (s === ".card" ? this.#card : (this.#card.querySelector(s) as HTMLElement)); + if (!this.#collision) { + q(".collision-row").hidden = true; + delete this.root.dataset.collision; + delete this.#panel.dataset.collision; + return; + } + const age = collisionAge(this.#collision, Date.now()); + q(".collision-row").hidden = false; + q(".collision").textContent = collisionLabel(this.#collision, age); + this.root.dataset.collision = age < COLLISION_ALERT_MS ? "recent" : "past"; + this.#panel.dataset.collision = this.root.dataset.collision; + } + + /** + * Repaint the trajectory overlay from current signal values. + * + * Reads with `peek` rather than taking arguments because the resize observer + * and the effect both call it, and threading four values through both is how + * the two callers drift apart. + */ + #drawOverlay() { + const canvas = this.#overlay; + const cssW = canvas.clientWidth; + const cssH = canvas.clientHeight; + if (cssW === 0 || cssH === 0) return; + + const dpr = window.devicePixelRatio || 1; + canvas.width = Math.round(cssW * dpr); + canvas.height = Math.round(cssH * dpr); + const ctx = canvas.getContext("2d"); + if (!ctx) return; + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + ctx.clearRect(0, 0, cssW, cssH); + + const status = this.truck.status.peek(); + const requested = this.truck.drive.peek(); + const driving = this.truck.active.peek() && status?.autonomy !== "autonomous"; + // A marker on the map is a preview at 240p; rails on it would be noise. + // Measured steering is worth seeing on a truck you are only watching, so + // it is drawn whenever the panel is open, autonomous or not. + const measured = focused.peek() === this.truck.id ? status?.measured : undefined; + + if (measured) { + // A visible gap turns red when feedback departs from the input. + if (driving) { + const gap = divergence(requested, measured); + drawDivergence(ctx, cssW, cssH, requested, measured, { + color: diverged(gap) ? "#ff4d55" : "#ffffff", + alpha: 0.16, + }); + } + drawGuide(ctx, cssW, cssH, measured, { color: "#ffffff", width: 2, alpha: 0.8 }); + } + + // Your requested input, shown while you hold control so you can see lead/lag. + if (driving) { + drawGuide(ctx, cssW, cssH, requested, { + color: "#50c8ff", + width: 2, + dash: [7, 6], + alpha: 0.9, + }); + } + // The solid pedal arrow represents measured truck feedback. + if (measured || driving) drawDriveHud(ctx, cssW, cssH, driving ? requested : undefined, measured); + } + + focusMarker() { + required(".pin", this.root).focus(); + } + + dispose() { + closeCameraChooser(); + this.#signals.close(); + this.truck.close(); + this.root.remove(); + this.#panel.remove(); + if (hovered.peek() === this.truck.id) hovered.set(undefined); + poses.delete(this.truck.id); + towns.delete(this.truck.id); + scheduleRefit(); + } +} + +// A development-only, disconnected fixture for reviewing layouts without a GPU. +if (preview) { + required("#preview-notice").hidden = false; + const { populatePreview } = await import("./preview.ts"); + const cleanup = populatePreview((path) => { + const truck = new Truck({ broadcastId: path, connection, driving, focused, hovered }); + const tile = new TruckTile(truck); + tiles.set(path, tile); + vehicles.set(tiles.size); + refreshFocusLayout(); + return truck; + }); + signals.cleanup(cleanup); +} + +window.addEventListener("pagehide", (event) => { + if (event.persisted) return; + for (const tile of tiles.values()) tile.dispose(); + signals.close(); + connection.close(); +}); diff --git a/demo/carla/web/src/map.test.ts b/demo/carla/web/src/map.test.ts new file mode 100644 index 00000000000..55a22cef96c --- /dev/null +++ b/demo/carla/web/src/map.test.ts @@ -0,0 +1,181 @@ +import { describe, expect, test } from "bun:test"; +import { + expandToAspect, + fitPoints, + fleetTown, + mapView, + needsRefit, + pathData, + project, + type RoadMap, + scaleBar, + speedLabel, + type View, + viewBox, +} from "./map.ts"; + +const square: View = { minX: -100, minY: -100, maxX: 100, maxY: 100 }; + +describe("expandToAspect", () => { + test("widens a square view for a landscape box", () => { + expect(expandToAspect(square, 2)).toEqual({ minX: -200, minY: -100, maxX: 200, maxY: 100 }); + }); + + test("heightens a square view for a portrait box", () => { + expect(expandToAspect(square, 0.5)).toEqual({ minX: -100, minY: -200, maxX: 100, maxY: 200 }); + }); + + test("only ever grows, so nothing already in view is cropped out", () => { + const wide: View = { minX: 0, minY: 0, maxX: 400, maxY: 100 }; + expect(expandToAspect(wide, 2)).toEqual({ minX: 0, minY: -50, maxX: 400, maxY: 150 }); + }); + + test("leaves the view alone before the map box has been laid out", () => { + expect(expandToAspect(square, Number.NaN)).toEqual(square); + expect(expandToAspect(square, 0)).toEqual(square); + }); +}); + +describe("project", () => { + test("puts the view's corners on the box's corners", () => { + expect(project(square, { x: -100, y: -100 })).toEqual({ left: 0, top: 0 }); + expect(project(square, { x: 100, y: 100 })).toEqual({ left: 100, top: 100 }); + }); + + test("maps CARLA's southward y onto a downward screen without a flip", () => { + expect(project(square, { x: 0, y: 50 })).toEqual({ left: 50, top: 75 }); + }); +}); + +describe("fitPoints", () => { + test("has nothing to fit before a truck reports a position", () => { + expect(fitPoints([])).toBeUndefined(); + }); + + test("floors the span so a nose-to-tail convoy is not a wall of truck", () => { + const view = fitPoints([ + { x: 0, y: 0 }, + { x: 12, y: 0 }, + ]); + expect(view).toBeDefined(); + expect((view as View).maxX - (view as View).minX).toBeCloseTo(300); + expect((view as View).maxY - (view as View).minY).toBeCloseTo(300); + }); + + test("centres and pads a fleet spread wider than the floor", () => { + const view = fitPoints([ + { x: -500, y: 0 }, + { x: 500, y: 0 }, + ]) as View; + expect(view.minX + view.maxX).toBeCloseTo(0); + expect(view.maxX - view.minX).toBeCloseTo(1200); + }); +}); + +describe("needsRefit", () => { + test("fits once there is something to fit", () => { + expect(needsRefit(undefined, [])).toBe(false); + expect(needsRefit(undefined, [{ x: 0, y: 0 }])).toBe(true); + }); + + test("holds the view still while the trucks drive around inside it", () => { + expect(needsRefit(square, [{ x: 40, y: -40 }])).toBe(false); + }); + + test("refits when a truck reaches the edge", () => { + expect(needsRefit(square, [{ x: 95, y: 0 }])).toBe(true); + expect(needsRefit(square, [{ x: 0, y: -300 }])).toBe(true); + }); +}); + +describe("scaleBar", () => { + test("picks a round length that fits inside a quarter of the view", () => { + expect(scaleBar({ minX: 0, minY: 0, maxX: 1000, maxY: 1000 }).metres).toBe(200); + expect(scaleBar({ minX: 0, minY: 0, maxX: 300, maxY: 300 }).metres).toBe(50); + }); + + test("reports the fraction of the view the bar covers", () => { + expect(scaleBar({ minX: 0, minY: 0, maxX: 1000, maxY: 1000 }).fraction).toBeCloseTo(0.2); + }); +}); + +describe("baked road maps", () => { + const map: RoadMap = { + name: "Town10HD_Opt", + bbox: [-10, -20, 30, 40], + features: [ + { + geometry: { + coordinates: [ + [ + [0, 0], + [10, 5], + ], + [[1, 1]], + ], + }, + }, + ], + }; + + test("draws every lane as one path, skipping a lane with no length", () => { + expect(pathData(map)).toBe("M0 0 L10 5"); + }); + + test("takes the drawn view straight from the baked bounds", () => { + expect(mapView(map)).toEqual({ minX: -10, minY: -20, maxX: 30, maxY: 40 }); + expect(viewBox(mapView(map))).toBe("-10 -20 40 60"); + }); + + test("gives a town of one straight road something to draw on", () => { + // A single east-west road bakes to a bbox with no height at all; drawn + // as-is that is a zero SVG viewBox dimension and a non-finite scale bar. + const road = mapView({ ...map, bbox: [0, 50, 400, 50] }); + expect(road).toEqual({ minX: 0, maxX: 400, minY: 45, maxY: 55 }); + expect(scaleBar(road).fraction).toBeCloseTo(0.25); + + const northSouth = mapView({ ...map, bbox: [50, 0, 50, 400] }); + expect(northSouth).toEqual({ minX: 45, maxX: 55, minY: 0, maxY: 400 }); + expect(Number.isFinite(scaleBar(northSouth).fraction)).toBe(true); + }); +}); + +describe("fleetTown", () => { + test("has no town to show before any truck reports one", () => { + expect(fleetTown([])).toBeUndefined(); + }); + + test("shows the town most of the fleet is in", () => { + expect(fleetTown(["Town10HD_Opt", "Town04", "Town10HD_Opt"])).toBe("Town10HD_Opt"); + }); + + test("breaks a tie by name rather than by announcement order", () => { + expect(fleetTown(["Town10HD_Opt", "Town04"])).toBe("Town04"); + expect(fleetTown(["Town04", "Town10HD_Opt"])).toBe("Town04"); + }); +}); + +test("speed is labelled in km/h, which is how a truck reads", () => { + expect(speedLabel(0)).toBe("0 km/h"); + expect(speedLabel(13.9)).toBe("50 km/h"); +}); + +test("aerial imagery and roads fit together without shifting their coordinate origin", () => { + const map: RoadMap = { + name: "site", + bbox: [0, 0, 100, 100], + features: [], + aerial: { image: "site.aerial.png", bbox: [-20, -10, 120, 110] }, + }; + const fitted = mapView(map); + expect(fitted).toEqual({ minX: -20, minY: -10, maxX: 120, maxY: 110 }); + expect(project(fitted, { x: 50, y: 50 })).toEqual({ left: 50, top: 50 }); + map.aerial = { image: "site.aerial.png", bbox: [20, 20, 80, 80] }; + expect(mapView(map)).toEqual({ minX: 0, minY: 0, maxX: 100, maxY: 100 }); +}); + +test("map padding leaves room for road shoulders without moving the world origin", () => { + const map: RoadMap = { name: "site", bbox: [0, 0, 100, 100], features: [] }; + expect(mapView(map, 0.06)).toEqual({ minX: -6, minY: -6, maxX: 106, maxY: 106 }); + expect(project(mapView(map, 0.06), { x: 50, y: 50 })).toEqual({ left: 50, top: 50 }); +}); diff --git a/demo/carla/web/src/map.ts b/demo/carla/web/src/map.ts new file mode 100644 index 00000000000..857d2b449dc --- /dev/null +++ b/demo/carla/web/src/map.ts @@ -0,0 +1,195 @@ +/** + * The fleet map: baked CARLA road geometry, and the projection that puts truck + * poses on top of it. + * + * Everything here is in CARLA world METRES (x east, y south), which is also what + * the trucks put on their `status` track, so roads and markers need no common + * reference beyond this module. Screen y grows downward like CARLA's y, so the + * projection is a scale with no flip, and a yaw in degrees is a CSS rotation. + * + * The view is always widened to the container's exact aspect ratio rather than + * letterboxed by the SVG, because the markers are HTML positioned in percent: + * the two only line up if the viewBox and the box agree. + * + * @module + */ + +/** One baked town, written by the simulator's `moq_carla_sim.roadmap`. */ +export interface RoadMap { + name: string; + /** [minX, minY, maxX, maxY], metres. */ + bbox: [number, number, number, number]; + features: { geometry: { coordinates: [number, number][][] } }[]; + /** Calibrated top-down image in the same world metres as the roads. */ + aerial?: { image: string; bbox: [number, number, number, number] }; +} + +/** A rectangle of CARLA world metres, as drawn. */ +export interface View { + minX: number; + minY: number; + maxX: number; + maxY: number; +} + +/** Something with a position on the map. */ +export interface Located { + x: number; + y: number; +} + +/** Metres across the smallest auto-fitted view, so a convoy is not a wall of truck. */ +const MIN_SPAN = 250; + +/** Fraction of the span left empty around auto-fitted trucks. */ +const PADDING = 0.2; + +/** + * Metres, the narrowest a baked town may be drawn on either axis. + * + * A town whose lanes are all collinear - one straight road, which is what a + * hand-authored OpenDRIVE tends to look like - bakes to a bbox with zero span on + * an axis. Left alone that reaches the SVG as a zero viewBox dimension and makes + * the scale bar's fraction non-finite. + */ +const MIN_MAP_SPAN = 10; + +/** The rectangle a baked town covers, never thinner than it can be drawn. */ +export function mapView(map: RoadMap, padding = 0): View { + const [leftX, topY, rightX, bottomY] = map.bbox; + const aerial = map.aerial?.bbox ?? map.bbox; + const minX = Math.min(leftX, aerial[0]); + const minY = Math.min(topY, aerial[1]); + const maxX = Math.max(rightX, aerial[2]); + const maxY = Math.max(bottomY, aerial[3]); + const [left, right] = widen(minX, maxX, MIN_MAP_SPAN); + const [top, bottom] = widen(minY, maxY, MIN_MAP_SPAN); + const margin = Math.max(right - left, bottom - top) * padding; + return { minX: left - margin, maxX: right + margin, minY: top - margin, maxY: bottom + margin }; +} + +/** Grow an axis around its centre until it spans at least `span`. */ +function widen(low: number, high: number, span: number): [number, number] { + if (high - low >= span) return [low, high]; + const centre = (low + high) / 2; + return [centre - span / 2, centre + span / 2]; +} + +/** + * The town the map shows when a relay carries trucks from more than one. + * + * CARLA coordinates from different towns are unrelated, so the map can only be + * one of them: the town most trucks are in, ties broken by name so the choice is + * stable rather than a function of announcement order. Everyone else waits + * beside the map, the same place a truck with no position goes. + */ +export function fleetTown(towns: Iterable): string | undefined { + const counts = new Map(); + for (const town of towns) counts.set(town, (counts.get(town) ?? 0) + 1); + + let best: string | undefined; + let most = 0; + for (const [town, count] of [...counts].sort(([a], [b]) => (a < b ? -1 : 1))) { + if (count > most) { + most = count; + best = town; + } + } + return best; +} + +/** A square view around whatever positions we have, until a town is baked. */ +export function fitPoints(points: readonly Located[]): View | undefined { + if (points.length === 0) return undefined; + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (const { x, y } of points) { + minX = Math.min(minX, x); + maxX = Math.max(maxX, x); + minY = Math.min(minY, y); + maxY = Math.max(maxY, y); + } + // Square and floored: a convoy sits nose to tail, and fitting tightly to + // three trucks 12 m apart would zoom the map to a stretch of one road. + const span = Math.max(maxX - minX, maxY - minY, MIN_SPAN) * (1 + PADDING); + const x = (minX + maxX) / 2; + const y = (minY + maxY) / 2; + return { minX: x - span / 2, maxX: x + span / 2, minY: y - span / 2, maxY: y + span / 2 }; +} + +/** + * Whether an auto-fitted view has to be recomputed for these positions. + * + * Refitting on every pose would slide the whole map under the driver at 10 Hz. + * Instead the view holds still until a truck reaches `margin` of the edge. + */ +export function needsRefit(view: View | undefined, points: readonly Located[], margin = 0.08): boolean { + if (!view) return points.length > 0; + if (points.length === 0) return false; + const insetX = (view.maxX - view.minX) * margin; + const insetY = (view.maxY - view.minY) * margin; + return points.some( + ({ x, y }) => + x < view.minX + insetX || x > view.maxX - insetX || y < view.minY + insetY || y > view.maxY - insetY, + ); +} + +/** Widen the shorter axis until the view matches the container it is drawn in. */ +export function expandToAspect(view: View, aspect: number): View { + const width = view.maxX - view.minX; + const height = view.maxY - view.minY; + if (!Number.isFinite(aspect) || aspect <= 0 || width <= 0 || height <= 0) return view; + const x = (view.minX + view.maxX) / 2; + const y = (view.minY + view.maxY) / 2; + const spanX = width / height < aspect ? height * aspect : width; + const spanY = width / height < aspect ? height : width / aspect; + return { minX: x - spanX / 2, maxX: x + spanX / 2, minY: y - spanY / 2, maxY: y + spanY / 2 }; +} + +/** Where a position sits in the view, as CSS percentages. */ +export function project(view: View, point: Located): { left: number; top: number } { + const width = view.maxX - view.minX; + const height = view.maxY - view.minY; + return { + left: width > 0 ? ((point.x - view.minX) / width) * 100 : 50, + top: height > 0 ? ((point.y - view.minY) / height) * 100 : 50, + }; +} + +/** The SVG viewBox covering a view, in metres. */ +export function viewBox(view: View): string { + return `${view.minX} ${view.minY} ${view.maxX - view.minX} ${view.maxY - view.minY}`; +} + +/** Every lane in one SVG path, in metres. */ +export function pathData(map: RoadMap): string { + const parts: string[] = []; + for (const feature of map.features) { + for (const line of feature.geometry.coordinates) { + if (line.length < 2) continue; + parts.push(line.map(([x, y], index) => `${index ? "L" : "M"}${x} ${y}`).join(" ")); + } + } + return parts.join(" "); +} + +/** + * A round scale-bar length and the fraction of the view's width it covers. + * + * Round means 1, 2, or 5 times a power of ten, the largest that still fits in a + * quarter of the view, so the bar stays readable at every zoom. + */ +export function scaleBar(view: View, fraction = 0.25): { metres: number; fraction: number } { + const width = view.maxX - view.minX; + const budget = width * fraction; + const magnitude = 10 ** Math.floor(Math.log10(budget)); + const metres = [5, 2, 1].map((step) => step * magnitude).find((length) => length <= budget) ?? magnitude; + return { metres, fraction: metres / width }; +} + +/** A truck's speed as the map labels it. */ +export function speedLabel(metresPerSecond: number): string { + return `${Math.round(metresPerSecond * 3.6)} km/h`; +} diff --git a/demo/carla/web/src/maps/README.md b/demo/carla/web/src/maps/README.md new file mode 100644 index 00000000000..09826ea7163 --- /dev/null +++ b/demo/carla/web/src/maps/README.md @@ -0,0 +1,54 @@ +# Baked road maps + +One `.json` per CARLA town, drawn under the truck markers on the map. +Bake against a running simulator and commit the result: + +```bash +cd demo/carla/sim +./python.sh -m moq_carla_sim.roadmap --out ../web/src/maps +``` + +The file is a GeoJSON `FeatureCollection` of lane centrelines, but its +coordinates are **CARLA world metres** (x east, y south), not WGS84 degrees: +the same axes the trucks publish on `status.pose`, so the player projects both +with one transform. See `demo/carla/sim/moq_carla_sim/roadmap.py` for why, and +`map.ts` for the projection. + +The player matches the file name against the town each truck reports. Nothing +here is required: without a match it fits the view around the trucks themselves +and says so. + +## Aerial imagery + +Town10HD\_Opt includes a calibrated WebP capture. Its manifest preserves the +capture metadata and image checksum alongside the player's `name`, `image`, +and `bbox` fields. The supplied image already has its horizontal flip applied; +image right is +x and image down is +y. Do not flip it again. + +On the machine running CARLA, open a truck camera in the player to activate +rendering, then run: + +```bash +cd demo/carla/sim +./python.sh -m moq_carla_sim.aerial +``` + +The capture reads the loaded town and its baked road bounds. It creates one +temporary RGB camera and removes it even when capture fails; it never ticks, +loads a map, moves trucks, or changes world/render settings. `--carla-host`, +`--carla-port`, `--timeout`, `--resolution`, `--padding`, `--ground-z`, and `--fov` +allow an explicit capture configuration. The frame wait defaults to 30 seconds. + +Copy both `.aerial.png` and `.aerial.json` into this directory. +The manifest's `image` is a relative basename and `bbox` is +`[minX, minY, maxX, maxY]` in world metres, with +x right and +y down. It also +records `name`, image `width`/`height`, `groundZ`, the camera transform and FOV, +and the simulator `frame`. The PNG and manifest are a pair: ship them together. +WebP is also supported using `.aerial.webp` and the matching manifest. +Run `just fix` afterwards so the manifests match the repository's formatting. + +This is a perspective screenshot calibrated on the `--ground-z` plane, not an +orthophoto. Default narrow FOV limits building lean, but elevated terrain still +shifts. Check the result visually against the baked roads and actual truck +positions before shipping. Rendering or world streaming can leave absent +scenery; a successfully written file does not establish visual alignment. diff --git a/demo/carla/web/src/maps/Town10HD_Opt.aerial.json b/demo/carla/web/src/maps/Town10HD_Opt.aerial.json new file mode 100644 index 00000000000..ace1e91f885 --- /dev/null +++ b/demo/carla/web/src/maps/Town10HD_Opt.aerial.json @@ -0,0 +1,54 @@ +{ + "version": 1, + "map": "Carla/Maps/Town10HD_Opt", + "image": "Town10HD_Opt.aerial.webp", + "image_sha256": "8bf3fad9861d24b47cf5916148d3a4e324e8b1c43a5c500fe534cea0690e278b", + "units": "metres", + "image_size": { + "width": 3840, + "height": 2160 + }, + "camera": { + "location": { + "x": -2.306732177734375, + "y": 36.241275787353516, + "z": 381.4052090099687 + }, + "rotation_degrees": { + "pitch": -90.0, + "yaw": 90.0, + "roll": 0.0 + }, + "horizontal_fov_degrees": 60.0 + }, + "projection": { + "type": "nadir_pinhole_ground_plane", + "ground_z": 0.0, + "world_bounds_at_image_edges": { + "min_x": -222.51113226996526, + "min_y": -87.62369926452635, + "max_x": 217.8976679144965, + "max_y": 160.10625083923338 + }, + "image_axes": { + "left_to_right": "carla_x_increasing", + "top_to_bottom": "carla_y_increasing" + }, + "normalized_mapping": { + "left": "(x - min_x) / (max_x - min_x)", + "top": "(y - min_y) / (max_y - min_y)" + } + }, + "capture": { + "road_bounds": { + "min_x": -114.59522247314453, + "min_y": -68.72904205322266, + "max_x": 109.98175811767578, + "max_y": 141.2115936279297 + }, + "padding_fraction": 0.18, + "horizontal_flip_applied": true + }, + "name": "Town10HD_Opt", + "bbox": [-222.51113226996526, -87.62369926452635, 217.8976679144965, 160.10625083923338] +} diff --git a/demo/carla/web/src/maps/Town10HD_Opt.aerial.webp b/demo/carla/web/src/maps/Town10HD_Opt.aerial.webp new file mode 100644 index 0000000000000000000000000000000000000000..48c4d0782fcf66ee84eedf745c93c400917dbbe3 GIT binary patch literal 1975394 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

|=@){Q0*Y+k!@#-VLZVSu1 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%0ATL+8 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%0Dy$rNG_1$R|g5yR)kEI&H$s*U9kxUlQP} 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

*2mxexL3lY231*=_Yvz}}L??nXy5 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

czY-a~%8#-0?On$jtfu|5SCd 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

Sj66czVrWFB`!wvM(~KlukI|`^j<#u)&SA6e0U# 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

T+>!##iV#IWk=CMxM7%eX5 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�U1maNrP)H)N_SN) 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�EKcg_Lj3GUi^a<6Cecs(T;Yks_iZavI; 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 z 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

9rasA?*O9n$)WAkem#J$4~u{W@5 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�-8V1;dutTdQtQ*c|kLbW}Yn6 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≶GSB#Y5a( z#kG_=dXvCzdi=(Y>8WfD2{RjU{oLMIOXwu}Zq(a|UXU<(=A(MnPr#G2uu(l{cN)Vu z*Km*-KYPe~23eTZgSe61GSotjrh0iv+FvBa z+#=a!SaTY%f*OcD^arZCHo4DjmX07O@)RC2e2FPbU`uTlal{@FImz0Rlw^2&aTnw4}neSYR&uF`R;2=0V}(1 z$2&g<8{>E6&@Ja7cRe7MnHdk~?4up5+t=;-Usla^P8gW-*I*1!ZVSMmoZ)cAtPM## zwbpL6m{_^#1d6>{Gc)XbI0ktTUN)io_hZSr*Q`swB>000HLIMaE+l!A!;@Q-3&l9} zy`Np(WY;Z8$LS!HpN&sul9JS>+E|G1;OqoFepOVK0K$R2R}$`kkWa%$qOt^il~-({ zt4HTUb8aA8KLrbX+y+ZL_#*uhA!j7+02Le@k;RRc{|i_Wr`H`32q|lt<$=iQ8Gt=w zq3MTDzYfxkgA*xfVsz$G2rZ{Hw0&9=8 zbJO_xrwtaVCqOS#3wAE6WOk@UzZm0r6|zqdVw=Ri zQXSrQM*<2)mYH>+cq6q&H3p~KK;o25y%g9eLy*hIo5fX=jJb2(WdKAyj#0uHvEZC{03w;?tlf!5T*hFqFL>^ zebm}~A$P?gIUH3zOb!kEVj-g_7F906)yToFX%P}Hln>bgL}0n&OAY_A!dAEr)9D5) zs|ban-s4G7ta|Nxa8u`}*A|VcUVW6kP(q121vFudMQ-WPNiyacv)y40#aDdRtfI$` zNx0;&mFRM^3TzFj8F$$`$-fj{vxo0N?zP!W3D@%$N~zE*)i8W&|{7Wh$8a{*E{PDiIV&LMj z%GUGG;ruk5R1)n*aw~cP!HyjfhR}hP|0RvkBH2@7-$(Y>q_*`)m1RO@Ll-G+^zz^C zF+d_%cT3)sAy1rnHRVONqlSn=+CusdJi{pG{r3d~Ewk9c_Z!^^kQ&0TyzF~J8kB`6 z%4o4N`sGxb7p$I`U$S$4gQVB-)0!s3OTSYh#4M;8x0IKWM%qaI^Q%=LNCPCwIw2tV?!}pR6?gIaNte zDN3VHp(qRG>n(D8MK2o4TuTItSOmRXxZ0 zTArzM3_1_yuC=Mf`Q5$8Z_JiNq7^?6(AfErUu0=lva1(kSwQp`l5s8HoY4s zQ@;D*-HKaPBuc{SyGi$p^4@fTExHXd>3oLRhZOPZX1DI18Wu*L&eHQV6d$KLW%c%n z7E2~}N>_TJVuw~fUL0ZV_46OJ^HFwyucqijJjMo2hcGXDB8t{BF=iJ8YdgMdMQvZr zYIzCHS`Bv1*wTh-*fH0)xqg%g*ky;GDZS#6@VB*MLan-ET5ntwE$;b z_80gn0i<1>qX)FVCn@}S%tcdin&CNMrc;+u&tagX^Oh_|&~#RQZgruIXSc5)ivpfa zCYIK4Wjw{^AwOI2gCOSQl9CkXTQ_q(TlXc3(-tC;Gm!aw#r*93R16Wa2ZNGaX)rXK z2N{>(5AfkT6R0QH5y;xIGwXEBTu1!O%>|eFQWi60R1L8w4v=KNwdJdng30edkmLSV z%vxbXo_!(B5^-vOyNA(@abZ_M$G@>Aq+5 zuFvSbgjCOzQ;w9VTh#)1gVZV@iVw3dVd6L&hJ2$r6wLxEwC~O$PD4=KIa=}9`EP$R zcevI_z;ANhRYA@7H%T$)OnP>2R$;eI9H|s0Q7cm0iZssgYp#d>I?#UPAmmvJY@^-^ z3&AlorK2CH5G-#t%c5oDT^H<+ivt>S;?TC(F5gp>3 z@q;@-3oEYF3Dp|V*Y_#!?-r}f{01JN@Sk(lQJ3zBB@YSr-ux+H5mfyasE-jWn&ZG% zYDIajrt(GF}08Gkxd6n$7)h@+j zE3X%0LcL3e?R~x|b2DMLkbWjlvjG8m4t`Y1V~A`;g#LHeuT0qGmKd%N zDNpVXFp$U#dB7+idNo0-G!2;z0-0p6kUu1iB>W& za$|>j>z(}bTuUrC*)F$06~i~3I9~$eIbrezNY=-5hy4Oi_8cvmDx0e~rGrG?8xf8u zH%w%_{3Z*qqWO0Y%>~t?6KFv5f#dgp#|#CD@Tdn&+Y{>K2;xZjvD6QWKgmkShMt%@ zjm{GJNhSV$^^OFeXRD^)&`3?oELflL=OSBz#SO%|$mjNDFw+NS%5q(>i-AYmXLpgP zF|w*L(smX)zlb(?)f>&xMDIBtl{W!dpJE|g(4Ypc8lt9DXWndeW~0`EedRZ0++CFO z*fL&vw_8}N)s&(VBn(n3=I0gSsoWL52SC}bR;n7v;%~9eUo?7nS?pA5^cnLN?rrsVaCryW z{XQP*NrMz3_SQ3PLS@r#SD{CD0;8rG?e!&VgY8NbF7R+= z24hs-flwwi1^RQM-1V!KL*H=ID`1>IX&|Fz&9XEd#k%4rXy@IR1-i`~ut&0fu8{y& zIw6BG-&aiIc6UB#XQjUlc!UAMFZ3lm{+;9#3mgi3Bv;Uw4{uAUa?;tK0WxvL>qk&` zUSM6~@v<59uf)512I{x;P7=qG8T#R~&C~?ZDDD`B`lfOk8$u>)P{id`?2 z?377tlWgiwt1N2`JBfPIlDjU}Yn>w9CJYNM#1B02_wq+)_3KA%fgl486r4%<`pH!i zpAfH&J$q+PSIdLSfG$OPPF07f#R~7%@hK;-`88E|ce>Ndhhz~@Ie0~uxiu_#<$9|7Xe4SX+#+1;Wp zB*k)jUeU^C8)hD?1J36~V9r)t^=goVKi85%ZJo7!cOUvSy&RC3$Lxeo8#Zpq4Z^#- zZxM5vfSYiRW0)lb)Ei40*m!5Ijd6c>}Whz+- znYp-8Oqo7H-ovSY&~E6N9aQe@G?oR>ZLtuHoY2{>vn ztJ>$1?-m~bfi5|<%e5Q?70Jf0Ryq0v=DzbrSGEzjXEb@`LE1wZWLWA_-UekCHLX z*xpj<9O=>9eIBW)mJSN6u}qB_9bDrTj9Rltzd`qvn8Lm&TXNm#v1+_<{ylAL5*?}m z-zGdlK%Vm%%O5_Puqu3euY0CdMRa|Qm)1X zz5KMc0AWjKjHchf6vBJzcT9i`i_<`u$NsFRhMV3>?Cx@uVD%@gVV4uv7jfhZF0hGqzLd5aXt7UJx zrkdACV;n!px&J9W*4mgR*_4-^dPAoi;#=$h2{`eLj|)*6qCX6CPI{^Nxqp*R5@%YJ z!-D@U;hO@e6r$x0t03e~g$%K3Ino|;MA&q}%$|xWHel?GCYPI1|Ho3Tf@i4;#a}v# z^u{w!otSqNLp>PUO~2T4meJyQo2v#K5%oqq5v(Bd8TK9&HS(_@GTOH4;h$W|f7(Bp znx&o}o&pE+pY0WFk!ID{bsXQfCR6b#Eg9C*w+Y~R&m{1gQ90NW{1?q30Fr!ofLw5D zyVV3`L{cSWguZO%orUwR=aqJFh#7NFyjLZ4E9-8JTO8FzB z65EE)Q7O%s5USAXVF&7n$(F&Rq!woAs?S_CJA|tk>iMC%QVO7p+&EXergu3kg`oIS z0Mw7|4C1_-)pGURUvU43LTPnx>OLOD9xw!Y1>Qn35F~Uz*BpUL8MDuf zD}2oO`vHiS8IXYss|h{_T^YRL|Ofy(7>i18zk8# z&-t!c2fXGigy|JXUh>NdP{R}0lM&+2oh-VP%S~yl@_{9Dg-qo_P20g#5#w+qbphi4 zECiz&FhPTE(@b@J?jL^w8#lTBDyVK^I8pfGe|em4Q;%K=&nyFPJJ=HwVWS z1br9E7#dq7pCp6Vs-hpZkf!C~NWklM0^a7mj;OQYQ#p|bAd~4)1l1KUw|YN60xwcx z^zkb$puZbB8j{nbDe9Re7H3ReKso2G;mLhP0me_RII9+;9@Z44rltzTIr~s$QXuWH zP9Z&d&q?KKsMkwU54UN^89AwO_`pA^Y`c&v$C;HQ#+DAf2Ev(k zA2v&(&cZYEG=)A}QJmG6Qg4*RRD+C--&U)?fmiACl3vj6KJs_+P1tD5HtxRT{9Myt ziFujGt&)5|hCz6c(82hYdZrS44#>9ey7Zu7pNtPc8wcdKd}BX3+3ZbHryx2E%|F#+ zqA23Wbb{>$_>2{MY9aooR<2Yz@esw;&tQ{jfOO0Y>>(H_GI&c6 zeJI>yP5hs3_MR8cfssl}4_g?X?{o%TTCfg&kGz**$h2H^TJMgBtA8y$)Q=6TbU^|P z?adCx!y@>6pWo;zGN*6}4vuSCUd0ZD$xj_=wd|*}(8d%I6$@%*_XK;57d0wDqM-ZL z_xBp?<-pFAXR$)_{##FPeahQS;%H;}=|8@TAxU{Qj`yh1ZQS_X2V-=Cz(3pM3OJ5% zbctM()ztw^pg&0HACMO7TCNv@ksq0eY=QbihCNt5^wxR}Rf#h%DYtt7U$16A>kdB* zBR8BFViPx_ReUZ32zW=34v})qtPM1#>jY6csBH#21l97*%s$Z@PR5Amy3329u)ct{ zY zbIS`6fwDR^9TIDtccYAqg^gxsrXBip8(Eusd!QgV*Qm%%GnAli?&}y^yJX+KFcG% zWK^;J>=$UOfXZKUl*T>RtfhJ-$x(n5>QF)5fO*y0K$zQOw82E;ZSP(hfJoCz=G|J- zAMg4{-E{c|xs42Gz$fKAbXE$6JNsQzA}|SZXyVzhPGLuzp#W2TNTDrhQ6nle7kMvG zRMu84nThG@27o7#?Z;~UNN4Q@kzj1`ClSb;bBC0`Nl)kj#Mt4|sU|^)1(O?}vrYy< zNH~Zv?ZqQ!<+zAqXrLQn*dDF8Y+&p&A2S{clHdL?AI)FNxV7J1d_<6>iNhF!_A>3- zmY?*Gvxp!)pvQ(R!DTSvOvX!02%=9+9!*g~;I&H1BBFpnmeSdLqC{L7duJVSU?Qz- z?4>WXf+#@UD4Yo>mKvXn6RYhH~E3mro?C0hD+8i K2>vm26GW<@mC{b1A*&uH%yAPC*APyXgBE}5L08?_aTFzNradJz6w={EL= zY=t~G<6-7jI%V}M7`=*9Ms1O;`$bz?#eYF&#ye!KD)UmC)B22v?dczOuiY&Eb18lE zoDV8-53)~%@lmAJr)Hg6qpR;zJY{ZjQ(=pWW!}&6)!a2B=OJ)V1TpX(FkA2m2>C|v z8pC_)`+oL)8f|HdWO^%xND!x()dYyMqT+Lx&5HMO9%vlPKhMC`00zkY*7idD=Ar$0 zFg!24B0O#n8n8lXX1a-mIv=8XXswK&J)KTY5xwoJ_#FObgE=L}AoLk$mR>1r$B1Dy zZ%VjQUdvq{RD@EBM(E-4zujD|hBLnB%dG!X6xeUf(vH?b+R3)aQwD@6gc@RZ0%3YK zvs5VBaE{xAx5LRCI0&l^ITl}QoMFq0z*bXotaqfWl8rb$vp8*z;1&RYXVdIL5tXx= zj-C9@W^7ig_;V|J=$j8*m6fR~TZ_mHJ@6mR%f)g8e_nihgkDAL+0bT%$=UqF*DB)J zeAJttMTjb8=~qiC=b;%T(}~GP+(f(qutt+0GDxy*^YUD`7j4f zzFV+)pU&y3h6Q1~XslO+9|Kzs5ndQt3G@sQd|OBO_?iau7@iw!A=A~+`;iGl_oxG+ z-X^tJkuSDfU7kN5>PVY>ObTXu*Bm&SUOZQ$reJzI{F}Q%e)co#zd4p=LZKv_c64*j zx$&E|nE9_lS$wEjjPb4yH8pUhKdLcH?h|yKTw;T7XKboE+yfj<#l2qY*H%RZh(wT4 z8m`0|?&Jb|`J0>1F#Yu4&#jQ}Nx4U{1lIPE>ZWT!t?F52&P;n#YWc;P9Fz5}#mx0%1K-Hk18$UD$f(*P4)zD zLHqm@-%XRpxqrzQl}0a~_W)SSY5(5M4}+#Uvq6KQLy#4~1Ikz+fdt6PIM}j80xo6| z2K0K$#q}cLk_m}9gBq0J_+{6x<5v4$%1{3ciMOkqYZrOjmmTPAih9(}RqN(Es$U@q zX)MgVtOb_e@LIYX6$*X(38Q4FeI^U`RABCX8_VkPr1I86up5}vKH4t|pcXX(jmJ$=0$8ZTPR z#jeYlTfW=-RoyTI)}P8tQQhKs^1!TaRFO`t$=N}$2VJvR6Y6xDO$H8@NG0L%3U;Je7 zszZuIxrQfvnan!CjReq~Mv~m=-#4R%M{OyTV4|(o9f@73d1A#}UY`IL#;FZZ z<#$t~eoG))c`&>_be3propYoVX^4I>M`qNTldbG(sRbHu)lL=@PW|A29(B=Q|1v18 z%9~3akC0~Z(H!1`LH;w@N)G~hj(;y!*!-HYQ|-_h5i`=I?5b6!uzYzXC#7XW&M^lc zz#$2zH^y&=PJsiS$o(U4Nv0X~$fFjA+ic#m%wN5#ghV6u_NVSgjUIPV5%4xG--g`v znlCE#1hEZJAm8zC*$2CEwl^4&r36c83|L)Zp|+gTaSt{_Nr#lw76twhqbM|<-4#9= zEkOTsICR6!kSb_JbI;DpyxtU_wL{v5L2SHztRZT2{y118HD@r$I4^FZ=b0aTgMx8n zMK;vqWLs-RZFCiLT64?f96v#hmr}wLW z*G8-QI@&nr0r)I*Z8vsTE2CUf==Lf=aJ0?py0*NBUuYnhvfuCXf-HCWprh}lpD~%z zakmC5BT4%EH1IIK#5FY0R+*}dH2!QHydE~bF4s7mIa^#iw2-Z5A2k}4-HA2IVzVp8 zzC&6aw8F{2*2)b%?nfs=<@=64AAY;GG3|=t1Pre(_u=%!(#&OUOG7zi6j;{&1E9^d z*@M^;G}ryBX!XK#0~EdQeD9vY`nO%Q=y4SV>)A zf4|mW)$}Xmc=qd|80;p1T-_(|j{s@Q+4nnMBkJAaQ`}5dw-+TTPj53wS9;h1E_}7v z>E%28tbI@jM_90TBB9fVg_Zp10=a+XIhOm|=QGbPt3+|A^Zl%9m-K`VNa$#mAf*mk z=RSXm*TkWR*%`c3w>h|DgRhEQ0cIfwG?d*)M@{byNa-|;JpxLQ?wAd51*teB>Ngzopg zD8(EdoopWUz8cr?bnYbx68}qtHo+1L(v&|@U{<}#BQ)Q2(Ku`z4m(9F(L8g8aL8uC zo}wN+=Z>8(SB%pkh?zAYIk`m(F|b>-D&4Nal`?*!EBE#uWcjI0=CUPAOcgT~3An_6;;BQp4iHs!V`-;Xb4g@0-5~xB_9V-PjB; zIKw1+%|%&jK$+ol3_0GCEII3$S(1y|a@OGjQHJmVTA%T94Ku6g##}*S;AEHlikV0q z*Q0!?BSk_3Lv86&sDo_ubO}R$t1wMR2p|as7qA!8B=GgN+a>NJ_8&XFE_5GbFS>md zeHGVB4cca;yZF=pE#zwFwIcudob4{+L$5)uA@R`5Bx%Ns1)NZJ- zU5&0GJzqv9jXG<@TQ6jUJ@+OziUUtiKXs``F*4^8;Ui^% z%*_!9#^1HvSgxmd^4e0exkR0@P7Tt&#Fc%vMn^ig`cV{SX4+J43EI6ma}kbK_zdsQ z`hiwxcXamy`Uw%i@jEmWY0pr@dEc2|Gr{$NJQAi75Yg;Er${%{F!y{CwuiH5yn6w1 zcQ^Mi-9a!%wFD*As5a|MwI-Xd(uH`*IqqWE1aIaR;Rm zj^))for4Q2+p0h0SQ!klfFLRYwK$+V#TKFH3Te6fL!)2Hz1s0z@hCsucg4hlciEXu z-VUAl2( zB*g8p8>fWp&G}8_I(NCQ#-^DFJ}8*ZL;rnuS^;O8p_Li4hb@2n7&r4=YkQX+0NsJ&d@Q%f&T#hP+Q+5$zmg@D(Tb9rirHe1Q4cw1l3pLxce+!a5kR&AM21Mh z(VD~~_uEiR<_A@Q`eY2etq2)x?=A#*y(mr2-Z^5d=mxqjuVxBY2x`J0WtD{^v~Hvo zLv$bfYl)BEk~eUZLe0*h44wp3a#tFRzvHOyElzJr*%QS>DKgb6#d& z@oX6Cw@6^5IwwTnOPKlnr^(xI7xftupn;gqH0CWXsUFp`)-SS8P}nfGtl*k^ZpueL z`ieNQ)TV6SyqU>FTPv4HC;~@Uh*+?vKAG-w|L0eZXWh7hx6fxSn@CILD@Y|MLMt~< zkXgB6FPH~u$8G16m|IWF1Ut4l$+o}hDz9DFA(`0y$v{aCE~=`1Z4871B#fX*ML~Mz z$*(EDYZYz#+BbD1fBb)D_F~vY9(IW5NCF#btdE}OpjfebfstFH!9GOB2jCe6Vj`0V zJwgP~QI^-g+gzTdaKYtZOn}BK(bGV)iGcz?@~f@W9&jAFWj0SW^M;gqU*RD)2gR5f z@iiP)?R~AOxz}CRSJYwrh#6ADw4hp{*hd6Em|_n4ltD?#yJ7V*8@3Yr|ECRnN^#f% zr^8O9mJo9Nwd3(WbbFO1NDu<9Fz4d2Z@ot0^fYG09l~l;YY0gdP*msVpGSLFP|oJM zZn#D*HH*s>Y5uVr>H-czv2Hl{E&HThCycw4V<;_z2Nw*TD!1l1$77`I?$wDrR+vNH z@&}k0nI5bOEN}?!MX;6Z!Js-1aY1~+)mBP5=5zu){Jq+;H2fb5@awKCj9a}6_c#H> z7Th4A+(JT^?oH4c81G^B@5}4VY5CikB4TMiUKS;e!fL1D|4a7ja1E(zn0r8x`^gZ2 z(Gnq3y7aH|k-r_qFdw^ty;`H`ZM(?S#cgBwZqq05 zCph=1o--+xqT|KHwYHWfg@p0hhGa}mZMgM#)p8%Lyjnu0jq%RKA#sdoH*>l=*D`JK zDM8J8MoF%Zw|JUSk<9$McWgnq(ZJmioMFLS?VTRs{#axf8fNnwDxZE_pOuCbap7R2 z3bNi&L>iKzP9HWW!LX@fczY%+iZE3(nZIO|RSMwmr*`0<@`Zin)QVZ;I<(u@MKs}# zYDPYPn$sbsQAro{OSP&>qU4?(d;`Au{7C zr(0wC=t}fq^x=d-qX57yPCG91ks1h#=Z) zQthWkHm_*@sHFh@;MfpH-v?g`eB&CoP#%DX2-7lM(yS3|J#aiAj`qFUzj|AZ1+e`t z&5|T8<#tXcpb4VM24GxdOMBFnR)9T@22?Av6g#iI6Q>G?>{G)yjh#)`6 zJ8?0~L+6pd2n6a#$pT2Wep;1fSNy{;waxyQ3ivK>st5S}Szp8Ut9Br0*p8xZ_Uo0E z!SQ>%U_PHq2W8piNEs_hJN`Ew1$gf`be4GL*pI3Xln^irZ?#aRJm{>$*X|?|NS>4d zH=X7>lgfrCmb#W!mv$%{KdCH+lZmj0)9kbsT=VQ{o5FH>Bx&47RBrA=oUt_orV$Q!iA;V*InFh|J$rmA>Zp3Tusz?w2Yd=hZhP#5NKD6?#C#a=AsU~ZfCN$K^6$RA!$@X}D+3x)S z!Gv$isiK-{IyvV zK!*Rtt1tZlr@)1reTP8<9;^t#7i|hvT!@s&@IAa1A6>#ppQoE{AAq^ zMG5GOE&fla*UIPpN1?-y47d^bD>4SAe9C|zu=A+(1akW z{%Ktt9J=xS_(2&_Slj`i*Hx^?v0`K;R1r?n+?$`Z(I74~7!lGxgw9|9plFo|!oTBK zDs3owJV75nGj~-am=vRt@6(7$(xV^UsEOz<&wY)mkKiV{AvVxND6RSQr4&J)EfO@$ zu2f`fIV&92c$@fYQ~~l#N^s`6$9RK3fv&t_tAra}^w%$!^7kZiK!6*m6CT*J8 za7G#*WJD1bo-W=vxcJpW#W>UDWQZaSdzDym5gBzDM|tz?Dhyin0L=sYPp+l1_5`B^ zJr~li^8y?eNs{wEBzJ9+ls z4lF?-?#>U~Qi>KHF2$@wY4Ux*=&Mems@v~Al8SH#tNzavOMrQnAJLIh%$KlvA3|qw z^4MM9aywtK=z7BJ{1ofI#qUyTD zV`LPp*8VB``T9QTdZrWk9HIi6+ERuVxF4H`M3lPPA&EK+uNR4=YLB_E%-GcvHWww% zpwvZvxhbVMxZ`aGzCx<*proLxY|goafFb ziCo(1V-UIySkxJaU8Bx;k%Hu&JYVmFTEUJ-910nY7z& z+v%O>h?@>#biUwV;+#D4F`aof;9+Hu|DlFb2VW@H966 z1Ovjh;NBNQwXeB_O|Y^xi3R&f5@8=esyFd0TFMcgs^m{|;we)64IIn(zstcsF*b#D z<484vn^sQ$ydtfymUY@;H1I`D1_K`Z0t3;zabK^)rBqdcT$Zt;)7Rv#$uvd9@xKl} zI>b%DlLvBG`*-2t1(O=T@E=S&qSJze$X}#4*`c3%moQEfR|Ujp93Ys>K$DV^bQxs; zm6Oc9vSWdZ*vrfmLdx7x;c-h_`Pw&#q-t$jvj6W-1Q}is*|}B%eeyiiGu}rGQK(g? zSU33GvyC>!tb2g8Uq38%->I8yguX6PY>O8BC7bB(CPklLJk$w_8ZBa7Zt@|C|JooM zhvQX!GT)-nA{&~=0 zIMg;p`Xp0JaP8IM#3>Tj$XQ5-9Q+#4(%L%!z;_5plimsEoNDDrqICU7v%T(EO>*`I zz<@#4QBiWb0qF876ggd!{Qa3?z$dY>;#71|^nOKQKk~j_hcl4Sbhik?hkC+6&R)?R zS2qu`BqCg4dA3iz1ei^U`ytxeZe3w1)uz(KyEt*Vu(SIu#3*Sc)wCfBUVOokC%Bf> zizAZXRJ>u13pml$HXlDWqdz23gx;oGe5tlxi_%YbUupA9R_@+m2D;wfJIx3PLAFU3 zh;j~+PMsvx#;n*T^%H>7Se7lsUVv|yd0YM+-=5|{J40h|PqwfdRo-g~MUS1t+6dc6n zph9O@CIgZ$WPsb8NO_c^elG2jPREvoL?w^Hj5F-fWeq zF72BoPh0>ir$4cumj=P!;nR}!#kSZ$U@!0S%jCPu=|1bo8?&&f6*viPgq&=?xM%*w z`A?F3l5X~CIEHvZ#5NR?pcL49RNkdm`)vPpAcCwb_v;>Rsf}w0B--#QJCDhiFE?IW=R(XJcbQ>Bo%Trtn<@n+rTG9BycWDi5f;!JJJE8ZWK* z9|+OBN030W`70rSK?5iMvo#5G0xF^1=Y|Mq3?9iXRf%qyCh$c=}d zw2{08rW(l`Ga)3ITfDnpKVr;pVf!r|1smL|8rDPnE@6Y#x5Q(AH3&cc!H#|)a_`tO z&NGbZA7Qy9lCLM$f(B)x0#01Hnj}rTzq-Jk7&}3%Rh+&v=lO)<^6gD-e(#f7+ncCd zbv-+l2#KMs@Xp(?ksLL&VNi^jO}nNW3}<7R%?EnKnbDgeN>w%UlrUFj^v^ov1w}37 zhm&=$?#0<4R-Scx&(S{ zbM{~kvKu{y&_i8t`yq07)(Xu)-4Kqd5ezX>$GL;mn1F-^+UVflCkHv*8RCS{P2{OD zvknY^ht&8l*h|WwpZnUhBMY9)obftsHsBwv8V9%S)q6RtPnCN*w&~OXZ_S)}XG2rK zI*8*#rpMt0U?%FbphD96CZc9 z8Xtd{+tmX%i_KOuXpryj-!?OtXxuKfosIBI{%LFPDK2=T-pBH@`pDpizAXqH*bB7h z$@YkLLPz#+47GF^zNLIsaZGbheE?i+2k@^c$RR=S%SGyO#}#x^WY^@%^U70$Q>e5O zt*Kt4T=g)U*R>6T?|$uO=T~dIy1y`!FUn4) zycR4lB|_XCt~y)LgDmuaXj||20y|ZImGp)DMDuh=9ea=I_=U_)(tvsM5URTvZwY3w z{O$VMZEDQzl3GE&9+^lI{zNy<)XHLz^E>sff*#Jpx!TbZC+I)tB0$=6VuXagJjQ#H z+%KZJg5rPem=3!nX0-_Nf}NX7`Oaq#@tpA@lF75yo%_f%|wN=X)g6S?tdfprMON2}P7Jifbm{5G>uBXwsHwNm4l}UlcK5 z_w7~%U=XXJoHX%idOO}-KHN%v(u~(Iy?(Xo0J}2sB^DH*wTlcVXHh#<-?6A!o5|D5qls zc3F(OGS#;jCjc8nz@$cgYX&?`TMBl^e~5Z%{2?~}L+ zq;bq>1nzqZQ_6IluaB#(o_G0!m;86Lf6Nn<*7GB01+upsi>9EmXz>d0w<>D}T z)!_jd=>c*pJwrDW_gO3@HkAxN{ zq0(}ZxU>&Va(-#)G&o>s!U)pJ8mEgrxxvbOfsd$8E=p{FY%7}s`7Z9n3`w|S@SCO@E~fkDP8AObd$?XeZfpbc%CU1MUjHD*1h*d|dF4>1$; z1Upw;+bfa_fD(O4@z_KNEeMcOPSP4ibHLJFg}T-tWB?ujJDi}Jlll2CJfgHDgXtn-JY?Ttf}6FI-I zHLvT^X_n?90dP(q<(?_H%kRnk9rsPa0<&x)X0%x@8Wp?xjsa>1nQ>8+Pd3AicDn#8 zJ%`jF)Z@u+_UWtB+hk}2dMtkG1_{xl+bmm$C32SP`>9M3vUxSTQBI|IjDFM)rd5U> z{^vMLkA?aydg7_1VVVFJ{R}8OD`Y@>j;Y)RbZlvwx1H90g^h)OP78(%9rUgEu&^J;2(B|41%{>2JxRg=06$;X1A#6>C-Qg{!N{O;EgTc6M zP8d|C|HPQG^=3rScHQ7Xxk+juimretdVq1d?Mlx}fKj|ApQ&Yrv6mQ!PsRQK4{d*2 zLaQ~PG81ObD)j_+X%9C#8v^w>k^dcTdO63Nx5tcE<_EvCRp0`!48>?9tGzz)zMjj! zNrwT+HY>RocW-f%U=3ScoIK|j-MCKf**&!3BzlI?vdVjPs0yruX23NqTidI5YsC1U zPj-Q)(;tvk$n+t5h|dZg2Lm84V2yzOH{9WGF|_N|aSCP<{fkaQ$(qr6%owe&-RG88 zM&vzAh6)(Lw(1ie9c1Ct0_$=rM_*t9j)p@JFBVYk#PBOA&IZK@^v8{!QZPmLFbNj_ zW;#1#8qI%z!}71eR4N-`#)(%Ds;9`oPGK?@cZ-L4;ws=esRwJ;_2nYmWw7b!PbNg@ z`lf)GF3okiq?g?{9zkO!n#lN=F$u&a(Mjl|_3`>95$Vs^yYLQ6zE3nlB0F~!PCOd# z@W>X;>D_5f%7fJZ^XD^56z0PqdMIQ-X8#6Q_M(j_!hcc z7?M2f;xwYZr4|F(Tec_%-s#@*h86saCyu_Ped}6!B^qM1Um#Z@8^vv!J`5XEp>~zj zY4X~KJDXP0E?CUW!wR&lxiQ!?#rOt!Qk{Hl%W@j$yRD)=v@*0%YtsfU93Glt4gzva z1yT~TA6YilFlX~TqaKzY-<+53+=uHuKR24$ z&pH+uueI}7<#eE~YuM-M8KKrj?1@4@btA82={GCIDZjJ#`0LYJ((%TD!Us;mxc}pg zru<0Cv8h3!v#Joi=kA060A)Mo4$lI5-*i(bKt)Y4o!d)H2>E3lypf18pir+xh4)Q1 z*T@1C5#sK)(9rIvi?bMph`;uq;UEVCD3bj`(7D%q&Nnf6sbV&g$8nywZLh++P|`X5 z6G{?j)Nh*?F?t#~_NhRQn;OWj5pbd0&-GrpNre|} z>E0$IXkW@b2@7`|Qpw7!1fyRPPzFf1rmv#Rx4AShzvsDqHbkjCUwWhyZiMc_{(kWtXA z7a*UqD;ZL6d2Kc)dgXJ9v<8^^C0>B9jk*#=y!NEQ!suT6AKXTmAr0@fK^DDi|5V}H z*DnPt4tZ~&wtSn1i0E+I;MKyDz!Zsf?rR}O+9M)|i9%wDh1d%rb+FdzMOwDJ#W643BW>)5 zyJ|G&DVnRC}d=;9d`B0sBn$FLT~9?l}Svcb4@8ubXI3j?jK3A#4|MLx-Bq5%fq1QBL?B>XH($4?islzX%i02Em~HC^*% zezGOOFO?=6jJ35iCemKWQRy5~H{YEeiw(j9wUm8>40W8ANNH@m+m0;vDFeIgD|stg zZz9ziyG~G%ku@7}-P_q9s*NItb;U)U>5+^7!(&EYwipl4fv=)f($l=*Z_4d>eT9KY z)q>K~tq*W!SQ{Gbejm|`Po<2OQiKUE8{G?rN?^4SQ=WP6ho$N%@gY%BnZj~|t_bn- z@aQ(#8NBK<6=fzVqiDAU$djq^%VZ{uS#T29^w|mbf#S-1q_J`&uXj7cUu*)|J%gAs zJX>>pzqCf*pu5M5BW_*VvXBQ?y|48Me)den9HrBnS+R_ccPF;C?N9;$Vb?alXJ+#w z76`^V-~QG@X;m}4{?{M4%)t?qk`}R{Dv|?p;5n4Qc!yv03K`?2<=ZhKVd`+QCpcvx zow|ALN{q&7_0J7TEO=pd>14QQUtHGjSeY`VOpV-~?dsZZ7xo~goE10jG-BApx>#lM zTUtC6mJFB+9pY~>)i5R?aj7camQJb%XW9kMX1#7IUoYZS>MA-fIZYi&5}3RLuOxaL)jMdlGN1ccUlTS`sn~ZpqQ7 zX9T&#S#d&@1&?afxKG0-BGu$=aZO)0#%g%eL&+6wxoj|!STrL$QI(fpg`5PeD@GjO zMP)IL4f25%lEh3gDM9-{hO?4jNgaY#v-`dAxB5H7LyYykC?TAwLF*JdTYR{eDkWbN z;M}%TJ%S~hR)v-zKOP>f&0_G5LR;WV>vX4RpFnS0#XNtF-Kf{@R3+s-UG9OXID17s zX299<^rTg^FsEIT0!)ky9hRg0M~06Wakr$kJhP^p}s) z)I1&-|B0y7l#1Ala5H2{;9hD+u$P zLV)Hd;OL<%SLxcr6Z?{M4ZeGq+*OiwDuc2;0e`HkXeHZWQ>^0;eQQt-1*IbxmkpC7 zRE|_Kf0bq)tDb-;oE#@*gSdJ4XILx|h1wfc*@tL&`CTi%my5-k`0$ zWW6eADijmxU-LwF%wiq{OI~=eM)w`1^3b;2tpaS$6C$xV2?Pgl8Aj|6Byv7&43N=9 z@?oO1p?~{y5jI zQo@;glw@^FNs*phH1>B?_`7x6-UI~skd8G48eyl+9X3U__cK1tsdCvobN$;$Fa+`D zuKukkPAlW>kOAK(!mGU2K;26eL9NIwZSF?^Z$r#hh%A&Pia<0o2o8B_gJ#Hv(Dv2s zH4#T<4YV6`V4bZkCOo!+BGR+3Y`zs0k-5>U+A7X=KUUrjg{KEdp)6Hr&CN4G-Dz(mG`ldH1f&MY`cYxzXd< zb{xg970D;j*i-UK7VNx&3{WXqnk5>ZF{9S|Z+ip|irOBj_HH;Ja)*YQLGH*Qik$83 zN9Q~U?^g(iv;R4Qe>+ce$W$F|qKdA{cd6#-p@3-|8sBdgjTyf~5Y~4mumUitcSEq^4xSQMkrsLx#YL6eG(8%3yA3 zOKrSOhNKLBxNy?IFew~GXEQXM*>sN>Qa>RhA4F%oo)>6D_xF{A6x+A>@G4rl;jf)U zXPrmE>hfE$LgJjk9Czoo@dht>@B_eBEZ?Xq^j+)1oin9t-0H8P8RX3N*?11(Y6N0c zMsIEnQqoVwJ<{(nT;mfmx*Srxy>C8~8&4jA_SL6|{s}?y)If4N90%?p;BhxYg|O88 zKDh99T+PSb7k9Ua+Y3e;^#X>-XA7vR%~s&e*sKzp*pAkv(2~;MdNnEnj@H^fyGF=& zs4)B!kxMbYSF9GxE$2W`%|yu+++B4i6(uv!rKhCyxq{VO@o}p}uTFh-XLrEJvVixK zLONIw)R=?W8(*fLByKS(kZz|dBC~0ts)IoxSc67J(Vm z)z;pHrIbFUA80k1|7JN}Qsl}ee}&!3M!mBsj8w0_b1vVR-xu7QN&D@S26THC-;JV3 zNa?m6lg*giJU>*_7}8mQeQrLw*;fG6VVD2A74zaw3o%uYC7JK^^hZIuAXh^85OgyG z3i8gZN4spNuUp>|5<=KZQ>ZM!9#7+jQHZkA`0PKtau<|eYibIt9F265l_MRm6>Ib~ z>F){MYKy~>ayIVI2jI(If=`K(d;S0lurWHsf^X22cL8{qf-JUCU>F?v+J@&Rox!!5 zKo~Ojo{zIr0d%Ov&s|z+blnm(xUk>1CggQ77${(l>*Fu_Fp1ILH;@i{UWZ4G;T-Mb zNDFEFk9R%>@Tk86d6bNHt?Wy1?_GJJ{arOjtg8%nF&%bd$8NE*NA#)45WDAs$deO~ zU#vp}RL35(U^XutNsBOI%B2vex<4fQo;0y!e2E3jc$V|ynp_hVLW*FYi`tOZ6itHgMG{r33Q-S`m81PB{j$5>O@cLXk8|K=DE^>f-*K)6AuCeT%$$U;02=&ku^Z?qE^0!=9U?o*^s#{jI}=G8SB>9*FKTu<7l`0Ks6dp(j{5$6er#N(qU^jE0NlewxKxTgcGfPzTdx7oX zYt}y{%$Ph42gUA?>a$lR>}w0Q?mAi|h*G7CXmCjeS_tCbp?#MR!U`@rxs*I`a9PBn zd@>qfSapVn8E@DpiE#ABo5x^;)bt>9^P@y9O?#|WHUMsZfo^&qH$Q3TGeMm)PpS(# zySus}+l^fzJ?>LYpcBS-3ogi;5E93F)a%~Fv@24)<1G+)3^n)X!6?=iZF`{yMvpxvTu(#w9UD(edAs5Q-RK?GMPL+&$LUu9JFvQp<45HTMu0Xw9L&3+xxKcIuJsSPSx zeeDEgaz!cql1jK+jIJCdo$*KO8s01-!_8K2WuvQ~BO@^tvgjk>+qscc0Il|ULX?>P z?f^nF9k;*Gng3%rkq)!jGgUqN@qG5Bjx#RvaVoMO7U1@cU%YoCdx6?+Lw{y+FJ=l$mW+z1I&!}+sXK!!S7S+aY#*L+NgiNEWsL`>GzU^!upNLlX)tD& zECN^%k3oBWJyg55wbVJE|AHLgKgP%GR~UhSM|QaF+{W z!RT=!&ak|xc5HP+4G2`w&h;w`2iouNtjA0ARi=e-Sjp0ez8iua&*_D5!oT$jxY<Or4NPtCL&s@x& zLp9d_;X*tGvyHxjThQtst9&K%br;vq;D-H|3#qIzz_?r+Cs$D6evy7-2 zV6*EE8FeRkS-3Jr-%K^@4f~pK`P9zD>)Yj$nz1brNF=^^Fdv%A4UF;5X5O z`gDF zh)yxr2Ktd#h)8dVqhMeZEh|(+z|fE#dWUV6DgaL^scnHz^6zetoRh%%^d>o~bg&$| z;^S_+9&)-FWJ^ZKNp6kY2=tp(J0}v0v0UTh z-rk>ty%jkk@F3U+C8$Z>Z+K%w$#oAidTvcUfKT23PZeb%!B)AeIrF*n>uiI!dD11M zq|Q zWv8Qbxp`&HI9)g9kVk)n&hIR7&o2LK=>8;IHX*wcAtikZtwHxW;^HP1x_jSCAE4$Q zzg_pn6y29BG>3K!fIMZSGK=nk?@tokwmRiewPTDoGATg)CO~F0C807w>Uhu6n30Gt zZzk}~(=PPoO`PKnt{H$Y9C^jz4JQ6F{ex&Rk&U5bIK!q@B*d_Quc2hgdT%mO-Hzi`MGLzw z!<{yk0W5qYJpWLpalHF*Tsp_szYY{vgRi`>J*HOdRmiw&W)~X>bpvL2BAcG?d!+2t z>)?uTVaT!7abiZcGeu|cuPn+Ywdj|HW#0uffj#W9LitYXeUPB4 zJBsZM2&SKO4QGI@n&vpa7$ejFg9W6t_pRJgye!4wROZ5z=%Q;SOqq>@_4*j;T>A`{ z&l19|Qm_npN)SP=+sK~~2ZG~qRvc7E;}YCB21d-5xv#?bsk<>*CxX_2jl>-7!bA@+ zHHe;Qo~ubjZM))#ZCAtUTT)*_)VKqcTre*Qt~CP$U_Py%IhzYoqu!k7n3S4@(>kCe zr@smV$STzkHc8#q8XjVe>^UwXEoXY1UVYL`#5x^N$b1!;;yDaka5 z?o1scN&d`?fpo4DB%AxZfI>-ZVO7w!7)Dxr=1MX}80(B6^-k7IiZQ9TT|h=_EACeX zO|bT)-F3h{-jbnA3g}!-8Snzmm-zjb)0>_?Wpfu(GIeITypX<~Z{DUGH99B`H>v=6 z?GDCzle{z$_FVT*e^BwTSqDt7OvXEt_>4{V-?RfLx{cY@81%OY+lrX5AOubP7@mvk zSPMU_Csh5!aMQK{lx-t$g<0w@?!4sE3p-TETD`0kmerZx>Ap6;y0!}qkLFL;YPA*G zaP9K!I?;jt7bjO#*eT*)R&0U=q9L#~ywlFta|ZSv;T>&XZH=^Rrmqo6(JBxpP`i_N z#v>rSi+f6#(j6T(<-I#H-v_QXmUD6DOm`T-#~rW1-EPA%aJ{Os&gwZUFFXO58*0^n z9yrLfsP7@opwOvkTCtBdT|h6ArOd;Is3AQ!$^YX{kJlT4Ar@vdxmB0+-+IK>r0dLW z56sJk%5do=YCrC8z|v}xuqrI;SZzn9BPi$VODH5emmdPOHi2eCNEu#5Jgb)ATI^`{ zoUwGVc#qr?s)l9uu-9+Ny(TV_3If7TDUyxA_+R zLg;F*@@~=8gTy*L4}ru#qnMuZ12}MTvioT51V@37Ni_sVF>4%OOoDVk&ajgAipDgn z+?oN6PLU^+=UHvR;dYC~wNPNy*659IGf_ATtyGtD2zgR~MQ4Uh(+6te^VuBYy*sMIw82-e2MTuaTiNNIwjrT+uG)xi%FVH;$34a?VKr@Rk%q=zPVq z1lpp%n3r{UP;D{wiNQhr7ddf|r+I4eb_%&0X9z4I9?7r`|BW6~Nx3AEO%2g>uMXA# zw3JQ+HW;#-fnJM(e>P#ZU}flZ`cK2hY50cyNs(Ea6w|Bu!U$sFlO_h@LT{$13aBI4 zeS{w&qJKc#D`bSwZ*9xH=vSlgYyf+$jsOD*K|yu*WZn;!dJiGYKofG)&TSqGL`zD! zhQP{m+`{IbNAF7xX3!C2RYh_XkD)L(AbJtQn%N?{gmREu&!#T$VS1Rz6tWs_@ZHw2 zY92vASJDDqk`Fd((d#bXTz}w2pMTa67tCkFm=NT=!&$wu3B*?~mf&}>!C{YBx_7h3 z{ZOFOW&a3`?XYjA%ZZWgDoCN?KAppN$XGBAwft^Oc=pb)sEZ)^Ul`FZ>8roqcEIiV zR3EeCdmrM&sNuI{Lm#n^mBooy?}nhbYd*$PjH6w*+@LUU#U;si2YXSZ?c=$VYtOix zzN}iYXc!C9rS{-GsKNfyq|d-UQbKW}{rQa%PSFVzY9p?%@!ZzL0uzFlt)9U8qPWs5 z-!&hZOsei7M&2=^C17a!oZ?1cS%^-9@~@&=5gfxC3{OCU$S)hpsz~%!o+a!aSWdP@ zsAhn6vk2O!!}vhurvl89z%FLDRk=aW7`lVzSKsG3HmVOF}>!B z9WUs>uIP+U5Cv61rJ1c8_(=3LC5lo)Va|_xwW&@_oy`1_Qp5D~=Kk8%O||t+zo-ZE zT>ZY}zN8-32A9wS1apjont;~(a^=aIunntonOp=ZlapUC@x$;m`CHJ3u(=F;I z`M?-M>#2%_)sdI|m}$&554z6P<#Ep;vyWft^ohCLYis(TT)PDZhH>0FzKf^6&)B;I z&W8a&nFxwIBP(eY9n$0yw>M7wCj2atJDY&1`8w;4n(E40|g^(cQ)x+({ zO*v937*~lz@kiL?K8CpQI*QK}DFhj>inVqakRDXP_=ELMV-m{gL@4q*NOpj^Hihgj z8-37VhnNU%aBEl!R&d#`qJgY+_XMj#Kdiy);iwmn4dlB?4^(J&@!w?RnhDmKR8pf> zlnRd+j{&Vjn%)5}WvF4Ad^J*q+xq1#e?~lq=r?rNC%Jk|2dw#Ru3_#KRZq1xN9sE!q~Y_jP$V( z$&?4O1jk?<#s~faQ+%K)rjnS-FEkG3GC<1SDYuRXL(9<>;S`!bYbfZx2_S_ihi|_d z%7+Dm zbw+N4YVXD4(o%O8{aqT`JMU!Ym>W~E8+y4hCK0?8UGXaBB2p^NILk}Wxboa!3TwO@ zor|UCs6-a0_Vpuu5|_xogXJbZluQUa;qSm;Ws!K7^Fv}F~y`cG;MJx1+SH4-plwBRy{L-G@{)&rF^TUyND!S=ym`}8rdRx?$QXR z4QwZbtiHUy{ZqZQ0&-v@dVrJw?9XIp`mx~*bgGp>E@ND-t^+)4`c4;;2r260bmW8v zgjRb*IQ1G%^%%1XNgs@n^@uy*vL#ALHXM{IFU)h? zdRAfm)dqYu^;K=0ty5s5;0G@C+~$wBS0>neLB*fIV4TgX0L7F1U_@LW5~id>cxh6R zL~*jWjQjLmNgSx!*7Ni8AM2^Mm+l@3t2^@UPNzS~3PS)~Sgo+hG~ixJ9VyHk3WXG- zu)u~4ot~iXgU^6a*8zD;7LBT^U_Zz~`0_HwoZ5(w)UCj-lsAl)(1hco=ldrnE%Q*Q zI-HE{iz&OTy z!?S9gPZu9NxDJ6gmV9z&TEg7~HOb~;CM_e3+1R(F4N=v3YJfDYw#iQb-_m>K{DU$% zQ=bDjM}@sXqP%L(zb>Hq-@dTWYqX;(hGMbXhdhh4eh^|jnOTbKZg)#z%6~7*KI3=sp|Cq3gqB{>4faOFH?5*F^%q`83aI5r3TYRy- z$H-r&$#OHYtW?kFEx+&K7=Hu4KXkx!MF&c}3=a}5b?w|8WzLj`x=sB*$OQ_S-~e+3 z`C_)Zez~h4H%_={6-ilb-64A5m4HOBvWF-u5?%c5Qx;I4!N4(mExV-I^7)&0#E<=a z^1ZlR0$YbezEbf7yXE@sp8Q%y>{8J63_hIbn^AoehJ&PB@Ptl(4sYP%AOAo(t)6ZZ zxNQ^m>_nm3bG#wXLTM8$moxJKP27dPwDZ@EAOIfM!(5v#Q2z>RJZ;%#0;jrUFcV$`R(^q< z71w}|nNrqqoptJpza2m2c$W;$h)iI8km9U7z$Y5&7Pw?fj#z>XMdd`=_?ued^*1`SJ^8HHXIR;qF3+^b+4+FMmUM`(y`If7 z_`3*-XOzj|@F(#@<)2=AnW-MG4*NPT}e(9D$_}ahfj{wITrHO7Zb$52y{hw?6cL4LjszYF#+3@x*n$V=;|nGj_$I z_c<^e?h*N_%h$-_MdY4^j229K&19er4V{WxkMr`cy(1ZE)^nN?zaW#rhtqJ$yLs=X zC&bHJWAR5g(hUX0ooxeHGm2A^!Ykd3)BqUl5H zM=_q)gr>U@8N{hI8eZSZ_P&8J^lTXXagAdU3v>TldB_KcBy(Jt;7nSid6aR9Wl@|u zf!HwV5v{!f7s)*Vk&4~awx87s@^ROMRrF>+)K4KC0C=QF@Kk8j{gG8qKhCe?m282r z&qZh}jajVSkA}*WFe&b>dCkxH={RCoF{)~U=Dx`4LaEcP;;|u~BQhN^=IVKnsfLpMr+=Au1J23E*k^OhiqoPZdvzoRf*3N(^l#ig$1r~f8W#g zN4k95xtW@GFOKK?q`33(TSA%C0f^xCuT2<<;mtS-PxGiTOWxorl-xpy(A$>}K*lci~zSV2V zPen1OAS6{%l^N~zc&5wLq~q7%t*%(mb^7Tn;mnsp>X2&W9i@un)KDXPN3ckJg z%s)w_bJc;I4X4q)pO}n1!s};}w!xxWx!nu;*W8>7@sZhgXtE);I$iV0{n^IC1K28+ zZ1~%9$y-SiH6|JIPaBiuCJy4~;z= z6+xS0Y%eSirc#xX<-C3?xLRzGy-U`mVHAhE3en;i3}vtsxw@S?5fO*{cx0KJCAjj|_rR_dPQF#> zMi#C|K+n-06c#|}0uKPHPGWDR@O3K9S>=hQ&&4ZO7svo*TLcMAvgh4 z@k4d7#)yp4STh2^!i}{zz9>!m7kTI9bJ^_?5ixXa#R?^Qg8J~as&x~8a`r_poM47m z)LRn-m4pXg}dL|H&+wpBop0X`eb+#p2T8ZhvL=ilO~kqer~P>YY4PFH2TNOjPp) zbx)I=&V4M%X^l(IzDqm>9IlYhBujHh<${`igT%mNDLKImw1rSZeS-uxx1h$-IG4J3 z57YN3=;tcH7XF$Uh&}F$+`I z(z903q}IF!VUpN4B7e$(}d1Rz4J26L#D z)JJ1%BV~Azn!`ayN-;0vdBG`fp_g#H1Em#t$$yVF{IMHz4wuzCSggIVDS^o3H z-1g1Kwbc<8q4M)2nqGRhz{|S~RqEdA81Sn@lv>&xO3o)Z3r}f z=~s>xWjb|P0=v~;M0qSN>I=I;?6n}Sue0pzuLx}<*n`L6FzJcwfj48}{ISAWY>xH^ zJNrJKuCUCa;yLo|tsMf`MhhK5B|!x(AUBRZMozC7U&G)Ivy2f7vt{0L{De=>x6uT}~y1`hi;i>hL$1%S@IQIyKu$~owi z*8-poz#@d!gq}V7R*+=5NpA9?JQP%zO>&;29O@wnHf}~n_wI45kMUq#eT)_a(QKA9 z6(;9F;P@StH5!j$cB|boQIvVX$grfO4T)Dv(C<^YH7Dghd2EN!iqB7WOn&z*io%VQ zwkE}TGFrcR7w86x^bj2qj1446|Ljte1ZgHqc&$YfXgsQGX?cEb?QUynHMf9U-7r&X zadV{C2p$i)lK;Zc12zLbtUsm2#HP5xD7$((m;_$-QLisQuPG%Gq#ALFWJF$3y9tFv z4v_|Dhhb94DT^^T8YVk8$H=@o_tq%4X}#{>z$s3zNe=X)C6V)~-*x-aDDlH4Lq4Tz?jFRes zNOqVs$qkV)Bg{H=-VbiK={@OH#;#?Wz*|EYi>RAL&3yc)+8Ca-A{D|NGSN4~ z-6J!E02Hn$)vd)~1F~XGm>3h#3I8RD;2W*Bv)D!}@up~rr&E& zf8lh2T$nF}q?Xth;aiiPH7lzrzTfax?57!94vO>=rxi7`6jfsOKOww~CLgpK(AY-Z zeJ+u#0T?%D+k^I1Bze&4?KD{7+#@81wQ6N+_m^9Sb@Fn`!WE6Q-!PQ zG$f{=U^jFXp&{-j+UmcHp-PXeu`@I`9a!iOG3K9*vN+((GzvED$pHOJ^{Y%64OyE% zPzFnrgi`Zhdk;b#o2+&aP2A*~D$1Al3kz$EYE8$;sAz#58a7h;yFG1b8fYwK=YtC# zI*jx2&|lge&AFJ6E|L4Cd4jgo06w5GzOAcD0&ewoA~pn8s(=HG#S9{f8c?cFc?sTQ zQiaJA1roPJD=bW^p&8`@=0fenU@PbcP6ZjCgPrqVtuq|k16J;CF-!WOF5o+Vka&kL zv0ZwRt;*x;I*qnEMPwioz3$wY4}ygvoqR@v?mz^*`TWDcd9*^XiWTg^)Id+a03{Z` z4voNjs%?J1zdQ`!lC46<+}1uA_JFxXQbQK5qqCp=AKA+b`Sk_(r`=?J9_E;H3f&5V z=NtfLGsMeus6toVjtYq;8bE@dEe4|i0(RT$i88VN7;DeaZQ(=HG@$6;6vhUI&}CZq z9MuT3A(XQFkIItDgtrm~lTxF?oL6p{7}g!1Y1ZsU+#B{Om5wmi8x=TC$;r#{a?mO* zlU22!>-usZ2l=2K705cjdWHmmHFuDj>yI)!dN9gSS2_@J_%X+NzgKbO>9I`g{nxU* zsMgHRUBjP42U@#T%LfTt!I4-p3cN+dOh+t+0Thpq%|jwfK_VtHLb(;fm~@ zXpl=MekYHyS2C4%?B|if7v4?nx10dUf~pIDU|Yb0ps)11^Kudcyh8;)@@W(PhSK*G z=#5Tz5UIY8CrJgp@MW9gspv0HKvpdj%srIj!06PWJx|*b;-_ zW5s-`2+tTUH)B^a-%)vNG(z_hAA)=d`9Xzd?k?$2bpX6hTYb%FNccW$`xS*-=E#umw#{@gb8_&no>U5sli0Ru{p z>7f#*oWV&VL7hPcL~^`2GF3D)xVC+a2%VT?45R`YJ}{+Cx{4q{z#dA>4^sRv^TC*= zN8Co+lZ7|X)gPV$PxaBw_Ydk?=Xb{#uQjfbpCHozofh_z#mEyUUXf%e^Q|cqYtmI zeuxP3{e1vPyrpCmH!d{~*VXa;JPNs*SxueZFnZ?SthnwdQJS2u%6X&XeYpp`?3Z0qxvGGj7eND$Ane(=DP~?1 z>_D2ECTRBjNJvyzBojbN9=aw7QZOblq2Gi;8h_NNrE*F2KA-Q{$t<_jihB!n5?*^} z0V6)W|2m!FwB7sBuuK)q^EI=Ak@Bnj&ra4jcZ^cx$Cq75e)CoRo1EWfOoCrCX-up9 zy@Z4ZS}Q7 zWAHqhwFc_?oLA%}s`m@8E_eNqp8qLRz3`tKZCNoJq=c;$!%VxqkJ)7weo4IKZH81? zwzOrx^aE19YeGHIzFK1&dS`NPmufCY*h+*h=lkB*_{|HEwg|shU#Ai0VZ@e$2g|=S zTe|gjjuhvy(#~D9T1a&uBDrkT3jYW3^4K+hF1tQyIci@(^F0pm{7FoXjj)l49-;Em zp2z&TS~_|2{R9n3^UYw&D(OCE$%dk(qa(~&EU2=xCIA6i{?$s6|DH#8>CyW|q75V7 z;{Kp1ihOLC-F%rw^*QP#bydnshSutL~H z-y0}s;>;^?N72~D3^HqR1qOcmpsGy&T;~r=Z6Ap+bq&C2bxTX0rWo;TsiAIMrKm~K z>qKJEG{ z_ZBO38qe{2=3~|Tvq{Hi^~RXjso z3U(Rf@&f|a4-b{n5BfJxe!EKRq-iESW8CFbYPGZrW(JpvN%T?nTU!<$i)_ z5H6Rd18nGM#ehw7m6}^ttci#8{nuWB#wGXlpZtA04H)&)tkuGDN57hn((ph<+cokc zl9*_}M+7X+G; zBsL{{F=hmT&AFZa@a+*=z~a=B$n7(@^aI?&l^-ZLRa_M7nb#y2ThSL^lQArcmqKY{ zZZXCLw!uaWy)i}bme-)SeYxFtE*Fo_4|_*I;2L2d$>}vthEAT(kz!CWAbspq>V7EK z-(&0b&MmE$(3I|9{(C|UDGXush_)4gse3nxvhZygG-``H!dFv)g0Fl^T#tv>TG!F{ z;W+;>lqRW$l|V`f{yPkz2Q2FP+mkyc7fD?a(QAsI2wWG9t!-2>haf`xSrB5H>?Njg zp#jSfXBE+@cF_j3>rY_0IeeL)jw*imbHRzfO!?<+whVwSU{T2}89`Zvy_VSL3*r%FUUQG>vhUI;gkvSMygNsZ?Z|}+{2%7 z70ZcOYM2|14e95it*v!MPDMx5K!2EvK%hZoM8|Z!D*r37BoqZZKEAd3lNTm8FSfC6 z!L)g{`bVMX$;OkcU75+0B)PbUpn6a&FhX>c>bMdlGjwg_pf^kIwdALfwcdxI;lmo^ z1q=C-J;@n3{JT$dJ&TcK{2j*~+O;hdb6-Xf<{P=c_#VHqcIwXb8o07F2$zrzY2 zOF;IOwzL4X@47PMxf8gm8e5Ut*lM5xt~ynm}lR2d5_p=bH9Y{wVT7bWY15fJP90y96{ZK zn`^QZB%+JmAQf4iGaC8M=bF-Wf(YelvQ5oqQ4Wd1Aqgwrr(L=1F6FKXXg_k26D0lV z3~p&Uy^7IV0n^-52+6*4hf^{fo@O(!*5jmixF`7VweZYLg4O84V;bF6+QlJ+0C+L4 zV-;2S% zM;be&pcC{>ArbrwU{Z=ydfZ)0k=Z11!Z?!=WM&tdo~t`w^ZtK~d+Zj)?U9dpcA^rU z;tDWn*Y8mnsaI^*RZ!PozMRpftTK$}2;EmbL`nd?)dXy@TY!F+!h(<&_hHKI6W8fl7OkK;%Ns@({>%rLFFZ zTZBH~K$b9cgRUz7w=_0u9uv7}HRG9Q9!PmLVJs&v+RE~{hoC-{VGDNw_v+a%O=HXa zZdG_F3%kW8x@0e`fOf$o+|1*tU&E`OmtituFSh)l`I#JStvuq&3LG91JZM z#W!8MDmV5g6u!Q224bT>QIr)TZ;-d62wN2CGU}9A+(Ckpzs#ofOH*MY@0OWX1Dcl&;L zgW7vdTDkKsoT_1OpyDjeebjHqs>P~vm??{##PzmwaVQ)o>yEV&O3P{AY1oebp&mi6 zqMq&sXAq+udluw8=n^6E-ilg{t}Prc%w2CjwRc>1#;d{43n`Y!_ONPAZ$xkehIFa5 z_m0gHFGKmFSOc#&I_k#3Axdb{&pVo0pVfCEt34bzOWG^8036`5qLuVrfE~$*MS@0> zOFpXY|LP%XEcWenh|9E9V2?goe?JUrkIaBNqkeo>l-R%nR?r?#kDN@@7dZSKK^WNr zOl>KGq}7=%#PP_9@z`Fu-v*#$G0DWK=$x^zv~+qpEUzwtPi>V}ZhA`?Quq%QoZ3P7 z&gLYkR6VIoYyrd&q%{L&oP9x#D$!R!$!Q=d$u(spe6{dVay9aB;gLV%PW>?&X1&7Q zA7@V(B1Nc0Tw{3(VS&_GIY;U}#aezc^5sR^-iWRy{a*{ZuY+JYp9}L{y%^-;w@7T^mpj^T%LJZbf%3GbfitYAOYAmM?3$_T8Ymx2&RUhy}UXfimschBMyw}<&J8O-M_G7pg+8( zQROe&a4iUgc&hOy0@%!w}o=SI#p0k*GZX!S8sw5 zM;VJS(X{Saxdu$8V}O3w24Ho^aN;B8#yAG+e~YnM&0YqbeHNl$9F8bz06wprqpfJ0RTX2VoaLSe{9*PSGjC&KN5rK;L$AUEMld$#N~E zcbJ#QMcQsc>hBqAuitX~rpvC{why6WqrK&%xAIg?m?ezWppDT%jwgHuva{4DSw6ZSA%G9)Gk8a`SKppu! z3BYTt3Wq?9o0r!oCzuN}cc6N$uTw%N&7j$Ub)vUuUq{2t3vt!7thK37TcU#Pt*8i^k3udKpsnlOKg&ZN_SG$!lJf zqaRFFnpxmAoJAg+xe|ecb`ZY2GdKV|6iJxWl{yIxL2sW)p6A*_qOm253>b(WzrubX zYqCO;#DxV<9u~1;Kss^F*Ml61n7>G8rKuw?Qt>}}=CTfHuKQq;E$X(FVlTqWyVdba zohg1t5}IGg9jI~`eG&M|W7LF3$G#(uH{u;$yk=>Dn>fzmw_6_8Q6%&NX=YWl&=(0v z0AvSBcPD#BgZ|F;GI!gO%vjWy#kPIZMihR)_UQNlEb;6h@e4~~tOmW?D=~zkF z`Ue#sa8r&(U=4)H=j?{dp_cm$pG6w6V`Gv7Raf@^4;k^(0HC2&N_vG$6Ln59-?!in zB-#V`>$10fj|2sHt~)g{RUFP<@^kJ4q-n}dU(#SXm`_v-+2?{lQF8o`6J(+%UwQ@4 zh;5$@-BMPbUAQ#gx-ByWE&L6%Utk;2b@@Yx!64q!uXcg=sziITq1m^N@*(HxYOOyM z5z{NEBcpuVq3YfRnsV2Esgf)Twtd@EVxn@KB`386LetxZTGgGk`O_K%Y{5X;HM-{g zs+f|M-xr5mJ0aZh4SMlI=)pcXno3#TQogMs=#~mJh;5w6=NZQOEX7W~%iVnofM9!{ z1r8Sb*=xVr$a}fJL?2D-8*ipez>yO5&XhZ23Qe+O>Oe(GTEI(m2>u_6c)A88uK`q- zn>vnzvCtrYDuxF$PU3!9Wr9yC#tldCIM}T7?mhKiv&to<*s=}LK@zYc=E%q-kR9Zop< z4Nf*|A&jKI+?wkNmKKq!3GF7}YI+N*q8<$EtnnDwPjR1l^8IKW8X{S*Sm$+_1!}xzEOhYNX38W6R#_OxQ0Y zz@;IZ9xGP9IP$wjJT;_WOd^bKQIU5Rrm|1u5_U$J^C~2>w>LwB+#PU-+^|W*z-sxe zn}1#?d?G&uw3VeL0SA~Qv23tMe%<8GVBkhSDii|U6MqqLciB~QCO?0iNAZP5>4}{C zc@#gbBdwp3=)XNAvjd%rZt+4~l)B?QiVdsCTMy}1_`|=%lvALBA^=wP5Y1CuyL3+u z4LP{N(RRt7y@>fxOiT_4JN6`&DWvnSxalVBpR!35a;ix?dHR+l*ze4EI6(kQu(Oy(vB$L3yAy=1kd*H8FvN zpvm)V0zlVPP|hqI>JgJ*kTL`O#@p@V(=VyxdmTEdUtcfgL3HeMo#hxwg0hvL5o4}v z9>uolvMgL}?kL7nv!44*s`O3Q{K zNi;GnK{iPR$?-NCkwwjBlM~9n@}|T-u6x~RK3&h6R&sEY*xcX=$~puYd-IN$LlpE( zJgP-6IfqaAEKjBkEa~$Jz_Nfkizc+ccFN~5A^3bewaLEl(o4#yldZQt#<+-0f)6Xu zKYjS)mRy%Cg8~C!&9OJg0Rrngi7|(jMc*G87y%^oX@kXz|j#7jUxa z%U}Q3jgm}~n(s6Yrg$|XH5&L7OtTxhk2%r;LYHb|hYf8!HtEZPT{$5k2`M#kDCOO( z%K+`!JhAAM*4jNH`ofh18{e?A>x7?iHR#bnWkiY}S0%Qv6$(Sht}fQPkfZIUh`+E> zFz^jlgAhm_MlVDQyG@tt;p^obv9kq2$tHPour7kfU;LY&URsV)5cW%@vVaZ+O2Ag; zN=~sx8C8*nP4x^}SvozPukgV5mc4aJCV9i=tHBjnJFi8301Xgz77!qK{dsXgP z!24VdqQ#kz=y%aSnGM^`AN!u2Ep|bLau=0U97L)kdK#%)usl6B;aOZ-!lXn1KSMudXaN z21`r=DyKaqFe8R;u9qWT8Rd#KMX6gka$zbB$PHL3<1tIqY^8T{)||`RRxf_C3?+11 zZJ_`2>mqPw`0~LytQ!h?Al_*^UVJejwNZ5n#Z@Kj-#mp%Q<kp=(*Kven82~ZK@_=$H>$2%V0t`aQ*HzuO8 zErN9@z5ni!x)DkJ^ZM0FLm}|mp5WL%q zCRo_1@?(!kR8w_km+D&MxqCWHl!Y74_+T**0z8(U965^-Sk%frpk`fg24t5wI)APhp&*+X@VQBDx|hwYe6sl9dOep%PKLpOH)XM6 z1lCqIIgiP>xp1klldr}1cF1a%zW{I1V!gX@XcZ<=m9ZO|LIZY)3qQjO9++sciZrs5NqH@*KY z|AqWIYad+b(P_{r8p*~y51^*4$a?0c;h*M@usk_vqCZ^M$K5FMq10}Dz7`}XxI?ng z8t+rKC7$s`sqHP~iYI*WyP=;xC7rI>9$d~`CdX=SkWszXK)oXAj|A>- zmY>V9(xoxPa*cadhj)F|E}Iy6EX$`119nTm0O{YI@t}9@o;+KqGrKN z+=($HrDx_X*UZ$9UOV@i-mik*DBvqd)mV)*7f%@of}~E6BMd+OTZZ5Ey9*gx4wvXX zVzt}05^^9|@P(aGW+Id+o#074qfff_uP@A~DN`y<%^cAE{RH)=zia*lPgm^o2~6~H+@vp(&# ze##{nn6?ufl>cP&06vb>H&F>5?uKuf%&4v{c6*YVC#Y9w&x}^B0#AFN$%MhVuyC@4 zDmE0NSXgU18uVn?9$?Dk)GsUbkQnfdI&|Vp<;Q9?WRWd+Og6sgjkC1D?|yCBUJT=q z8bo<+zjh8s=Xtp=x9pRb7+`kV&>Om&-C)y&gdLEZ=+0aBJ^YP2Y%frJl$*zkKiQ2Y zMF7F+=V+Yq-eKd0%*5wdeAMdsTig^wKUH7nXKM+RJ0TWTx4nX`WP}GgYmjSPx7eVUAsECdP2qOT{bs7}yP)>a7QG$H zAM?D1HGOY|w`DcQy#$1;B0Xr%@hgW>Ty6ae?}XXNpG zu9C3Dlw7@}Q8-@ajaXH|Lt5k|(q*;b$}D6PPG0YgA`&(_=xYQedw0=9qCpB|h-4s( zZe7kho4@rEngZCa3==%*NdL!S1mZxvPJqV{2j<}_jDLDM?w+2M(-auLY%|N_f+Iq> zL&jvkCz%79;jAJUM#bScI-VN3;vS7&a4{YxZLxEf6gkno@QRS85@UbA(|^xc!GW_f z@=P6hd|%uXUO=arrgJ0zPNO89@Lj(A8Rt=GXR>*`gwr0OTcQnl+3ai zdDWt=A6*ww8#q$I&N%>{X7HRuvAT=8JfD8^;AaGpc*AT_}Z``l`su%Tz~ywj8+rRfvpI zd9wr6=W<+;B_#Xnj^=ksfZWd!#&D@gVGbKtxB^F!`*nc)o=al|<>wgpL09TtqDyos zzclg~6r(Eekqc@m4Do%ON)~lOTK3DJ?`xI3Ikb5$R5vlHxX5)3+M19lqsmdioE-f6 zWb9WUd3m$w32H3Owprj+mNN-rvPBx4R_Rq#R^6g+6DFEz-;Y?HBUQqz4kTQ`v!8v9 zc3)m&7s;Fsf()p0z@$m^SImn3122YJQgWv?uhar2noslU=*o1&_emB~uf@BLR_vv- ziCc}kJy6vIiJ-65{5uB^C~9H=vA5zW98xXv?2IS8rjDwh^1`mB6wk<@4D>@Y{5U;x zxQWtOm7@9LAhHxD;|^e|ktWuxD%G3M;|xiqB00CTsmsd|8X_@EqcQ-`D~Z@uQ17!A zVYd&|G^W{2&xI^eUWfT%`tRAbcbiCmj@~69EWUhw5;nH{cZb}r49y2~O`XrMby$e-Oe=vCxPk8IrXMc4uvhH#rlqnCeaYJQ zi)x=X1d8NUZ%0yhgk;d?^TeN}B$bx-o?*$(>5-|sPp_N14}F1ohU5M68rvSSJJK|< z1@9)sJzCsyqq3}rC0s?8U-18J*C96~}mR^ZNT_S#b=SIh(sm4Lx7%9*9zKpb# z!D_NbhPX1?X!U@vVX^lE0>tHq!*DAG3}3{@s!9FVPey&bKc#DsT{Y!BrQZY3x~s&q z$_9B%j+MBaV7cVsI%dv@VMuyKzYJ$NhS+)gfa0ExcVAitEEq@iBU7Z;=R*n{4(SRl zYJPuI@O1uHgX8!CZhXVK-ruIJ@@QG5piUC6hC6Ql`@ar1jIj2%l48umKe&eMcLi{R zwL*Tv>knJ4yPrMKbXU0@dnev;EENb_wX~ht(!bA_HGloYdQ=kppaGoqO{vp1%0wGw z5u3JW(=|{)#iLMFPPUTA_V~W-ojrb15_nEu?zg?efqp*FYF+&wYR&G)Vywp++g~K4 zz#=KWyh&y2>H~fe#BV3gPimqmr5y7Fw517w?l2E$XlW^af@+49qDfEM62t$>S_wU% zB)N+q%?P*Qg>-dTnR2*uUL93~G>N<%GQ`5%i32r!1%vt?YSbs99UvV1%G?Ntp?CW@ zLITH?dwKP_0VmdyGOdn&tDB$Civ9N-RUv+Zcz$nsZ_CUdjpGXADiFsFgE=CUh9gy0 zk|mB(dB^JkFk^$W)x#2>j^`hF|73}4zo)ktDhTM5>8fJIJ94w*{BSFUlAuZ>ra2qR zCP03$8^^H>8(}S}xptWTW5xvolfhI2u_I6kD2BFU@$mE&YU2c1)hgl03q|O%Lle$^M z(-$5WAQHF%MN@6(A7fn9zO61s(6wm-Y34^2Dg|DM=z0={gY5dRX1{yS2j74Y`wiD3 zXISCzUEK}vTFacnXRSk=H9?$pQJXg39b&*KEb4OXBRlDpv0t z@K-kBZ>^`9$nNkF;&*m&Nl0dZQc-|RrWa~;T2HUa`^c{~Fsjgw1aC@t^+ID(`nM!_ zf7UWvn_F`w-PEvT-wHl_-R}CiNN10~l?vyN9LQrbHwHQ9Xj8+o2`7pWJTPH*{Z?bD z?ZHAU$(N+wb$h#uj59{3l7QW~s=qyG*H{b_G()1Lfv*Kk@0Tz6D#P0G0xP39eTMb= zz=R*Y=}fNJbGAf6NrBm`2Z5#PMxT>iYT@o1=`z}I2&iSMY6};cb=Lfh#_53^^A2LH z0y@W{xzS8sl|^daA9KKeu=R_TEw_0D8L&AFdV=CE0izBD2^AGV4YSTLOEX2Y0R^Uf zp{=*Y;~R&QO{gGKj#x&ql&eK92Vih6y`+R{1r6gKV7trjGHSSk<;f(#V?Vuc(-~Ko zThNig)7RYGZ|-xG2`$;ll5g*MM#W!e-}@a%oFAr(dHKr$%fu>8nA@$c*}4HK_}8KGmft!T3mH