Skip to content

Instantly share code, notes, and snippets.

@mrpollo
Created February 19, 2026 22:46
Show Gist options
  • Select an option

  • Save mrpollo/d88d2daaaa1a0a5b94ba62711309cf2d to your computer and use it in GitHub Desktop.

Select an option

Save mrpollo/d88d2daaaa1a0a5b94ba62711309cf2d to your computer and use it in GitHub Desktop.

PX4 Gazebo .deb Package — Local Validation Report

Date: 2026-02-19 Branch: mrpollo/deb-package Platform: Apple Silicon (aarch64 / arm64) Fix included: Tools/packaging/px4-gazebo.shreadlink -f symlink resolution


1. Build Summary

Field Value
Build container ubuntu:24.04 + Tools/setup/ubuntu.sh --no-nuttx
Host arch aarch64 (arm64)
Git describe v1.17.0-alpha1-663-gb84a385e48d
.deb filename px4-gazebo_1.17.0~alpha1-noble_arm64.deb
.deb size 30,771,444 bytes (30 MB)
Installed size ~5.2 GB (uncompressed, includes Gazebo models/worlds)

Bug fixed in this build

Tools/packaging/px4-gazebo.sh used dirname "$0" to locate the install prefix, which resolves to /usr/bin when invoked via the /usr/bin/px4-gazebo symlink, causing PX4_GZ_WORLDS and GZ_SIM_RESOURCE_PATH to point to /usr/share/gz/worlds (nonexistent) instead of /opt/px4-gazebo/share/gz/worlds.

-PX4_GAZEBO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
+PX4_GAZEBO_DIR="$(cd "$(dirname "$(readlink -f "$0")")/.." && pwd)"

dpkg-deb -I output

 new Debian package, version 2.0.
 size 30771444 bytes: control archive=11216 bytes.
     952 bytes,    10 lines      control
   33232 bytes,   361 lines      md5sums
      82 bytes,     4 lines   *  postinst             #!/bin/sh
     108 bytes,     6 lines   *  postrm               #!/bin/sh
 Architecture: arm64
 Depends: libc6, libstdc++6, gz-sim8-cli, libgz-sim8-plugins, libgz-physics7-dartsim,
          gz-tools2, libc6 (>= 2.38), libgcc-s1 (>= 3.0), libglib2.0-0t64 (>= 2.12.0),
          libgstreamer-plugins-base1.0-0 (>= 1.0.0), libgstreamer1.0-0 (>= 1.4.0),
          libgz-common5 (>= 5.8.0), libgz-common5-graphics (>= 5.8.0),
          libgz-math7 (>= 7.5.1), libgz-msgs10 (>= 10.3.2),
          libgz-sensors8 (>= 8.2.2), libgz-sim8 (>= 8.10.0),
          libgz-transport13 (>= 13.5.0), libopencv-calib3d406t64 (>= 4.6.0+dfsg),
          libopencv-core406t64 (>= 4.6.0+dfsg), libopencv-features2d406t64 (>= 4.6.0+dfsg),
          libopencv-imgproc406t64 (>= 4.6.0+dfsg), libopencv-video406t64 (>= 4.6.0+dfsg),
          libprotobuf32t64 (>= 3.21.12), libsdformat14 (>= 14.8.0), libstdc++6 (>= 13.1)
 Description: PX4 SITL autopilot with Gazebo Harmonic simulation resources
 Maintainer: Daniel Agar <daniel@agar.ca>
 Package: px4-gazebo
 Priority: optional
 Section: misc
 Version: 1.17.0~alpha1-noble
 Installed-Size: 5220162

2. Install Verification (ubuntu:24.04 + OSRF PPA)

Check Result
Package installs without errors ✅ PASS
/opt/px4-gazebo/bin/px4 exists and is executable (57 MB) ✅ PASS
/opt/px4-gazebo/bin/px4-gazebo wrapper script exists ✅ PASS
/usr/bin/px4-gazebo -> /opt/px4-gazebo/bin/px4-gazebo symlink ✅ PASS
/opt/px4-gazebo/share/gz/models/ present ✅ PASS
/opt/px4-gazebo/share/gz/worlds/ present ✅ PASS
/opt/px4-gazebo/etc/ ROMFS present (extras, init.d, init.d-posix) ✅ PASS

3. Runtime Output — 60-second smoke test

Invocation

export PX4_SIM_MODEL=gz_x500
export HEADLESS=1
export PATH=/opt/px4-gazebo/bin:$PATH
timeout 60 /usr/bin/px4-gazebo < /dev/null 2>&1

Note on pxh> prompt volume: Without -d, PX4's interactive shell emits pxh> at high frequency to stdout (~1M lines/60 s). The log below is the complete meaningful output with bare pxh> prompt lines stripped.

Full annotated log

Setting up px4-gazebo (1.17.0~alpha1-noble) ...

______  __   __    ___
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

INFO  [px4] startup script: /bin/sh etc/init.d-posix/rcS 0      ← startup confirmed
INFO  [init] found model autostart file as SYS_AUTOSTART=4001
INFO  [param] selected parameter default file parameters.bson
INFO  [param] selected parameter backup file parameters_backup.bson
  SYS_AUTOCONFIG: curr: 0 -> new: 1
  SYS_AUTOSTART: curr: 0 -> new: 4001
  CAL_ACC0_ID: curr: 0 -> new: 1310988
  CAL_GYRO0_ID: curr: 0 -> new: 1310988
  CAL_ACC1_ID: curr: 0 -> new: 1310996
  CAL_GYRO1_ID: curr: 0 -> new: 1310996
  CAL_ACC2_ID: curr: 0 -> new: 1311004
  CAL_GYRO2_ID: curr: 0 -> new: 1311004
  CAL_MAG0_ID: curr: 0 -> new: 197388
  CAL_MAG0_PRIO: curr: -1 -> new: 50
  CAL_MAG1_ID: curr: 0 -> new: 197644
  CAL_MAG1_PRIO: curr: -1 -> new: 50
  SENS_BOARD_X_OFF: curr: 0.0000 -> new: 0.0000
  SENS_DPRES_OFF: curr: 0.0000 -> new: 0.0010
