Qt/C++实现无人机监控系统/航点实时监控系统/集群地面站管理平台/飞行轨迹规划和模拟

一、前言说明

没想到有一天还会做无人机相关的软件开发,这个主要得益于把相关功能点的组件都基本实现好了,比如地图组件,带有轨迹规划和绘制以及回放,还有个视频组件,支持任意视频源的实时画面显示以及存储和回放,比如有很多无人机是RTMP流,有些是私有流,解码出来264/265裸流数据直接放入这个视频组件也能播放,之前还专门特意花了大功夫实现这个功能,直接append数据即可,不需要打开一个url地址。还有一大块就是飞控控件,这个自己也纯代码绘制写过几个,但是写的不是很好,后面发现网上有个svg做的,写的非常好非常全,专业的飞控控件套件,但是性能稍微有点低就是,好在一个软件上也不会有太多的飞控控件放在上面,所以影响也不大。

地图组件目前采用的浏览器控件的方式,为了能够mingw的套件也能支持,还特意封装了通用的浏览器组件,如果是msvc或者linux系统则自动采用webengine控件,mingw的qt则采用miniblink控件,后期还会增加cef控件,这样就算一种控件不存在,另一个控件可以补上,完美支持所有可能的开发环境。理论上来说浏览器加载html地图网页交互的方式,性能上打折扣的,肯定没有直接painter的方式来得快,优点就是利用现成的js代码,开发起来非常快速,有时候项目就是要快,快速出项目抢占市场,然后再慢慢迭代优化,只要市场拿下了,资金到位了,后期全部重构也不是不可能。

二、效果图

Snipaste_2025-10-08_09-13-54

Snipaste_2025-10-08_09-14-23

Snipaste_2025-10-08_09-15-11

三、相关代码

