QGC4.1.2二次开发(2)QGC连接与数据收发

2023-05-16

文章目录

  • 前言
  • 一、连接原理
  • 二、连接过程与数据收发
    • 1.连接过程(以串口为例)
    • 2.数据发送
  • 总结


前言

QGC连接无人机飞控时支持多种连接方式,并且可以自动连接,不由让人好奇它的实现原理,本文主要分析QGC的连接原理和连接过程,数据的收发过程。


提示:以下是本篇文章正文内容

一、连接原理

    QGC使用QT框架,采用c++语言,能够通过多种方式连接无人机飞控(串口、UDP、TCP、蓝牙等)。连接的实现类有一个基类Linkinterface,继承于QThread类,基类提供统一接口,实现多态。子类有:SerialLink、UDPLink、TCPLink、BluetoothLink、MockLink,分别对应串口、UDP、TCP、蓝牙连接的具体实现。除SerialLink类外,其他的子类都重写了run函数,说明这些连接都运行在子线程里,通过信号槽的方式把接收到的数据送到主线程。
    LinkInterface主要用于实现连接的通用接口,而连接的管理放在了LinkManager类。LinkManager继承于QGCTool类,QGCTool类是QGC工具类的基类,继承于QGCTool类的子类对象都是单例模式。连接管理包括了创建连接、建立连接、断开连接、数据收发等。

二、连接过程与数据收发

1.连接过程(以串口为例)

    QGC的自动连接实际使用的是一个定时器,定时去触发连接检测函数,检测是否有需要连接的设备。定时器变量名_portListTimer,定时时间到后触发槽函数_updateAutoConnectLinks()

connect(&_portListTimer, &QTimer::timeout, this, &LinkManager::_updateAutoConnectLinks);//linkManager.c  90

整理了一下整个连接过程,贴个图

    _updateAutoConnectLinks()函数检测是否有需要连接的设备,检测到后执行createConnectedLink()函数,在该函数中根据不同的连接类型将Linkinterfacce基类指针指向不同的子类对象。
LinkInterface* LinkManager::createConnectedLink(SharedLinkConfigurationPointer& config, bool isPX4Flow)
{
    if (!config) {
        qWarning() << "LinkManager::createConnectedLink called with nullptr config";
        return nullptr;
    }
  
    LinkInterface* pLink = nullptr;
    switch(config->type()) {
#ifndef NO_SERIAL_LINK
    case LinkConfiguration::TypeSerial:
    {
        auto* serialConfig = qobject_cast<SerialConfiguration*>(config.data());
        if (serialConfig) {
            pLink = new SerialLink(config, isPX4Flow);
            if (serialConfig->usbDirect()) {
                _activeLinkCheckList.append(qobject_cast<SerialLink*>(pLink));
                if (!_activeLinkCheckTimer.isActive()) {
                    _activeLinkCheckTimer.start();
                }
            }
        }
    }
        break;
#else
    Q_UNUSED(isPX4Flow)
#endif
    case LinkConfiguration::TypeUdp:
        pLink = new UDPLink(config);
        break;
    case LinkConfiguration::TypeTcp:
        pLink = new TCPLink(config);
        break;
#ifdef QGC_ENABLE_BLUETOOTH
    case LinkConfiguration::TypeBluetooth:
        pLink = new BluetoothLink(config);
        break;
#endif
    case LinkConfiguration::TypeLogReplay:
        pLink = new LogReplayLink(config);
        break;
#ifdef QT_DEBUG
    case LinkConfiguration::TypeMock:
        pLink = new MockLink(config);
        break;
#endif
    case LinkConfiguration::TypeLast:
        break;
    }
    if (pLink) {
        _addLink(pLink);
        connectLink(pLink);
    }
    return pLink;
}

    然后分别执行_addLink()、connectLink()函数。connectLink()中主要操作是link->_connect(),根据基类指针指向的不同子类,调用不同的连接函数。_addLink()主要把连接对象指针添加到连接列表,连接数据收发的信号槽,数据接收槽函数位于MavlinkProtocol类(图片中写错了,笔误),该类同样继承于QGCTool类,单例模式,只有一个对象。