INFO  [dataman] data manager file './dataman' size is 1208528 bytes
INFO  [init] Gazebo simulator 8.10.0                             ← Gazebo version confirmed
INFO  [init] Starting gazebo with world: /opt/px4-gazebo/share/gz/worlds/default.sdf  ← path resolves correctly
INFO  [init] Waiting for Gazebo world...
INFO  [init] Gazebo world is ready                               ← world loaded successfully
INFO  [init] Spawning Gazebo model
Warning [Utils.cc:132] XML Element[gz_frame_id] not defined in SDF. Copying as children of [sensor].  (×4, air_pressure / magnetometer / imu / navsat)
INFO  [lockstep_scheduler] setting initial absolute time to 3968000 us
INFO  [gz_bridge] world: default, model: x500_0                  ← bridge connected
INFO  [init] Setting camera to follow x500_0
INFO  [init] Camera follow offset set to -2.0, -2.0, 2.0
INFO  [commander] LED: open /dev/led0 failed (22)                ← expected, no LED device in container
WARN  [health_and_arming_checks] Preflight Fail: ekf2 missing data     ← expected, headless (no sensor flow yet)
WARN  [health_and_arming_checks] Preflight Fail: No connection to the GCS  ← expected, no GCS attached
INFO  [uxrce_dds_client] init UDP agent IP:127.0.0.1, port:8888
INFO  [tone_alarm] home set
INFO  [mavlink] mode: Normal, data rate: 4000000 B/s on udp port 18570 remote port 14550
INFO  [mavlink] mode: Onboard, data rate: 4000000 B/s on udp port 14580 remote port 14540
INFO  [mavlink] mode: Onboard, data rate: 4000 B/s on udp port 14280 remote port 14030
INFO  [mavlink] mode: Gimbal, data rate: 400000 B/s on udp port 13030 remote port 13280
INFO  [logger] logger started (mode=all)
INFO  [logger] Start file log (type: full)
INFO  [logger] [logger] ./log/2026-02-19/22_44_11.ulg
INFO  [logger] Opened full log file: ./log/2026-02-19/22_44_11.ulg
INFO  [mavlink] MAVLink only on localhost (set param MAV_{i}_BROADCAST = 1 to enable network)
INFO  [mavlink] MAVLink only on localhost (set param MAV_{i}_BROADCAST = 1 to enable network)
INFO  [px4] Startup script returned successfully                  ← clean startup

  ... PX4 ran for 60 seconds (pxh> prompt, ~1M lines suppressed) ...

WARN  [health_and_arming_checks] Preflight Fail: No connection to the GCS
NodeShared::Publish() Error: Interrupted system call              ← SIGTERM from timeout
ERROR [vehicle_imu] 0 - gyro 1310988 timestamp error timestamp_sample: 31228000, previous timestamp_sample: 31228000
ERROR [vehicle_imu] 0 - accel 1310988 timestamp error timestamp_sample: 31228000, previous timestamp_sample: 31228000
PX4 Exiting...
Exiting NOW.                                                      ← clean shutdown on SIGTERM

Log analysis

Item Finding
Startup confirmed INFO [px4] startup script
Gazebo version 8.10.0
World path resolves /opt/px4-gazebo/share/gz/worlds/default.sdf
World loaded Gazebo world is ready
Model spawned gz_bridge world: default, model: x500_0
Logger started ✅ ULG file opened
Startup script success Startup script returned successfully
Ran full 60 seconds ✅ SIGTERM at t=60s
Clean shutdown PX4 Exiting... / Exiting NOW.
gz_frame_id SDF warnings (×4) ⚠️ Benign — unknown XML element copied through by Gazebo
LED: open /dev/led0 failed (22) ⚠️ Expected — no LED device in container
Preflight Fail: ekf2 missing data ⚠️ Expected — Gazebo headless, sensor data not flowing
Preflight Fail: No connection to the GCS ⚠️ Expected — no GCS attached
IMU timestamp errors at shutdown ⚠️ Expected — race condition on SIGTERM
NodeShared::Publish() Interrupted system call ⚠️ Expected — Gazebo IPC interrupted by SIGTERM

All warnings are expected for a headless, GCS-less, 60-second container run. No unexpected ERROR lines during the steady-state run.


4. Verdict

✅ OVERALL PASS

Criterion Result
.deb builds without error ✅ PASS
Filename matches px4-gazebo_*-noble_arm64.deb ✅ PASS
Package metadata correct (Package: px4-gazebo, Gazebo deps) ✅ PASS
All 7 install layout checks pass ✅ PASS
World path resolves via wrapper (/opt/px4-gazebo/share/gz/worlds/default.sdf) ✅ PASS
Gazebo world loads headless ✅ PASS
Model spawns (x500_0) ✅ PASS
Startup script completes successfully ✅ PASS
Ran full 60 seconds ✅ PASS
Clean shutdown on SIGTERM ✅ PASS
No unexpected errors during steady state ✅ PASS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment