QGC二次开发---框选多机执行解锁任务2

QGC二次开发 # 视频流代码分析 视频GUI代码分析 Gui代码的根:MainRootWindow.qml 配置文件的代码: GeneralSetting.qml _videoSettings.videoSource settingmanager -> _videosettings videosetting.h -> DEFINE_SETTINGFACT(videoSource) 视频GUI代码 FlyView.qml - MainRootWindow除了header(上面的toolbar部分)的部分是fl 阅读详情

上一篇中,已经展示了实现以后的效果动图以及实现思路。此篇着重开始编写前端QML界面代码,包括获取鼠标按压/释放点的坐标、绘制矩形线框的代码。

阻拦地图插件的鼠标事件

在FlightDisplayView.qml中,直接在Map视图添加鼠标事件,将会拖动地图,所以需要在地图窗口添加一个遮罩层(Rectangle)

然后添加鼠标事件

最后添加一个Canvas画布,在鼠标位置改变时绘制,代码如下:

//定义变量
//记录按压、释放时的坐标
property  var pressedPonit;
property  var relasedPonit;
//绘制选中框
//鼠标点击坐标位置
property real startX     //储存鼠标开始时的坐标
property real startY
property real stopX      //储存鼠标结束时的坐标
property real stopY
property bool isMouseMoveEnable: false //是否允许鼠标移动绘制事件

//--------------------------------------------------------------
//-- Map View
        Item {
            id: _flightMapContainer
            z:  mainIsMap ? _mapAndVideo.z + 1 : _mapAndVideo.z + 2
            anchors.left:   _mapAndVideo.left
            anchors.bottom: _mapAndVideo.bottom
            visible:        mainIsMap || _isPipVisible && !QGroundControl.videoManager.fullScreen
            width:          mainIsMap ? _mapAndVideo.width  : _pipSize
            height:         mainIsMap ? _mapAndVideo.height : _pipSize * (9/16)
            states: [
                State {
                    name:   "pipMode"
                    PropertyChanges {
                        target:             _flightMapContainer
                        anchors.margins:    ScreenTools.defaultFontPixelHeight
                    }
                },
                State {
                    name:   "fullMode"
                    PropertyChanges {
                        target:             _flightMapContainer
                        anchors.margins:    0
                    }
                }
            ]
            FlightDisplayViewMap {
                id:                         _fMap
                anchors.fill:               parent
                guidedActionsController:    _guidedController
                missionController:          _planController
                flightWidgets:              flightDisplayViewWidgets
                rightPanelWidth:            ScreenTools.defaultFontPixelHeight * 9
                multiVehicleView:           !singleVehicleView.checked
                scaleState:                 (mainIsMap && flyViewOverlay.item) ? (flyViewOverlay.item.scaleState ? flyViewOverlay.item.scaleState : "bottomMode") : "bottomMode"
                Component.onCompleted: {
                    mainWindow.flightDisplayMap = _fMap
                    _fMap.adjustMapSize()
                }
            }
            //
            Rectangle{
                anchors.fill: parent
                opacity: 0
            }
            //框选边框
            //创建一个画布
            Canvas{
                id:canvas;
                anchors.fill:parent

                onPaint: {
                    var ctx = getContext("2d")
                    ctx.lineWidtn = 3
                    ctx.strokeStyle = "blue";


                    if (!isMouseMoveEnable) {
                        ctx.clearRect(0,0,width,height) //清空所画图形
                        return;
                    }

                    if (isMouseMoveEnable){
                        ctx.clearRect(0,0,width,height)
                    }

                    //开始绘制
                    ctx.beginPath()
                    ctx.moveTo(startX,startY)
                    //console.log(startX,startY)

                    //记录移动终点
                    stopX = area.mouseX
                    stopY = area.mouseY

                    //绘制长方形
                    ctx.strokeRect(startX,startY,stopX-startX,stopY-startY)
                    ctx.stroke()
                }

            }
            //对框选目标进行操纵
            Rectangle{
                id:carryVehicleRect
                width: 100
                height: 200
                x:0
                y:0
                visible: false
                z:_mapAndVideo.z + 4
                Column{
                    spacing: 2
                    Button{
                        text: "Arm"
                        MouseArea{
                            anchors.fill: parent
                            onClicked: {
                                QGroundControl.multiVehicleManager.setCarryVehicleArmd()
                                carryVehicleRect.visible=false
                            }
                        }
                    }
                    Button{
                        text: "DisArm"
                        MouseArea{
                            anchors.fill: parent
                            onClicked: {
                                QGroundControl.multiVehicleManager.setCarryVehicleDisarmd()
                                carryVehicleRect.visible=false
                            }
                        }
                    }
                }
            }
            MouseArea{
                id:area
                anchors.fill: parent
                acceptedButtons: Qt.LeftButton| Qt.RightButton
                //实现框选多个载具功能
                onPressed: {
                    if(mouse.button == Qt.RightButton)
                    {
                        pressedPonit = _fMap.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
                        startX = mouse.x;
                        startY = mouse.y;
                        isMouseMoveEnable = true
                        console.log(pressedPonit.latitude,pressedPonit.longitude)
                    }
                }
                onReleased: {
                    if(mouse.button == Qt.RightButton)
                    {
                        relasedPonit = _fMap.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
                        carryVehicleRect.x=mouse.x-carryVehicleRect.width
                        carryVehicleRect.y=mouse.y
                        carryVehicleRect.visible=true
                        console.log(relasedPonit.latitude,relasedPonit.longitude)
                        //调用判断框选中载具
                        QGroundControl.multiVehicleManager.getCarryVehicleId(pressedPonit.latitude,pressedPonit.longitude,relasedPonit.latitude,relasedPonit.longitude)
                        isMouseMoveEnable = false
                        canvas.requestPaint()      //当鼠标released时,调用绘制paint
                    }
                }
                //当鼠标press位置改变,调用本函数
                onPositionChanged: {
                    if (isMouseMoveEnable){
                        canvas.requestPaint()   //绘制函数
                    }
                }
                //解决添加蒙层后阻断FlightDisplayViewMap页面点击按钮事件
                //具体效果待测试
                onClicked: {
                    _fMap.clickFlightDisplayView()
                }
            }
        }

