Skip to main content

Tools and REST API for configuring PX4 from a companion computer

Project description

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 port and baudrate (defaults /dev/pixhawk, 2000000). SSE responses emit JSON payloads with keys such as type, message, progress, etc.

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

px4_configuration-0.3.1.tar.gz (32.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

px4_configuration-0.3.1-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

File details

Details for the file px4_configuration-0.3.1.tar.gz.

File metadata

  • Download URL: px4_configuration-0.3.1.tar.gz
  • Upload date:
  • Size: 32.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for px4_configuration-0.3.1.tar.gz
Algorithm Hash digest
SHA256 73db642a3f5cec25d929887a546ce0a3c758aeb708a23a223c765c8dc0339365
MD5 7348d1314626b69ca1f5fefb48e9d99f
BLAKE2b-256 e246b3096372eb33ec6c4efd22b7dc8c639eccc234976242001273a1f0f63771

See more details on using hashes here.

File details

Details for the file px4_configuration-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for px4_configuration-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e218defd28a23a29e08b7a6dcfad1e9f7ed7f59782f819780870d3979ef5531b
MD5 f8299d42a3b345194c078d5c292c683b
BLAKE2b-256 1ade740bdbb694c97658c0377bd7f53411176dc7d47a9d8e3636d058c3a66462

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page