目录
多机控制原理
多机地面站支持 TCP、 UDP 和串口等三种连接方式,首先我们需要对这两种连接方式抽象出一个基类 LinkInterface,提供两个虚函数分别对应于数据接受和发送处理, 针对不同的连接方式实现 TCP、 UDP 和串口连接相对应的子类TCPLink、 UDPLink 和 SerialLink 并在该类中完成将输入写入 socket 和串口的操作。再实现一个 MAVLinkProtocol 类,它实现将所有接受到的数据统一汇总到MAVlink 的消息解析的接口中,实现消息的解包,每个飞机对应于唯一的system id,当出现不同的 system id 时,构造一个飞机类。该飞机 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); | ||||
意义 | 将接受到的字节流通过信号发射出去 | ||||
输入 |
|
||||
输出 | 无 |
将接受到的所有数据汇聚到 MAVLinkProtocol 的 receiveBytes 接口中进行通过MAVLink 的解析接口进行消息的解析。
接口 | void receiveBytes(LinkInterface* link, QByteArray b) | ||||
意义 | 将地面站接受到的字节解析为 MAVlink 消息包,并通过信号 messageReceived(LinkInterface* link, mavlink_message_t message)将解析出的 MAVLink 结构体发射出去。 |
||||
输入 |
|
||||
输出 | 无 |
同时再 MAVLinkProtocol 解析到心跳包还会发射 vehicleHeartbeatInfo 信号,在MultiVehicleManager 类的的_vehicleHeartbeatIn