ICP算法加速优化--多线程和GPU
创始人
2024-02-14 22:22:27
0

LZ之前的文章ICP算法实现(C++) 用C++实现了基础的ICP算法,由于该算法是一种迭代的优化算法,里面含有大量循环操作以及矩阵运算,可以通过使用多线程或者GPU硬件来进行加速,具体分别可以通过OpenMP和CUDA编程实现。这里给出的代码是根据github地址:https://github.com/alex-van-vliet/icp的代码改写的。原作者的代码质量还是不错的,有许多值得借签和学习的地方。但是考虑到使用的第三方库太多不便于配置和使用,LZ把这份代码重构了一下。原作者在代码里造了很多轮子,比如自己实现了Point3D、matrix以及vp-tree(也是一种搜索树,比原PCL中的kd-tree出现时间略晚)的数据结构,但是SVD分解还是调用了Eigen库(可能他也觉得底层实现太麻烦了吧~),LZ把这里面的矩阵结构统一用Eigen库实现了。另外去掉了一些不方便编译的第三方库,并简化了CmakeLists的内容以及程序的结构。如果只编译libcpu库只需依赖Eigen,编译libgpu库的话需要CUDA。

该工程的运行效果如下所示:
lib_icp.exe line1.pcd line2.pcd --cpu 100 1e-6 32 0ms
lib_icp.exe line1.pcd line2.pcd --cpu 100 1e-6 32 2ms(OpenMP)
lib_icp.exe line1.pcd line2.pcd --gpu 100 1e-6 1024 81ms
lib_icp.exe bunny1.pcd bunny2.pcd --cpu 100 1e-6 32 1407ms
lib_icp.exe bunny1.pcd bunny2.pcd --cpu 100 1e-6 32 246ms(OpenMP)
lib_icp.exe bunny1.pcd bunny2.pcd --gpu 100 1e-6 1024 156ms
lib_icp.exe horse1.pcd horse2.pcd --cpu 100 1e-6 32 12585ms
lib_icp.exe horse1.pcd horse2.pcd --cpu 100 1e-6 32 1603ms(OpenMP)
lib_icp.exe horse1.pcd horse2.pcd --gpu 100 1e-6 1024 363ms
测试平台为Windows10系统,内存32G,CPU是i7-12700(20线程),GPU是NVIDIA GeForce RTX 3070 Laptop GPU(8G);修改后的代码在linux系统也能编译,本人在WSL(Ubuntu20.04)的docker中测试过和Windows本地差别不大,但是调用CUDA版本代码计算结果有误。其中line1.pcd和line2.pcd点数为10,bunny1.pcd和bunny2.pcd点数为35947,horse1.pcd和horse2.pcd点数为193940。可以看出多核和GPU的加速作用随着点云点数增加优势还是非常明显的,但是点数非常少的话,GPU由于需要和CPU进行数据传输,此时运算速度会不太理想。

自己写了测试main函数,可以直接读取.pcd格式的点云文件(读取二进制储存的pcd文件更为高效,原作者代码是读.txt文件),并添加了时间计算部分和可视化部分,需要另外配置PCL库。

