主要内容

使用MAVLink参数协议调整无人机参数

这个例子展示了如何在MATLAB™中使用MAVLink参数协议,并与外部地面控制站进行通信。提供了一个参数协议样本,用于使用MAVLink通信协议从模拟无人机(UAV)向地面控制站发送参数更新。你建立了两个MAVLink组件之间的通信,无人机和地面控制站。然后,发送和接收参数更新以调整无人机的参数值。最后,如果您使用QGroundControl©作为地面控制站,您可以从QGroundControl获得这些参数更新,并在程序窗口中看到它们的反映。

参数协议

MAVLink客户端使用通常定义的数据结构作为消息在网络内交换信息。MAVLink参数协议用于无人机与地面控制站(GCS)之间交换配置设置。参数协议遵循客户机-服务器模式。例如,GCS以消息的形式发起请求,UAV用数据进行响应。

建立通用方言

MAVLink消息在XML文件中定义。所有系统通用的标准消息定义在“common.xml”文件。其他特定于供应商的消息存储在单独的XML文件中。在本例中,使用“common.xml”文件来设置MAVLink客户端之间的通用方言。

方言= mavlinkdialect (“common.xml”);

这种方言被用来创造mavlinkio对象可以理解方言中的信息。

建立无人机连接

创建一个mavlinkio对象表示模拟的无人机。指定SystemIDComponentIDAutoPilotType,组件类型参数作为名称-值对。在这个例子中,我们使用一个通用的自动驾驶仪类型,“MAV_AUTOPILOT_GENERIC”,带有四旋翼组件类型,“MAV_TYPE_QUADROTOR”

uavNode = mavlinkio(方言,“SystemID”,1,“ComponentID”,1,...“AutopilotType”“MAV_AUTOPILOT_GENERIC”的组件类型“MAV_TYPE_QUADROTOR”);

模拟无人机正在UDP端口上监听传入的消息。连接到这个UDP端口使用uavNode对象。

uavPort = 14750;连接(uavNode“UDP”“LocalPort”, uavPort);

建立GCS连接

创建一个模拟地面控制站(GCS)监听不同的UDP端口。

gcsNode = mavlinkio(方言);gcsPort = 14560;连接(gcsNode“UDP”“LocalPort”, gcsPort);

设置客户端和订阅服务器

设置一个客户端接口,用于模拟无人机与地面控制站通信。得到了LocalClient将系统和组件ID信息指定为结构mavlinkclient对象。

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

创建一个mavlinksub对象接收消息并使用回调处理这些消息。此订阅者在“PARAM_VALUE”的系统和组件ID匹配的消息uavClient.指定一个回调函数来显示接收到的每个新消息的有效负载。

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

参数操作

现在你已经建立了无人机和地面控制站之间的连接。您现在可以使用参数协议中定义的操作查询和更新模拟无人机配置,exampleHelperMAVParamProtocol.共有4个GCS操作描述了参数协议的工作流。列出的每个消息类型都有一个简短的描述,根据指定的参数协议消息要执行什么。

  1. PARAM_REQUET_LIST:向收件人请求所有参数。使用PARAM_VALUE消息。

  2. PARAM_REQUEST_READ:请求单个参数。指定的参数值使用PARAM_VALUE消息。

  3. PARAM_SET:设置具体参数值的命令。设置值后,使用PARAM_VALUE消息

  4. PARAM_VALUE:广播参数的当前值以响应上述请求(PARAM_REQUEST_LISTPARAM_REQUEST_READPARAM_SET)。

paramProtocol = exampleHelperMAVParamProtocol (uavNode);

该参数协议有三个参数值:“MAX_ROLL_RATE”“MAX_PITCH_RATE”,“MAX_YAW_RATE”.这些值代表无人机的最大滚转、俯仰和偏航速率,单位为每秒度。在真实的无人机系统中,这些速率可以被调整以调整性能或多或少的杂技控制。

阅读所有参数

要读取无人机系统的所有参数,请发送PARAM_REQUEST_LIST”消息从gcsNodeuavNode

  1. GCS节点发送一个主题为PARAM_REQUEST_LIST”到无人机节点,使用如上定义的uavClient指定目标系统和组件。

  2. 无人机节点以“”的形式单独发送所有参数PARAM_VALUE”消息,由于我们在GCS节点上有一个订阅了主题'PARAM_VALUE'的订阅者,消息有效负载将立即显示出来。

