在MATLAB中使用MAVLink参数协议来调整无人机的参数

此示例示出了如何使用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的ComponentIDAutoPilotType,组件类型参数名称 - 值对。在这个例子中,我们使用一个通用的自动驾驶仪类型,“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连接

创建一个模拟地面控制站(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操作。列出的每个消息类型都有一个简短的说明,说明消息根据指定的参数协议执行哪些操作。

  1. PARAM_REQUET_LIST:从接收方请求所有参数。所有值广播使用PARAM_VALUE消息。

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

  3. PARAM_SET:命令来设置特定参数的值。设定值后,电流值是使用广播PARAM_VALUE消息

  4. PARAM_VALUE:广播参数的当前值,以回应上述要求(PARAM_REQUEST_LISTPARAM_REQUEST_READ要么PARAM_SET)。

paramProtocol = exampleHelperMAVParamProtocol (uavNode);

该参数协议有三个参数值:“MAX_ROLL_RATE”'MAX_PITCH_RATE','MAX_YAW_RATE'。这些值表示为滚动,俯仰和偏航以每秒度UAV的最大速率。在实际的无人机系统,这些利率可以调整,调整或多或少杂技控制性能。

阅读所有参数

从无人机系统读取的所有参数,发送“PARAM_REQUEST_LIST”从消息gcsNodeuavNode。是操作的顺序如下:

  1. GCS节点发送消息,其题目是“PARAM_REQUEST_LIST”到UAV节点,使用上面定义的uavClient指定目标系统和组件。

  2. 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工作

QGroundControl©是用来进行飞行控制和任务规划任何支持MAVLink无人机的应用程序。您可以使用QGroundControl作为GCS如何展示给我们的模拟UAV的访问参数:

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

  2. 创建心跳消息。

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

  4. 一旦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无法识别连接作为已知自动驾驶仪的类型。这不会影响连接,如图所示的参数值仍然应该更新。

关闭MAVLink连接

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

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