本文最后更新于298 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
1.添加路径规划功能
将三维测量点投影到一个平面上,推测一个剂量值,然后平面路径规划 之后再把路径显示到三维中
1. 投影方式
- 直接投影到基平面(如 XY 平面):
- 忽略 Z 坐标,将所有三维点投影到 XY 平面上。
- 这是最简单的方式,适用于高度变化不大或高度信息不重要的场景。
- 投影到特定高度平面:
- 选择一个特定的高度(如地面高度),将所有三维点投影到该平面上。
- 适用于需要关注特定高度(如地面)的场景。
2. 数据聚合方法
在将三维数据投影到二维平面后,需要对每个二维网格内的数据进行聚合。以下是几种常见的聚合方法:
(1) 取最大值
- 方法:在每个二维网格内,取所有投影点中的最大剂量值。
- 适用场景:
- 当需要规避高剂量区域时,取最大值可以确保路径规划避开最危险的区域。
- 适用于对高剂量区域敏感的应用(如辐射防护)。
#include <iostream>
#include <QApplication>
#include <QMainWindow>
#include <QFileDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <QSlider>
#include <QLabel>
// Point Cloud Library
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
// VTK
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <QVTKWidget.h>
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化点云
cloud.reset(new PointCloudT);
// 设置窗口标题
this->setWindowTitle("3D Point Cloud Viewer with Path Planning");
// 创建用于显示点云的窗口部件
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
renderWindow->AddRenderer(renderer);
viewer.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "viewer", false));
// 创建 QVTKWidget 并设置到主窗口
vtkWidget = new QVTKWidget(this);
vtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(vtkWidget->GetInteractor(), vtkWidget->GetRenderWindow());
// 设置布局
QWidget *centralWidget = new QWidget(this);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->addWidget(vtkWidget);
this->setCentralWidget(centralWidget);
// 加载点云按钮
loadButton = new QPushButton("Load Point Cloud", this);
layout->addWidget(loadButton);
// 目标点按钮
targetButton = new QPushButton("Set Target Point", this);
layout->addWidget(targetButton);
// 连接按钮信号与槽
connect(loadButton, &QPushButton::clicked, this, &MainWindow::loadPointCloud);
connect(targetButton, &QPushButton::clicked, this, &MainWindow::setTargetPoint);
// 初始化路径规划器
planner = nullptr;
}
~MainWindow()
{
delete ui;
}
public Q_SLOTS:
void loadPointCloud()
{
QString fileName = QFileDialog::getOpenFileName(this, "Open PCD File", "", "PCD Files (*.pcd)");
if (!fileName.isEmpty()) {
if (pcl::io::loadPCDFile<pcl::PointXYZRGBA>(fileName.toStdString(), *cloud) == -1) {
PCL_ERROR("Couldn't read file %s \n", fileName.toStdString().c_str());
return;
}
// 显示点云
viewer->addPointCloud<pcl::PointXYZRGBA>(cloud, "cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");
viewer->resetCamera();
viewer->spinOnce();
}
}
void setTargetPoint()
{
// 这里你可以实现选择目标点的逻辑,例如通过鼠标点击选择点云中的一个点
// 然后调用路径规划器来规划路径
std::cout << "Setting target point..." << std::endl;
// 示例:假设选择点云的最后一个点作为目标点
if (!cloud->points.empty()) {
int index = cloud->points.size() - 1;
pcl::PointXYZRGBA targetPoint = cloud->points[index];
// 创建路径规划器并规划路径到目标点
if (planner == nullptr) {
planner = new PathPlanner(cloud); // 假设你的路径规划器类有一个构造函数接受点云
}
std::vector<pcl::PointXYZ> path = planner->planPath(cloud->points[0], targetPoint);
// 显示路径(示例:将路径点保存到一个文件)
if (!path.empty()) {
std::cout << "Path planned with " << path.size() << " points." << std::endl;
// 在这里你可以添加代码来可视化路径或保存路径到文件
}
}
}
private:
Ui::MainWindow *ui;
QVTKWidget *vtkWidget;
vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow;
pcl::visualization::PCLVisualizer::Ptr viewer;
PointCloudT::Ptr cloud;
QPushButton *loadButton;
QPushButton *targetButton;
PathPlanner *planner; // 假设你的路径规划器类名为 PathPlanner
};
// PathPlanner 类的简单实现示例(需要根据你的具体需求调整)
class PathPlanner {
public:
PathPlanner(PointCloudT::Ptr cloud) : cloud(cloud) {}
std::vector<pcl::PointXYZ> planPath(const pcl::PointXYZ &start, const pcl::PointXYZ &goal) {
// 这里是路径规划的逻辑
// 在实际应用中,你需要根据你的具体算法(如 A*)来实现
std::vector<pcl::PointXYZ> path;
// 示例:添加起点和目标点到路径
path.push_back(start);
path.push_back(goal);
return path;
}
private:
PointCloudT::Ptr cloud;
};
2.扫描实时获取图-网格化(优化性能)
具体实现 体素滤波降采样后减少点云个数 然后再将剩下的点云放大即可
3.剂量算法优化(低剂量区域采用能谱探测器G(E)函数转换)
4.反投影算法优化(看是否能添加方向因子)





