Date: 2026-02-19
Branch: mrpollo/deb-package
Platform: Apple Silicon (aarch64 / arm64)
Fix included: Tools/packaging/px4-gazebo.sh — readlink -f symlink resolution
| 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) |
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)" 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
| 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 |
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>&1Note on
pxh>prompt volume: Without-d, PX4's interactive shell emitspxh>at high frequency to stdout (~1M lines/60 s). The log below is the complete meaningful output with barepxh>prompt lines stripped.
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
| 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) |
|
LED: open /dev/led0 failed (22) |
|
Preflight Fail: ekf2 missing data |
|
Preflight Fail: No connection to the GCS |
|
| IMU timestamp errors at shutdown | |
NodeShared::Publish() Interrupted system call |
All warnings are expected for a headless, GCS-less, 60-second container run. No unexpected ERROR lines during the steady-state run.
| 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 |