Home        Store        Docs        Blog

Doubts in pymavlink


I am using ubuntu 16.04 OS in my topside computer. The topside computer has an IP address I have installed python2 and mavproxy in this computer. It is connected using ethernet to a raspberry pi whose IP is The raspberry pi has been connected to pixhwk and latest ardusub software has been installed in it. As given in pymavlink page in ardusub, I followed the same code to “Run pyMavlink on the surface computer”. I wrote the code in some text editor, saved it as ‘file.py’ and tried to execute this file in the python shell. I didn’t get any output. Actually when I run he file, actually the vehicle information should come below the line . I have also checked by writing each line of the code individually in the python shell. Still I didn’t get any information from the vehicle(pixhawk). Am I following the correct steps? My doubt is whether, is this the way to send or receive mavlink messages using python? Please reply.


Are you running the script with QGroundControl open ?
The script provides a small explanation about this:

# Create the connection
#  If using a companion computer
#  the default connection is available
#  at ip and the port 14550
# Note: The connection is done with 'udpin' and not 'udpout'.
#  You can check in http: that the communication made for 14550
#  uses a 'udpbcast' (client) and not 'udpin' (server).
#  If you want to use QGroundControl in parallel with your python script,
#  it's possible to add a new output port in http: as a new line.
#  E.g: --out udpbcast:

Also, can you check if the communication between your surface computer and the ROV is working with QGroundControl ? If QGC is not working, you should fix your connection configuration/hardware before running the script.

The topside computer is connected to raspberry pi through an ethernet cable. I had installed python-pip, python-future and pymavlink in my topside computer, along with python 2.7.12. I followed the commands given in the ardusub page ‘https://www.ardusub.com/developers/pymavlink.html’. For eg, if I wanted to send RC values to my vehicle, the command given in the page is as given below.

Import mavutil

from pymavlink import mavutil

Create the connection

master = mavutil.mavlink_connection(‘udpin:’)

Wait a heartbeat before sending commands


Create a function to send RC values

More information about Joystick channels

here: https://www.ardusub.com/operators-manual/rc-input-and-output.html#rc-inputs

def set_rc_channel_pwm(id, pwm=1500):
“”" Set RC channel pwm value
id (TYPE): Channel ID
pwm (int, optional): Channel pwm value 1100-1900
if id < 1:
print(“Channel does not exist.”)

# We only have 8 channels
if id < 9:
    rc_channel_values = [65535 for _ in range(8)]
    rc_channel_values[id - 1] = pwm
        master.target_system,                # target_system
        master.target_component,             # target_component
        *rc_channel_values)                  # RC channel list, in microseconds.

Set some roll

set_rc_channel_pwm(2, 1600)

Set some yaw

set_rc_channel_pwm(4, 1600)

The camera pwm value is the servo speed

and not the servo position

Set camera tilt to 45º with full speed

set_rc_channel_pwm(8, 1900)

The main doubt lies within the code. Here we gave a certain PWM value to each channel which implies we are setting the PWM value for yaw, roll etc which are the RC channel inputs. Now suppose, if I want the whole ardusub vehicle to move up/down, If I give the input " Vehicle up/down", all the thrusters which makes the vehicle to move up/down, should receive the PWM(it may be thruster2, thruster 3, thruster5) and these thruster should spin. Is it possible in ardusub using pymavlink. if so, How do I need to change the code?
Looking forward for your reply,

Thanking you,


This example, as the comments explain, points how to send RC pwm values to the vehicle.
If you want to send Throttle, you should check the rc-inputs link in the example and use the channel that deals with Throttle information (channel number 3).