Qt无人机姿态模拟

这篇具有很好参考价值的文章主要介绍了Qt无人机姿态模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个是我实训做的项目,是模拟对无人机姿态的控制,实现对无人机飞行数据的分析,项目主要分为登录窗口,客户端和服务器端
项目主题界面:
Qt无人机姿态模拟

需求分析:

1、设计本地登录界面及云端平台界面。
2、根据用户登录信息的不同,选择不同的云端用户级别,具体为user和vip。
3、普通用户只能查看实时数据、自动给出实时建议,超级用户可以查看实时数据、历史数据、统计数据判断是否危险飞行、生成事故报告
4、创建数据库,保存两张表,表1判断云端用户级别及用户登录验证,表2记录一定时间内的飞机姿态数据
5、事故报告以文档(word、pdf)形式生成

功能分析:

1、可以根据用户级别的不同授权不同的内容查看。
2、可以使用模拟终端(滑动按钮)来改变机身角度的值。
3、通过计算机网络将数据进行传输。
4、可以实时改变验证平台上图形的状态。
5、可以实时记录机身角度改变的内容并保存到数据库中

总体设计:

Qt无人机姿态模拟
我先从登录界面开始说起吧

登录界面的设计:

Qt无人机姿态模拟
Qt无人机姿态模拟
登录界面主要分为用户登录和管理员登录,运用了Sqlite轻量级数据库,可实现账号的注册,在普通用户界面加了一个验证码的功能,其实是通过随机数来实现验证,主要的代码如下:
创建数据库和表

 //创建数据库
    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
    //QSqlDatabase db1=QSqlDatabase::addDatabase("QSQLITE");
    //设置数据库名
    db.setDatabaseName("pwd.db");
    //db1.setDatabaseName("pwd1.db");
    //打开数据
    if(db.open())
    {
        qDebug()<<"open database success";
    }else
    {
        qDebug()<<"open database fail";
    }
    //创建一个存储用户名密码的数据库表
    QString tableuser="create table userinfo(username varchar(64),password varchar(64))";
    QString tableadmin="create table userinfo1(username1 varchar(64),password1 varchar(64))";

实现注册:

 QString username=ui->useredit->text();
    QString password=ui->passedit->text();
    QString cmd=QString("insert into userinfo values('%1','%2')")
            .arg(username).arg(password);
    QSqlQuery query;
    if(username==NULL||password==NULL)
    {
        QMessageBox::information(this,"注册提示","用户名或密码不能为空");

    }
    else if(query.exec(cmd))
    {
        QMessageBox::information(this,"注册提示","注册成功");

    }

服务器的实现:

Qt无人机姿态模拟
服务器界面就是一个模拟无人机的圆
Qt无人机姿态模拟
这里运用了Qpainter来绘制三角,圆等形状来实现对无人机的模拟,服务器接收来自客户端的消息,来进行角度的改变,接收来自客户端连接的信号:

if(svr->hasPendingConnections()){
        socket = svr->nextPendingConnection();
        connect(socket,SIGNAL(readyRead()),this,SLOT(slotRecv()));
        qDebug() << "有设备连接";
    }

接收客户端数据:

  QByteArray array = socket->readAll();
    QString str = QString::fromUtf8(array);
    QString tmp;
    int j = 0;
    while(j<str.size()){
        tmp.clear();
        int k = 0;
        for(j;j<str.length();j++)
        {
            if(str[j]>='0'&&str[j]<='9'||str[j]=='-'){
                tmp.append(str[j]);
            }
            if(str[j]==" "){
                k++;
                if(k == 1){
                    angle_spin = tmp.toInt();
                    tmp.clear();
                }else if(k==2) {
                    angle_dir = tmp.toInt();
                    tmp.clear();
                }
            }
            if(str[j]=="e"){
                j++;
                angle_pit = tmp.toInt();
                break;
            }
        }
        this->setWindowTitle("偏转角:"+QString::number(angle_spin)+"°俯仰角:"+QString::number(angle_dir)+"°方向:"+QString::number(angle_pit)+"°");
        update();
    }

客户端的实现:

