PCL存储点云错误pcl::IOException what() [pcl::PCDWriter::writeASCII] Could not open file for writing
关于PCL写入/读取点云的报错:
写入:
1 点云指针为空。
最好在写入前面加一个判断,只有当指针不为空时才执行写入到点云的操作,即:
if (!cloud->points.empty())
{
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ> ("cloud.pcd", *cloud, false);
}
2 文件路径不存在。
一般保存时写的相对路径,是相对于可执行文件的位置而言的。即如果直接保存,则文件存放在和可执行文件相同的位置,如果你写的保存路径下有子文件夹,则会在可执行文件的位置搜索这个文件夹,如果有,则保存;如果没有,则报错。(有时候好像不会报错,也没有这个文件。)
这样一来,最好在程序开头检查一下有没有这个文件夹,如果没有,则创建之。
DIR *dir;
if ((dir = opendir("/home/aemc/catkin_ws/devel/lib/rvv/out/")) == NULL)
{
system("mkdir -p /home/aemc/catkin_ws/devel/lib/rvv/out/"); //system( s.c_str() );
}
上述代码我在ubuntu下编译没有错,如果是windows系统,需要加一个函数来把你写的路径转换成字符串。
DIR *dir;
if ((dir = opendir("/home/aemc/catkin_ws/devel/lib/rvv/out/".c_str())) == NULL)
{
system("mkdir -p /home/aemc/catkin_ws/devel/lib/rvv/out/");
}
3 没有写入权限。
不妨在开头先试一下能不能写入文件。
FILE* tempFile = fopen("test.txt", "w+");
if (tempFile == nullptr)
{
cout << "没有写入权限!"<< endl;
return -1;
}
fclose(tempFile);
remove("test.txt");
4 绝对路径与相对路径。
这个坑过我一次。代码中所有涉及到路径的问题,要么全部写成相对路径(就是前面说的相对于可执行文件的路径);要么全部写成绝对路径。千万不要绝对路径和相对路径混杂着写。我按照上述方法仔仔细细检查了一下午代码,最后发现代码结尾处我输出了一组点云,路径的书写方式不一样。
LINUX系统怎么看绝对路径?选中你要查看的文件,右键-properties属性,在弹出的属性菜单的首页即可看到。