pcl读取pcd文件并显示,kitti数据集bin与pcd文件互相转换

本文介绍了如何使用PCL库读取和显示PCD文件,以及Kitti数据集中bin格式到PCD格式的转换方法,并提供了从PCD到bin格式的逆向转换代码。

pcl读取pcd文件并显示

#include <iostream> //标准输入输出流
#include <pcl/io/pcd_io.h> //PCL的PCD格式文件的输入输出头文件
#include <pcl/point_types.h> //PCL对各种格式的点的支持头文件
#include <pcl/visualization/cloud_viewer.h>//点云查看窗口头文件
int main(int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 创建点云(指针)

    if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\bun0.pcd", *cloud) == -1) //* 读入PCD格式的文件,如果文件不存在,返回-1
    {
        PCL_ERROR("Couldn't read file test_pcd.pcd \n"); //文件不存在时,返回错误,终止程序。
        return (-1);
    }
    pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");//直接创造一个显示窗口
    viewer.showCloud(cloud);//再这个窗口显示点云
    while (!viewer.wasStopped())
    {
    }
    return (0);
}

kitti数据集bin转pcd

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>//标准C++库中的输入输出类相关头文件。
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h> //PCL中支持的点类型头文件。
#include <boost/random.hpp>  //高斯噪点测试
#include <fstream>  
#include <string>  
#include <vector> 
#include <pcl/features/integral_image_normal.h>
#include <pcl/features/normal_3d.h>
using namespace std;
//读取了反射强度
void bin2pcdR(const char *filenameInput, const char *filenameOutput) {//批量转换,filenameList用于保存文件名
	int32_t num = 1000000;
	float *data = (float*)malloc(num * sizeof(float));
	// 点
	float *px = data + 0;
	float *py = data + 1;
	float *pz = data + 2;
	float *pr = data + 3;//反射强度
	// 读取点云数据
	FILE *stream;
	fopen_s(&stream, filenameInput, "rb");
	num = fread(data, sizeof(float), num, stream) / 4;//读入点云数据,大概10万+个点
	fclose(stream);
	//转换成PCD
	//写文件声明
	/*string previous = "G:/pcl_source/pcl_test/pcl_test/pcd/data/00000000";
	string tmp1 = previous.append(to_string(version));
	string tmp2 = tmp1.append(".pcd");
	const char* outputFilename = tmp2.c_str();*/
	FILE *writePCDStream;
	fopen_s(&writePCDStream, filenameOutput, "wb");
	fprintf(writePCDStream, "VERSION 0.7\n");//版本说明
	fprintf(writePCDStream, "FIELDS x y z intensity\n");//维度说明
	fprintf(writePCDStream, "SIZE 4 4 4 4\n");//占用字节说明
	fprintf(writePCDStream, "TYPE F F F F\n");//具体数据类型定义
	fprintf(writePCDStream, "WIDTH %d\n", num);//点数量
	fprintf(writePCDStream, "HEIGHT 1\n");//无序点云默认为1
	fprintf(writePCDStream, "POINTS %d\n", num);//点数量
	fprintf(writePCDStream, "DATA ascii\n");//文档使用字符类型shuom
	//写点云数据
	for (int32_t i = 0; i < num; i++)
	{
		fprintf(writePCDStream, "%f %f %f %f\n", *px, *py, *pz, *pr);
		px += 4; py += 4; pz += 4; pr += 4;
	}
	fclose(writePCDStream);
}

kitti数据集pcd转bin

#include <omp.h>
#include <ctime>
#include <vector>
#include <string>
#include <algorithm>

#include <pcl/io/pcd_io.h>
#include <pcl/common/common_headers.h>

#include <sys/stat.h>

#include <pcl/io/boost.h>
#include <boost/program_options.hpp>

#include <fstream>



