这个例子展示了如何在MATLAB中使用MAVLink参数协议与外部地面控制站进行通信。提供了一个参数协议样本,用于使用MAVLink通信协议从模拟无人机(UAV)向地面控制站发送参数更新。你设置两个MAVLink组件之间的通信,无人机和地面控制站。然后,发送和接收参数更新以调整无人机的参数值。最后,如果你使用QGroundControl©作为地面控制站,您可以从QgroundControl获取这些参数更新,并在程序窗口中反映它们。
Mavlink客户端使用通常定义的数据结构作为消息交换网络中的信息。Mavlink参数协议用于在UAV和地面控制站(GCS)之间交换配置设置。参数协议遵循客户端 - 服务器模式。例如,GCS以消息的形式启动请求,并且UAV响应数据。
Mavlink消息在XML文件中定义。对所有系统共同的标准消息在“common.xml“
文件。特定于供应商的消息存储在单独的XML文件中。对于此示例,使用“common.xml“
文件来设置MAVLink客户端之间的通用方言。
dialect = mavlinkdialect(“common.xml”);
此方言用于创建Mavlinkio
可以了解方言中的消息的对象。
创建一个Mavlinkio
对象表示模拟的UAV。指定systemid.
那componentId.
那AutoPilotType
,ComponentType.
参数为名称值对。对于此示例,我们使用通用自动驾驶仪类型,'mav_autopilot_generic'
,具有四元组件类型,'mav_type_quadrotor'
。
Uavnode = Mavlinkio(方言,'systemid',1,'componentId',1,......'autopilottype'那“mav_autopilot_generic”那'componentype'那“mav_type_quadrotor”);
模拟的UAV正在侦听传入消息的UDP端口。使用使用的连接到此UDP端口uavNode
目的。
uavport = 14750;连接(UAVNode,“UDP”那'localport',uavport);
创建一个模拟地面控制站(GCS)监听不同的UDP端口。
gcsnode = mavlinkio(方言);gcsport = 14560;连接(GCSnode,“UDP”那'localport',gcsport);
设置模拟UAV的客户端界面以与地面控制站通信。得到localclient.
作为结构的信息,并指定系统和组件ID信息mavlinkclient.
目的。
clientstruct = Uavnode.LocalClient;Uavclient = mavlinkclient(gcsnode,clientstruct.systemid,clientstruct.componentid);
创建一个mavlinksub
对象接收消息并使用回调处理这些消息。此订阅者在“PARAM_VALUE”
主题,并专门查找符合系统和组件ID的消息uavClient
。指定回调函数以显示所接收的每条新邮件的有效载荷。
paramvaluesub = mavlinksub(gcsnode,uavclient,“PARAM_VALUE”那'缓冲区大小'10,......'newmessagefcn',@(〜,msg)disp(msg.payload));
现在你已经建立了无人机和地面控制站之间的连接。您现在可以使用参数协议中定义的操作查询和更新模拟无人机配置,exampleHelperMAVParamProtocol
。有4个GCS操作描述了参数协议的工作流程。列出的每个消息类型都有一个简要说明消息基于指定的参数协议执行该消息。
PARAM_REQUET_LIST
:请求来自收件人的所有参数。所有值都是使用的param_value.
消息。
PARAM_REQUEST_READ
:请求单个参数。使用a广播指定的参数值param_value.
信息。
PARAM_SET
:命令设置特定参数的值。设置值后,使用a广播当前值param_value消息
。
param_value.
:响应上述请求广播参数的当前值(param_request_list.
那PARAM_REQUEST_READ
或PARAM_SET
)。
paramprotocol = examplehelpermavparamprotocol(UaVnode);
此参数协议有三个参数值:'max_roll_rate'
那'max_pitch_rate'
,'max_yaw_rate'
。这些值表示UAV以每秒度为单位的卷尺,间距和偏航的最大速率。在真实的UAV系统中,可以调整这些速率以调整可用于更宽或更少杂技控制的性能。
要从UAV系统中读取所有参数,请发送“param_request_list“
消息从gcsNode
到uavNode
。操作顺序如下:
GCS节点发送一个主题为param_request_list“
使用如上定义的UAVClient指定目标系统和组件的UAV节点。
UAV节点以“撰写”单独发出所有参数param_value“
消息,因为我们在注册主题'param_value'的gcs节点上有一个订阅者,消息有效载荷立即显示。
msg = createmsg(方言,“param_request_list”);
将系统和组件ID分配给消息的值,使用(,) =
索引以确保分配不会更改结构字段数据类型。
msg.Payload.target_system (:) = uavNode.LocalClient.SystemID;msg.payload.target_component(:) = Uavnode.Localclient.ComponentId;
将参数请求发送到UAV,该请求在本地主机IP地址处侦听端口'127.0.0.1'
。暂停以允许处理消息。参数列表显示在“命令”窗口中。
sendudpmsg(gcsnode,msg,“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_count: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“
对UAVnode的主题。指定0的参数索引,这是指的'max_roll_rate'
范围。此索引值查询第一个参数值。
UAV将更新的参数发送为“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,msg,“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度来更新UAV的最大偏航速率。
味精= 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,msg,“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的UAV执行飞行控制和任务规划。您可以使用QgroundControl作为GCS来演示如何访问我们模拟的UAV的参数:
下载并启动QgroundControl。定义qgcPort
数字为14550,这是QgroundControl应用程序的默认UDP端口。
创建心跳消息。
使用MATLAB向QgroundControl发送从UAV节点的心跳消息计时器
目的。默认情况下,计时器
对象执行TimerFcn
每1秒。这TimerFcn
是A.sendudpmsg
呼叫发送心跳消息。
QgroundControl从模拟的UAV接收心跳后,QgroundControl为用户创建一个参数面板小部件,以读取和更新UAV参数
qgcport = 14550;Heartbeat = 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 =.'固定利率';heartbeattimer.timerfcn = @(〜,〜)sendudpmsg(Uavnode,心跳,'127.0.0.1',qgcport);开始(心脏比特米);
虽然计时器运行,QgroundControl显示它已收到HeartBeast消息并连接到无人机。在里面车辆设置选项卡,单击其他> Misc要查看参数值集在应用中反映。
笔记:因为我们使用的是普通的自动驾驶仪,“mav_autopilot_generic”
,QgroundControl无法识别连接作为已知的自动驾驶仪类型。这不会影响连接,并且参数值仍应如图所示更新。
在试验了QGroundControl参数小部件之后,停止心脏比特米尔
停止发送任何心跳消息。删除心脏比特米尔
和paramProtocol.
对象。最后,断开无人机和GCS节点,清理系统之间的通信。
停止(心脏比特米);删除(心脏跳动器);删除(ParamProtocol);断开(UVnode);断开连接(GCSnode);