hello,点云

亲爱的观众朋友们大家好,这里是爱说标准c语言的老嫂子。。。
公司的项目终于快做完了,我又可以学自己的东西了( •̀ ω •́ )y~。今天把plc库下载并安装了,准备正式入门到放弃三维。

如何下载

进入官网下载界面:点击下载这两个,我下载了编译好的,当然也可以自己下载源码编译。
在这里插入图片描述
配置教程看这个博主的,非常详细。

下载好了之后,首先我就跟着上述教程,显示了一只点云兔子(兔子的数据要在网上下载,可以下载这位博主的)。

#define _CRT_SECURE_NO_WARNINGS
#include<pcl/visualization/cloud_viewer.h>
#include<iostream>
// PCL 的 IO 操作头文件,包含一些输入输出的基础函数和定义。
#include<pcl/io/io.h>
// PCL 的 PCD 文件 IO 操作头文件,包含读写 .pcd(Point Cloud Data)格式文件的函数。
#include<pcl/io/pcd_io.h>
// PCL 的 PLY 文件 IO 操作头文件,用于读取 .ply(Polygon File Format)文件。
#include<pcl/io/ply_io.h>
// PCL 的点类型定义头文件,提供了 PointXYZ、PointXYZRGB 等常用点类型的定义。
#include<pcl/point_types.h>

using namespace std;
using namespace pcl;

// 定义一个回调函数 viewerOneOff,它会在 PCLVisualizer 可视化器初始化时调用。viewer.setBackgroundColor(0, 0, 0); 将背景颜色设置为黑色。
void viewerOneOff(visualization::PCLVisualizer& viewer) {
	viewer.setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
}

int main() {
    // 定义并初始化一个 PointCloud 对象指针 cloud,它是一个包含 PointXYZ 类型点的点云。PointXYZ 结构定义了一个 3D 点,每个点包含 x、y、z 坐标。
    // ::Ptr 表示 PCL 中的智能指针,用于管理 PointCloud 对象的生命周期。
	PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);

	char strfilepath[256] = "rabbit.pcd";
	// 调用 io::loadPCDFile 函数来加载指定路径的 .pcd 点云文件,将数据存入 cloud 点云对象。
	if (-1 == io::loadPCDFile(strfilepath, *cloud)) {
		cout << "error input!" << endl;
		return -1;
	}

	cout << cloud->points.size() << endl;
	visualization::CloudViewer viewer("Cloud Viewer: Rabbit");
    // showCloud 方法会将点云加载到可视化窗口。
	viewer.showCloud(cloud);
	// 注册回调函数 viewerOneOff,该函数会在可视化器初始化后立即执行一次,用于设置背景颜色等。
	viewer.runOnVisualizationThreadOnce(viewerOneOff);
	system("pause");
	return 0;
}

点云文件格式

  1. 文件结构
    PCD(Point Cloud Data)和 PLY(Polygon File Format)是两种用于存储三维点云数据的文件格式
  • PCD格式:
    是 PCL(Point Cloud Library)专用的文件格式,设计用于存储点云数据。
    有两种数据存储格式:ASCII和二进制(binary)。ASCII格式是文本格式,易于读取和编辑;二进制格式更紧凑,适合存储大规模点云。
    包含点云的属性信息,例如坐标(x, y, z)、颜色(rgb)、法线(normal)等,字段名称灵活。
  • PLY格式:
    是一种通用的三维模型文件格式,最初为保存多边形网格而设计,但也可用于存储点云。
    同样支持ASCII和二进制两种格式。ASCII格式方便调试,二进制格式占用空间小。
    文件可以包含点的颜色、法线等属性,但不如PCD格式灵活。在点云应用中,PLY格式通常用于数据交换。
  1. 应用场景
  • PCD格式:
    主要用于点云处理领域,特别是在PCL库中,用于存储点云数据、传输点云数据等。适合与PCL库的其他数据处理功能无缝集成。
    常见于3D扫描、SLAM(即时定位与地图构建)、机器人和计算机视觉等领域。
  • PLY格式:
    更广泛应用于三维模型存储,如三维扫描模型、CAD模型和计算机图形学。
    兼容性更强,可以在不同的三维建模软件中使用,例如MeshLab和Blender等。
  1. 灵活性与兼容性
  • PCD格式:灵活性高,可以方便地添加或移除字段。对于PCL的用户来说,这个格式使用起来最简便,但其他非PCL程序的支持较少。
  • PLY格式:兼容性强,可以在PCL以外的软件中广泛使用,但对于特定字段的扩展性不如PCD。

pcd数据示例

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z rgb intensity normal_x normal_y normal_z label
SIZE 4 4 4 4 4 4 4 4 4
TYPE F F F F F F F F I
COUNT 1 1 1 1 1 1 1 1 1
WIDTH 5
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 5
DATA ascii
0.0 0.0 0.0 255 0.5 0.0 0.0 1.0 0
1.0 0.0 0.0 255 0.7 0.0 0.0 1.0 1
1.0 1.0 0.0 255 0.8 0.0 0.0 1.0 2
0.0 1.0 0.0 255 0.6 0.0 0.0 1.0 3
0.5 0.5 1.0 255 0.9 0.0 0.0 1.0 4

// 表示点云数据格式的版本号,0.7是最常用的版本

