A companion computer operates as a “companion” to the flight controller (such as ArduPilot or PX4) on an autonomous vehicle. It performs higher level, more complex tasks that enhance the overall capability of the vehicle.

Typically, the flight controller is a microcontroller (such as the STM32). It takes in raw sensor data, calculates the vehicle’s attitude/position and then commands the servos and motors according to a desired position and attitude. This could be “hover in place”, “go to this location” and so on.

These microcontrollers tend to be very limited in terms of CPU, RAM and stored memory. A typical flight controller might have a 100MHz processor, 512 Kb of RAM and 2 Mb of stored (flash) memory.

A companion computer, on the other hand, will typically have a multi-core 1GHz processor, >1 GB of RAM and 10’s of GB of stored (flash) memory.

The companion computer receives telemetry data from the flight controller. It then uses that data (sometimes with other attached sensors) to calculate and send high-level commands to the flight controller. For example, the companion computer might command the flight controller to fly the vehicle to the location of an object detected by an attached camera. The below diagram shows this layout.

Layout of a flight Controller and companion computer
Layout of a flight Controller and companion computer. Note the flight controller has direct access to the sensors and motor/servo outputs, whereas the companion computer does not.

What can I do with a Companion Computer?

A companion computer has moderate computational power and numerous interfaces (such as USB and Ethernet). These can be used for capturing and processing data from devices attached to these interfaces.

There are two major classes of devices. First are payload devices (such as cameras and LIDAR) that collect data. Second are communications devices (such as 4G modems and long range Wi-Fi) for long range monitoring and control.

Some examples of use cases include:

Interfacing the Companion Computer with the Flight Controller

On the hardware side, UARTs are used to pass data between the companion computer and flight controller. Flight controllers often label these as Telemetry ports. At a minimum, they consist of two data lines (transmit and receive) and ground. Some may also provide flow control (RTS/CTS lines), but this is typically optional.

Boards such as the Pi-Connect assist with hardware interfacing by including power converters and the correct type of telemetry port.

MAVLink is the protocol used for reading telemetry and issuing commands for flight controllers using ArduPilot. The commands can include high-level commands such as takeoff and landing. oll/pitch/yaw/throttle (RC) commands can be issued.

MAVLink is available in a number of different language bindings. This includes Python (most common), C, C# and JavaScript. Some higher level libraries (such as dronekit, pymavlink and MAVProxy) can provide a simpler interface over the top of MAVLink.

For integration with ROS, there are specific setups available online.

Examples of Companion Computers

Companion computers are typically small, low powered devices. Examples of this include the Raspberry Pi, Odroid and NVIDIA boards such as the Jetson Nano and TX2.

Larger vehicles can use larger (and more powerful) companion computers such as the Intel NUCs.

Choosing a suitable companion computer can depend on the following factors:

  • Size and weight
  • Power consumption
  • Interfaces (ports) for the specific payload or sensors wanting to be used
  • Computational speed. This is important in SLAM or image processing applications where a powerful CPU and large amounts of RAM are required
  • Software support. Some boards (such as the Raspberry Pi) have a large ecosystem of pre-built software applications and support forums