此示例示出了如何使用MATLAB一个MAVLink参数协议和与外部地面控制站通信。样品参数协议提供了一种使用MAVLink通信协议从一个模拟无人驾驶飞行器(UAV)发送参数更新一个地面控制站。在安装两个MAVLink元件,UAV和地面控制站之间的通信。然后,您发送和接收参数更新调整参数值的无人机。最后,如果你使用QGroundControl©作为一个地面控制站,你可以从这些QGroundControl参数更新,看看他们是体现在程序窗口。
MAVLink客户使用通常定义的数据结构作为消息在网络中交换信息。MAVLink参数协议用于UAV和地面控制站(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”,“本地端口”,uavPort);
创建一个模拟地面控制站(GCS),一个不同的UDP端口上监听。
gcsNode = mavlinkio(方言);gcsPort = 14560;连接(gcsNode,“UDP”,“本地端口”,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
。描述参数协议的工作流程有四种GCS操作。列出的每个消息类型都有一个简短的说明,说明消息根据指定的参数协议执行哪些操作。
PARAM_REQUET_LIST
:从接收方请求所有参数。所有值广播使用PARAM_VALUE
消息。
PARAM_REQUEST_READ
:请求单个参数。使用a广播指定的参数值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'
。这些值表示为滚动,俯仰和偏航以每秒度UAV的最大速率。在实际的无人机系统,这些利率可以调整,调整或多或少杂技控制性能。
从无人机系统读取的所有参数,发送“PARAM_REQUEST_LIST”
从消息gcsNode
至uavNode
。是操作的顺序如下:
GCS节点发送消息,其题目是“PARAM_REQUEST_LIST”
到UAV节点,使用上面定义的uavClient指定目标系统和组件。
UAV节点以“PARAM_VALUE”
消息,由于我们在GCS节点上有一个订阅了主题“PARAM_VALUE”的订阅方,消息有效负载将立即显示。
味精= createmsg(方言,“PARAM_REQUEST_LIST”);
将系统和组件ID的值赋给消息use(:)=
索引,以确保分配不改变结构字段的数据类型。
msg.Payload.target_system (:) = uavNode.LocalClient.SystemID;msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;
将参数请求发送给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消息node.Send对“消息PARAM_REQUEST_READ”
主题到UAVnode。指定参数索引为0,它引用“MAX_ROLL_RATE”
参数。此索引值查询第一个参数值。
UAV将更新后的参数发送为PARAM_VALUE”
消息返回到GCS节点。因为我们设置了订阅服务器“PARAM_VALUE”
在GCS节点上,该消息的有效负载被显示给命令窗口。
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,味精,“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度更新UAV的最大横摆率。
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,味精,“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如何展示给我们的模拟UAV的访问参数:
下载并启动QGroundControl。限定qgcPort
编号为14550,这是QGroundControl应用程序的默认UDP端口。
创建心跳消息。
从无人机节点发送心跳消息QGroundControl使用MATLAB计时器
对象。默认情况下,计时器
对象执行TimerFcn
每1秒。的TimerFcn
是一个sendudpmsg
发送心跳消息的调用。
一旦QGroundControl接收来自模拟UAV心跳,QGroundControl创建一个参数面板插件供用户读取和更新UAV参数
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 ='固定利率';heartbeatTimer。TimerFcn= @(~,~)sendudpmsg(uavNode,heartbeat,'127.0.0.1',qgcPort);开始(heartbeatTimer);
当计时器运行时,QGroundControl显示它已经收到了“心脏野兽”消息,并连接到无人机上。在车辆设置选项卡,单击其它>其它要查看设置的参数值,请查看应用程序。
注意:因为我们使用一个通用的自动驾驶仪类型,“MAV_AUTOPILOT_GENERIC”
,QGroundControl无法识别连接作为已知自动驾驶仪的类型。这不会影响连接,如图所示的参数值仍然应该更新。
与QGroundControl参数试验部件后,停止heartbeatTimer
停止发送任何更多的心跳消息。删除heartbeatTimer
和paramProtocol
对象。最后,断开无人机和GCS节点清理系统之间的通信。
停止(heartbeatTimer);删除(heartbeatTimer);删除(paramProtocol);断开(uavNode);断开(gcsNode);