void LinkManager::_addLink(LinkInterface* link)
{
    if (thread() != QThread::currentThread()) {
        qWarning() << "_addLink called from incorrect thread";
        return;
    }

    if (!link) {
        return;
    }

    if (!containsLink(link)) {
        int mavlinkChannel = _reserveMavlinkChannel();

        if (mavlinkChannel != 0) {
            link->_setMavlinkChannel(mavlinkChannel);
        } else {
            qWarning() << "Ran out of mavlink channels";
            return;
        }

        _sharedLinks.append(SharedLinkInterfacePointer(link));
        emit newLink(link);
    }

    connect(link, &LinkInterface::communicationError,   _app,               &QGCApplication::criticalMessageBoxOnMainThread);
    connect(link, &LinkInterface::bytesReceived,        _mavlinkProtocol,   &MAVLinkProtocol::receiveBytes);// receive data. 
    connect(link, &LinkInterface::bytesSent,            _mavlinkProtocol,   &MAVLinkProtocol::logSentBytes);// send data. 

    _mavlinkProtocol->resetMetadataForLink(link);
    _mavlinkProtocol->setVersion(_mavlinkProtocol->getCurrentVersion());

    connect(link, &LinkInterface::connected,            this, &LinkManager::_linkConnected);
    connect(link, &LinkInterface::disconnected,         this, &LinkManager::_linkDisconnected);

    // This connection is queued since it will cloe the link. So we want the link emitter to return otherwise we would
    // close the link our from under itself.
    connect(link, &LinkInterface::connectionRemoved,    this, &LinkManager::_linkConnectionRemoved, Qt::QueuedConnection);
}

    mavlinkprotocol收到数据后根据mavlink协议进行一系列操作,最后消息会通过信号槽的方式传到vehicle类,根据不同的mavlink消息执行具体的操作(_mavlinkMessageReceived()函数)。
    写到这不得不说一下QGC的多机连接,多机管理类MultiVehicleManager,在mavlinkprotocol收到无人机广播的heartbeat消息后,会发送vehicleHeartbeatInfo信号,MultiVehicleManager类的槽函数_vehicleHeartbeatInfo()接收这个信号,根据消息包中的无人机类型创建不同的vehicle对象,实现多机的一个连接。

connect(_mavlinkProtocol, &MAVLinkProtocol::vehicleHeartbeatInfo, this, &MultiVehicleManager::_vehicleHeartbeatInfo);

2.数据发送

上面的过程图只写了数据的接收,数据发送也整理了一下,贴个图,详细过程就不叙述了,用到的话可以根据过程图追一下代码。
在这里插入图片描述


总结

