FlightDisplay设计思路

FlightDisplay 模块设计思路与学习总结


组成结构

FlightDisplay\ (飞行显示器)

  • VedioManager (录像机管理器)

具体实现思路

VedioManager

引入头文件:

#include <QObject>
#include <QTimer>
#include <QUrl>

#include "QGCLoggingCategory.h"  // QGC登录类别
#include "VideoSurface.h" // 视频外观
#include "VideoReceiver.h" // 视频接收器
#include "QGCToolbox.h" // QGC工具盒

源文件引入的头文件:

#include <QCameraInfo> // 摄影机信息
#include <VideoItem.h> // 录像机项目

#include "ScreenToolsController.h" // 屏幕工具控制器
#include "VideoManager.h" // 录像机管理器
#include "QGCToolbox.h"
#include "QGCCorePlugin.h" // QGC核心插件
#include "QGCOptions.h" // QGC选项
#include "Settings/SettingsManager.h" // 设置管理器

创建一个继承QGCTool的VideoManager类,添加以下属性:

// 是否有录像机
Q_PROPERTY(bool             hasVideo            READ    hasVideo                                    NOTIFY hasVideoChanged)
// 是否初始化
Q_PROPERTY(bool             isGStreamer         READ    isGStreamer                                 NOTIFY isGStreamerChanged)
// 录像机来源ID
Q_PROPERTY(QString          videoSourceID       READ    videoSourceID                               NOTIFY videoSourceIDChanged)
// 录像机是否运转
Q_PROPERTY(bool             videoRunning        READ    videoRunning                                NOTIFY videoRunningChanged)
// 紫外线/万能接头是否启用
Q_PROPERTY(bool             uvcEnabled          READ    uvcEnabled                                  CONSTANT)
// 录像机表层
Q_PROPERTY(VideoSurface*    videoSurface        MEMBER  _videoSurface                               CONSTANT)
// 录像机接收器
Q_PROPERTY(VideoReceiver*   videoReceiver       MEMBER  _videoReceiver                              CONSTANT)
// 是否启用录音
Q_PROPERTY(bool             recordingEnabled    READ    recordingEnabled                            CONSTANT)

四个信号均没有具体的实现:

  • void hasVideoChanged() (是否有录像机改变)
  • void videoRunningChanged() (录像机是否运转改变)
  • void isGStreamerChanged() (是否初始化改变)
  • void videoSourceIDChanged() (录像机来源ID改变)

以及函数:

  • setToolbox(QGCToolbox *toolbox) (重载QGCTool下的该函数)
  • hasVideo() (是否有录像机)
  • isGStreamer() (是否初始化)
  • uvcEnabled() (紫外线/万能接头) 如果可用摄像机数量大于0,则启用。
  • _updateTimer() (更新计时器)
  • _updateVideo() (更新录像机) 如果初始化了,当videoReceiver和videoSurface存在时,删除他们,并新建。

总结

在飞行显示器的录像机管理器中,对录像机的是否存在,是否初始化,是否启用紫外线,以及计时器的更新,和录像机的更新进行了处理,频繁使用了

#if 
#ifndef 
#endif

以下是查阅的相关资料:

#if的使用说明
#if的后面接的是表达式

#if (MAX==10)||(MAX==20)
 code...
#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)

#if defined的使用
#if后面接的是一个宏。

#if defined (x)
    ...code...
#endif
这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则不直接忽视中间的…code…代码。

另外 #if defined(x)也可以取反,也就用 #if !defined(x)

#ifdef的使用
#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。

最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif


#if defined还有另外一个#if{n,}def没有的功能~
#if (defined(x) && !defined (y)) || defined(z)

以及

