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表格

原文地址:https://www.cnblogs.com/tangyuanjie/p/14304636.html