Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Utilice un protocolo de parámetros MAVLink para ajustar los parámetros UAV en MATLAB

Este ejemplo muestra cómo utilizar un protocolo de parámetros MAVLink en MATLAB y comunicarse con estaciones de control de tierra externas. Se proporciona un protocolo de parámetros de ejemplo para enviar actualizaciones de parámetros desde un vehículo aéreo no tripulado (UAV) simulado a una estación de control en tierra mediante protocolos de comunicación MAVLink. La comunicación entre los dos componentes MAVLink, el UAV y la estación de control de tierra. A continuación, envíe y reciba actualizaciones de parámetros para ajustar los valores de los parámetros para el UAV. Por último, si utiliza © como estación de control de tierra, puede obtener estas actualizaciones de parámetros de QGroundControl y verlas reflejadas en la ventana del programa.QGroundControl

Protocolo de parámetros

Los clientes MAVLink intercambian información dentro de la red utilizando estructuras de datos comúnmente definidas como mensajes. El protocolo de parámetros MAVLink se utiliza para intercambiar los ajustes de configuración entre UAV y la estación de control de tierra (GCS). El protocolo parameter sigue un patrón cliente-servidor. Por ejemplo, GCS inicia una solicitud en forma de mensajes y el UAV responde con datos.

Configurar dialecto común

Los mensajes MAVLink se definen en un archivo XML. Los mensajes estándar que son comunes a todos los sistemas se definen en el archivo ".common.xml" Otros mensajes específicos del proveedor se almacenan en archivos XML independientes. Para este ejemplo, utilice el archivo " para configurar un dialecto común entre los clientes MAVLink.common.xml"

dialect = mavlinkdialect("common.xml");

Este dialecto se utiliza para crear objetos que pueden entender mensajes dentro del dialecto.mavlinkio

Configuración de la conexión UAV

Cree un objeto para representar un UAV simulado.mavlinkio Especifique los parámetros , , y como pares nombre-valor.SystemIDComponentIDAutoPilotTypeComponentType Para este ejemplo, usamos un tipo de piloto automático genérico, , con un tipo de componente quadrotor, .'MAV_AUTOPILOT_GENERIC''MAV_TYPE_QUADROTOR'

uavNode = mavlinkio(dialect,'SystemID',1,'ComponentID',1, ...     'AutopilotType',"MAV_AUTOPILOT_GENERIC",'ComponentType',"MAV_TYPE_QUADROTOR");

El UAV simulado está escuchando en un puerto UDP para los mensajes entrantes. Conéctese a este puerto UDP utilizando el objeto.uavNode

uavPort = 14750; connect(uavNode,"UDP",'LocalPort',uavPort);

Configurar la conexión GCS

Cree una estación de control de tierra simulada (GCS) que escuche en un puerto UDP diferente.

gcsNode = mavlinkio(dialect); gcsPort = 14560; connect(gcsNode,"UDP", 'LocalPort', gcsPort);

Configurar cliente y suscriptor

Configure una interfaz de cliente para que el UAV simulado se comunique con la estación de control de tierra. Obtenga la información como una estructura y especifique la información de ID de sistema y componente en el objeto.LocalClientmavlinkclient

clientStruct = uavNode.LocalClient; uavClient = mavlinkclient(gcsNode,clientStruct.SystemID,clientStruct.ComponentID);

Cree un objeto para recibir mensajes y procesaresos mediante una devolución de llamada.mavlinksub Este suscriptor recibe mensajes sobre el tema y busca específicamente los mensajes que coinciden con el sistema y el ID de componente de .'PARAM_VALUE'uavClient Se especifica una función de devolución de llamada para mostrar la carga de cada nuevo mensaje recibido.

paramValueSub = mavlinksub(gcsNode,uavClient,'PARAM_VALUE','BufferSize',10,...                             'NewMessageFcn', @(~,msg)disp(msg.Payload));

Operaciones de parámetros

