当前位置: 首页 > news >正文

PCL 生成圆柱面点云

目录

  • 一、算法原理
  • 二、代码实现
  • 三、结果展示

在这里插入图片描述
本文由CSDN点云侠原创。博客长期更新,本文最近更新时间为:2025年6月15日。

一、算法原理

  圆柱面参数方程(局部坐标系):
x = r cos ⁡ θ , y = r sin ⁡ θ , z = h x = r \cos\theta,\quad y = r \sin\theta,\quad z = h x=rcosθ,y=rsinθ,z=h
其中:

  • r r r 为圆柱半径
  • θ ∈ [ 0 , 2 π ) \theta \in [0, 2\pi) θ[0,2π) 为旋转角度
  • h ∈ [ 0 , H ] h \in [0, H] h[0,H] 为高度

二、代码实现

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/transforms.h>
#include <pcl/ModelCoefficients.h>void CreatCylinder(pcl::ModelCoefficients::Ptr& coefCylinder,pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, int Num = 1200, float height = 1.0)
{if (coefCylinder->values.size() != 7 || coefCylinder->values[6] <= 0){std::cerr << "参数输入错误!!!" << std::endl;return;}//先构建轴线为Z轴的圆柱点云float inter = 2.0 * M_PI / Num;Eigen::VectorXf vectorx(Num), vectory(Num);vectorx.setLinSpaced(Num, 0, Num - 1);vectory = vectorx;Eigen::RowVector3f axis(coefCylinder->values[3], coefCylinder->values[4], coefCylinder->values[5]);float length = axis.norm();cout << length << endl;float x0, y0, z0, r0;x0 = coefCylinder->values[0];y0 = coefCylinder->values[1];z0 = coefCylinder->values[2];r0 = coefCylinder->values[6];pcl::PointCloud<pcl::PointXYZ>::Ptr cylinder(new pcl::PointCloud<pcl::PointXYZ>);for (float z = 0.0; z <= height; z += 0.05){for (size_t i = 0; i < Num; ++i) {pcl::PointXYZ point;point.x = r0 * cosf(vectorx[i] * inter);point.y = r0 * sinf(vectory[i] * inter);point.z = z;cylinder->points.push_back(point);}}//点云旋转 Z轴转到axisEigen::RowVector3f Z(0.0, 0.0, 0.1);//Eigen::Vector3f axis(coefCylinder->values[3], coefCylinder->values[4], coefCylinder->values[5]);Eigen::Matrix4f Rotate = Eigen::Matrix4f::Identity();Rotate.block<3, 3>(0, 0) = Eigen::Quaternionf::FromTwoVectors(Z, axis).toRotationMatrix();Rotate.block<3, 1>(0, 3) = Eigen::Vector3f(coefCylinder->values[0], coefCylinder->values[1], coefCylinder->values[2]);//旋转pcl::transformPointCloud(*cylinder, *cloud, Rotate);}int main()
{pcl::ModelCoefficients::Ptr cylinder(new pcl::ModelCoefficients);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);cylinder->values.resize(7);//随便设置参数cylinder->values[0] = 1;cylinder->values[1] = 2;cylinder->values[2] = 3;cylinder->values[3] = 4;cylinder->values[4] = 5;cylinder->values[5] = 6;cylinder->values[6] = 7;CreatCylinder(cylinder, cloud, 2000, 80.0);cout << cloud->size() << endl;//--------------------------------------可视化--------------------------pcl::visualization::PCLVisualizer viewer;//创建的点云和直接addCylinder函数创建的圆柱面面片进行比对viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud1");//viewer.addCylinder(*cylinder, "cylinder");viewer.addCoordinateSystem();while (!viewer.wasStopped()){viewer.spinOnce(100);}return 0;
}

三、结果展示

在这里插入图片描述

相关文章:

  • 人工智能-准确率(Precision)、召回率(Recall) 和 F1 分数
  • YOLO优化之双池化下采样融合块、注意力引导逆残差块
  • 第20篇:数据库中间件的热点 Key 缓存一致性策略与分布式协调机制
  • Spring Boot 整合 Swagger 快速生成 API 文档的最佳实践
  • Axure应用交互设计:中继器数据向多种类型元件赋值
  • jxWebUI--简单易用的webUI库
  • Iceberg与Hive集成深度
  • linux多线程之条件变量
  • 学习昇腾开发的第三天--将服务器连接网络
  • Android 与 ESP-01 WIFI模块通信
  • HTTP协议简易入门
  • Vue3相关知识3
  • JS当中怎么定义一个类
  • Linux信号机制:进程异步通信的秘密
  • Kafka 可靠性保障:消息确认与事务机制(一)
  • XR-RokidAR-UXR3.0-Draggable 脚本解析
  • HTML的最基础入门知识,从零开始逐步讲解,适合为后续爬虫技术打基础:
  • 苏州SAP代理商:哲讯科技助力企业数字化转型
  • [python] 堆
  • 贝塞尔曲线的公式推导贝塞尔曲线的公式推导,和 SVG 中 Path 的贝塞尔曲线指令的理解记忆
  • 建设银行杭州网站首页/seo怎么做新手入门
  • 免费做网站有哪些/游戏加盟
  • 英国有哪些做折扣的网站/网络推广员工资多少钱
  • 做网站就/app拉新推广赚佣金
  • 做网站需要哪些费用/域名权重是什么意思
  • dnf交易网站建设/百度推广怎么登陆