首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句
  #ifndef _MYHEADFILE_H
  #define _MYHEADFILE_H
  // .......语句......
  #endif // _MYHEADFILE_H
  为了避免同一个文件被include多次,我们常使用 #ifndef 进行判断,如果没有包含
  _MYHEADFILE_H , 则使用#define 来定义一个宏 _MYHEADFILE_H , #endif 与#ifndef
  首尾呼应,表示结束。
  说到这里,我们有必要提一个C语言中的预处理器,预处理器是一个小软件,它可以在编译前处理C程序,它的行为是由预处理指令控制的,预处理指令包含了以下内容:
  1,宏定义   #define
  2,文件包含 #include
  3,条件编译 #if
  #ifdef
  #ifndef
  #if defined
  #if !defined
  #elif
  #else
  #endif
  #undef
  指令都是以#开始的,我们来看一下简单的宏定义(对象式宏)
  #define  标准符  替换列表
  #define  PI  3.1415926
  可以对类型重命名
  #define  BOOL  int
  宏可以带参数,也是常说的宏函数
  #define 标识符(x1,x2...) 替换列表
  特别注意的是标识符和(之间不能有空格,圆括号是必须的。
  我们来看一下例子:
  #define MAX(x,y) ((x)>(y)?(x):(y))
  #define IS_EVEN(n) ((n)%2==0)
  #define TOUPPER(c) (‘a’<(c)&&(c)<’z’?(c)-’a’+’A’(c))
  #define SWAP(T,x,y) {T t=x; x=y; y=t}
  还可以写得更复杂一点,比如我们来写一个宏函数,用它来验证一个日期是否合法
  #define ISLEAP(y) ((y)%4==0&&(y)%100!=0||(y)%400==0)
  #define ISSMALL(m) ((m)==4||(m)==6||(m)==9||(m)==11)
  #define NORMAL(m) (ISSMALL(m)?30:31)
  #define DAYS(y,m) ((m)==2?28+ISLEAP(y):NORMAL(m))
  #define IN(x, from,to) ((x)>=(from)&&(x)<=(to))
  #define VALID(y,m,d) ((y)>1600&&IN(m,1,12)&&IN(d,1,DAYS(y,m)))
  下面我们来看看条件编译
  #if (comdition)
  {//语句##;}
  #endif
  如果(comdition)为真, 也就是逻辑1的话,编译下面的语句,如果(comdition)为假,即逻辑0,则不编译下面的语句。例子如下:
  #define DEBUG
  #if DEBUG
  Printf(“Value of i:%d\n”, i);
  Printf(“Value of j:%d\n”, j);
  #endif
  格式:
  #if  常量表达式
  常量表达式为0时,预处理器删除#if 和#endif中间的代码
  #if 会把没有定义过的标准符视做为0, 如果没有定义DEBUG, 则
  测试#if DEBUG 会失败,但#if !DEBUG会成功。
  可以用宏来定义文件名:
  #if define(IA32)
  #define CPU_FILE “ia32.h”
  #elif defined(IA64)
  #deifine CPU_FILE “ia64.h”
  #elif defined(AMD64)
  #define CPU_FILE “amd64.h”
  #endif
  #include CPU_FILE
  还可以取消已经定义的宏:
  #if defined VALUE              // 检验VALUE是否被定义 ,如果被定义
  #undef VALUE            // 解除语句定义
  #define VALUE 1000            //  重新定义VALUE 为1000
  #endif
  如果检验没有定义,可以这样写:
  #ifndef VALUE               // 如果VALUE没有被定义
  #define VALUE 1000          //  定义VALUE 为1000
  #endif
  以上所用的宏中:
  #undef为解除定义;
  #ifndef是if not defined的缩写,也可以写成#if !defined 即如果没有定义;
  #ifdef是if defined的缩写,也可以写成#if defined 即检查是否定义过;
  #ifdef 和 #if defined 的区别,#ifndef 与#if !defined 的区别相类似,都在于后者可以组成复杂的预编译条件,前者只判断单个宏是否定义,例如:
  #if defined(PERL_PACK_CAN_SHRIEKSIGN)
  /* v */ SIZE16,
  #else
  0,
  #endif
  #ifdef PERL_PACK_CAN_SHRIEKSIGN
  /* v */ SIZE16,
  #else
  0,
  #endif
  #ifdef是种简写,但不支持更复杂的表达式。
  #ifdef HAVE_MYHEADER
  # if VERSION > 3
  ...
  # endif
  #endif
  这种情况用
  #if defined(HAVE_MYHEADER) && VERSION > 3
  ...
  #endif
  更为合理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QGC地面站支持多机连接,可以通过串口连接、TCP连接和UDP连接来实现。对于一对一的连接,一般采用串口连接。如果要实现多机控制,可以使用TCP或UDP连接。TCP和UDP是比较好的网络架构,可以控制延迟,并实现无人机之间以及无人机与地面站之间的通信。通过TCP/UDP连接,可以实现无人机的组网。\[2\] 在QGC地面站中,可以通过修改MultiVehicleList.qml文件来添加触发动作的按钮。该文件位于QT工程文件的Resources/qgroundcontrol.qrc//qml/QGroundControl/FlightDisplay/MultiVehicleList.qml路径下。\[3\] 因此,通过QGC地面站的多机连接功能,可以实现对多架飞机的控制和通信。然而,需要注意的是,原版的QGC代码在断线重新连接机制和MAVLINK协议流方面可能存在一些问题,特别是在超过10架飞机时可能会出现飞机掉线和控制延迟等问题。因此,如果需要更好的性能和稳定性,可以进行优化和修改。\[1\] #### 引用[.reference_title] - *1* *2* [【测试】QGC地面站开发课程完结篇--一站多机控制测试说明](https://blog.csdn.net/msq19895070/article/details/86646235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [QGroundControl实现多机控制](https://blog.csdn.net/qq_26550927/article/details/106220881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值