Skip to main content

px4-configuration

Repository that collects scripts to configure and modify PX4 from a companion Linux computer. All tooling is built on top of MAVSDK-Python.

Installation

Development Installation

# Optional: create a virtual environment
python3 -m venv .venv
source .venv/bin/activate

# Install the package (installs all required dependencies)
pip install -e .

Building a Wheel Package

To build a distributable wheel (.whl) file:

# Install build tools (if not already installed)
pip install build

# Build the wheel package
python -m build --wheel

# The wheel file will be created in the dist/ directory
# Example: dist/px4_configuration-0.1.0-py3-none-any.whl

To build both wheel and source distribution:

python -m build

Installing from a built wheel:

# Install from the wheel file
pip install dist/px4_configuration-0.1.0-py3-none-any.whl

Requirements

  • Python 3.10+
  • PX4 flight controller connected over serial (e.g. /dev/pixhawk)
  • User added to the dialout group for serial access (sudo usermod -aG dialout $USER)

Scripts

All scripts use a serial connection to talk to PX4.

  • scripts/calibrate.py – run gyro, accel, mag, level and (future) ESC calibration
  • scripts/set-params.py – bulk upload parameters from .params files in configs/
  • scripts/upload-sdcard-config.py – upload files (e.g. extras.txt) to the PX4 SD card via MAVLink FTP
  • scripts/shell.py – open an interactive PX4 NSH shell session over MAVLink
  • scripts/px_uploader.py – PX4 firmware uploader (original PX4 script, unverified here)

REST API (FastAPI)

The companion computer can expose the same functionality through a REST API located in the px4_configuration.api package.

Run the API server

# Using the packaged console script
px4-config-api --host 0.0.0.0 --port 8000

# Or via the helper module
python run_api.py

# Or directly with uvicorn
uvicorn px4_configuration.api.main:app --host 0.0.0.0 --port 8000

Endpoints

  • GET /health – health check
  • POST /calibration/start – start selected calibrations, returns Server-Sent Events (SSE) with progress
  • POST /params/upload – upload a .params file (multipart form), SSE progress stream
  • POST /sdcard/upload – upload a file (e.g. extras.txt) to the SD card, SSE progress stream
  • WS /shell/connect – interactive PX4 shell over WebSocket

All endpoints accept optional system_address, port, and baudrate.

  • If system_address is provided (or PX4_SYSTEM_ADDRESS is set), it is used first.
  • Otherwise, serial fallback uses port + baudrate (defaults /dev/pixhawk, 2000000). SSE responses emit JSON payloads with keys such as type, message, progress, etc.

When sharing PX4 with multiple consumers (e.g. ROS package + this API), run mavlink-router as the only serial owner and connect this API over UDP:

export PX4_SYSTEM_ADDRESS="udp://:14550"
px4-config-api --host 0.0.0.0 --port 8000

Use listener form udp://:PORT for MAVSDK when router forwards packets to a local UDP port.

Calibration Message Structure

The /calibration/start endpoint returns structured JSON messages via Server-Sent Events (SSE). Each calibration type has a specific message format:

Accelerometer Calibration

The /calibration/start endpoint returns structured JSON messages via Server-Sent Events (SSE). Each calibration type has a specific message format:

{
  "type": "accelerometer_progress",
  "progress": 0.17,
  "status_text": "down side result: [0.020 0.819 -9.750]",
  "pending_orientations": ["back", "front", "left", "right", "up"],
  "current_orientation": "down",
  "current_message": "measuring",
  "result": [0.020, 0.819, -9.750],
  "is_complete": false
}

Fields:

  • pending_orientations: List of remaining orientations to measure (e.g., ["back", "front", "left", "right", "up"])
  • current_orientation: Currently detected orientation being measured (e.g., "down", "left")
  • current_message: Instruction type - "hold_still", "rest_detected", "measuring", "rotate", "orientation_detected", "already_completed", "complete"
  • progress: Progress value (0.0 to 1.0)
  • result: Measurement result array [x, y, z] when available
  • is_complete: Boolean indicating completion