Ahora que ha configurado las conexiones entre el UAV y la estación de control de tierra. Ahora puede consultar y actualizar la configuración de UAV simulada mediante operaciones definidas en el protocolo de parámetros, .exampleHelperMAVParamProtocol Hay 4 operaciones GCS que describen el flujo de trabajo del protocolo de parámetros. Cada tipo de mensaje enumerado tiene una breve descripción de lo que el mensaje ejecuta en función del protocolo de parámetros especificado.

  1. :PARAM_REQUET_LIST Solicita todos los parámetros de los destinatarios. Todos los valores se transmiten mediante mensajes.PARAM_VALUE

  2. :PARAM_REQUEST_READ Solicita un único parámetro. El valor del parámetro especificado se transmite mediante un mensaje.PARAM_VALUE

  3. :PARAM_SET Comandos para establecer el valor del parámetro específico. Después de configurar el valor, el valor actual se transmite mediante un archivo .PARAM_VALUE message

  4. :PARAM_VALUE Difunde el valor actual de un parámetro en respuesta a las solicitudes anteriores ( , o ).PARAM_REQUEST_LISTPARAM_REQUEST_READPARAM_SET

paramProtocol = exampleHelperMAVParamProtocol(uavNode);

Este protocolo de parámetros tiene tres valores de parámetro: , , y .'MAX_ROLL_RATE''MAX_PITCH_RATE''MAX_YAW_RATE' Estos valores representan la velocidad máxima para el rollo, el tono y la guioguis para el UAV en grados por segundo. En un sistema UAV real, estas velocidades se pueden ajustar para ajustar el rendimiento para un control más o menos acrobático.

Leer todos los parámetros

Para leer todos los parámetros de un sistema UAV, envíe un mensaje " desde a .PARAM_REQUEST_LIST"gcsNodeuavNode La secuencia de operaciones es la siguiente:

  1. El nodo GCS envía un mensaje cuyo tema es " al nodo UAV que especifica el sistema de destino y el componente mediante uavClient como se definió anteriormente.PARAM_REQUEST_LIST"

  2. El nodo UAV envía todos los parámetros individualmente en forma de " mensajes, ya que tenemos un suscriptor en el nodo GCS que está suscrito al tema 'PARAM_VALUE', la carga útil del mensaje se muestra de inmediato.PARAM_VALUE"

msg = createmsg(dialect,"PARAM_REQUEST_LIST");

Asigne valores para el sistema y el ID de componente en el mensaje, utilice la indexación para asegurarse de que la asignación no cambia el tipo de datos del campo struct.(:)=

msg.Payload.target_system(:) = uavNode.LocalClient.SystemID; msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

Envíe la solicitud de parámetro al UAV, que está escuchando en un puerto en la dirección IP del host local.'127.0.0.1' Pausa para permitir que se procese el mensaje. La lista de parámetros se muestra en la ventana de comandos.

sendudpmsg(gcsNode,msg,"127.0.0.1",uavPort) pause(1);
    param_value: 90     param_count: 3     param_index: 0        param_id: 'MAX_ROLL_RATE   '      param_type: 9      param_value: 90     param_count: 3     param_index: 1        param_id: 'MAX_YAW_RATE    '      param_type: 9      param_value: 90     param_count: 3     param_index: 2        param_id: 'MAX_PITCH_RATE  '      param_type: 9 

Leer parámetro único

Lea un único parámetro enviando un mensaje " desde el nodo GCS al nodo UAV. Envíe un mensaje sobre el tema " al nodo UAVnode.PARAM_REQUEST_READ"PARAM_REQUEST_READ" Especifique el índice de parámetro sin 0, que hace referencia al parámetro.'MAX_ROLL_RATE' Este valor de índice consulta el primer valor de parámetro.

El UAV envía el parámetro actualizado como un mensaje " de vuelta al nodo GCS.PARAM_VALUE" Porque configuramos un suscriptor al nodo en el GCS, la carga útil del mensaje se visualiza a la ventana de comandos."PARAM_VALUE"