#include 
#include 
#include 
#include 
#include #ifdef _WIN32#include #include 
#endif#ifdef __linux__#include 
#endif#include "libcpu/icp.h"
#include "libgpu/icp.h"int main(int argc, char* argv[])
{std::cout << "\033[31mUsage:	.exe   --cpu|gpu   \n"<< "for example:	./lib_icp.exe bunny1.pcd bunny2.pcd  --gpu 100 1e-6 1024\033[0m" << std::endl;pcl::PointCloud::Ptr cloud_src(new pcl::PointCloud);pcl::io::loadPCDFile(argv[1], *cloud_src);pcl::PointCloud::Ptr cloud_tgt(new pcl::PointCloud);pcl::io::loadPCDFile(argv[2], *cloud_tgt);bool use_gpu = (std::string(argv[3]) == "--gpu");if (use_gpu)	std::cout << "use gpu" << std::endl;else	std::cout << "use cpu" << std::endl;size_t iterations = std::atoi(argv[4]);std::cout << "max iterations:" << iterations << std::endl;float error = std::atof(argv[5]);std::cout << "error:" << error << std::endl;int capacity = std::atoi(argv[6]);std::cout << "capacity:" << capacity << std::endl;std::vector p(cloud_src->size());std::vector q(cloud_tgt->size());for (size_t i = 0; i < cloud_src->size(); i++){p[i] = cloud_src->points[i].getVector3fMap();}for (size_t i = 0; i < cloud_tgt->size(); i++){q[i] = cloud_tgt->points[i].getVector3fMap();}#ifdef _WIN32clock_t start = clock();
#endif#ifdef __linux__struct timeval start, end;gettimeofday(&start, 0);
#endifauto [transformation, new_p] = (use_gpu ? libgpu::icp(q, p, iterations, error, capacity): libcpu::icp(q, p, iterations, error, capacity));#ifdef _WIN32clock_t end = clock();std::cout << "time cost:" << end - start << "ms" << std::endl;
#endif#ifdef __linux__gettimeofday(&end, 0);std::cout << "time cost:" << (1000000.0 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec) / 1000.0 << "ms" << std::endl;
#endifstd::cout << "transformation matrix: \n" << transformation << std::endl;pcl::PointCloud::Ptr cloud_icp(new pcl::PointCloud);pcl::transformPointCloud(*cloud_src, *cloud_icp, transformation);pcl::io::savePCDFile("cloud_icp.pcd", *cloud_icp);#ifdef _WIN32pcl::visualization::PCLVisualizer viewer("registration Viewer");pcl::visualization::PointCloudColorHandlerCustom src_h(cloud_src, 0, 255, 0); 	//原始点云绿色pcl::visualization::PointCloudColorHandlerCustom tgt_h(cloud_tgt, 255, 0, 0); 	//目标点云红色pcl::visualization::PointCloudColorHandlerCustom final_h(cloud_icp, 0, 0, 255); 	//匹配好的点云蓝色viewer.setBackgroundColor(0, 0, 0);viewer.addPointCloud(cloud_src, src_h, "source cloud");viewer.addPointCloud(cloud_tgt, tgt_h, "target cloud");viewer.addPointCloud(cloud_icp, final_h, "result cloud");while (!viewer.wasStopped()){viewer.spinOnce(100);}
#endifreturn 0;
}

工程结构如下:
在这里插入图片描述

运行结果截图:
在这里插入图片描述在这里插入图片描述

代码和数据集下载地址如下:
工程下载链接

相关内容

热门资讯

湖南三安发布首代Trench ... 8月28日,据湖南湘江新区企业湖南三安半导体(简称“湖南三安”)消息,该企业于8月正式推出首代高性能...
中国人民解放军南部战区位黄岩岛... 8月29日,中国人民解放军南部战区组织海空兵力位中国黄岩岛领海周边海空域开展战备警巡。黄岩岛是中国固...
青岛海牛1-0领先河南队:林创... 在2023赛季的中超联赛第23轮中,青岛海牛主场迎战河南队,比赛于北京时间8月29日19:00正式拉...
原创 中... 南海波涛之上,中国正以截然不同的策略处理仁爱礁和黄岩岛问题,展现了一个大国在捍卫主权时的战略定力和智...
“白发针”突然爆火,打完就能“... 都说白发是全人类的烦恼, 世界性的难题。 近期,一种名为“白发针”的疗法在社交平台上引起了关注,一些...
用餐男子5分钟抽40张纸巾擦拭... 进店用餐,5分钟内使用40多张餐巾纸,老板娘发布店内监控,称遇到这样的食客很无语。对此,法律人士认为...
15岁儿子考上高中,41岁湖南... 暑假临近尾声,近日,来自湖南怀化的41岁市民邹先生,在网上分享了自己与15岁儿子从东莞虎门骑行千余公...
阿莫林:有时我想放弃有时想在这... 直播吧8月29日讯 北京时间8月30日22:00,2025-26赛季英超联赛第3轮,曼联将坐镇老特拉...
广西官宣:正厅级蒋家柏落马 据广西壮族自治区纪委监委8月29日消息,自治区人大常委会委员、自治区人大法制委员会主任委员蒋家柏涉嫌...