目录
前言
在使用D435i相机跑ORB-SLAM2_RGBD_DENSE_MAP-master稠密建图的过程中,发现最终保存的点云上下颠倒,而且其他轴的角度也有问题,这对滤除地面以及将pcd点云文件转化成可用于路径规划的pgm文件造成了困难
看了ORB-SLAM2_RGBD_DENSE_MAP-master
点云部分的代码,没有找到为啥3个轴会有角度偏离;调用pcl库对点云操作暂时没找到方法,就没有尝试。
系统是Ubuntu18.04
1.安装MeshLab软件
参考链接:高翔视觉SLAM十四讲(第二版)各种软件、库安装的以及报错解决方法
打开 Ubuntu软件中心 -> 图像与摄影 -> 按照名称排序 -> MeshLab -> 安装
2.利用pcl库将pcd文件转成ply文件
MeshLab支持的文件格式:STL,OFF,OBJ,PLY,PTX,V3D,PTS,APTS,XYZ,GTS,TRI,ASC,X3D,X3DV,VRML,ALN
打开终端
pcl_pcd2ply XXX.pcd XXX.ply
3.利用MeshLab旋转ply点云
参考链接:利用Meshlab旋转三维点云模型
将转化好的ply文件用MeshLab打开,选择Filters->Normals,Curvatures and Orientation ->Transform:Rotate,会出现如下图:
首先选择Y axis
(Y轴)、barycenter
(重心)、旋转角度16.5、最后点击apply
(应用);接着选择X axis
(X轴)、barycenter
(重心)、旋转角度-98、最后点击apply
(应用)
旋转后的结果为
4.将ply文件转为pcd文件
参考链接:https://github.com/qixuxiang/ply2pcd
首先将代码下载下来
git clone https://github.com/qixuxiang/ply2pcd.git
打开main.cpp
,把下面两行路径改成自己的
注意修改ply2pcd/CMakeLists.txt
中的PCL版本,查看已安装pcl版本命令dpkg -l | grep libpcl
然后开始编译
cd ply2pcd
mkdir build && cd build
cmake ..
make
接着运行程序
cd ply2pcd/build
./ply2pcd
在指定的路径就生成了转化好的pcd文件
接下来就可以将pcd点云文件转化成可用于路径规划的pgm文件了
5.将ply文件转为pcd文件(添加读取配置文件版本)
参考链接:用C/C++读取配置文件的小例子
上述代码当要修改文件路径的时候需要重新编译,比较麻烦。将文件路径写进配置文件中,然后代码从配置文件中读取比较方便。当文件路径需要修改的时候,只需要修给配置文件即可,不需要重新编译。
新建一个文件夹,并且在文件夹里创建3个文件
mkdir ply2pcd
touch CMakeLists.txt config.txt main.cpp
三个文件内容分别为
main.cpp
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace pcl;
using namespace pcl::io;
#define MAX_LINE_LENGTH 256
int main (int argc, char** argv)
{
char line[MAX_LINE_LENGTH];
char key[MAX_LINE_LENGTH];
char value[MAX_LINE_LENGTH];
char plyAddress[MAX_LINE_LENGTH];
char pcdAddress[MAX_LINE_LENGTH];
FILE *fp = fopen("../config.txt", "r"); // 打开配置文件
if (fp == NULL) {
printf("无法打开配置文件:config.txt\n");
return 1;
}
while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
// 逐行读取配置文件
if (line[0] == '#' || line[0] == '\n') {
// 跳过注释和空行
continue;
}
if (sscanf(line, "%s = %s", key, value) == 2) {
// 解析配置项
if (strcmp(key, "plyAddress") == 0) {
printf("PLY文件地址:%s\n", value);
strcpy(plyAddress, value);
} else if (strcmp(key, "pcdAddress") == 0) {
printf("PCD文件地址:%s\n", value);
strcpy(pcdAddress, value);
}
}
}
fclose(fp);
pcl::PLYReader reader;
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
reader.read<pcl::PointXYZRGBA>(plyAddress, *cloud);
pcl::io::savePCDFileASCII(pcdAddress, *cloud ); // 指定文件后缀名为.pcd
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(ply2pcd)
set(CMAKE_CXX_STANDARD 11)
find_package(PCL 1.8 REQUIRED)
include_directories(${
PCL_INCLUDE_DIRS})
link_directories(${
PCL_LIBRARY_DIRS})
add_definitions(${
PCL_DEFINITIONS})
add_executable(ply2pcd main.cpp)
target_link_libraries(ply2pcd ${
PCL_LIBRARIES})
config.txt
#路径改成自己的
plyAddress = /XXX/XXX/.../XXX.ply
pcdAddress = /XXX/XXX/.../XXX.pcd
之后开始编译,运行
cd ply2pcd
#编译
mkdir build && cd build
cmake ..
make
#运行
./ply2pcd