该示例演示了如何在MATLAB中使用MAVLink参数协议并与外部地面控制站通信。提供了一个用于从模拟无人机(UAV)发送参数更新的示例参数协议使用MAVLink通信协议发送到地面控制站。设置两个MAVLink组件(无人机和地面控制站)之间的通信。然后,发送和接收参数更新,以调整无人机的参数值。最后,如果使用地面控制©作为一个地面控制站,你可以从QGroundControl得到这些参数的更新,并看到它们反映在程序窗口中。
MAVLink客户端使用通常定义的数据结构作为消息在网络内交换信息。MAVLink参数协议用于无人机与地面控制站(GCS)之间交换配置设置。参数协议遵循客户机-服务器模式。例如,GCS以消息的形式发起请求,UAV用数据进行响应。
MAVLink消息在XML文件中定义。所有系统通用的标准消息在“common.xml”
文件。其他特定于供应商的消息存储在单独的XML文件中。对于本例,请使用““common.xml”
文件来设置MAVLink客户端之间的通用方言。
方言= mavlinkdialect (“common.xml”);
这个方言是用来创造马夫林基奥
可以理解方言中消息的对象。
创建一个马夫林基奥
对象来表示模拟的无人机。指定SystemID
,ComponentID
,自动驾驶仪类型
和组件类型
参数作为名称-值对。在这个例子中,我们使用一个通用的自动驾驶仪类型,“MAV\u自动驾驶仪\u通用”
,具有四转子组件类型,“MAV_TYPE_QUADROTOR”
.
uavNode=mavlinkio(方言,“SystemID”1.“ComponentID”1....“AutopilotType”,“MAV_自动驾驶仪_通用”,“组件类型”,“MAV_TYPE_QUADROTOR”);
模拟UAV正在UDP端口上侦听传入消息。使用uavNode
对象。
uavPort = 14750;连接(uavNode“UDP”,“LocalPort”, uavPort);
创建在不同UDP端口上侦听的模拟地面控制站(GCS)。
gcsNode = mavlinkio(方言);gcsPort = 14560;连接(gcsNode“UDP”,“LocalPort”, gcsPort);
设置一个客户端接口,用于模拟无人机与地面控制站通信。得到了网络带宽
将系统和组件ID信息指定为结构mavlinkclient
对象。
clientStruct=uavNode.LocalClient;uavClient=mavlinkclient(gcsNode,clientStruct.SystemID,clientStruct.ComponentID);
创建一个mavlinksub
对象接收消息并使用回调处理这些消息。此订阅服务器通过“参数值”
主题,并专门查找与的系统和组件ID匹配的消息UAV客户
.指定回调函数以显示接收到的每个新消息的有效负载。
paramValueSub = mavlinksub (gcsNode uavClient,“参数值”,“BufferSize”10...“NewMessageFcn”,@(~,msg)disp(msg.Payload));
现在您已经设置了UAV和地面控制站之间的连接。现在您可以使用参数协议中定义的操作查询和更新模拟UAV配置,示例helpermavparamprotocol
。有4个GCS操作描述参数协议的工作流程。列出的每种消息类型都简要描述了消息基于指定参数协议执行的内容。
参数需求列表
:从收件人请求所有参数。所有值都使用PARAM_VALUE
消息。
参数请求读取
:请求单个参数。使用PARAM_VALUE
消息
参数集
:设置具体参数值的命令。设置值后,使用参数值消息
.
PARAM_VALUE
:广播参数的当前值以响应上述请求(参数请求列表
,参数请求读取
或参数集
).
paramProtocol=示例HelperMapParamProtocol(uavNode);
此参数协议有三个参数值:“最大滚动率”
,“MAX_PITCH_RATE”
和“MAX_YAW_RATE”
.这些值代表无人机的最大滚转、俯仰和偏航速率,单位为每秒度。在一个真实的无人机系统中,这些速率可以被调整以调整性能或多或少的杂技控制。
要读取无人机系统的所有参数,请发送PARAM_REQUEST_LIST”
来自gcsNode
来uavNode
.操作顺序如下:
GCS节点发送主题为“的消息”PARAM_REQUEST_LIST”
到UAV节点,使用上面定义的UAV客户端指定目标系统和组件。
UAV节点以“无人机”的形式单独发送所有参数PARAM_VALUE”
消息,因为我们在GCS节点上有一个订阅者,该订阅者订阅了主题“PARAM_VALUE”,因此消息有效负载将立即显示。
msg=createmsg(方言,“参数请求列表”);
将系统和组件ID的值分配到消息中,使用(:)=
索引以确保赋值不会改变结构字段数据类型。
msg.Payload.target_system(:)=uavNode.LocalClient.SystemID;msg.Payload.target_组件(:)=uavNode.LocalClient.ComponentID;
向UAV发送参数请求,UAV正在监听本地主机IP地址的端口“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”
主题。指定参数索引0,该索引引用“最大滚动率”
参数。此索引值查询第一个参数值。
UAV将更新后的参数发送为“PARAM_VALUE”
返回到GCS节点的消息。因为我们为“PARAM_VALUE”
在GCS节点上,消息有效负载将显示到命令窗口。
msg=createmsg(gcsNode.dialogue,“参数请求读取”);msg.Payload.param_index (:) = 0;msg.Payload.target_system(:)=uavNode.LocalClient.SystemID;msg.Payload.target_组件(:)=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节点到UAV节点的消息。指定消息的ID、类型和值,并使用gcsNode
对象。UAV发送回更新后的参数值,GCS订阅者显示消息有效负载。这条消息更新了无人机的最大偏航率,降低到每秒45度。
msg=createmsg(gcsNode.dialogue,“PARAM_SET”);消息有效载荷参数id(1:12)=“最大横摆率”;msg.Payload.param_type(:)=9;msg.Payload.param_value(:)=45;msg.Payload.target_system(:)=uavNode.LocalClient.SystemID;msg.Payload.target_组件(:)=uavNode.LocalClient.ComponentID;sendudpmsg(gcsNode,msg,"127.0.0.1"暂停(1);
param_value: 45 param_count: 3 param_index: 2 param_id: 'MAX_YAW_RATE ' param_type: 9
地面控制©是一个应用程序,用于执行飞行控制和任务规划任何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_自动驾驶仪”,uavNode.LocalClient.AutopilotType);heartbeat.Payload.system_status(:)=enum2num(方言,“马夫州”,“MAV_状态_备用”);heartbeatTimer =定时器;heartbeatTimer。ExecutionMode =“fixedRate”; heartbeatTimer.TimerFcn=@(~,~)sendudpmsg(uavNode,heartbeat,“127.0.0.1”,qgcPort);启动(心跳定时器);
计时器运行时,QGroundControl显示它已收到heartbeast消息并连接到UAV车辆设置选项卡上,单击其他>杂项查看应用程序中反映的参数值集。
注意:因为我们使用的是通用自动驾驶仪类型,“MAV_自动驾驶仪_通用”
, QGroundControl不识别该连接为已知的自动驾驶类型。这不会影响连接,参数值仍然会更新,如下所示。
在试用QGroundControl参数小部件后,停止心跳计时器
停止发送更多心跳消息。删除心跳计时器
和副协议
最后,断开无人机和地面军事系统节点的连接,以清理系统之间的通信。
停止(heartbeatTimer);删除(heartbeatTimer);删除(paramProtocol);断开连接(uavNode);断开连接(gcsNode);