# System Startup
The PX4 startup is controlled by shell scripts. On NuttX they reside in the ROMFS/px4fmu_common/init.d (opens new window) folder - some of these are also used on Posix (Linux/MacOS). The scripts that are only used on Posix are located in ROMFS/px4fmu_common/init.d-posix (opens new window).
All files starting with a number and underscore (e.g.
10000_airplane) are predefined airframe configurations.
They are exported at build-time into an
airframes.xml file which is parsed by QGroundControl (opens new window) for the airframe selection UI.
Adding a new configuration is covered here.
The remaining files are part of the general startup logic. The first executed file is the init.d/rcS (opens new window) script (or init.d-posix/rcS (opens new window) on Posix), which calls all other scripts.
The following sections are split according to the operating system that PX4 runs on.
# Posix (Linux/MacOS)
On Posix, the system shell is used as script interpreter (e.g. /bin/sh, being symlinked to dash on Ubuntu). For that to work, a few things are required:
PX4 modules need to look like individual executables to the system. This is done via symbolic links. For each module a symbolic link
px4-<module> -> px4is created in the
bindirectory of the build folder. When executed, the binary path is checked (
argv), and if it is a module (starts with
px4-), it sends the command to the main px4 instance (see below).
px4-prefix is used to avoid conflicts with system commands (e.g.
shutdown), and it also allows for simple tab completion by typing
The shell needs to know where to find the symbolic links. For that the
bindirectory with the symbolic links is added to the
PATHvariable right before executing the startup scripts.
The shell starts each module as a new (client) process. Each client process needs to communicate with the main instance of px4 (the server), where the actual modules are running as threads. This is done through a UNIX socket (opens new window). The server listens on a socket, to which clients can connect and send a command. The server then sends the output and return code back to the client.
The startup scripts call the module directly, e.g.
commander start, rather than using the
px4-prefix. This works via aliases: for each module an alias in the form of
alias <module>=px4-<module>is created in the file
rcSscript is executed from the main px4 instance. It does not start any modules, but first updates the
PATHvariable and then simply runs a shell with the
rcSfile as argument.
In addition to that, multiple server instances can be started for multi-vehicle simulations. A client selects the instance via
--instance. The instance is available in the script via
The modules can be executed from any terminal when PX4 is already running on a system. For example:
cd <PX4-Autopilot>/build/px4_sitl_default/bin ./px4-commander takeoff ./px4-listener sensor_accel
# Dynamic modules
Normally, all modules are compiled into a single PX4 executable.
However, on Posix, there's the option of compiling a module into a separate file, which can be loaded into PX4 using the
NuttX has an integrated shell interpreter (NuttShell (NSH) (opens new window)), and thus scripts can be executed directly.
# Debugging the System Boot
A failure of a driver of software component will not lead to an aborted boot.
This is controlled via
set +e in the startup script.
The boot sequence can be debugged by connecting the system console and power-cycling the board. The resulting boot log has detailed information about the boot sequence and should contain hints why the boot aborted.
# Common boot failure causes
- For custom applications: The system was out of RAM. Run the
freecommand to see the amount of free RAM.
- A software fault or assertion resulting in a stack trace
# Replacing the System Startup
In most cases customizing the default boot is the better approach, which is documented below. If the complete boot should be replaced, create a file
/fs/microsd/etc/rc.txt, which is located in the
etc folder on the microSD card. If this file is present nothing in the system will be auto-started.
# Customizing the System Startup
The best way to customize the system startup is to introduce a new airframe configuration. If only tweaks are wanted (like starting one more application or just using a different mixer) special hooks in the startup can be used.
:::caution The system boot files are UNIX FILES which require UNIX LINE ENDINGS. If editing on Windows use a suitable editor. :::
There are three main hooks. Note that the root folder of the microsd card is identified by the path
# Customizing the Configuration (config.txt)
config.txt file can be used to modify shell variables.
It is loaded after the main system has been configured and before it is booted.
# Starting additional applications
extras.txt can be used to start additional applications after the main system boot.
Typically these would be payload controllers or similar optional custom components.
:::caution Calling an unknown command in system boot files may result in boot failure. Typically the system does not stream mavlink messages after boot failure, in this case check the error messages that are printed on the system console. :::
The following example shows how to start custom applications:
- Create a file on the SD card
etc/extras.txtwith this content:
- A command can be made optional by gating it with the
set +e optional_app start # Will not result in boot failure if optional_app is unknown or fails set -e mandatory_app start # Will abort boot if mandatory_app is unknown or fails
# Starting a custom mixer
By default the system loads the mixer from
If a file with the same name exists in
/fs/microsd/etc/mixers this file will be loaded instead.
This allows to customize the mixer file without the need to recompile the Firmware.
The following example shows how to add a custom aux mixer:
- Create a file on the SD card,
etc/mixers/gimbal.aux.mixwith your mixer content.
- Then to use it, create an additional file
etc/config.txtwith this content:
set MIXER_AUX gimbal set PWM_AUX_OUT 1234 set PWM_AUX_DISARMED 1500 set PWM_AUX_MIN 1000 set PWM_AUX_MAX 2000 set PWM_AUX_RATE 50