优化无人机使用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操作描述参数协议的工作流程。每个消息类型列出简要描述了协议的消息执行基于指定的参数。
PARAM_REQUET_LIST
:从收件人请求所有参数。所有值都是播放使用PARAM_VALUE
消息。PARAM_REQUEST_READ
:请求的一个参数。指定的参数值播放使用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”
。这些值代表的最大速度辊,音高,无人机的偏航度每秒。在真正的无人机系统中,可以调整这些利率调整或多或少的杂技控制的性能。
阅读所有参数
阅读来自无人机系统的所有参数,发送一个“PARAM_REQUEST_LIST”
消息从gcsNode
来uavNode
。
GCS节点发送消息的主题是“
PARAM_REQUEST_LIST”
UAV节点指定使用uavClient如上定义目标系统和组件。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演示如何访问我们模拟无人机的参数:
下载和启动QGroundControl。定义
qgcPort
数量14550,默认QGroundControl应用UDP端口。创建一个心跳消息。
从无人机节点发送心跳消息使用MATLAB QGroundControl
计时器
对象。默认情况下,计时器
对象执行TimerFcn
每1秒。的TimerFcn
是一个sendudpmsg
称之为发送心跳消息。一旦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
心跳停止发送任何消息。删除heartbeatTimer
和paramProtocol
对象。最后,断开无人机和GCS节点清理系统之间的通信。
停止(heartbeatTimer);删除(heartbeatTimer);删除(paramProtocol);断开(uavNode);断开(gcsNode);