// FIELDS 字段定义了点云数据中每个点包含的属性(字段)。x, y, z 是最常见的字段,表示三维坐标,但 .pcd 格式支持更多的字段类型,具体取决于你想要存储哪些数据。
常见的 FIELDS 字段除了 x, y, z 之外,FIELDS 字段还可以包括以下常见属性:

  • rgb: 表示每个点的颜色,通常存储为一个整数值(可以通过编码 RGB 分量,例如将 R, G, B 组合成一个 32 位整数)。
    R (红色):占用最高的 8 位(24-31 位)。
    G (绿色):占用中间的 8 位(16-23 位)。
    B (蓝色):占用最低的 8 位(8-15 位)。
    通常还有 8 位的透明度 (Alpha, A) 分量,占用最低的 8 位(0-7 位)。在 .pcd 文件中,透明度一般不使用,直接置为 0。
    格式:rgb 字段通常存储为一个单一的整数值,表示点的 RGB 颜色。
  • intensity: 表示每个点的强度值,通常用于激光雷达(LiDAR)数据,表示每个点的反射强度。
    格式:intensity 字段通常是一个浮动或整数值。
  • normal_x, normal_y, normal_z: 用于表示法线向量的三个分量,描述点云表面的朝向。
    格式:每个法线分量通常是浮动值。
  • curvature: 点云的曲率值,通常用来描述点云表面的曲率变化。
    格式:浮动值。
  • label: 用于标注点云中每个点的类别,常用于语义分割任务中,表示该点属于哪个物体类别。
    格式:整数或字符串,具体取决于任务需求。

SIZE: 每个字段的字节数,这里每个值为 4 字节,表示浮点型。

TYPE: 每个字段的数据类型,这里 F 表示浮点型。

COUNT: 每个字段的计数(通常为 1)。

WIDTH: 点的数量(如果 HEIGHT 为 1,即为单行数据)。

HEIGHT: 行数(设置为 1 表示数据为一维,即单行)。

VIEWPOINT: 相机视点的姿态(位置和方向)。 VIEWPOINT 这里包含 7 个数值:
tx (平移 x):相机沿 x 轴的平移位置。
ty (平移 y):相机沿 y 轴的平移位置。
tz (平移 z):相机沿 z 轴的平移位置。
qw (旋转 w):表示方向的四元数的实部。
qx (旋转 x):四元数的 x 分量。
qy (旋转 y):四元数的 y 分量。
qz (旋转 z):四元数的 z 分量。
前三个数字(tx, ty, tz)表示相机在 3D 空间中的位置,即相机的位置。

后四个数字(qw, qx, qy, qz)构成了一个四元数,用于表示相机的旋转方向。四元数是一种常用的 3D 旋转表示方法,具有无奇异性的优势,适合描述旋转方向。具体来说:

四元数 是一种表示 3D 旋转的方式。它包含一个实部 qw 和三个虚部 qx, qy, qz,可以方便地表示空间中的旋转而不产生“万向节锁”问题。
方向 定义了从此视点观看点云的角度,即相机的朝向。

POINTS: 点的总数

DATA: 数据存储格式,这里是 ascii 表示文本格式(也可为 binary)。

ply数据示例

请看这位帅哥的博客

### RViz 中无法显示点云的排查方法 在调试 RViz 无法显示点云的问题时,可以考虑以下几个方面的原因以及解决方案: #### 1. 数据源验证 确认点云数据是否正常发布到 ROS 主节点。可以通过 `rostopic echo` 命令来监听点云话题的内容并检查其有效性[^1]。 ```bash rostopic echo /point_cloud_topic_name ``` 如果该命令未返回任何消息,则说明点云并未成功发布或者订阅者未能接收到数据流。此时应进一步检查传感器驱动程序或点云生成逻辑是否存在错误。 #### 2. 配置文件校验 确保 RViz 的配置设置无误。打开 RViz 后,在左侧面板中添加一个 **PointCloud2** 显示项,并仔细核对其参数设定: - 设置正确的 Topic 名称; - 确认坐标系(Fixed Frame 和 Target Frame)匹配实际使用的参考帧; - 调整颜色编码模式以适应不同类型的输入数据; 这些选项中的任何一个不一致都可能导致可视化失败[^2]。 #### 3. 时间同步问题 由于 ROS 使用时间戳机制管理消息传递顺序,因此当计算机系统时间和硬件设备之间存在较大偏差时也可能引发渲染异常现象。建议通过以下方式解决可能存在的时钟偏移情况: - 执行 NTP 客户端服务保持网络连接下的精确授时操作; - 或者利用 rosparam 修改允许的最大容忍延迟值 `/use_sim_time=true` 来模拟环境运行状态[^3]。 #### 4. 图形驱动兼容性测试 有时图形卡驱动版本过低亦或是特定显卡架构缺乏必要的支持也会阻碍复杂三维模型呈现效果。更新至最新稳定版 NVIDIA/AMD Radeon Drivers 并重启工作站往往能够有效缓解此类状况的发生概率[^4]。 以下是用于检测 GPU 性能及功能特性的 Python 脚本示例代码片段: ```python import pycuda.driver as cuda from pycuda.compiler import SourceModule cuda.init() print("%d device(s) found." % cuda.Device.count()) for ordinal in range(cuda.Device.count()): dev = cuda.Device(ordinal) print("Device #%d: %s" % (ordinal, dev.name())) mod = SourceModule(""" __global__ void hello_from_gpu(void){ printf("Hello World from GPU!\n"); } """) func = mod.get_function("hello_from_gpu") func(block=(8,8,8), grid=(8,8)) ``` 此脚本可以帮助判断当前系统的 CUDA 支持程度如何,这对于依赖高性能计算资源的应用场景尤为重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值