QGC的连接结构设计的还是挺棒的,过程简洁,结构合理。除了串口没搞明白是否开线程外,其他方式的连接都是每个连接都是一个线程,收到数据后再通过信号槽的方式传递到主线程。另外连接还有通道的概念,每个连接对应一个mavlink通道,通道数目会显示限制连接数量,通过修改MAVLINK_COMM_NUM_BUFFERS(位置:mavlink_types.h)宏可以修改通道数目。还需要修改一个变量_mavlinkChannelsUsedBitMask,该变量用于计算存储每个通道。

    宏:MAVLINK_COMM_NUM_BUFFERS
    位置:mav_link_types.c
    通道控制函数:int LinkManager::_reserveMavlinkChannel(void)
         void LinkManager::_freeMavlinkChannel(int channel)
    位置:LinkManager.c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QGC4.1.2二次开发(2)QGC连接与数据收发 的相关文章

  • NX二次开发-BlockUI树列表快速插入多个节点

    适用版本 xff1a NX 7 5及以上版本 一 概述 在NX二次开发中 xff0c 我们经常使用BlockUI来设计界面 xff0c 树列表控件 xff08 Tree List xff09 是非常常用的控件之一 xff0c 可以创建表示节
  • Ubuntu18.04-Melodic-Mavros源码安装,Mavros二次开发。

    如果是会对Mavros进行修改二次开发 xff0c 那么建议使用源码安装 网上没有找到Melodic的安装教程 xff0c 所以自己摸索了一下 xff0c 希望能帮到大家 参考网址 xff1a mavros mavros at master
  • PIXHawk用QGC刷Firmware

    1 准备版本 2 开始刷 确定后会出现弹窗 xff0c 再弹窗的文件名处粘贴
  • QGC、PX4和AirSim的安装

    本教程视频地址 xff1a https www bilibili com video BV1dv411K71E 本教程将讲解QGC地面站的安装 PX4控制系统 xff08 包括jMAVSim ROS和Gazebo xff09 的安装 Air
  • 通过mavros的桥接连接qgc

    fcu url指定的是飞控的连接方式 xff0c 设置飞控为正确的端口即可 gcs url指定的是QGC所在主机的IP xff0c 这个换为运行QGC主机的IP地址即可 如果不知道主机的IP地址可以用udp发布方式 gcs url span
  • jupyter-notebook二次开发

    背景 公司内部提供给算法人员用于模型训练的平台开发需求中提出了嵌入Jupyter Notebook模块 xff0c 而Jupyter Notebook是开源的 xff0c 方便后续对部分细节进行功能定制和优化 xff0c 需要对其进行调研
  • 【PX4 二次开发 初级】 03 飞控调试以及地面站使用

    PX4 二次开发 初级 03 飞控调试以及地面站使用 前言IMU三轴稳定性内部构成陀螺仪加速度计磁力计 误差加速度 amp 陀螺仪 磁力计干扰测试 标题 xff1a PX4二次开发教程 xff1a 起源 xff1a 根据阿木实验室讲解课程整
  • PX4:二次开发:流程

    1 程序编写 xff08 用模板简单实现一个程序 xff09 gt 进阶 xff1a 不同项目下的程序规范 xff1b 调用子模块的流程 2 在Nuttx系统中注册应用并编译 为了使该程序能够编译进固件 xff0c 需要在系统的cmake文
  • QGC Windows下编译环境搭建-------Qt5.7 + VS2015

    源码下载 打开qgc的github网址 xff0c 并选择最新的稳定版v3 4 https github com mavlink qgroundcontrol tree Stable V3 4 下载git xff0c 在电脑中进入希望下载的
  • PX4二次开发——uorb订阅

    PX4二次开发 uorb订阅 一 写在前面 我们写了一个一个功能的模块 xff0c 这些模块并不是独立的 模块之间是有数据传递的 xff0c 这样才能组合到一起实现飞行控制的目的 那么解决模块之间的数据传递的方式就是通过uorb订阅的方式
  • ubuntu18.04下QGC安装

    QGC安装 xff08 新手操作 xff09 参考官网教程即可 官网链接 link 先把命令行的代码贴过来 xff0c 方便大家复制粘贴 第 span class token number 1 span 步的 sudo usermod sp
  • PX4串口添加传感器—QGC添加自定义mavlik消息

    简介 功能 xff1a 假设我想要飞控传输一个我定义的消息给地面站 xff0c 其地面站必须有一个接收处理的过程以及飞控处理发送的过程 我们传输的方式是mavlink通信方式 想要实现上面的功能 xff0c PX4和QGC就必须要有 1 修
  • QGC接收PX4自定义Mavlink消息(二)qgc接收

    这里补充一些 xff0c 我的px4版本是1 11 0dev xff0c 在ubuntu18 04上开发 xff0c qgc为目前官网最新的版本 xff0c 在windows上上开发 xff0c 大家的源码会因为版本差异而有少许区别 xff
  • vue-element-admin的二次开发

    最近也是完成了公司招聘管理系统后台的前端开发 xff0c 项目已经开始测试了近期估计就会交付使用 一直是一个人在做 xff0c 配合两个后端 xff0c 说实话这种从很多不会到一个个独立debug解决问题到最后终于完成项目的感觉真的太有成就
  • QGC4.1.2二次开发(2)QGC连接与数据收发

    文章目录 前言一 连接原理二 连接过程与数据收发1 连接过程 xff08 以串口为例 xff09 2 数据发送 总结 前言 QGC连接无人机飞控时支持多种连接方式 xff0c 并且可以自动连接 xff0c 不由让人好奇它的实现原理 xff0
  • vue-element-admin 二次开发 报错修改

    安装 GitHub git clone https github com PanJiaChen vue element admin git Gitee https gitee com panjiachen vue element admin
  • QGC 添加电机测试功能

    组装过程中为了测试电机的连接以及转向 xff0c 现将电机测试功能单独制作一个页面 xff0c 以便使用 一 xff0c 效果 原型 实际效果总是差那么一丢丢 二 xff0c 实现思路 MavlinkConsole 功能 xff0c 可以在
  • QGC 报错 Fail: No CPU load information

    据说是因为bootloader与px4固件版本不匹配 xff0c 需要修改qgc中的参数 xff1a 使其能够在安装固件的时候更新到匹配版本的bootloader 步骤一 xff1a 修改 SDLOG PROFILE 参数从 default
  • DIY个人智能家庭网关—— 路由器篇之安装python

    Python是一种解释型 面向对象 动态数据类型的高级程序设计语言 在openwrt上进行二次开发编写自己的程序 python肯定是最方便最快捷的编程语言 因为它是解释型语言 无需openwrt的编译环境 只要安装好了python就可以直接
  • 松灵机器人——ROS下的CAN通讯调试(内含所需调用包,都是操作步骤)

    松灵机器人 ROS下的CAN通讯调试 1 代码包地址 2 硬件准备 2 1 SCOUT MINI 小白车 尾部航空插头 CAN TO USB适配器 2 2 接线 3 具体操作 3 1 ROS安装和环境设置 3 2 配置 CAN TO USB

