demo演示
官方数据集
自己的数据
项目地址
github链接:Go-icp
复现流程
1、下载源码
下载完成后解压缩,将文件夹中所有的.h与.cpp文件拷贝到新的工程,不需要任何依赖项。
2、新建vs工程
将拷贝过来的文件,添加到相应的头文件与源文件中,此时可以直接编译运行。
其中根据jly_main函数,设置相应的调试参数,如下图所示
第一第二分别为待匹配的点云数据,txt格式
第三为随机采样后的点,如果不设置,默认为全部点计算,设置为500个点
第四项为config文件,配准需要的初始参数
第五项为output文件,将配准好的旋转矩阵和平移矩阵写入文件。
3、参照github中note,build3d distance 时间大约在20-25s左右,所以我们大部分时间都浪费在build 3d distance 上。
4、按照github所说,如下图所示,点云的输入格式是txt格式,第一行为点云的数量,对于我们常见的pcd格式不友好,显示效果特不方便,因此我们更改源代码中读取操作,读取pcd文件。
首先增加pcl_release属性列表,如下图所示:
将jly_main.cpp中文件读取点云更改,如下所示:
原有的读取文件:
int loadPointCloud(string FName, int & N, POINT3D ** p)
{
int i;
ifstream ifile;
ifile.open(FName.c_str(), ifstream::in);
if(!ifile.is_open())
{
cout << "Unable to open point file '" << FName << "'" << endl;
exit(-1);
}
ifile >> N; // First line has number of points to follow
*p = (POINT3D *)malloc(sizeof(POINT3D) * N);
for(i = 0; i < N; i++)
{
ifile >> (*p)[i].x >> (*p)[i].y >> (*p)[i].z;
}
ifile.close();
return 0;
}
更改后:
int loadPointCloud(POINT3D ** p, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
int i;
int N = cloud->size();
*p = (POINT3D *)malloc(sizeof(POINT3D) * N);
for (i = 0; i < N; i++)
{
(*p)[i].x = cloud->points[i].x;
(*p)[i].y = cloud->points[i].y;
(*p)[i].z = cloud->points[i].z;
}
return 0;
}
数据集测试
绿色是匹配后的data_bunny,如图所示,匹配效果还是很好的。
对于其余数据集
后续
算法看的还是不够仔细,没有仔细看过相关论文,没有研究过参数,只是囫囵吞枣的过了一遍,感觉这个算法实时性不是很好,后续相关操作也会集成到QT+PCL中,一起学习,一起进步。