Qt无人机姿态模拟
客户端主要通过三个Slider来实现对角度的控制,在tableView控件里来显示历史数据,tableView里还有一个事故,我这里设置的是三个角度大于60度就会报警,一般报警就是事故变为1.0并且图标发生改变:
Qt无人机姿态模拟
Qt无人机姿态模拟
Qt无人机姿态模拟
然后就是散点图的绘制:


    chart = new QChart();

    chart->setTitle("无人机飞行角度"); //设置表格标题

    QScatterSeries *scatterSeries1 = new QScatterSeries(chart);
    QScatterSeries *scatterSeries2 = new QScatterSeries(chart);
    QScatterSeries *scatterSeries3 = new QScatterSeries(chart);


    scatterSeries1->setName("偏航角度");
    scatterSeries1->setPointLabelsFormat("@yPoint");
    scatterSeries1->setPointLabelsVisible();
    scatterSeries1->setMarkerSize(16); // 设置节点大小

    scatterSeries2->setName("横滚角度");
    scatterSeries2->setPointLabelsFormat("@yPoint");
    scatterSeries2->setPointLabelsVisible();
    scatterSeries2->setMarkerSize(16);

    scatterSeries3->setName("俯视角度");
    scatterSeries3->setPointLabelsFormat("@yPoint");
    scatterSeries3->setPointLabelsVisible();
    scatterSeries3->setMarkerSize(16);


    QSqlQuery sql_query;
    QString select_sql = "select * from info3";// order by 字段名 +asc 递增方式
    if(!sql_query.exec(select_sql))
    {
        qDebug()<<"错误";
    }
    else
    {
        while(sql_query.next())//判断下个查询数据是否可用
        {
            static int i=1,j=1,k=1;
            int a = sql_query.value(0).toDouble();//打印某行第一列
            int b = sql_query.value(1).toDouble();
            int c=sql_query.value(2).toDouble();


            scatterSeries1->append(i,a);

            scatterSeries2->append(j,b);
            scatterSeries3->append(k,c);
            i++;
            j++;
            k++;
            if(i==90){
                i=-90;
            }
            if(j==90){
                j=-90;
            }
            if(k==0){
                k=-90;
            }


        }
    }


    // 添加节点
    //    scatterSeries1->append(0,6);
    //    scatterSeries1->append(1,10);
    //    scatterSeries1->append(4,12);
    //    scatterSeries1->append(6,5);
    //    scatterSeries2->append(0,18);
    //    scatterSeries2->append(3,13);
    //    scatterSeries2->append(5,7);
    //    scatterSeries2->append(6,2);
    chart->addSeries(scatterSeries1);
    chart->addSeries(scatterSeries2);
    chart->addSeries(scatterSeries3);
    //设置动画效果
    chart->setAnimationOptions(QChart::AllAnimations);

    chart->createDefaultAxes();//设置网格线
    chart->axes(Qt::Horizontal).first()->setRange(-90,90);// x轴范围
    chart->axes(Qt::Vertical).first()->setRange(-90,90);// y轴范围
    // Add space to label to add space between labels and axis在标签和轴之间加空格
    QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
    Q_ASSERT(axisY);
    axisY->setLabelFormat("%.1f  ");


    chart->setTheme(QChart::ChartThemeDark);

    QChartView *chartView;

    chartView = new QChartView(chart);

    zt++;
    ui->widget1->insertWidget(0,chartView,0,Qt::Alignment());
    if(zt==1){
        ui->widget1->removeWidget(chartView);
        zt=0;
    }

可以实现数据的清空,一旦清空所有数据都会删除,散点图也会清除:
Qt无人机姿态模拟
全部重置是对Slider的重置,导出数据是保存历史数据到csv文件:
Qt无人机姿态模拟
导出pdf是保存历史数据到pdf中:
Qt无人机姿态模拟

保存pdf代码:

 QFile pdfFile("D:\\test1.pdf");//输出文件名
    if(!pdfFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
        return;
    }
    QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);               //实例化QPdfWriter 可以设置PDF文件的一些参数
    pdfWriter->setPageSize(QPagedPaintDevice::A4);                  //设置纸张为A4纸
    pdfWriter->setResolution(QPrinter::ScreenResolution);           //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
    pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40));           //设置页边距 顺序是:左上右下

    QPainter *pdfPainter = new QPainter(pdfWriter);                //qt绘制工具

    //设置标题
    QTextOption option(Qt::AlignCenter);                           //标题居中显示
    option.setWrapMode(QTextOption::WordWrap);                     //标题自动换行

    // 设置标题字体 需要使用QT的QFont
    QFont font;
    font.setFamily("Microsoft YaHei");                            //设置字体 微软雅黑、宋体之类的
    font.setPointSize(22);                                        //设置字体大小
    //font.setItalic(true);//斜体
    //font.setUnderline(true);//设置下划线
    //    font.setBold(true);                                           //加粗
    pdfPainter->setFont(font);
    pdfPainter->drawText(QRect(3000, 0, 2100, 450), QString::QString::fromUtf8("历史数据"), option);//距离左边3000,上面0,标题字宽度2100,标题字高450(如果字显示不全,可以适当调整)

    //设置内容
    option.setAlignment(Qt::AlignLeft);
    font.setPointSize(14);                                       //字体大小14
    pdfPainter->setFont(font);

    pdfPainter->drawRect(200, 250, 2000, 1);
    pdfPainter->drawRect(200, 700, 2000, 4);

    pdfPainter->setFont(QFont("NSimSun", 12, QFont::Normal));


    pdfPainter->setFont(QFont("NSimSun", 14, QFont::Normal));
    option.setAlignment(Qt::AlignLeft);
    font.setPointSize(10);                                       //字体大小14
    pdfPainter->setFont(font);

    pdfPainter->drawText(200, 2000, QString::fromUtf8("偏移角度"));
    pdfPainter->drawText(1200, 2000, QString::fromUtf8("横滚角度"));
    pdfPainter->drawText(2200, 2000, QString::fromUtf8("俯视角度"));
    pdfPainter->drawText(3200, 2000, QString::fromUtf8("事故"));

    QString str = "select * from info3";
    QSqlQuery query;
    query.exec(str);

    int i=0;
    while(query.next())//依次取出下一行数据
    {
        i++;
        QString x1 = query.value(0).toString();
        QString x = query.value(1).toString();
        QString y = query.value(2).toString();
        QString z = query.value(3).toString();

        pdfPainter->drawText(200, 2000+i*200, x1);
        pdfPainter->drawText(1200, 2000+i*200, y);
        pdfPainter->drawText(2200, 2000+i*200, x);
        pdfPainter->drawText(3200, 2000+i*200, z);

        if(2000+i*200>12000)
        {
            i=i-50;
            pdfWriter->newPage();
            pdfPainter->drawText(200, 2000+i*200, x1);
            pdfPainter->drawText(1200, 2000+i*200, y);
            pdfPainter->drawText(2200, 2000+i*200, x);
            pdfPainter->drawText(3200, 2000+i*200, z);


        }
    }
    delete pdfPainter;
    delete pdfWriter;
    QDesktopServices::openUrl(QUrl::fromLocalFile("D:\\test1.pdf"));