随机推荐

  • k8s 官方文档

    k8s 官方文档 https kubernetes io zh docs home
  • 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考 xff1a http blog csdn net jhq0113 article details 43812895 Mysql分区表的介绍可以参考 xff1a http blog csdn net jhq011
  • 利用C++求解一元二次方程

    题目 xff1a 求解一元二次方程 xff1a ax 43 bx 43 c 61 0 的解 xff0c 其中a 61 1 b 61 3 c 61 2 分析 xff1a 大家都知道一元二次方程的解有三种情况 xff0c 即考虑 61 xff0
  • VS2019配置BOOST-v1.70.0库

    文章目录 vs2019配置c 43 43 boost库安装编译Boost c 43 43 library新建vs2019 c 43 43 项目 xff0c 并添加boost依赖库代码测试 c 43 43 boost库说明主要分类常用库相关图
  • sudo aptitude install sudo apt-get update sudo apt-get install libatlas-dev

    记坑 xff1a sudo apt get update 报错 xff1a 没有公钥 xff0c 解决办法 xff1a sudo apt key adv keyserver keyserver ubuntu com recv keys 13
  • 深度学习综述之分类(适合深度学习面试者看)

    目前图像方向 xff0c 主要用深度学习进行分类 xff0c 定位 xff08 回归 xff09 xff0c 检测 xff0c 那么她三主要区别是什么呢 xff1f 分类 xff1a 是什么 xff1f 定位 xff1a 在哪里 xff1f
  • tf变换及工具说明(1)

    tf变换及工具说明 xff08 1 xff09 xff09 tf说明解释tf 库常用方法tf数据类型静态tf发布tf动态发布tf接收坐标转换平面坐标系例子 坐标转换传递 tf说明解释 在ros下有一个库 xff1a tf xff0c 其主要
  • Python实现微信自动回复(机器人版本)

    现在微信使用程度越来越高 xff0c 就想到能不能微信实现像qq似得自动回复功能 在实现的过程中发现 xff0c 图灵机器人也有微信的接口 xff0c 就拿来用了 机器人创建完成后 xff0c 会生成一个APIkey xff0c 用来和程序
  • PPTV面试题——括号消除

    题目 xff1a 给定一个字符串 xff0c 设计一个算法消除其中承兑的括号 xff0c 如果括号不成对 xff0c 提示异常 xff08 error xff09 如 xff08 1 xff0c xff08 2 3 xff09 xff0c
  • reStructuredText(rst)简介+安装+简单说明

    reStructuredText简介 43 安装 43 简单说明 reStructuredText是什么 reStructuredText是扩展名为 rst的纯文本文件 xff0c 含义为 重新构建的文本 xff0c 是python编程语言
  • 【VS Code】"The 'clang-format' command is not available. Please check your clang-format."报错

    文章目录 34 The 39 clang format 39 command is not available 34 报错说明一 安装插件 clang format 二 解决方案三 参考链接 34 The clang format comm
  • 大环境不好,找工作太难?看我历时10天三面阿里,成功入职...

    三面大概九十分钟 xff0c 问的东西很全面 xff0c 需要做充足准备 xff0c 就是除了概念以外问的有点懵逼了 xff08 呜呜呜 xff09 回来之后把这些题目做了一个分类并整理出答案 xff08 强迫症的我狂补知识 xff09 分
  • Ubuntu18.04 远程命令行下安装并启动x11vnc

    最近做项目需要连接ubuntu的图像界面 xff0c 开始用XQuartZ xff0c 界面太low太丑 xff0c 而且有些应用启动不了 xff1b 后来转到使用x11vnc xff0c 在网络上查看了很多交安装x11vnc的方法 xff
  • CMakeLists.txt编写常用命令

    文章目录 一 设置cmake最小版本二 设置项目名称三 设置编译目标类型四 指定编译包含的源文件1 明确指明包含的源文件2 搜索指定目录的所有的cpp文件3 自定义搜索规则4 包含多个文件夹里的文件 五 设置包含目录六 设置链接库搜索目录七
  • Docker 拉取镜像及标签 pull | tag

    Docker 拉取镜像及标签 pull tag 重翻Fabric项目的源码 xff0c 发现Docker部分内容 xff0c 有很多不尽理解的地方 xff0c 看着看着 xff0c 就看到使用docker pull拉取Fabric镜像及使用
  • USB大容量存储设备无法启动该怎么办?

    USB大容量存储设备 xff08 USB mass storage device class xff0c 也称为USB MSC或UMS xff09 是一个协议 xff0c 允许一个USB接口的设备与电脑相连接 xff0c 以便在两者之间传输
  • Tensor数据相关的运算、函数讲解及与numpy区别

    Tensor tensorflow 中使用它来表示数据 可以看做多维数组或者list 标量是张量 xff0c 向量是张量 xff0c 矩阵是张量 xff0c 矩阵的矩阵是张量 常用几种定义方法 1 variable变量 xff0c 一般是可
  • QGC4.1.2二次开发(1)--Qt5.12.6 andorid开发环境搭建

    开发环境介绍 xff1a QGC版本 xff1a 4 1 2 Qt版本 xff1a 5 12 6 xff08 QGC要求 xff09 windows平台开发 xff1a vs2017 andorid平台 xff1a JDK Java SE
  • SITL--仿真多架无人机

    SITL仿真环境搭建 ardupliot源码下载与编译 首先需要安装Ardupliot开源飞控的开发环境 xff0c 参考这个知乎博主的文章 xff1a 链接 我的安装环境 ubuntu20 04 先下载Ardupilot源码 xff0c
  • QGC4.1.2二次开发(2)QGC连接与数据收发

    文章目录 前言一 连接原理二 连接过程与数据收发1 连接过程 xff08 以串口为例 xff09 2 数据发送 总结 前言 QGC连接无人机飞控时支持多种连接方式 xff0c 并且可以自动连接 xff0c 不由让人好奇它的实现原理 xff0