QGroundControl实现多机控制

前言

作为西安电子科技大学的本科生一名,目前在研究关于无人机导航规划与轨迹控制方面。
目前在跟导师做关于雷达无人机的一个项目,在这里记录一下关于QGC地面站实现多机控制的一些方法。
某些地方写的可能不是很完善,欢迎大家补充。
目前该文章还未写完,后期本人会继续编写

多机控制原理

多机地面站支持TCP,UDP和串口等三种连接方式,首先我们需要对这两种连接方式抽象出一个基类LinkInterface,提供两个虚函数分别对应于数据接受和发送处理,针对于不同的连接方式实现TCP,UDP和串口连接相对应的子类 TCPLink,UDPLink和SerialLink ,并在该类中完成将输入写入socket和串口的操作。
参考:Qt应用编程中,常用链路的封装

再实现一个MAVLinkProtocol类,它实现将所有接收到的数据统一汇总到MAVLink的消息解析的接口中,实现消息的解包,每个飞机对应于唯一的system id,当出现不同的system id时,构造一个飞机类。
参考:MAVLink解析

该飞机Vehicle类实现对飞机的控制(如解锁,起飞,航点等操作)一即数据接收显示(如飞行轨迹绘制等等)。这些多机通过MultiVehicleManager来实现多机的管理,其中多机管理中通过activeVehicle接口来选中当前活跃的飞机,进而实现对该飞机的单机控制。同样的,我们可以遍历连接的所有飞机进而实现对所有飞机的控制。

(下面插入流程图)

多机控制实现

多机控制首先需要实现的是建立地面站和飞机之间的连接,将TCP,UDP和串口通信抽象出一个 LinkInterface 基类,实现父类 TCPLink,UDPLink和SerialLink 分别对应于TCP,UDP,串口的数据读入和写入操作。

接口void _writeBytes(const QByteArray)
意义将数据写入TCP,UDP和串口等
输入const QByteArray写入的字节流
输出
接口void bytesReceived(LinkInterface* link, QByteArray data);
意义将接收到的字节流通过信号发射出去
输入LinkInterface* link接收到数据的链接
QByteArray data接收到的字节流
输出
将接收到的所有数据汇聚到MAVLinkProtocol的receiveByter接口中进行通过MAVLink的解析接口进行消息的解析。
接口void receiveBytes(LinkInterface* link, QByteArray b);
意义将地面站接收到的字节解析维MAVLink消息包,并通过信号messageReceived(LinkInterface* link, mavlink_message_t message)将解析出的MAVLink结构体发射出去
输入LinkInterface* link接收到数据的链接
QByteArray d接收到的字节信息
输出
同时在 MAVLinkProtocol 解析到心跳包还会发射 vehicleHeartbeatInfo 信号,在 MultiVehicleManager 类的 _vehicleHeartbeatInfo 中进行处理,判断心跳包中出现新的 system id 时构造一个 Vehicle 类。
当前选中的飞机
所在类MultiVehicleManager
接口Vehicle* activeVehicle()
属性activeVehicle
WRITEsetActiveVehicle
NOTIFYactiveVehicleChanged
多机链表
所在类MultiVehicleManager
接口QmlObjectListModel* vehicles(void)
属性vehicles

(下面插入多机实现关系图)

多机控制优化

飞机的飞行轨迹以不同的颜色区分

主要的思想是预选一系列的颜色,将飞机的ID和轨迹颜色的相应序列号建立一一的对应关系,并在Vehicle中提供一个轨迹颜色的属性提供给qml进行访问。

首先在Vehicle中添加两个静态变量和轨迹颜色属性:
需要修改的文件为:src/Vehicle/Vehicle.h(在QT工程文件中位于Headers文件夹内)

public:
//连接的飞机的数量,每多连接一台飞机,该值加一,
//即在Vehicle::Vehicle(LinkInterface* link, ......)构造函数中加一
static quint16 connectedVehicleCount;

//提供一组轨迹颜色
static QList<QColor> trajectoryColors;

//建立飞机ID和轨迹颜色序列号的对应
static QMap<int, int> vehicleIdAndConnectedSeq;

Q_PROPERTY(Qcolor trajectoryColor READ trajectoryColor CONSTANT)

对 connectedVehicleCount 和 trajectoryColor 进行初始化。
需要修改的文件为:src/Vehicle/Vehicle.cc(在QT工程文件中位于Sources文件夹内)

quint16 Vehicle::connectedVehicleCount = 0;
//参考:http://www/sioe.cn/yingyong/yanse-rgb-16/

//构造颜色类,用于定义轨迹颜色
QList<QColor> Vehicle::trajectoryColors = {
	QColor(0x00, 0x00, 0x00),	//black
	QColor(0xFF, 0xFF, 0x00),	//yellow
	......
};

QMap<int, int> Vehicle::vehicleIdAndConnectedSeq;

在构造函数中添加对颜色的处理

//连接飞机数量加1
Vehicle::connectedVehicleCount++;

同时,断开连接之后,析构函数中将连接的飞机数减1,同时删除飞机编号和飞机轨迹颜色的映射关系的映射辨析。

Vehicle::connectedVehicleCount--;
Vehicle::vehicleIdAndConnectedSeq.take(_id);

之后给 trajectory 添加相应的实现
需要修改的文件为:src/Vehicle/Vehicle.cc(在QT工程文件中位于Sources文件夹内)

//这部分待更

控制所有的飞机

GuidedActionsController 中通过 actionID 进行不同状态切换和指令的实现,实现控制所有的飞机解锁、上锁、返航、起飞、降落、紧急停机等,首先新建如下的id,遍历 MultiVehicleManager 中的 Vehicles 调用相关的控制接口可以实现相关的操作。

之后在 confirmAction(actionCode, actionData) 中追加一系列消息提醒。(这部分提示信息会在地面站上面的对话栏提示)

当用户触发指令后,调用 executeAction 中追加代码实现当我们出发了确认操作需要执行的一系列动作。

接下来我们在页面上添加触发动作的按钮,在 MultiVehicleList.qml 中添加:
需要修改的文件为:src/FlightDisplay/MultiVehicleList.qml(在QT工程文件中位于路径 Resources/qgroundcontrol.qrc//qml/QGroundControl/FlightDisplay/MultiVehicleList.qml 文件夹内)

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值