A remote system will typically stream a default set of messages to a connected GCS, camera or other system. This default set may be hard coded, and is necessarily limited to reduce traffic on the channel.
A system can request that additional messages are sent as a stream, or change the rate at which existing streamed messages are sent, using the MAV_CMD_SET_MESSAGE_INTERVAL command. A single instance of a message can be requested by sending MAV_CMD_REQUEST_MESSAGE.
The example below shows how you can request the BATTERY_STATUS message is streamed at the rate of 1Hz, by sending
MAV_CMD_SET_MESSAGE_INTERVAL in a COMMAND_LONG. Because this is a command, we then wait for a
COMMAND_ACK to be recieved with the matching command id, and then display the result. Note that you could equally well send the command in a COMMAND_INT, if supported by the flight stack.
""" Example: Set that a message is streamed at particular rate """ from pymavlink import mavutil # Start a connection listening on a UDP port connection = mavutil.mavlink_connection('udpin:localhost:14551') # Wait for the first heartbeat to set the system and component ID of remote system for the link connection.wait_heartbeat() print("Heartbeat from system (system %u component %u)" % (connection.target_system, connection.target_component)) # Define command_long_encode message to send MAV_CMD_SET_MESSAGE_INTERVAL command # param1: MAVLINK_MSG_ID_BATTERY_STATUS (message to stream) # param2: 1000000 (Stream interval in microseconds) message = connection.mav.command_long_encode( connection.target_system, # Target system ID connection.target_component, # Target component ID mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL, # ID of command to send 0, # Confirmation mavutil.mavlink.MAVLINK_MSG_ID_BATTERY_STATUS, # param1: Message ID to be streamed 1000000, # param2: Interval in microseconds 0, # param3 (unused) 0, # param4 (unused) 0, # param5 (unused) 0, # param5 (unused) 0 # param6 (unused) ) # Send the COMMAND_LONG connection.mav.send(message) # Wait for a response (blocking) to the MAV_CMD_SET_MESSAGE_INTERVAL command and print result response = connection.recv_match(type='COMMAND_ACK', blocking=True) if response and response.command == mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL and response.result == mavutil.mavlink.MAV_RESULT_ACCEPTED: print("Command accepted") else: print("Command failed")