整体的项目就是这样,最后由衷地感谢我的小组团队,以及实训的所有老师
想要例子的可以私信,添加联系文章来源地址https://www.toymoban.com/news/detail-406630.html

到了这里,关于Qt无人机姿态模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无人机中的坐标系、旋转矩阵与相机姿态计算

    球坐标系 球坐标系是三维坐标系中的一种,在无人机中一般使用球坐标系来表示相机姿态,相机姿态的坐标是相对于无人机的,而无人机的飞行姿态则是相对于大地坐标系的。这里我们使用的相机是2自由度的相机,即可以水平 ϕ phi ϕ 和垂直 θ theta θ 两个方向转动,其中

    2024年02月12日
    浏览(41)
  • 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

    前言: 本文为手把手教学飞控核心知识点之一的 姿态解算 —— MPU6050 姿态解算 (飞控专栏第2篇)。项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算( 四元数方法 ),搭配设计的 卡尔曼滤波器 与一阶低通滤波器进行数据滤波。当然,本篇博客也将为读者朋友教学

    2024年02月10日
    浏览(54)
  • STM32无人机-四轴四元数姿态解算与卡尔曼滤波

    MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。 什么是四元数 这部分很难,新手知道四元数的功能是将 6 轴传感器数据转化为三轴姿态角度数据即可。 四元数解算程序店家已经封装成一个函数,输入 MPU6050 数值,解算周

    2024年02月03日
    浏览(43)
  • 【ESP32Arduino+MPU6050姿态解算】自制无人机学习笔记2 PLatformIO 下载即可使用

    本人之前发表过一篇关于esp32读取mpu6050数据的文章,链接:http://t.csdn.cn/AwzSZ,但其存在一些漏洞,具体表现在输出数据存在不连贯和错误,在mpu6050高速运动时存在较大误差等。仅作为参考。故在此重发作为修正。当前该篇文章中所述的模块,已经过无人机稳定性控制的测试

    2024年02月16日
    浏览(44)
  • Qt地图(无人机、无人车使用)

            我们在开发无人机(或无人车)的过程时,往往需要用到地图显示无人机的实时轨迹,或是创建航点给无人机指定飞行地点。使用Qt加载地图并不是件容易的事,需要专业的地图相关的知识,如地图切片、网络加载、数据库缓存等,而我们开发无人机项目,并不想花

    2024年02月09日
    浏览(41)
  • DJI无人机二次开发:模拟航线飞行

    1.下载大疆行业调参软件(大疆官网下载,有mac系统和win系统)。 2.安装软件以后用数据线连接电脑和无人机 3.识别无人机点击进去进入模拟器设置和遥控器相同的经纬坐标 4.在遥控器上载入航线 5.开始执行以后在上云api可以看到无人机在地图上移动 6.现在就可以用模拟器产

    2024年04月14日
    浏览(41)
  • 【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

     效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

    2024年04月14日
    浏览(74)
  • Cesium 无人机巡检实时视频投射及模拟数据采集

    用投射做了两个功能,一个是模拟无人机巡检,展示当前无人机的实时视频流,并且展示当前无人机的拍摄轨迹及范围。  第二个是直接将无人机的视频投射到拍摄范围面上。 代码都差不多,只是第二个用了实时视频做材质,并且实时计算了视频材质的朝向,不然会出现视频

    2024年02月12日
    浏览(132)
  • 无人机MAVROS保姆级配置及模拟、真机飞行(全)

    本文默认使用的是ubuntu18.04 melodic系统 进入ubuntu,建议使用鱼香ros一键安装ros: 终端运行: 安装ros1,建议添加新源但不清除系统源 安装完成启动roscore以验证ros是否安装成功! 下面开始进行mavros飞行环境的搭建: 为了确保脚本的顺利进行,安装基本依赖项: genxinpiphepip3 安

    2024年02月12日
    浏览(32)
  • 计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

    该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。 该项目使用了 YOLOv5目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪! 教程博客_传送门链接-------单目测

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包