这个例子展示了如何在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
对象表示模拟的无人机。指定SystemID
,ComponentID
,AutoPilotType
,组件类型
参数作为名称-值对。在这个例子中,我们使用一个通用的自动驾驶仪类型,“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)监听不同的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操作描述了参数协议的工作流。列出的每个消息类型都有一个简短的描述,根据指定的参数协议消息要执行什么。
PARAM_REQUET_LIST
:向收件人请求所有参数。使用PARAM_VALUE
消息。
PARAM_REQUEST_READ
:请求单个参数。指定的参数值使用PARAM_VALUE
消息。
PARAM_SET
:设置具体参数值的命令。设置值后,使用PARAM_VALUE消息
.
PARAM_VALUE
:广播参数的当前值以响应上述请求(PARAM_REQUEST_LIST
,PARAM_REQUEST_READ
或PARAM_SET
)。
paramProtocol = exampleHelperMAVParamProtocol (uavNode);
该参数协议有三个参数值:“MAX_ROLL_RATE”
,“MAX_PITCH_RATE”
,“MAX_YAW_RATE”
.这些值代表无人机的最大滚转、俯仰和偏航速率,单位为每秒度。在真实的无人机系统中,这些速率可以被调整以调整性能或多或少的杂技控制。
要读取无人机系统的所有参数,请发送PARAM_REQUEST_LIST”
消息从gcsNode
来uavNode
.
GCS节点发送一个主题为PARAM_REQUEST_LIST”
到无人机节点,使用如上定义的uavClient指定目标系统和组件。
无人机节点以“”的形式单独发送所有参数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©是一个应用程序,用于执行飞行控制和任务规划任何mavlink支持的无人机。您可以使用QGroundControl作为GCS来演示如何访问我们的模拟无人机的参数:
下载并启动QGroundControl。定义qgcPort
编号为14550,这是QGroundControl应用程序的默认UDP端口。
创建心跳消息。
利用MATLAB将无人机节点的心跳信息发送给QGroundControl计时器
对象。默认情况下,计时器
对象执行TimerFcn
每1秒。的TimerFcn
是一个sendudpmsg
发送心跳消息的调用。
一旦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不识别该连接为已知的自动驾驶类型。这不会影响连接,参数值仍然会更新,如下所示。
在试验了QGroundControl参数小部件之后,停止heartbeatTimer
停止发送任何心跳消息。删除heartbeatTimer
和paramProtocol
对象。最后,断开无人机和GCS节点,清理系统之间的通信。
停止(heartbeatTimer);删除(heartbeatTimer);删除(paramProtocol);断开(uavNode);断开(gcsNode);