void convertPCDtoBin(std::string &in_file, std::string& out_file)
{
	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);

	if (pcl::io::loadPCDFile<pcl::PointXYZI>(in_file, *cloud) == -1) //* load the file
	{
		std::string err = "Couldn't read file " + in_file;
		PCL_ERROR(err.c_str());
		return;// (-1);
	}
	std::cout << "Loaded "
		<< cloud->width * cloud->height
		<< " data points from "
		<< in_file
		<< " with the following fields: "
		<< std::endl;

	std::ofstream myFile(out_file.c_str(), std::ios::out | std::ios::binary);
	for (int j = 0; j < cloud->size(); j++) {

		myFile.write((char*)& cloud->at(j).x, sizeof(cloud->at(j).x));
		myFile.write((char*)& cloud->at(j).y, sizeof(cloud->at(j).y));
		myFile.write((char*)& cloud->at(j).z, sizeof(cloud->at(j).z));
		myFile.write((char *)& cloud->at(j).intensity, sizeof(cloud->at(j).intensity));
		//myFile << cloud->at(j).x << " " << cloud->at(j).y << " " << cloud->at(j).z << endl;
	}
	myFile.close();
}
<think>好的,用户在使用LEGO-LOAM处理KITTI数据集时想保存点云数据为PCD文件。我需要根据提供的引用内容给出解决方案。首先,引用[2]提到在LIO-SAM中需要修改params.yaml文件中的SavePCD参数为true设置保存路径。LEGO-LOAM可能也有类似的配置。我需要检查LEGO-LOAM的配置文件,通常在config文件夹下,比如params.yaml或者别的名称。找到对应的保存选项,设为true指定路径。 然后,用户使用KITTI数据集,可能需要调整数据输入的topic名称。LEGO-LOAM默认订阅的可能是Velodyne的点云话题,而KITTI数据可能发布在不同的topic上,比如/kitti/velo/pointcloud。需要修改配置文件中的相应参数,确保LEGO-LOAM能正确接收数据。 另外,运行前需要创建保存路径,确保权限正确。运行结束后,检查指定目录是否有生成的PCD文件。如果遇到问题,可能需要查看日志或调整参数。引用[3]提到使用rosbag播放时调整频率,可能数据播放过快导致处理不完整,可以尝试降低播放速率,比如使用-r参数。 最后,验证生成的PCD文件是否正确,可以使用pcl_viewer命令查看,如引用[1]所述。综合这些步骤,整理出修改配置文件、调整话题名称、创建路径、运行处理程序以及验证结果的流程。</think>在使用LEGO-LOAM处理KITTI数据集时,保存PCD文件需要以下步骤: ### 1. 修改配置文件 进入LEGO-LOAM的配置文件目录(通常为`~/catkin_ws/src/LEGO-LOAM/config/`),找到参数文件`utility.h`或`params.yaml`: - 将参数`savePCD`设置为`true` - 修改`savePCDDirectory`为自定义存储路径(如`/home/user/pcd_data/`) ```cpp // 示例参数配置 bool savePCD = true; std::string savePCDDirectory = "/home/user/pcd_data/"; ``` ### 2. 适配KITTI数据集 由于KITTI数据格式Velodyne不同: - 在`utility.h`中修改点云订阅话题名称为KITTI数据的话题(如`/kitti/velo/pointcloud`) ```cpp #define POINT_CLOUD_TOPIC "/kitti/velo/pointcloud" ``` - 确保时间戳同步参数`use_imu_as_input`设置为`false`(KITTI使用GPS/IMU联合标定) ### 3. 创建存储路径 在终端执行: ```bash mkdir -p /home/user/pcd_data/ chmod 777 /home/user/pcd_data/ ``` ### 4. 运行处理流程 ```bash roslaunch lego_loam run.launch rosbag play kitti_dataset.bag -r 0.5 # 降低播放速度避免丢帧 ``` ### 5. 验证结果 程序运行结束后,使用以下命令查看生成的PCD文件: ```bash pcl_viewer /home/user/pcd_data/*.pcd ``` [^1]: 引用自PCD文件查看方法 [^2]: 参数修改参考LIO-SAM配置经验 [^3]: 数据播放频率调整建议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值