一.环境搭建
主要是PCL的环境搭建,这部分比较复杂,遇到问题可以私信我一起交流.
VS2019+QT5.12.10+PCL1.11.1+VTK8.2.0(cmake3.20.4)环境搭配
二.ui界面设计
三.头文件代码
#include <pcl/point_cloud.h>
#include <pcl/octree/octree.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
#include <vtkRenderWindow.h>
#include <vtkPlaneSource.h>
#include "udpThread"//自己写的udp雷达数据接收线程,没有雷达的自己模拟点云数据即可
class frmPointCloud : public QWidget
{
Q_OBJECT
public:
frmPointCloud(QWidget *parent = Q_NULLPTR);
~frmPointCloud();
private slots:
void on_pbtnStart_clicked()
void sloUpdatePointCloud(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr);
private
pcl::visualization::PCLVisualizer::Ptr viewer;
udpThread UDPthread;
};
四.源文件代码
frmPointCloud::frmPointCloud(QWidget *parent)
: QWidget(parent),
viewer(new pcl::visualization::PCLVisualizer("showPointCloud", false))
{
//在udp雷达线程中获取到一帧点云数据就更新点云
connect(&UDPthread, SIGNAL(pointdata(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr)), this, SLOT(sloUpdatePointCloud(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr)));
//点云视图的一些设置,可以不设置
viewer->initCameraParameters();
viewer->setBackgroundColor(0, 0, 0, 0);
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "radar cloud", 0);
//添加camera视角
viewer->createViewPortCamera(0);
//设置视角位置
//viewer->setCameraPosition(0,0,0,0,0,0,0,0,0);
//添加坐标系
viewer->addCoordinateSystem(0.9, "coordinateSystem v1", 0);
//将viewer视图添加到vtk上
ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
ui.qvtkWidget->update();
}
void frmLidarPointCloud::sloUpdatePointCloud(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr udpPointCloud)
{
//删除视图中原来的点云
viewer->removeAllPointClouds(0);
//定义一个设置点云的颜色,三个数字代表颜色rgb
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGBA> point_color(udpPointCloud, 0, 150, 200);
//添加点云
viewer->addPointCloud(udpPointCloud, point_color, "radar cloud", 0);
//设置散点大小
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1.3, "radar cloud");
ui.qvtkWidget->update();
}
void frmPointCloud::on_pbtnStart_clicked()
{
if (ui.pbtnStart->text() == "接收雷达") {
if (!UDPthread.isRunning()) {
UDPthread.start();
}
ui.pbtnStart->setText("暂停接收");
}
else {
if (UDPthread.isRunning()) {
UDPthread.stop();
}
ui.pbtnStart->setText("接收雷达");
}
}
五.UDP部分的部分代码供参考
QVector<pcl::PointXYZRGBA> points;
pcl::PointXYZRGBA vector3d(x, y, z, 0, 255, 255,255);//xyz为三维坐标点,可自己模拟
points.push_back(vector3d);
void udpThread::emitFrameData()
{
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr pointCloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
for (int i = 0; i < points.size(); i++)
{
pointCloud->push_back(points.at(i));
}
emit pointdata(pointCloud); //发送一帧雷达数据
points.clear();
}
五.显示效果
六.其他
关闭vtk启动界面加上代码:
#include <vtkOutPutWindow.h>
vtkOutputWindow::SetGlobalWarningDisplay(0);
不使用PCL使用QT绘制点云可以看前面的文章。
Qt中使用QtDataVisualization实时绘制雷达点云三维散点图