味精= createmsg(方言,“PARAM_REQUEST_LIST”);

将系统和组件ID的值分配到消息中,使用(,) =索引以确保赋值不会改变结构字段数据类型。

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

将参数请求发送给正在侦听本地主机IP地址的端口的UAV“127.0.0.1”.暂停以允许处理消息。在命令窗口中显示参数列表。

sendudpmsg (gcsNode、味精、“127.0.0.1”uavPort)暂停(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

读单参数

通过发送一个PARAM_REQUEST_READ”消息从GCS节点发送给UAV节点。在“PARAM_REQUEST_READ”主题到uav节点。指定参数索引0,指的是“MAX_ROLL_RATE”参数。这个索引值查询第一个参数值。

无人机将更新后的参数发送为PARAM_VALUE”消息返回给GCS节点。因为我们设置了“PARAM_VALUE”在GCS节点上,消息有效负载将显示到命令窗口。

味精= createmsg (gcsNode。方言,“PARAM_REQUEST_READ”);msg.Payload.param_index (:) = 0;msg.Payload.target_system (:) = uavNode.LocalClient.SystemID;msg.Payload.target_component (:) = uavNode.LocalClient.ComponentID;sendudpmsg (gcsNode、味精、“127.0.0.1”, uavPort);暂停(1);
param_value: 90 param_count: 3 param_index: 0 param_id: 'MAX_ROLL_RATE ' param_type: 9

写参数

要编写参数,请发送“PARAM_SET”消息从GCS节点到无人机节点。属性指定消息的ID、类型和值并使用gcsNode对象。UAV发送回更新后的参数值,GCS订阅者显示消息有效负载。这条消息更新了无人机的最大偏航率,降低到每秒45度。

味精= createmsg (gcsNode。方言,“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、味精、“127.0.0.1”, uavPort);暂停(1);
param_value: 45 param_count: 3 param_index: 2 param_id: 'MAX_YAW_RATE ' param_type: 9

使用QGroundControl

QGroundControl©是一个应用程序,用于执行飞行控制和任务规划任何mavlink支持的无人机。您可以使用QGroundControl作为GCS来演示如何访问我们的模拟无人机的参数:

  1. 下载并启动QGroundControl。定义qgcPort编号为14550,这是QGroundControl应用程序的默认UDP端口。

  2. 创建心跳消息。

  3. 利用MATLAB将无人机节点的心跳信息发送给QGroundControl计时器对象。默认情况下,计时器对象执行TimerFcn每1秒。的TimerFcn是一个sendudpmsg发送心跳消息的调用。

  4. 一旦QGroundControl接收到来自模拟无人机的心跳,QGroundControl创建一个参数面板小部件供用户读取和更新无人机参数

qgcPort = 14550;心跳= createmsg(方言,“心跳”);heartbeat.Payload.type (:) = enum2num(方言,“MAV_TYPE”, uavNode.LocalClient.ComponentType);heartbeat.Payload.autopilot (:) = enum2num(方言,“MAV_AUTOPILOT”, uavNode.LocalClient.AutopilotType);heartbeat.Payload.system_status (:) = enum2num(方言,“MAV_STATE”“MAV_STATE_STANDBY”);heartbeatTimer =定时器;heartbeatTimer。ExecutionMode =“fixedRate”;heartbeatTimer。TimerFcn= @(~,~)sendudpmsg(uavNode,heartbeat,“127.0.0.1”, qgcPort);开始(heartbeatTimer);

当计时器运行时,QGroundControl显示它已经收到了心脏兽信息,并与一架无人机相连。在车辆设置选项卡上,单击其他> Misc查看设置的参数值是否反映在应用程序中。

注意:因为我们使用的是普通的自动驾驶仪,“MAV_AUTOPILOT_GENERIC”, QGroundControl不识别该连接为已知的自动驾驶类型。这不会影响连接,参数值仍然会更新,如下所示。

MAVLink密切联系

在试验了QGroundControl参数小部件之后,停止heartbeatTimer停止发送任何心跳消息。删除heartbeatTimerparamProtocol对象。最后,断开无人机和GCS节点,清理系统之间的通信。

停止(heartbeatTimer);删除(heartbeatTimer);删除(paramProtocol);断开(uavNode);断开(gcsNode);