docs/px4_setup.md
The PX4 software stack is an open source very popular flight controller with support for wide variety of boards and sensors as well as built-in capability for higher level tasks such as mission planning. Please visit px4.io for more information.
Warning: While all releases of AirSim are always tested with PX4 to ensure the support, setting up PX4 is not a trivial task. Unless you have at least intermediate level of experience with PX4 stack, we recommend you use simple_flight, which is now a default in AirSim.
The following Pixhawk hardware has been tested with AirSim:
Version 1.11.2 of the PX4 firmware also works on the Pixhawk 4 devices.
For this you will need one of the supported device listed above. For manual flight you will also need RC + transmitter.
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"ClockType": "SteppableClock",
"Vehicles": {
"PX4": {
"VehicleType": "PX4Multirotor",
"UseSerial": true,
"LockStep": true,
"Sensors":{
"Barometer":{
"SensorType": 1,
"Enabled": true,
"PressureFactorSigma": 0.0001825
}
},
"Parameters": {
"NAV_RCL_ACT": 0,
"NAV_DLL_ACT": 0,
"COM_OBL_ACT": 1,
"LPE_LAT": 47.641468,
"LPE_LON": -122.140165
}
}
}
}
Notice the PX4 [simulator] is using TCP, which is why we need to add: "UseTcp": true,. Notice we
are also enabling LockStep, see PX4 LockStep for more information. The
Barometer setting keeps PX4 happy because the default AirSim barometer has a bit too much noise
generation. This setting clamps that down a bit which allows PX4 to achieve GPS lock more quickly.
After above setup you should be able to use a remote control (RC) to fly with AirSim. You can usually arm the vehicle by lowering and bringing two sticks of RC together down and in-wards. You don't need QGroundControl after the initial setup. Typically the Stabilized (instead of Manual) mode gives better experience for beginners. See PX4 Basic Flying Guide.
You can also control the drone from Python APIs.
See Walkthrough Demo Video and Unreal AirSim Setup Video that shows you all the setup steps in this document.
The PX4 SITL mode doesn't require you to have separate device such as a Pixhawk or Pixracer. This is in fact the recommended way to use PX4 with simulators by PX4 team. However, this is indeed harder to set up. Please see this dedicated page for setting up PX4 in SITL mode.
There are a few reasons that can cause this. First, make sure your drone doesn't fall down large distance when starting the simulator. This might happen if you have created a custom Unreal environment and Player Start is placed too high above the ground. It seems that when this happens internal calibration in PX4 gets confused.
You should also use QGroundControl and make sure you can arm and takeoff in QGroundControl properly.
Finally, this also can be a machine performance issue in some rare cases, check your hard drive performance.
Our code is tested with the PX4 firmware. We have not tested Arducopter or other mavlink implementations. Some of the flight API's do use the PX4 custom modes in the MAV_CMD_DO_SET_MODE messages (like PX4_CUSTOM_MAIN_MODE_AUTO)
Check your settings.json file for this line "SerialPort":"*,115200". The asterisk here means "find any serial port that looks like a Pixhawk device, but this doesn't always work for all types of Pixhawk hardware. So on Windows you can find the actual COM port using Device Manager, look under "Ports (COM & LPT), plug the device in and see what new COM port shows up. Let's say you see a new port named "USB Serial Port (COM5)". Well, then change the SerialPort setting to this: "SerialPort":"COM5,115200".
On Linux, the device can be found by running "ls /dev/serial/by-id" if you see a device name listed that looks
like this usb-3D_Robotics_PX4_FMU_v2.x_0-if00 then you can use that name to connect, like this:
"SerialPort":"/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00". Note this long name is actually a symbolic link to the real
name, if you use "ls -l ..." you can find that symbolic link, it is usually something like "/dev/ttyACM0",
so this will also work "SerialPort":"/dev/ttyACM0,115200". But that mapping is similar to windows, it is
automatically assigned and can change, whereas the long name will work even if the actual TTY serial device
mapping changes.
This happens if you try and take off when PX4 still has not computed the home position. PX4 will report the home position once it is happy with the GPS signal, and you will see these messages:
INFO [commander] home: 47.6414680, -122.1401672, 119.99
INFO [tone_alarm] home_set
Up until this point in time, however, the PX4 will reject takeoff commands.
For example, you use DroneShell moveToPosition -z -20 -x 50 -y 0 which it does, but when it gets to the target location the
drone starts to land. This is the default behavior of PX4 when offboard mode completes. To set the drone to hover instead
set this PX4 parameter:
param set COM_OBL_ACT 1
You might need to set MAV_PROTO_VER parameter in QGC to "Always use version 1". Please see this issue more details.