Taking off with PX4 and Gazebo
flying with an autopilot computer

PX4 is an excellent open source autopilot stack. They have offer Software-in-the-loop(SITL) and hardware-in-the-loop(HITL) simulation out-of-the-box. In addition to that, you can integrate with their simulator using MAVROS in the same you would be talking to a real vehicle. Let’s see the steps to setup PX4 SITL + Gazebo locally.


There are a few scripts to create a development environment on https://dev.px4.io/en/setup/dev_env_linux_ubuntu.html for Ubuntu, and other links for other platforms. After taking a look at the scripts, I decided to try the installation step by step to understand the process better.

First, I cloned the PX4 code:

git clone git@github.com:PX4/Firmware.git

On the installation page, I started following the instructions beginning on Permission Setup

Persmissions and general dependencies

sudo usermod -a - G dialout $USER

This group is described here:

dialout: Full and direct access to serial ports. Members of this group can reconfigure the modem, dial anywhere, etc.

I was not planning of connecting to anything because I want to run the simulator, but I did it anyway.

Then remove the modemmanager as recommended.

sudo apt-get remove modemmanager

There are a few packages we need to install, but I just a few were missing on my system:

sudo apt-get install genromfs exiftool

Required python packages

sudo apt-get install python-argparse python-empy
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'libpython2.7-stdlib' instead of 'python-argparse'
python-empy is already the newest version (3.3.2-1build1).
python-empy set to manually installed.
libpython2.7-stdlib is already the newest version (2.7.12-1ubuntu0~16.04.4).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Both were installed already.

My pip version is 8.1.1, so I needed an update there.

sudo -H pip install --upgrade pip

And then install some packages:

sudo -H pip install pandas jinja2 pyserial cerberus

Also pyylog even it was optional:

sudo -H pip install pyulog

FastRTPS installation

The installation went smothly with the instructions here:

wget http://www.eprosima.com/index.php/component/ars/repository/eprosima-fast-rtps/eprosima-fast-rtps-1-5-0/eprosima_fastrtps-1-5-0-linux-tar-gz -O eprosima_fastrtps-1-5-0-linux.tar.gz
tar -xzf eprosima_fastrtps-1-5-0-linux.tar.gz eProsima_FastRTPS-1.5.0-Linux/
tar -xzf eprosima_fastrtps-1-5-0-linux.tar.gz requiredcomponents
tar -xzf requiredcomponents/eProsima_FastCDR-1.0.7-Linux.tar.gz

It doesn’t need to be in the home directory; it could be anywhere you have space. Make part in the next instruction could take some time, but it is ok. I did the make and configure part one by one, but it can be done as suggested in a single line:

cd eProsima_FastCDR-1.0.7-Linux; ./configure --libdir=/usr/lib; make -j2; sudo make install
cd ..
cd eProsima_FastRTPS-1.5.0-Linux; ./configure --libdir=/usr/lib; make -j2; sudo make install
cd ..
rm -rf requiredcomponents eprosima_fastrtps-1-5-0-linux.tar.gz

ROS/Gazebo dependencies

I have installed a full ROS Kinetic Kane installation; so, I got a few steps done already. Some shared libraries needed for this part were installed already as well(protobuf-compiler, libeigen3-dev and libopencv-dev). I also had installed mavros and mavros-extras; so, I skipped the installation from the source recommended on the instructions

apt-cache pkgnames | grep ros-kinetic-mavros 

Making and running

Installation requirements are done. To run the simulator, we need to pick a model and run a make command that makes the code and run the simulator at the same time. Pick the first target on the documentation and try it:

cd Firmware
make posix_sitl_default gazebo
[  0%] Building CXX object src/lib/DriverFramework/framework/src/CMakeFiles/df_driver_framework.dir/DriverFramework.cpp.o
('python import error: ', ImportError('No module named toml',))

Required python packages not installed.

On a GNU/Linux or MacOS system please run:
  sudo pip install numpy toml


src/lib/mixer/CMakeFiles/mixer_gen.dir/build.make:82: recipe for target 'src/lib/mixer/mixer_multirotor.generated.h' failed
make[4]: *** [src/lib/mixer/mixer_multirotor.generated.h] Error 1
CMakeFiles/Makefile2:4154: recipe for target 'src/lib/mixer/CMakeFiles/mixer_gen.dir/all' failed
make[3]: *** [src/lib/mixer/CMakeFiles/mixer_gen.dir/all] Error 2
make[3]: *** Waiting for unfinished jobs....
('python import error: ', ImportError('No module named toml',))

Required python packages not installed.

On a GNU/Linux or MacOS system please run:
  sudo pip install numpy toml

Got two errors even when:

sudo apt-cache pkgnames | grep python-toml

The package was there. Let’s follow the instruction again:

sudo -H pip install numpy toml
make posix_sitl_default gazebo

This time it works! Gazebo started showing a standing drone waiting for commands:

PX4 first run

Let’s see how the other vehicles look like:

These are just a few of the targets there. They could be listed with make posix list_vmd_make_targets.

As explained on the documentation, you can type on the terminal commander takeoff, and the drone started flying

Everything is set now to command the drone. Let’s create a ROS node and start sending MAVLINK commands.

Happy droning!

Written by Darien Martinez Torres on 18 November 2018