Jetson AGX Orin bring-up repo for the Haptica Sensorics ZED Link Quad setup.
AGENTS.md: hard acceptance criteria for the bring-up and validation flowdocs/JETSON_STEREOLABS_CODEX_RUNBOOK.md: host and Jetson setup runbookscripts/zed-mosaic: canonical CLI for the laptop-side 4-stream viewerscripts/zed-studio-forever.sh: Jetson-side guarded ZED Studio auto-launcherscripts/setup_zed_python_venv.sh: builds the supported Jetson-side Python venv for the ZED SDKscripts/zed-python: runs Python inside the Jetson-side ZED SDK venvscripts/zed-pip: runs pip inside the Jetson-side ZED SDK venvscripts/build-virtual-stereo-depth-demo.sh: builds the Jetson-side virtual stereo demo binaryscripts/virtual-stereo-depth-demo.sh: keeps the virtual stereo demo running on the Jetson displayscripts/deploy-virtual-stereo-depth-demo.sh: pushes the depth demo files from the host to the Jetson and rebuilds therescripts/complete-sensor-demo.sh: keeps the integrated stereo + wrist + telemetry demo running on the Jetson displayscripts/deploy-complete-sensor-demo.sh: pushes the integrated demo files from the host to the Jetsonscripts/launch-complete-sensor-demo.sh: desktop-launch wrapper that shows startup progress while the Jetson camera stack comes upscripts/collect_zed_support_bundle.sh: gathers a vendor-aligned Jetson support bundlescripts/ptp_network_readiness.sh: checks whether an interface and host are ready forlinuxptp/PTP syncscripts/zedx-fourcam-diagnose.py: lower-level 4-cameraCameraOnediagnosticconfig/complete-sensor-demo.env.example: known-good Jetson env for the integrated showcase appsystemd/user/zed-mosaic.service: user service for the laptop mosaic viewersystemd/user/zed-studio-forever.service: Jetson-side user service for ZED Studiosystemd/user/virtual-stereo-depth-demo.service: Jetson-side user service for the virtual stereo depth demosystemd/user/complete-sensor-demo.service: Jetson-side user service for the integrated showcase dashboard
Run directly from the command line:
/home/bob-smith/dev/hapticajetson/scripts/zed-mosaic runOr install the command and service into your user environment:
/home/bob-smith/dev/hapticajetson/scripts/zed-mosaic install
systemctl --user enable --now zed-mosaic.serviceAfter install, use:
zed-mosaic run
zed-mosaic watch
zed-mosaic start
zed-mosaic stop
zed-mosaic restart
zed-mosaic status
zed-mosaic logsOptional user config can live in ~/.config/zed-mosaic.env, for example:
JETSON_IP=192.168.1.232
LATENCY_MS=80Run directly on the Jetson:
~/bin/run_zed_studio_forever.shOr install the repo-managed script and user service on the Jetson:
REPO_ROOT=~/dev/hapticajetson
install -Dm755 "$REPO_ROOT/scripts/zed-studio-forever.sh" ~/bin/run_zed_studio_forever.sh
install -Dm644 "$REPO_ROOT/systemd/user/zed-studio-forever.service" ~/.config/systemd/user/zed-studio-forever.service
systemctl --user daemon-reload
systemctl --user enable --now zed-studio-forever.serviceOptional Jetson-side overrides can live in ~/.config/zed-studio-forever.env, for example:
SETTLE_DELAY_S=30
REQUIRED_CAMERAS=4
PROBE_TIMEOUT_S=10
RESTART_CAMERA_STACK_BEFORE_LAUNCH=1
STACK_RESTART_SETTLE_S=8On this Jetson, the launcher is intentionally conservative. By default it:
- restarts
nvargus-daemon,zed_x_daemon, andIMU_Daemon - waits for
/dev/video0-3 - waits an additional settle delay
- requires
4/4 AVAILABLEfromZED_Explorer --all
That root-level restart path depends on the helper:
install -Dm755 "$REPO_ROOT/scripts/restart-zed-camera-stack" /usr/local/bin/restart-zed-camera-stackIf you want Studio to come up pinned to one camera instead of its default UI, set:
TARGET_SERIAL=306073138
TARGET_RES=HD1200
TARGET_FPS=60Logs live in ~/.local/state/zed_studio_forever.log and ~/.local/state/zed_studio_systemd.log.
To control whether Studio starts automatically on login without editing
systemctl commands manually, install the helper:
install -Dm755 "$REPO_ROOT/scripts/zed-studio-autostart" /usr/local/bin/zed-studio-autostartUseful commands on the Jetson:
zed-studio-autostart status
zed-studio-autostart enable
zed-studio-autostart disableThe repo also includes desktop launchers for enable, disable, and status. Those
can be copied into ~/Desktop/ for a one-click persistent autostart toggle.
The sustainable Python setup on the Jetson is a dedicated venv built with the
official Stereolabs get_python_api.py installer plus pip-managed OpenCV.
Do not rely on the mixed system Python environment for GUI Python samples.
Install or rebuild it on the Jetson:
REPO_ROOT=~/dev/hapticajetson
"$REPO_ROOT/scripts/setup_zed_python_venv.sh"
sudo install -Dm755 "$REPO_ROOT/scripts/zed-python" /usr/local/bin/zed-python
sudo install -Dm755 "$REPO_ROOT/scripts/zed-pip" /usr/local/bin/zed-pipAfter install:
zed-python -c "import cv2, numpy, pyzed.sl as sl; print(cv2.__version__, numpy.__version__, len(sl.CameraOne.get_device_list()))"
zed-pip checkThe default venv path is ~/.venvs/zed-sdk. Override it with ZED_PYTHON_VENV
if needed.
Deploy the demo source, launcher, and user service from the host to the Jetson:
~/dev/hapticajetson/scripts/deploy-virtual-stereo-depth-demo.shThat rebuilds /home/nvidia/virtual_stereo_depth_demo on the Jetson using the
repo source at tools/virtual_stereo_depth_demo.cpp.
Run directly on the Jetson:
~/bin/run_virtual_stereo_depth_demo.shOr enable the user service on the Jetson:
systemctl --user enable --now virtual-stereo-depth-demo.serviceOptional Jetson-side overrides can live in
~/.config/virtual-stereo-depth-demo.env, for example:
LEFT_SN=305075068
RIGHT_SN=308285223
VIRTUAL_SN=117172000
RESTART_CAMERA_STACK_BEFORE_LAUNCH=1
MIN_VIDEO_NODES=4Logs live in ~/.local/state/virtual_stereo_depth_demo.log and
~/.local/state/virtual_stereo_depth_demo_systemd.log.
Current known-good Jetson demo settings are documented in
stereopair.md under Known Good Demo State (2026-03-19).
The repo also includes an integrated dashboard app that combines:
- virtual stereo left image
- virtual stereo depth view
- left wrist camera
- right wrist camera
- live IMU telemetry from a selected wrist camera
- live GPS status from
gpsd
Run directly on the Jetson:
~/dev/hapticajetson/scripts/complete-sensor-demo.shOr deploy the current local repo copy from the host:
~/dev/hapticajetson/scripts/deploy-complete-sensor-demo.shOr install the repo-managed launcher and user service on the Jetson:
REPO_ROOT=~/dev/hapticajetson
install -Dm755 "$REPO_ROOT/scripts/complete-sensor-demo.sh" ~/bin/run_complete_sensor_demo.sh
install -Dm644 "$REPO_ROOT/systemd/user/complete-sensor-demo.service" ~/.config/systemd/user/complete-sensor-demo.service
systemctl --user daemon-reload
systemctl --user enable --now complete-sensor-demo.serviceOptional Jetson-side overrides can live in ~/.config/complete-sensor-demo.env, for example:
cp ~/dev/hapticajetson/config/complete-sensor-demo.env.example ~/.config/complete-sensor-demo.envIf ~/.config/virtual-stereo-depth-demo.env already exists, the launcher will
read that first so the known-good stereo tuning carries over automatically.
Known-good integrated demo settings on the current Jetson are:
- stereo head serials
305075068/308285223 - virtual stereo serial
117172000 - left wrist
306302901 - right wrist
306073138 DEPTH_MODE=NEURALDEPTH_MIN_MM=300DEPTH_MAX_MM=3000DEPTH_STABILIZATION=60ROTATE_180=1CAMERA_FPS=30STEREO_RESOLUTION=HD1080WRIST_RESOLUTION=AUTODEPTH_PREVIEW_FPS=15RECORD_SEGMENT_MAX_S=600
Current launch behavior on the Jetson desktop:
- the desktop icon calls
~/bin/launch_complete_sensor_demo.sh - startup commonly takes around
45sbecause the launcher waits for Argus, the ZED daemons,/dev/video*, and a settle period before opening the app - the launcher now shows a small Zenity progress window with the real startup phases instead of leaving a stale notification on screen
- pressing
qstops the app and the launcher loop, so the desktop icon can be used for a clean relaunch
Recording bundle behavior:
- recording toggles from the running app and writes to
/data/recordings/complete_sensor_demo - each segment is capped at
10 minutesand automatically rolls to a new one - every bundle contains
stereo_head.svo2,left_wrist.svo2,right_wrist.svo2,depth_preview.mp4,depth_preview_timestamps.jsonl,telemetry.jsonl, andsession.json
Important implementation note:
- on this Jetson, a minimal Python
sl.Cameravirtual-stereo probe repeatedly failed withCAMERA STREAM FAILED TO START - the integrated dashboard therefore uses the proven C++ virtual-stereo path and only reuses the wrist-camera and telemetry learnings from the Python probe
Stereolabs support wants a diagnostic file from the ZED diagnostic tool. The repo also includes a broader Jetson support bundle collector that captures the key camera, daemon, boot, and Python state in one directory.
Run on the Jetson:
~/dev/hapticajetson/scripts/collect_zed_support_bundle.shOr after installing it into PATH:
collect-zed-support-bundleIf the rig moves to distributed Ethernet streaming across multiple hosts, use
PTP (linuxptp) instead of ad hoc clock sync. The repo includes a quick
readiness checker:
~/dev/hapticajetson/scripts/ptp_network_readiness.sh eno1It checks whether the interface exposes hardware timestamping and whether
ptp4l, phc2sys, and pmc are installed.
Run on the Jetson to validate the four-camera capture path outside ZED_Studio:
zed-python ~/dev/hapticajetson/scripts/zedx-fourcam-diagnose.py --duration 30 --resolution HD1200 --fps 60 --retrieveUse --retrieve to include image retrieval load. Without it, the script measures grab() throughput only.
/home/dev/AGENTS.md/home/dev/HapticaAgenticEng/JETSON_STEREOLABS_CODEX_RUNBOOK.md/home/dev/.local/bin/zed_mosaic.sh/home/dev/zed_mosaic_loop.sh/home/dev/.config/systemd/user/zed-mosaic.service
The older duplicate scripts have been consolidated into scripts/zed-mosaic.