Completion message:

{
  "type": "accelerometer_complete",
  "message": "Accelerometer calibration finished",
  "is_complete": true
}

Magnetometer Calibration

{
  "type": "magnetometer_progress",
  "progress": 0.33,
  "status_text": "right orientation detected",
  "pending_orientations": ["back", "front", "left", "up"],
  "current_orientation": "right",
  "current_message": "orientation_detected",
  "is_complete": false
}

Fields:

  • pending_orientations: List of remaining orientations to measure
  • current_orientation: Currently detected orientation
  • current_message: Instruction type - "rotate", "hold_still", "rest_detected", "motion_detected", "orientation_detected", "already_completed", "complete"
  • progress: Progress value (0.0 to 1.0) that increments during rotation
  • is_complete: Boolean indicating completion (true when progress >= 1.0)

Completion message:

{
  "type": "magnetometer_complete",
  "message": "Magnetometer calibration finished",
  "is_complete": true
}

Gyroscope Calibration

{
  "type": "gyroscope_progress",
  "progress": 0.5,
  "status_text": null,
  "current_message": "calibrating",
  "is_complete": false
}

Fields:

  • progress: Progress value (0.0 to 1.0)
  • current_message: "calibrating" during progress, "complete" when done
  • is_complete: Boolean indicating completion (true when progress >= 1.0)

Completion message:

{
  "type": "gyroscope_complete",
  "message": "Gyroscope calibration finished",
  "is_complete": true
}

Level Horizon Calibration

{
  "type": "horizon_progress",
  "progress": 0.4,
  "status_text": null,
  "current_message": "calibrating",
  "is_complete": false
}

Fields:

  • progress: Progress value (0.0 to 1.0)
  • current_message: "calibrating" during progress, "complete" when done
  • is_complete: Boolean indicating completion (true when progress >= 1.0)

Completion message:

{
  "type": "horizon_complete",
  "message": "Level horizon calibration finished",
  "is_complete": true
}

Status Messages

General status messages are also emitted:

{
  "type": "status",
  "message": "Starting accelerometer calibration..."
}
{
  "type": "error",
  "message": "Calibration failed: <error details>"
}
{
  "type": "success",
  "message": "All calibrations completed"
}

Notes

  • Ensure the vehicle is disarmed and stationary before running calibration or parameter uploads.
  • The API and scripts require serial access; add your user to the dialout group if needed.
  • Example parameter files and extras.txt live under the configs/ directory.

Metadata

Release files for px4-configuration 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for px4-configuration 0.3.3
File Size Uploaded Provenance Actions
px4_configuration-0.3.3.tar.gz 71.8 kB Without provenance Details for px4_configuration-0.3.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for px4-configuration 0.3.3
File Interpreter ABI Platform Actions
px4_configuration-0.3.3-py3-none-any.whl Python 3 none any Details for px4_configuration-0.3.3-py3-none-any.whl

Total release size: 101.4 kB

Release files / px4_configuration-0.3.3.tar.gz

Download URL px4_configuration-0.3.3.tar.gz
Size 71.8 kB
Tags Source
SHA-256 checksum
How to use checksums
9e189548b549959fcf1bebb96346094b94fd4288fd5e29df4c37699907cbaa9f
BLAKE2b-256 checksum
How to use checksums
4571b8904c0603cb3222733d6dfbfef06b7e3e686d66e82a936c0875b3b7f414
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / px4_configuration-0.3.3-py3-none-any.whl

Download URL px4_configuration-0.3.3-py3-none-any.whl
Size 29.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f2e0392f80a544be51b31f78fd10400842f7a9f04e3330a3c6260c5def360ca1
BLAKE2b-256 checksum
How to use checksums
60f6b26936aef71bdee56d50f8f5d3e67e6cac1ffefce7efb5904d84acbe7840
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Security for px4-configuration 0.3.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page