QGC地面站二次开发(一)地面站介绍以及软件框架(1)地面站使用介绍和接口介绍 阅读详情

相关推荐

QGC地面站二次开发(三)Qt 简洁地面站

QGC地面站二次开发(三)Qt 简洁地面站

Neil_Chris的博客 1万+

【无标题】

win10下QGC二次开发环境搭建及编译小结

weixin_45924467的博客 3118

QGC二次开发---多机协同任务解锁的框选交互设计

本文深入探讨了在QGC地面站二次开发中,如何设计并实现高效的多机协同任务框选交互功能。通过从鼠标事件捕获、坐标转换到无人机位置判断与批量指令下发的完整链路拆解,详细说明了如何将传统的“点选”升级为“框选”,以支持对多架无人机进行批量解锁等操作,从而显著提升集群控制场景下的操作效率与用户体验。

weixin_29051149的博客 435

QGC二次开发笔记 一:Mavlink生成和MockLink模拟收发通讯

跟随http://t.csdn.cn/XRD0G 进行QGC显示页面的控件自定义以及QGC中涉及mavlink通讯协议的几个类的学习

Hail__hydra的博客 2446

无人机集群控制:QGC二次开发之框选多机任务执行避坑指南

本文深入探讨了无人机集群控制中,基于QGroundControl进行二次开发实现框选多机任务执行的关键技术与避坑指南。文章聚焦于提升集群操作效率,详细解析了从屏幕坐标到地理坐标的精准转换、多机状态管理的线程安全、以及通过指令队列确保批量解锁等任务执行的可靠性等核心挑战,为开发者提供了经过验证的工程实践与解决方案。

weixin_29067143的博客 235

QGC二次开发进阶---多机协同任务中的智能框选与指令批量下发

本文深入探讨了QGC二次开发中多机协同任务的智能框选与指令批量下发技术。通过坐标转换和算法优化,实现了高效的多机选择与并行指令下发,显著提升操作效率。文章结合实战案例,详细解析了界面交互设计、性能优化及异常处理方案,为无人机编队控制开发提供实用指导。

weixin_29054195的博客 345

QGC二次开发---框选多机执行解锁任务1

在多架无人机同时在一台地面站上操作时,我们通常希望能够通过鼠标框选其中部分无人机,对选中的无人机执行相同的操作,例如解锁指令,如上图所示效果。此篇文章先对实现思路进行讲解,具体的实现代码机过程,在后续文章中。 实现思路 1、获取鼠标框选时按压和释放的鼠标坐标值,通过Qt Map组件的函数toCoordinate(),转换为地图上的经纬度值。 2、在MultiVehicleManager类中增填函数,用于判断所有连接的无人机的经纬度是否在鼠标框选的经纬度内,将在框选内的无人机ID号存入一个...

hellocode_7812的博客 1806

Qt实战:QGC地面站如何实现框选多机批量解锁(附完整代码解析)

本文深入解析了在QGC地面站中利用Qt框架实现框选多机并执行批量解锁等指令的完整方案。通过剖析坐标转换、核心数据逻辑封装、QML前端交互设计及批量指令的可靠性处理,为无人机集群作业的二次开发提供了高效、可扩展的实战代码与架构思路。

weixin_29063979的博客 164

QGC二次开发---多机协同任务中的智能框选与指令批量下发

本文深入探讨了QGC二次开发中多机协同任务的智能框选与指令批量下发技术。通过分析农业植保、物流配送等场景的核心痛点,详细介绍了智能框选的实现原理、交互设计优化及指令批量下发的工程实践,显著提升了多无人机协同作业的效率与精准度。

weixin_29080843的博客 188

Qt实战:QGC地面站如何实现多无人机框选解锁(附完整代码解析)