msg = createmsg(gcsNode.Dialect,"PARAM_REQUEST_READ"); msg.Payload.param_index(:) = 0; msg.Payload.target_system(:) = uavNode.LocalClient.SystemID; msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;  sendudpmsg(gcsNode,msg,"127.0.0.1",uavPort); pause(1);
    param_value: 90     param_count: 3     param_index: 0        param_id: 'MAX_ROLL_RATE   '      param_type: 9 

Parámetros de escritura

Para escribir un parámetro, envíe un mensaje desde el nodo GCS al nodo UAV."PARAM_SET" Especifique el identificador, el tipo y el valor del mensaje y envíelo mediante el objeto.gcsNode El UAV envía el valor del parámetro actualizado detrás y el suscriptor GCS visualiza la carga útil del mensaje. Este mensaje actualiza la velocidad máxima de guias del UAV reduciéndolo a 45 grados por segundo.

msg = createmsg(gcsNode.Dialect,"PARAM_SET"); msg.Payload.param_id(1:12) = "MAX_YAW_RATE"; msg.Payload.param_type(:) = 9; msg.Payload.param_value(:) = 45; msg.Payload.target_system(:) = uavNode.LocalClient.SystemID; msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;  sendudpmsg(gcsNode,msg,"127.0.0.1", uavPort); pause(1);
    param_value: 45     param_count: 3     param_index: 2        param_id: 'MAX_YAW_RATE    '      param_type: 9 

Trabajar con QGroundControl

© es una aplicación que se utiliza para realizar el control de vuelo y la planificación de misiones para cualquier UAV habilitado para MAVLink.QGroundControl Puede utilizar QGroundControl como GCS para demostrar cómo acceder a los parámetros de nuestro UAV simulado:

  1. Descargue e inicie QGroundControl. Defina el número como 14550, que es el puerto UDP predeterminado para la aplicación QGroundControl.qgcPort

  2. Cree un mensaje de latido.

  3. Envíe un mensaje de latido desde el nodo UAV a QGroundControl mediante el objeto MATLAB.timer De forma predeterminada, el objeto ejecuta cada 1 segundo.timerTimerFcn Es una llamada que envía el mensaje de latido.TimerFcnsendudpmsg

  4. Una vez que QGroundControl recibe los latidos del UAV simulado, QGroundControl crea un widget de panel Parámetro para que el usuario lea y actualice los parámetros de UAV

qgcPort = 14550; heartbeat = createmsg(dialect,"HEARTBEAT"); heartbeat.Payload.type(:) = enum2num(dialect,'MAV_TYPE',uavNode.LocalClient.ComponentType); heartbeat.Payload.autopilot(:) = enum2num(dialect,'MAV_AUTOPILOT',uavNode.LocalClient.AutopilotType); heartbeat.Payload.system_status(:) = enum2num(dialect,'MAV_STATE',"MAV_STATE_STANDBY");  heartbeatTimer = timer; heartbeatTimer.ExecutionMode = 'fixedRate'; heartbeatTimer.TimerFcn = @(~,~)sendudpmsg(uavNode,heartbeat,'127.0.0.1',qgcPort); start(heartbeatTimer);

Mientras se ejecuta el temporizador, QGroundControl muestra que ha recibido el mensaje de la bestia del corazón y está conectado a un UAV. En la pestaña, haga clic para ver que los valores de parámetro establecidos se reflejan en la aplicación.Vehicle SetupOtros > Miscelásto

Dado que usamos un tipo de piloto automático genérico, QGroundControl no reconoce la conexión como un tipo de piloto automático conocido.Nota:"MAV_AUTOPILOT_GENERIC" Esto no afecta a la conexión y los valores de parámetro deben actualizarse como se muestra.

Cerrar conexiones MAVLink

Después de experimentar con el widget de parámetro QGroundControl, detenga el para detener el envío de más mensajes de latido.heartbeatTimer Elimine los objetos y los.heartbeatTimerparamProtocol Finalmente, desconecte los nodos UAV y GCS para limpiar la comunicación entre sistemas.

stop(heartbeatTimer); delete(heartbeatTimer); delete(paramProtocol);  disconnect(uavNode); disconnect(gcsNode);