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
dialoutgroup 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 calibrationscripts/set-params.py– bulk upload parameters from.paramsfiles inconfigs/scripts/upload-sdcard-config.py– upload files (e.g.extras.txt) to the PX4 SD card via MAVLink FTPscripts/shell.py– open an interactive PX4 NSH shell session over MAVLinkscripts/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 checkPOST /calibration/start– start selected calibrations, returns Server-Sent Events (SSE) with progressPOST /params/upload– upload a.paramsfile (multipart form), SSE progress streamPOST /sdcard/upload– upload a file (e.g.extras.txt) to the SD card, SSE progress streamWS /shell/connect– interactive PX4 shell over WebSocket
All endpoints accept optional system_address, port, and baudrate.
- If
system_addressis provided (orPX4_SYSTEM_ADDRESSis set), it is used first. - Otherwise, serial fallback uses
port+baudrate(defaults/dev/pixhawk,2000000). SSE responses emit JSON payloads with keys such astype,message,progress, etc.
Using with mavlink-router (recommended for multi-client setups)
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 availableis_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 measurecurrent_orientation: Currently detected orientationcurrent_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 rotationis_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 doneis_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 doneis_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
dialoutgroup if needed. - Example parameter files and
extras.txtlive under theconfigs/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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.