Talking to a PX4 FMU with a RPi via Serial. #noUSB #ArduNope

A guide by a n00b for a n00b. Henceforth: RPi = Raspberry Pi

Click here.


Seriously, I know you saw that wiring diagram with the red line between the Pixyhawk and the Raspberry Pi that’s being stealth edited out all over the place. Will it F your FMU? I dunno, sometimes grabbing that big capacitor doesn’t hurt by why take the chance? You’ll need a BEC to power the RPi.

..and here.

DON’T CONNECT Tx to Tx and/or Rx to Rx.

Did you see that other Pixyhawk/RPi post where they did that? I did :frowning:
It’s bad. because reasons:

  1. Configuring the serial on the RPi

    • Install Raspbian via NOOBS

    • Enable SSH

    • Most RPi’s have two UARTs (serial) which it uses and if you tell it not to it gives you the shitty one of the two. So. Go here, ctrl-F " Disabling Linux’s use of console UART", and disable Linux’s use of console UART. If your RPi has bluetooth, murder it by editing config.txt with $ sudo nano /boot/config.txt and add the line: dtoverlay=disable-bt to the end of the file, then double murder it with $ sudo systemctl disable hciuart

    • reboot

    • The serial port we are going to use is now: /dev/serial0 all other ttys are just imitating.

  2. Make a connection.

    • Aquire solder skillz
    • Aquire wires and connectors.
    • Make thing that connects the RPi UART to TELEM 2 on your flight controller.
      • GND (Pin 6) to GND
      • TXD (Pin 8) to RXD
      • RXD (Pin 10) to TXD
  3. Install/build MAVSDK (This gonna suck)

    • We’re going to build this on the RPi if you know how to cross compile and have it work then wtf are you doing here?

    • Get the RPi ready for the pain:

      • $ sudo apt update
      • $ sudo apt upgrade <-- Upgrade all the things
      • $ sudo apt install python3-pip
    • Go here and Follow the ‘Building SDK from Source’ instructions for ‘Linux’. Step 5 will take a while so get a drink or four then finish with cmake --build build/default then drink some more.

    • Install system-wide as described.

    • Now we’re going to build the “backend” that will be needed by MAVSDK-Python becasue you’re a n00b and as far as we’re concerned c++ is c+=1. If you follow the instructions the configuration(?) will fail and you’ll cry so do this instead:

      • Go to the MAVSDK directory.
      • $ sudo cmake -DBUILD_BACKEND=ON --symlink-install --cmake-args "-DCMAKE_SHARED_LINKER_FLAGS='-latomic'" "-DCMAKE_EXE_LINKER_FLAGS='-latomic'" -Bbuild/default -H.
      • $ sudo cmake --build build/default
      • Take note, the file mavsdk_server that you will need for MAVSDK-Python is in the totally obvious directory: MAVSDK/build/default/src/backend/src/
  4. Install MAVSDK-Python

    • Grab a beer or three and go here. Scroll down to “Build and run from sources” and follow along from there. You might have an issue when you try $ which protoc-gen-dcsdk and nothing shows up. In that case you’ll have to add /usr/local/bin/ to your PATH. I’d explain but I forgot how to do that.

    • You tried $ pip3 install mavsdk, didn’t you?

    • Copy that mavskd_server file into MAVSDK-Python/mavsdk/bin/

  5. Give it a whirl

    • Use that fancy connector to connect the RPi UART to TELEM 2 on your flight controller.

    • In QGroundControl set MAV_2_CONFIG to TELEM 2 and reboot the flight controller. (The baud rate is probably going to default to 921600 which you can check by looking at SER_TEL2_BAUD in QGroundControl)

    • I assume you can SSH into your RPi at this point over WiFi and probably already have. If not, you should do that now. Then go to the MAVSDK-Python directory and cd examples/. From there we are going to edit an example with $ sudo nano and replace the await drone.connect... line with:

      await drone.connect(system_address=“serial:///dev/serial0:921600”)

    • Now cross your fingers and type (while still in the examples directory) $ python3 If all went well you should see something like:

      Waiting for mavsdk_server to be ready…
      Connected to mavsdk_server!
      Waiting for drone to connect…
      Drone discovered with UUID: 8670068434521822000
      Version: [flight_sw_major: 1, flight_sw_minor: 10, flight_sw_patch: 0, flight_sw_vendor_major: 0, flight_sw_vendor_minor: 0, flight_sw_vendor_patch: 0, os_sw_major: 7, os_sw_minor: 29, os_sw_patch: 0]

If you just see it hang at Waiting for drone to connect... then a bad thing happed somewhere. Sorry bro.

  1. Install MAVLINK Router (Optional)

    • Quick and dirty because Im tired:

      • Clone this repo and $ cd mavlink-router/
      • $ git submodule update --init --recursive
      • $ sudo apt install python-future
      • $ sudo apt install python3-future
      • $ sudo apt install libtool
      • $ sudo apt install autoconf
      • $ sudo -s <-- root shell (yes rlly)
      • # ./ && ./configure CFLAGS='-g -O2' \ --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib \ --prefix=/usr
      • # make
      • # make install
    • Example main.conf file:

   #Mavlink-router serves on this TCP port

[UartEndpoint alpha]

[UdpEndpoint bravo]

Goodnight you Princes of Maine, you Kings of New England!


Nice report! This reminds me that we should really try to get a python wheel for RPi on PyPi, so that you could just pip install mavsdk there as well :innocent:


A follow up to the issue with $ which protoc-gen-dcsdk not showing up in $PATH.

I used $ sudo find / -name protoc-gen-dcsdk to find the directory that contained protoc-gen-dcsdk (in my case it was: /home/pi/.local/bin/) I then added that directory to $PATH with the command $ export PATH=$PATH:<path to protoc-gen-dcsdk>. After that I was all set.

Quirks (Part 1?):

The RPi Zero W uses armv6 and has issues with libatomic which is why I added (read: looked up error on google and copied soln) the `-latomic’ flags for the MAVSDK build. For other RPi with armv7 + this might not be needed.

The RPi 3 A+ does not have enough memory to build MAVSDK which I didn’t realize until just now. If I have a free USB port on my RPi I usually put a low profile flash drive in and make it swap which solves memory issues and I suspect helps take load off the SD card. (

Hi I get this error while doing:pip3 install -r requirements.txt -r requirements-dev.txt:
Collecting protobuf>=3.5.1 Using cached ERROR: Could not find a version that satisfies the requirement aiogrpc>=1.5 (from -r requirements.txt (line 2)) (from versions: none) ERROR: No matching distribution found for aiogrpc>=1.5 (from -r requirements.txt (line 2))

This might work:
sudo apt install python3-pip
sudo pip3 install aiogrpc


Seems familiar, I might have run into the same issue at some point :confused:

sudo apt install python3-pip shows:
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3-pip is already the newest version.

And sudo pip3 install aiogrpc shows:
Collecting aiogrpc
Could not find a version that satisfies the requirement aiogrpc (from versions: )
No matching distribution found for aiogrpc
You are using pip version 9.0.1, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

I tried using a venv:

pi@raspberrypi:~ $ python3 -m venv venv
pi@raspberrypi:~ $ source venv/bin/activate
(venv) pi@raspberrypi:~ $ pip3 install aiogrpc
Downloading/unpacking aiogrpc
Downloading aiogrpc-1.7-py3-none-any.whl
Downloading/unpacking grpcio>=1.12.0 (from aiogrpc)
Downloading grpcio-1.26.0.tar.gz (15.4MB): 15.4MB downloaded
Running (path:/tmp/pip-build-e7jz0yfr/grpcio/ egg_info for package grpcio
Found cython-generated files...
error in grpcio setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers
Complete output from command python egg_info:
Found cython-generated files...

error in grpcio setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers

Cleaning up...
Command python egg_info failed with error code 1 in /tmp/pip-build-e7jz0yfr/grpcio
Storing debug log for failure in /home/pi/.pip/pip.log

Im not sure, but, the consensus online seems to be to try “upgrading setuptools” with:
pip3 install --upgrade setuptools