本文深入解析了基于Qt框架的QGC地面站如何实现多无人机框选解锁功能,涵盖从地图坐标转换、多机筛选算法到动态UI交互设计的完整实现流程。通过Qt的信号槽机制与MAVLink协议结合,开发者可以高效构建专业级无人机集群控制系统,特别适合需要二次开发的无人机应用场景。

weixin_29031161的博客 391

Pixhawk飞行测试流程:从Stabilize到Loiter的四步安全闭环

Pixhawk飞控并非即插即用的黑盒设备,其可靠飞行依赖于严谨的嵌入式控制闭环与多传感器协同机制。理解姿态稳定(Stabilize)、定高(Alt Hold)、定点悬停(Loiter)等模式的层级依赖关系,是构建飞行安全的前提;而GPS锁星验证、气压计热漂移补偿、Safety硬件熔断机制等底层原理,直接决定失控风险边界。该流程不仅支撑农业植保、物流无人机等工程落地,更成为适航预审与故障归因的核心依据。掌握‘测、判、调、记’四步法,实质是建立人机信任、保障日志可追溯、实现参数精调与风险前置拦截的技术实践路径。

weixin_33924312的博客 371

基于开源飞控pix的无人机装调与测试

适用人群:希望进一步掌握无人机装调的飞手从零搭建无人机硬件平台的学生/教师无人机爱好者,开发者其他尚未入门开源PX4固件调试的学习者直播回放无人机装调与测试(一):无人机基本常识/预备知识固件是是烧录在飞控硬件中的软件,pixhawk飞控支持PX4和ArduPilot两种版本的固件。本次课程重点以PX4固件为基础进行讲解PX4 1.10以上固件QGC固件版本1.11一、将要观察的数据声明成uORB消息,并发布。我这里随便添加了一个。

超维空间科技的博客 2万+

保姆级教程:用PlotJuggler分析PX4日志,从FFT到姿态数据一网打尽

本文提供了一份详细的保姆级教程,教你如何使用PlotJuggler分析PX4日志数据,从FFT振动分析到姿态数据解算一网打尽。通过实战案例和高级技巧,帮助开发者快速掌握无人机日志分析的核心方法,提升故障诊断效率。

weixin_42653691的博客 235

新品发布 | P600准行业无人机研发平台,室外视觉识别跟踪、激光雷达避障、多机组网!

P600吊舱跟踪宣传视频

AMOVLAB(阿木实验室) 2479

QGC二次开发-框选多机进行解锁实现

实现在飞行页面通过鼠标框选中多架载具点击按钮进行加锁或者解锁。实现参考链接https://blog.youkuaiyun.com/hellocode_7812/article/details/124589462#comments_23821602。不是完整项目资源,只截取了修改过的几页代码,酌情下载。

qgc源码,供qgc二次开发用

qgc源码,供qgc二次开发用

鲁班猫4机载电脑+px4飞控切换动捕定位源

需要在地面站QGC中设置相关参数:具体参数设置由于版本变化,V1.14版本后采用EKF2_EV_CTRL来代替EKF2_AID_MASK,而EKF2_EV_CTRL默认的参数15实际可以直接使用,因此无需修改。另外,确保EKF2_HGT_MODE设置为vision模式即可。还有一些涉及到时延以及坐标微调的参数可以暂时不管。

hotlrng的博客 301

FastAPI + Layui:打造企业级敏捷开发后台管理系统

本文详细介绍了如何使用FastAPI和Layui构建高效的企业级后台管理系统。FastAPI提供高性能的异步API支持,而Layui则简化了前端开发流程,两者结合可实现快速开发和部署。文章涵盖了从环境搭建、核心组件开发到性能优化的全流程,特别适合需要敏捷开发的企业项目。

weixin_29045585的博客 555

QGC二次开发入门教程(一):课程大纲

QGC版本:4.2.4稳定版需要的基础:少量的C++、QT基础飞控固件:PX4、Ardupilot课程答疑微(18362086993)课程所用虚拟机(已配置好开发环境)链接:https://pan.baidu.com/s/12zes9Jk2OB_c2ghNsAKv1w?pwd=7o4u提取码:7o4u–来自百度网盘超级会员V6的分享独家汉化版QGC下载地址:链接:https://pan.baidu.com/s/16G97kfid-tDQq2kZCEYjnQ?pwd=es97。

超维空间科技的博客 1万+

Linux单独编译设备树,开发者分享 | Petalinux 工程中设备树的介绍

本文来自XILINX嵌入式产品应用工程师 Terry Ni设备树是 Petalinux kernel 的关键组件,接下来以 2020.1 版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。Petalinux 工程中设备树的位置当我们创建了一个 petalinux 工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的...

weixin_28877107的博客 2584

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+
上一篇: QGC二次开发---框选多机执行解锁任务1
下一篇: UE4---在Windows10交叉编译Linux版本报错
hellocode_7812
博客等级 码龄5年 32粉丝 14原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值