#include "apphelper.h"
#include "appconfig.h"MapObjBase *AppHelper::mapObj = NULL;
QString AppHelper::selectId = "1";
bool AppHelper::selectPoint = false;void AppHelper::append(const QString &id, const QString &point, const QString &pointx)
{if (!AppConfig::FlyIds.contains(id)) {return;}if (!point.isEmpty()) {//绘制实时轨迹点mapObj->runJs(QString("addDataByFlag('line_%1', '%2')").arg(id).arg(point));//移动飞机到最新的位置QString flag = AppHelper::getFlag(id, point);mapObj->runJs(QString("setMarker('fly_%1', '%2', '%3')").arg(id).arg(flag).arg(point));//移动中心点到当前点/不需要可以注释掉//mapObj->runJs(QString("setCenter('%1')").arg(point));} else if (!pointx.isEmpty()) {//绘制规划轨迹点mapObj->runJs(QString("addDataByFlag('linex_%1', '%2')").arg(id).arg(pointx));}
}void AppHelper::appendReal(const QString &id, const QString &lng, const QString &lat)
{AppHelper::append(id, QString("%1,%2").arg(lng).arg(lat), "");
}void AppHelper::appendPlan(const QString &id, const QString &lng, const QString &lat)
{AppHelper::append(id, "", QString("%1,%2").arg(lng).arg(lat));
}QString AppHelper::getFlag(const QString &id, const QString &point)
{QString flag = AppConfig::FlagFormat;flag.replace("[id]", id);flag.replace("[point]", point);return flag;
}//121.46347,31.24099;121.61728,31.24099;121.61728,31.09939;121.46347,31.09939
QString AppHelper::rectToJson(const QString &rect)
{QStringList result;QStringList points = rect.split(";");foreach (QString point, points) {QStringList list = point.split(",");result << QString("{\"lat\":%1,\"lon\":%2}").arg(list.at(0)).arg(list.at(1));}return QString("[%1]").arg(result.join(","));
}QString AppHelper::flyToJson(const QString &id, const QString &point)
{QStringList list = point.split(",");return QString("{\"id\": %1, \"lat\": %2, \"lon\": %3, \"alt\": %4}").arg(id).arg(list.at(1)).arg(list.at(0)).arg(0);
}QString AppHelper::getValue(double value)
{return QString::number(value, 'f', 13);
}//{\"id\": 1, \"lat\": 39.4682720000002, \"lon\": 116.14106, \"alt\": 30}
QString AppHelper::jsonToPoint(const QString &json, QString &lng, QString &lat)
{QString id;
#if 0QString text = json;text.replace(":", ",");text.replace(" ", "");QStringList list = text.split(",");if (list.count() == 8) {id = list.at(1);lng = list.at(5);lat = list.at(3);}
#elseQJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());if (doc.isNull()) {return id;}QJsonObject obj = doc.object();int idx = obj["id"].toInt();double latx = obj["lat"].toDouble();double lonx = obj["lon"].toDouble();//转换后保留精度id = QString::number(idx);lng = AppHelper::getValue(lonx);lat = AppHelper::getValue(latx);
#endifreturn id;
}QStringList AppHelper::getPoints(const QString &fileName)
{QStringList points;QFile file(fileName);if (!file.open(QFile::ReadOnly)) {return points;}QByteArray data = file.readAll();QJsonDocument doc = QJsonDocument::fromJson(data);if (doc.isNull() || !doc.isArray()) {return points;}QJsonArray array = doc.array();for (int i = 0; i < array.size(); ++i) {QJsonObject obj = array[i].toObject();double latx = obj["lat"].toDouble();double lonx = obj["lon"].toDouble();QString lng = AppHelper::getValue(lonx);QString lat = AppHelper::getValue(latx);points << lng + "," + lat;}return points;
}

四、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip

五、功能特点

5.1 地图功能

  1. 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图、谷歌地图等。
  2. 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
  3. 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
  4. 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
  5. 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
  6. 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
  7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
  8. 支持添加标注、删除标注、移动标注、清空标注。
  9. 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
  10. 标注点事件支持单击发信号通知和自己弹框显示信息。
  11. 提供地址转坐标和坐标转地址接口。
  12. 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
  13. 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
  14. 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
  15. 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
  16. 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
  17. 可以添加海量点,每个点都可以单击获取对应坐标和信息。
  18. 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
  19. 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
  20. 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
  21. 可以设置不同的地图视图比如街道图、卫星图、混合图。
  22. 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
  23. 可以设置地图的旋转角度和倾斜角度。
  24. 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
  25. 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
  26. 同时支持qwidget和qml,支持编译到安卓系统运行。

5.2 其他功能

  1. 提供离线地图下载模块,可以选择不同的地图内核比如百度地图或者谷歌地图,不同的地图类型比如下载街道图还是卫星图,不同的地图层级,多线程极速下载。
  2. 表格行实时显示对应的瓦片下载进度,有下载超时时间,重试次数,每个瓦片下载完成都发送信号通知,参数包括下载用时。
  3. 提供省市轮廓图下载模块,自动下载各个地区的轮廓图,保存到脚本文件或者文本文件。
  4. 支持手动调整不同区域的轮廓边界,调整后可以主动获取调整后的边界点集合。
  5. 提供动态点位示例,手动在地图上选点并添加标注,附带自定义的信息比如速度和时间等。
  6. 提供海量点位示例,批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。
  7. 提供动态轨迹示例,在地图上鼠标按下选择起点和终点后,查询路线,获取路径轨迹点,模拟轨迹平滑移动。可以筛选数据将过多的路径点筛选到设定的点数。
  8. 提供轨迹回放示例,按照指定的轨迹点列表回放,也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。
  9. 提供省市区域地图示例,采用echart组件,同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
  10. 省市区域地图示例,内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。可设置城市的名称、值、经纬度集合。
  11. 内置通用浏览器组件,同时支持webkit/webengine/miniblink等内核。提供网页控件示例,演示打开网页和本地网页文件。
  12. 支持任意Qt版本、任意系统、任意编译器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GitHub每日速递 251023】46.1k star, 1.2B参数逆袭!MinerU2.5成最牛文档解析多模态大模型

原文:https://mp.weixin.qq.com/s/0V9R33AYXPjbgcO-OkBsNg Klavis AI:突破工具集成极限,4 种方式让 AI 无缝对接多服务! klavis 是一个实现MCP集成层的AI工具。简单讲,它让AI代理能稳定使用成千上万种工具。适用人…

Python随笔(第一周)

字符串Python 语言中,字符串是用两个双引号""或者单引号括起来的零个或多个字符 字符串中的字母和中文都算一个字符且空格也算 字符串也提供区间访问方式,可采用[N:M]格式,表示字符串中从N到M(不包含M)…

我在政和一中的求学岁月(1993-1997)

一、命运的起点:从“跳出农门”的梦想到踏入一中1993年的夏天,命运将我带到了政和一中,这并非我中考的第一志愿。在那个年代,对于像我这样的农村孩子,考入中专或师范是“跳出农门”的终极梦想——这意味着“农转非…

互测记录

1本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/19159453

读AI赋能07基准测试

读AI赋能07基准测试1. 测试 1.1. 测试是普通公众了解AI及其快速增长能力的最主要途径 1.2. 在争夺基准测试霸主地位的AI太空竞赛中,只有最准确且无害的AI才能存活下来 1.3. AI领域的“竞赛”不是一场疯狂的抢占或瓜分…

微软七月补丁日修复130个漏洞,重点关注RRAS与Office安全更新

微软七月补丁日共修复130个安全漏洞,包括14个严重级别漏洞。重点涉及Windows路由和远程访问服务、Microsoft Office组件及Visual Studio开发工具,其中多个漏洞无需用户交互即可被远程利用。微软七月补丁日修复130个漏…

比特币闪电网络开源项目

以下是目前较活跃、具代表性的比特币闪电网络开源项目,涵盖节点实现、钱包、开发工具及基础设施,方便不同开发者或用户根据需求选用:一、主流闪电网络节点实现(全节点)项目名称 简介 技术特点 地址/引用LND(Ligh…

[windows xp] 还能在xp上使用的浏览器

Yes—but with very important caveats. Windows XP is extremely outdated, and modern web standards and security measures make most current browsers incompatible. That said, there are some options, mostly…

图像分割- sam2 版本 - MKT

图像分割- sam2 版本 # 使用前需要先安装 SAM 2。代码需要python>=3.10、 以及torch>=2.5.1和。请按照此处的torchvision>=0.20.1说明安装 PyTorch 和 TorchVision 依赖项。您可以使用以下方式在 GPU 机器# #…

tryhackme-网络安全基础-AD基础- Active Directory 基础知识-20

tryhackme-Cyber Security 101-Windows and AD Fundamentals-Active Directory Basics 房间地址:https://tryhackme.com/room/winadbasics 这是网络安全入门的基础模块的计算机科学基础知识:Active Directory Basics…

tryhackme-网络安全基础-命令行- windows命令行-21

tryhackme-Cyber Security 101-Command Line-Windows Command Line 房间地址:https://tryhackme.com/room/windowscommandline 这是网络安全入门的基础模块的计算机科学基础知识:Windows Command Line( windows命令…

图像分割和目标跟踪 - MKT

图像分割和目标跟踪https://github.com/IDEA-Research/Grounded-SAM-2?tab=readme-ov-file

tryhackme-网络安全基础-开启您的网络安全之旅- 搜索技巧-19

tryhackme-Cyber Security 101-Start Your Cyber Security Journey-Search Skills 房间地址:https://tryhackme.com/room/searchskills 这是网络安全入门的基础模块的计算机科学基础知识:Search Skills(搜索技巧),…

ESP32 + INMP441数字麦克风 可以做哪些有趣的应用

非常好的问题!这是一个经典的嵌入式音频应用场景。我们来详细分解一下。 1. ESP32通过I2S采集INMP441,得到的是什么数据? 答案是:标准的PCM(脉冲编码调制)数据。 更具体地说:格式:INMP441 是一个 24位 的MEMS麦…

Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)

Solon 是新一代,Java 企业级应用开发框架。从零开始构建(No Java-EE),有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议,是“杭州无耳科技有限公司”开源的根级项目,是 Java 应用开发的生态基座…

tryhackme-预安全-windows基础-windows 基础知识3-18

tryhackme-Pre Security-Windows Fundamentals -Windows Fundamentals 3 房间地址:https://tryhackme.com/room/windowsfundamentals3xzx 这是网络安全入门的基础模块的计算机科学基础知识:Windows Fundamentals 3(…

从生产到出库:医疗器械行业SAP B1MES质量追溯闭环方案

医疗器械行业通过SAP B1与MES系统集成实现全流程质量追溯闭环,应对法规合规性、供应链复杂性及生产效率挑战,提供端到端的批次追溯、实时质量监控与成本优化解决方案,助力企业提升质量管理水平医疗器械产品十分特殊…

CF1430C Numbers on Whiteboard

CF1430C Numbers on Whiteboard思路 也是简单模拟一下,就会发现无论你怎么选择a和b,结果都是2; 既然如此,我就选择方便点的,我就从后往前选a和b。 带大家模拟一下: n=10,为偶数: 1 2 3 4 5 6 7 8 9 10 找规…

SAP实施专家指南:SAP B1 如何优化成本与缩短项目周期?

SAP Business One实施过程中的关键挑战,提供精准规划、团队配置、用户培训与持续优化的实用策略。帮助企业控制成本、缩短周期,快速实现数字化转型价值。SAP Business One(SAP B1)凭借“轻量+可扩展”的特性成为热…

excel-2

import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import java.io.*;import java.util.*;import java.time.LocalDate;i…