Modules Reference: System
Module to provide persistent storage for the rest of the system in form of a simple database through a C API. Multiple backends are supported:
- a file (eg. on the SD card)
- FLASH (if the board supports it)
- RAM (this is obviously not persistent)
It is used to store structured data of different types: mission waypoints, mission state and geofence polygons. Each type has a specific type and a fixed maximum amount of storage items, so that fast random access is possible.
Reading and writing a single item is always atomic. If multiple items need to be read/modified atomically, there is
an additional lock per item type via
DM_KEY_FENCE_POINTS and DM_KEY_SAFE_POINTS items: the first data element is a
which stores the number of items for these types. These items are always updated atomically in one transaction (from
the mavlink mission manager). During that time, navigator will try to acquire the geofence item lock, fail, and will not
check for geofence violations.
dataman <command> [arguments...] Commands: start [-f <val>] Storage file values: <file> [-r] Use RAM backend (NOT persistent) [-i] Use FLASH backend The options -f, -r and -i are mutually exclusive. If nothing is specified, a file 'dataman' is used poweronrestart Restart dataman (on power on) inflightrestart Restart dataman (in flight) stop status print status info
Module to detect the freefall and landed state of the vehicle, and publishing the
Each vehicle type (multirotor, fixedwing, vtol, ...) provides its own algorithm, taking into account various
states, such as commanded thrust, arming state and vehicle motion.
Every type is implemented in its own class with a common base class. The base class maintains a state (landed, maybe_landed, ground_contact). Each possible state is implemented in the derived classes. A hysteresis and a fixed priority of each internal state determines the actual land_detector state.
Multicopter Land Detector
ground_contact: thrust setpoint and velocity in z-direction must be below a defined threshold for time GROUND_CONTACT_TRIGGER_TIME_US. When ground_contact is detected, the position controller turns off the thrust setpoint in body x and y.
maybe_landed: it requires ground_contact together with a tighter thrust setpoint threshold and no velocity in the horizontal direction. The trigger time is defined by MAYBE_LAND_TRIGGER_TIME. When maybe_landed is detected, the position controller sets the thrust setpoint to zero.
landed: it requires maybe_landed to be true for time LAND_DETECTOR_TRIGGER_TIME_US.
The module runs periodically on the HP work queue.
land_detector <command> [arguments...] Commands: start Start the background task fixedwing|multicopter|vtol|ugv Select vehicle type stop status print status info
Background process running periodically with 1 Hz on the LP work queue to calculate the CPU load and RAM
usage and publish the
On NuttX it also checks the stack usage of each process and if it falls below 300 bytes, a warning is output, which will also appear in the log file.
load_mon <command> [arguments...] Commands: start Start the background task stop status print status info
System logger which logs a configurable set of uORB topics and system printf messages
PX4_ERR) to ULog files. These can be used for system and flight performance evaluation,
tuning, replay and crash analysis.
It supports 2 backends:
- Files: write ULog files to the file system (SD card)
- MAVLink: stream ULog data via MAVLink to a client (the client must support this)
Both backends can be enabled and used at the same time.
The implementation uses two threads:
- The main thread, running at a fixed rate (or polling on a topic if started with -p) and checking for data updates
- The writer thread, writing data to the file
In between there is a write buffer with configurable size. It should be large to avoid dropouts.
Typical usage to start logging immediately:
logger start -e -t
Or if already running:
logger <command> [arguments...] Commands: start [-m <val>] Backend mode values: file|mavlink|all, default: all [-e] Enable logging right after start until disarm (otherwise only when armed) [-f] Log until shutdown (implies -e) [-t] Use date/time for naming log directories and files [-r <val>] Log rate in Hz, 0 means unlimited rate default: 280 [-b <val>] Log buffer size in KiB default: 12 [-q <val>] uORB queue size for mavlink mode default: 14 [-p <val>] Poll on a topic instead of running with fixed rate (Log rate and topic intervals are ignored if this is set) values: <topic_name> on start logging now, override arming (logger must be running) off stop logging now, override arming (logger must be running) stop status print status info
This module is used to replay ULog files.
There are 2 environment variables used for configuration:
replay, which must be set to an ULog file name - it's
the log file to be replayed. The second is the mode, specified via
replay_mode=ekf2: specific EKF2 replay mode. It can only be used with the ekf2 module, but allows the replay to run as fast as possible.
- Generic otherwise: this can be used to replay any module(s), but the replay will be done with the same speed as the log was recorded.
The module is typically used together with uORB publisher rules, to specify which messages should be replayed. The replay module will just publish all messages that are found in the log. It also applies the parameters from the log.
The replay procedure is documented on the System-wide Replay page.
replay <command> [arguments...] Commands: start Start replay, using log file from ENV variable 'replay' trystart Same as 'start', but silently exit if no log file given tryapplyparams Try to apply the parameters from the log file stop status print status info
Background process running periodically on the LP work queue to perform housekeeping tasks. It is currently only responsible for temperature calibration.
The tasks can be started via CLI or uORB topics (vehicle_command from MAVLink, etc.).
send_event <command> [arguments...] Commands: start Start the background task temperature_calibration Run temperature calibration process [-g] calibrate the gyro [-a] calibrate the accel [-b] calibrate the baro (if none of these is given, all will be calibrated) stop status print status info
The sensors module is central to the whole system. It takes low-level output from drivers, turns it into a more usable form, and publishes it for the rest of the system.
The provided functionality includes:
- Read the output from the sensor drivers (
sensor_gyro, etc.). If there are multiple of the same type, do voting and failover handling. Then apply the board rotation and temperature calibration (if enabled). And finally publish the data; one of the topics is
sensor_combined, used by many parts of the system.
- Do RC channel mapping: read the raw input channels (
input_rc), then apply the calibration, map the RC channels to the configured channels & mode switches, low-pass filter, and then publish as
- Read the output from the ADC driver (via ioctl interface) and publish
- Make sure the sensor drivers get the updated calibration parameters (scale & offset) when the parameters change or
on startup. The sensor drivers use the ioctl interface for parameter updates. For this to work properly, the
sensor drivers must already be running when
- Do preflight sensor consistency checks and publish the
It runs in its own thread and polls on the currently selected gyro topic.
sensors <command> [arguments...] Commands: start [-h] Start in HIL mode stop status print status info