主要内容

优化无人机使用MAVLink参数协议参数

这个例子展示了如何使用一个MAVLink参数协议在MATLAB™和与外部地面控制站。样本参数提供协议发送参数更新从一个模拟无人机(UAV)地面控制站使用MAVLink通信协议。设置两个MAVLink组件之间的通信,无人机和地面控制站。然后,您发送和接收参数更新为无人机调整参数值。最后,如果你使用QGroundControl©地面控制站,你可以得到这些参数更新QGroundControl和看到他们反映在程序窗口。

参数协议

一般MAVLink客户交换信息在网络中使用的数据结构定义为消息。MAVLink参数之间的协议是用来交换配置设置无人机和地面控制站(GCS)。参数协议遵循客户机-服务器模式。例如,GCS发起一个请求消息的形式和无人机响应数据。

建立共同的方言

MAVLink消息在一个XML文件中定义。标准通用的消息中定义的所有系统”common.xml”文件。其他特定于供应商的信息存储在单独的XML文件。对于这个示例,使用“common.xml”文件建立一个共同MAVLink客户之间的方言。

方言= mavlinkdialect (“common.xml”);

这个方言是用于创建mavlinkio方言中的对象可以理解消息。

建立无人机连接

创建一个mavlinkio对象代表一个模拟无人机。指定SystemID,ComponentID,AutoPilotType,组件类型参数名称-值对。对于本例,我们使用一种通用的自动驾驶仪,“MAV_AUTOPILOT_GENERIC”quadrotor组件类型,“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);

建立了gc连接

创建一个模拟的地面控制站(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”主题和专门寻找消息匹配的系统和组件IDuavClient。指定一个回调函数来显示每个收到新消息的有效负载。

paramValueSub = mavlinksub (gcsNode uavClient,“PARAM_VALUE”,“BufferSize”10“NewMessageFcn”@ (~ msg) disp (msg.Payload));

参数操作

现在您已经设置在无人机和地面控制站之间的连接。你现在可以查询和更新模拟无人机配置使用操作参数中定义的协议,exampleHelperMAVParamProtocol。有4个gc操作描述参数协议的工作流程。每个消息类型列出简要描述了协议的消息执行基于指定的参数。

  1. PARAM_REQUET_LIST:从收件人请求所有参数。所有值都是播放使用PARAM_VALUE消息。

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

  3. PARAM_SET:命令设置特定参数的值。设置值后,播放使用当前值PARAM_VALUE消息

  4. PARAM_VALUE:广播一个参数的当前值,以应对上述请求(PARAM_REQUEST_LIST,PARAM_REQUEST_READPARAM_SET)。

paramProtocol = exampleHelperMAVParamProtocol (uavNode);

这个参数协议有三个参数值:“MAX_ROLL_RATE”,“MAX_PITCH_RATE”,“MAX_YAW_RATE”。这些值代表的最大速度辊,音高,无人机的偏航度每秒。在真正的无人机系统中,可以调整这些利率调整或多或少的杂技控制的性能。

阅读所有参数

阅读来自无人机系统的所有参数,发送一个“PARAM_REQUEST_LIST”消息从gcsNodeuavNode

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

  2. UAV节点单独发送所有参数的形式”PARAM_VALUE”消息,因为我们有一个gc节点上的用户订阅的主题“PARAM_VALUE”,正在显示消息有效负载。

味精= createmsg(方言,“PARAM_REQUEST_LIST”);

赋值为系统和组件ID到消息,使用(,)=索引,确保作业不会改变结构体字段数据类型。

msg.Payload.target_system (:) = uavNode.LocalClient.SystemID;msg.Payload.target_component (:) = uavNode.LocalClient.ComponentID;

发送参数请求到无人机,监听一个端口在本地主机的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”UAVnode主题。指定参数指标(0),它指的是“MAX_ROLL_RATE”参数。这个索引值查询第一个参数值。

无人机发送更新后的参数作为一个“PARAM_VALUE”消息回GCS节点。因为我们的用户设置“PARAM_VALUE”在gc节点上,命令窗口显示消息有效负载。

味精= 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对象。无人机将更新后的参数值返回和GCS用户显示消息有效负载。这个信息更新的最大角速度无人机通过减少每秒45度。

味精= 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-enabled无人机飞行控制和任务规划。你可以使用QGroundControl GCS演示如何访问我们模拟无人机的参数:

  1. 下载和启动QGroundControl。定义qgcPort数量14550,默认QGroundControl应用UDP端口。

  2. 创建一个心跳消息。

  3. 从无人机节点发送心跳消息使用MATLAB QGroundControl计时器对象。默认情况下,计时器对象执行TimerFcn每1秒。的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显示已收到heartbeast消息并被连接到一个无人机。在车辆设置选项卡上,单击其他> Misc的参数值集中反映在应用。

注意:因为我们使用一个通用的自动驾驶仪类型,“MAV_AUTOPILOT_GENERIC”,QGroundControl不承认连接为一个已知的自动驾驶仪类型。这并不影响连接和参数值仍应更新如图所示。

MAVLink密切联系

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

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