QGroundControl实现多机控制
前言作为西安电子科技大学的本科生一名,目前在研究关于无人机导航规划与轨迹控制方面。目前在跟导师做关于雷达无人机的一个项目,在这里记录一下关于QGC地面站实现多机控制的一些方法。某些地方写的可能不是很完善,欢迎大家补充。目前该文章还未写完,后期本人会继续编写多机控制原理多机地面站支持TCP,UDP和串口等三种连接方式,首先我们需要对这两种连接方式抽象出一个基类LinkInterface,提供两个虚函
前言
作为西安电子科技大学的本科生一名,目前在研究关于无人机导航规划与轨迹控制方面。
目前在跟导师做关于雷达无人机的一个项目,在这里记录一下关于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 | 接收到的字节流 | |
输出 | 无 |
接口 | void receiveBytes(LinkInterface* link, QByteArray b); | |
意义 | 将地面站接收到的字节解析维MAVLink消息包,并通过信号messageReceived(LinkInterface* link, mavlink_message_t message)将解析出的MAVLink结构体发射出去 | |
输入 | LinkInterface* link | 接收到数据的链接 |
QByteArray d | 接收到的字节信息 | |
输出 | 无 |
当前选中的飞机 | |
---|---|
所在类 | MultiVehicleManager |
接口 | Vehicle* activeVehicle() |
属性 | activeVehicle |
WRITE | setActiveVehicle |
NOTIFY | activeVehicleChanged |
多机链表 | |
---|---|
所在类 | 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 文件夹内)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)