使用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
,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”,“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操作描述了参数协议的工作流程。列出的每种消息类型都有一个简短的描述,说明消息基于指定的参数协议执行什么。
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”
.这些值表示无人机的滚转、俯仰和偏航的最大速率,单位为度/秒。在真实的无人机系统中,这些速率可以调整,以调整性能或多或少的杂技控制。
读取所有参数
要从UAV系统读取所有参数,请发送一个“PARAM_REQUEST_LIST”
消息从gcsNode
来uavNode
.
GCS节点发送主题为“
PARAM_REQUEST_LIST”
到UAV节点,使用上面定义的uavClient指定目标系统和组件。无人机节点以“”的形式单独发送所有参数。
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来演示如何访问我们模拟无人机的参数:
下载并启动QGroundControl。定义
qgcPort
数字为14550,这是QGroundControl应用程序的默认UDP端口。创建心跳消息。
利用MATLAB将无人机节点的心跳消息发送到QGroundControl
计时器
对象。默认情况下,计时器
对象执行TimerFcn
每一秒。的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显示它已收到心跳消息并连接到无人机。在车辆设置选项卡上,单击其他>杂项查看设置的参数值是否反映在应用程序中。
注意:因为我们使用的是通用的自动驾驶模式,“MAV_AUTOPILOT_GENERIC”
, QGroundControl不将该连接识别为已知的自动驾驶仪类型。这不会影响连接,参数值仍然会更新,如图所示。
关闭MAVLink连接
在使用QGroundControl参数小部件之后,停止heartbeatTimer
停止再发送心跳信息。删除heartbeatTimer
和paramProtocol
对象。最后,断开UAV和GCS节点,以清理系统之间的通信。
停止(heartbeatTimer);删除(heartbeatTimer);删除(paramProtocol);断开(uavNode);断开(gcsNode);