zoukankan      html  css  js  c++  java
  • lidarShow-master(地面站)

    项目使用qt5.4编写,我使用5.2打开,遇到很多错误,需要把ui**.h文件,user文件都删除,编码全部用notepad更改成utf-8格式才能正常构件

     

    数据解析

     

    将接受到的字节码进行缓存;使用静态局部变量;

    接收到一个完整的数据帧后,对其进行处理

     

    判断数据帧的类型,判断是姿态信息还是激光雷达信息

    使用信号将数据发送给主线程用于显示

     

     

    将子线程(用于串口数据收发和数据解析)发出的信号与主线程的槽函数进行连接,在主线程对数据进行处理;

     

    绘制雷达图

    void radiaTrueShow::doRadar()

    {

    int i;

    pix->fill(Qt::white);

    QPainter painter(pix);

    QPainterPath pathTemp;

    painter.translate(ui->widget->rect().center().x(),ui->widget->rect().center().y()); //以矩形的中心为原点

    QRect rect;

    int lenght = ui->widget->rect().height()/20;

    QBrush brush(Qt::green, Qt::Dense2Pattern); //画刷可以设置颜色和填充模式

    painter.setBrush(brush);

    painter.drawEllipse(-(lenght*10),-(lenght*10),lenght*20,lenght*20);

    painter.setPen(Qt::white);

    painter.setBrush(Qt::NoBrush);

    for(i = 0;i<10;i++)//绘制同心圆

    {

    painter.drawEllipse(-(lenght*i),-(lenght*i),(lenght*i)*2,(lenght*i)*2);//绘制椭圆、圆(x,y,w,h),,,(x,y)为左上角坐标,w为长,h为宽

    }

    //绘制辐射线

    painter.translate(-ui->widget->rect().center().x(),-ui->widget->rect().center().y());//变回原来的零点

    painter.setPen(Qt::red);

    painter.setBrush(Qt::NoBrush);

     

    pathTemp.moveTo(ui->widget->rect().center());

    pathTemp.lineTo(ui->widget->rect().center().x()+200,ui->widget->rect().center().y()+200);

    painter.drawPath(pathTemp);

     

    pathTemp.moveTo(ui->widget->rect().center());

    pathTemp.lineTo(ui->widget->rect().center().x()-200,ui->widget->rect().center().y()+200);

    painter.drawPath(pathTemp);

     

    painter.setPen(Qt::red);

    painter.drawText(20, 0, 100, 20,Qt::AlignHCenter | Qt::AlignTop, "雷达显示图");

    //painter.drawText(x, y, width, height, alignment, text);其中(x,y,width,height)所确定的矩形,alignment确定文字在矩形中的位置。

    painter.translate(ui->widget->rect().center().x(),ui->widget->rect().center().y());//变回图形中心

    painter.drawText(lenght*0.707, lenght*0.707, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "1m");

    painter.drawText(lenght*0.707*2, lenght*0.707*2, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "2m");

    painter.drawText(lenght*0.707*3, lenght*0.707*3, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "3m");

    painter.drawText(lenght*0.707*4, lenght*0.707*4, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "4m");

    painter.drawText(lenght*0.707*5, lenght*0.707*5, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "5m");

    painter.drawText(lenght*0.707*6, lenght*0.707*6, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "6m");

    painter.drawText(lenght*0.707*7, lenght*0.707*7, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "7m");

    painter.drawText(lenght*0.707*8, lenght*0.707*8, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "8m");

    painter.drawText(lenght*0.707*9, lenght*0.707*9, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "9m");

    painter.drawText(lenght*0.707*10, lenght*0.707*10, 20, 20,Qt::AlignHCenter | Qt::AlignTop, "10m");

     

    if(init_ok==0) {//少去重复计算三角函数

    init_ok=1;

    painter.setPen(QPen(Qt::black, 2));

    painter.setBrush(Qt::NoBrush);

    for (int i=0; i<256; i++)

    {//像素应该是向右向下为正,目前中心已经搞到了图形的中心, 这里激光雷达角度是从-y轴开始,顺时针转

    pointf[i]->setX(0.0264*URGData[i]*qSin((1.40625*i)/360*2*3.14));

    pointf[i]->setY(-0.0264*URGData[i]*qCos((1.40625*i)/360*2*3.14));

    if(test)

    {

    pointf[0]->setX(0.0264*1000);//横坐标1 m 的位置

    pointf[0]->setY(0);

    }

    painter.drawPoints(pointf[i],1);

    }

     

    painter.setPen(QPen(Qt::red, 3)); //目标yaw方向标红

    painter.setBrush(Qt::VerPattern);

    painter.drawLine(0,0, -80*qCos((draw_yaw-now_yaw_here+90)/360*2*3.14), -80*qSin((draw_yaw-now_yaw_here+90)/360*2*3.14));

    painter.setPen(QPen(Qt::black, 3)); //目标roll方向标黑(目标命令左负右正)

    painter.setBrush(Qt::VerPattern);

    painter.drawLine(0,0,26.4*draw_roll, 0);

    painter.setPen(QPen(Qt::blue, 3)); //目标pitch方向标蓝(目标命令前正后负)

    painter.setBrush(Qt::NoBrush);

    painter.drawLine(0,0,0, -26.4*draw_pitch);

    update();

    }

    else {

    painter.setPen(QPen(Qt::black, 2));

    painter.setBrush(Qt::NoBrush);

    if(receiveOk==1)

    {

    for(int i=0;i<256;i++)

    {

    // pointf[receiveNum[i]]->setX(0.0264*URGData[receiveNum[i]]*qCos((0.625+1.25*receiveNum[i]-45)/360*2*3.14));

    // pointf[receiveNum[i]]->setY(-0.0264*URGData[receiveNum[i]]*qSin((0.625+1.25*receiveNum[i]-45)/360*2*3.14));

    pointf[i]->setX(0.0264*URGData[i]*qSin((1.40625*i)/360*2*3.14));

    pointf[i]->setY(-0.0264*URGData[i]*qCos((1.40625*i)/360*2*3.14));

    }

    receiveOk=0;

     

    if(test)

    {

    pointf[0]->setX(0.0264*1000);

    pointf[0]->setY(0);

    }

     

    }

    for(int j=0;j<256;j++)

    {

    painter.drawPoints(pointf[j],1);

    }

    painter.setPen(QPen(Qt::red, 3)); //目标方向标红

    painter.setBrush(Qt::VerPattern);

    painter.drawLine(0,0, -80*qCos((draw_yaw-now_yaw_here+90)/360*2*3.14), -80*qSin((draw_yaw-now_yaw_here+90)/360*2*3.14));

    painter.setPen(QPen(Qt::black, 3)); //目标roll方向标黑(目标命令左负右正)

    painter.setBrush(Qt::VerPattern);

    painter.drawLine(0,0,26.4*draw_roll, 0);

    painter.setPen(QPen(Qt::blue, 3)); //目标pitch方向标蓝(目标命令前正后负)

    painter.setBrush(Qt::NoBrush);

    painter.drawLine(0,0,0,-26.4*draw_pitch);

    update();

    }

    }

     

     

    绘制航向仪表盘

    全部手动绘制,作为自定义控件,在主窗口添加基础控件后提升为自定义控件;

    绘制表盘上的字母

    绘制中间的刻度尺

     

    绘制波形曲线

    使用QcustomPlot自定义控件;提升控件;

     

     

    将数据存储到Excel表格

  • 相关阅读:
    一些比较实用的小函数
    开发KOL程序 (1)
    开发KOL程序2
    使用mask来制作图像透明
    用U盘方便快捷安装系统
    Windows记忆专家
    Delphi开发桌面图标列表查看程序
    js压缩上传图片,转载
    js操作二进制数据
    mui扫码横屏全屏
  • 原文地址:https://www.cnblogs.com/tangyuanjie/p/14304636.html
Copyright © 2011-2022 走看看