主要内容

使用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对象来表示模拟无人机。指定SystemIDComponentIDAutoPilotType,组件类型参数作为名称-值对。在这个例子中,我们使用一个通用的自动驾驶仪类型,“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连接

创建一个模拟地面控制站(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操作描述了参数协议的工作流程。列出的每种消息类型都有一个简短的描述,说明消息基于指定的参数协议执行什么。

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

  2. PARAM_REQUEST_READ:请求单个参数。指定的参数值通过PARAM_VALUE消息。

  3. PARAM_SET:设置具体参数值的命令。设置值后,当前值将使用PARAM_VALUE消息

  4. PARAM_VALUE:广播参数的当前值以响应上述请求(PARAM_REQUEST_LISTPARAM_REQUEST_READPARAM_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. 无人机节点以“”的形式单独发送所有参数。PARAM_VALUE”消息,因为我们在GCS节点上有一个订阅了主题'PARAM_VALUE'的订阅者,消息有效负载将立即显示出来。

MSG = createmsg(方言,“PARAM_REQUEST_LIST”);

将系统和组件ID的值分配到消息中,使用(,) =索引以确保赋值不会改变结构字段数据类型。

msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;msg.Payload.target_component(:) = 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”topic到UAVnode。指定参数索引0,它引用“MAX_ROLL_RATE”参数。这个索引值查询第一个参数值。

UAV将更新后的参数作为“PARAM_VALUE”消息返回给GCS节点。的订阅者“PARAM_VALUE”在GCS节点上,消息有效负载显示到命令窗口。

msg = createmsg(gcsNode. msg)方言,“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度。

msg = createmsg(gcsNode. msg)方言,“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来演示如何访问我们模拟无人机的参数:

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

  2. 创建心跳消息。

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

  4. 一旦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显示它已收到心跳消息并连接到无人机。在车辆设置选项卡上,单击其他>杂项查看设置的参数值是否反映在应用程序中。

注意:因为我们使用的是通用的自动驾驶模式,“MAV_AUTOPILOT_GENERIC”, QGroundControl不将该连接识别为已知的自动驾驶仪类型。这不会影响连接,参数值仍然会更新,如图所示。

关闭MAVLink连接

在使用QGroundControl参数小部件之后,停止heartbeatTimer停止再发送心跳信息。删除heartbeatTimerparamProtocol对象。最后,断开UAV和GCS节点,以清理系统之间的通信。

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