lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
激光点云PCL库开发环境搭建
2022-09-08 21:27:38
121
0
0
lee-romantic
# 1、基本安装 - pcl安装参考:[Windows下配置安装PCL开发环境](https://blog.csdn.net/qq_45006390/article/details/118928500) - 安装CLion和CMake,其中CMake version大于2.8.3,PCL中用到了高版本的一些宏定义,低版本不兼容。 - 首先下载[PCL-1.12.1-AllInOne-msvc2019-win64.exe 和 pcl-1.12.1-pdb-msvc2019-win64.zip](https://github.com/PointCloudLibrary/pcl/releases),(参考2.7出现的bug,这里建议可以不要使用该版本,否则需要打开AVX开关) - 其中,All in one安装包,PCL提供了配置为Visual Studio的32位和64位下的该安装包,该包包含类PCL中所使用全部第三方编译包,除了QT编译包。 - 而All in one包对应的PDB文件包,该包用于后期单步调试时使用。 - 下载完成后,首先在D:\PCL 1.12.0下安装all in one包,并选择添加环境变量。  - 完成安装以后需要去:D:\PCL 1.12.0\3rdParty\OpenNI2 查看一下OpenNI有没有安装到这个文件夹。因为默认安装的路径是C盘,如果发现文件夹里只有一个NI的安装包的话,就打开安装程序:点击Remove,重新安装并选择路径为:D:\PCL 1.12.0\3rdParty\OpenNI2 - 然后,将下载的PDB文件,解压到:D:\PCL 1.12.0\bin 文件夹下。  - 最后,添加如下的环境变量: ``` %PCL_ROOT%\3rdParty\FLANN\bin %PCL_ROOT%\3rdParty\VTK\bin %OPENNI2_REDIST64% %OPENNI2_LIB64% %OPENNI2_INCLUDE64% ``` - 后续我们打算在CLion+msvc进行开发,CMakeLists.txt如下: ``` cmake_minimum_required(VERSION 3.23) project(pclRegister) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(PCL_ROOT "E:\\PCL 1.12.1") # 不要用中文的引号 find_package(PCL 1.12 REQUIRED) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) add_definitions(-DBOOST_ALL_NO_LIB) include_directories(PCL_INCLUDE_DIRS) include_directories("E:\\PCL 1.12.1\\3rdParty\\Eigen\\eigen3")#手动添加 set(SOURCE_FILES main.cpp) add_executable(pclRegister ${SOURCE_FILES}) #要使用哪些功能模块就需要链接,不然会提示未定义的引用 target_link_libraries(pclRegister ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_VISUALIZATION_LIBRARIES} ${PCL_RESISTRATION_LIBRARIES} ${PCL_FILTERS_LIBRARIES} ${PCL_FEATURES_LIBRARIES}) ``` 测试代码main.cpp: ``` #include <pcl\visualization\pcl_visualizer.h> #include <pcl\point_cloud.h> #include <pcl\point_types.h> int main() { //初始化点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); //设置点云大小 cloud->points.resize(200); //填充点云 for (size_t i = 0; i < cloud->points.size(); ++i) { cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f); cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f); cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f); } //声明视窗 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); //设置视窗背景色 viewer->setBackgroundColor(0, 0, 0); //预处理点云颜色 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> magenta(cloud, 255, 0, 255); //把点云加载到视窗 viewer->addPointCloud(cloud, magenta, "cloud"); //设置点云大小 viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud"); //显示 viewer->spin(); } ``` 效果:  # 2、问题记录: ## 2.1、cmake时PCL找不到 问题类似于:[链接](https://stackoverflow.com/questions/47496428/pcl-1-8-1-cmake-problems-on-windows) ``` PCL can not be found on this machine ``` 原因是`E:\PCL 1.12.1\cmake\PCLConfig.cmake`中的这段: ``` if(EXISTS "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}/pcl/pcl_config.h") # Found a PCL installation # pcl_message("Found a PCL installation") set(PCL_CONF_INCLUDE_DIR "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}") set(PCL_LIBRARY_DIRS "${PCL_ROOT}/lib") elseif(EXISTS "${PCL_ROOT}/include/pcl/pcl_config.h") # Found a non-standard (likely ANDROID) PCL installation # pcl_message("Found a PCL installation") set(PCL_CONF_INCLUDE_DIR "${PCL_ROOT}/include") set(PCL_LIBRARY_DIRS "${PCL_ROOT}/lib") elseif(EXISTS "${PCL_DIR}/include/pcl/pcl_config.h") # Found PCLConfig.cmake in a build tree of PCL # pcl_message("PCL found into a build tree.") set(PCL_CONF_INCLUDE_DIR "${PCL_DIR}/include") # for pcl_config.h set(PCL_LIBRARY_DIRS "${PCL_DIR}/lib") set(PCL_SOURCES_TREE "C:/pcl-1.12.1") else() pcl_report_not_found("PCL can not be found on this machine") endif() ``` 没有任何一个条件匹配上,尽管pcl_config.h是存在的,通过message()打印出来看到,${PCL_ROOT}与系统环境变量中的PCL_ROOT值貌似没匹配上,导致pcl_config.h路径没对上。解决办法可以在if前面添加: ``` set(PCL_ROOT "E:\\PCL 1.12.1") ``` ## 2.2、问题: - 找不到boost: ``` Could NOT find Boost (missing: system filesystem date_time iostreams serialization) (found suitable version "1.72.0", minimum required is "1.55.0") CMake Error at C:/Program Files/PCL 1.10.0/cmake/PCLConfig.cmake:59 (message): common is required but boost was not found ``` 大概是PCL依赖的Boost需要vs19版本,所以没有办法cmake成功。重新安装vs2019后问题解决。 参考[链接1](https://blog.csdn.net/Veronica_gogo/article/details/116797240) 和 [链接2](https://github.com/PointCloudLibrary/pcl/issues/3657) - 同样的,下面在使用`MSBuild`的时候出现的错误,也是说版本较低,升级到vs2019就可以了:  ## 2.3、CLion中无法reload cmake和run,无法通过测试: - 使用CLion中添加的tool chains:msvc2019时,使用命令行cmake+msbuild2019命令行可以正常运行,但是CLion中无法reload cmake和run:  - 解决: - 一种解决办法是强行将检查通过,参考[链接1](https://www.lxins.com/2021/01/22/cmake-the-c-compiler-xxxis-not-able-to-compile-a-simple-test-program/)和[链接2](https://stackoverflow.com/questions/53633705/cmake-the-c-compiler-is-not-able-to-compile-a-simple-test-program/53635241),比如在`CMakeTestCCompiler.cmake`中设置: ``` set(CMAKE_C_COMPILER_WORKS 1) set(CMAKE_CXX_COMPILER_WORKS 1) ``` 直接修改`CMakeTestCCompiler.cmake`这种文件也可以,只要跳过检查即可,一般不推荐。 - 第二种解决办法:既然命令行都是可以正常编译运行的,那么肯定是CLion的编译设置不对。 - tool chain没什么问题:  - 不过cmake设置的generator默认为ninja: -  - 而我们cmake命令行不带参数的话,generator默认的是msvc,而这里需要搭配msvc使用。这里将generator改成`Let Cmake Decide`或者`Visual Studio 16 2019`即可:  ## 2.4、使用vs2019打开sln出现问题 - cmake后,使用vs2019打开sln出现问题: ``` E0992 命令行错误: 宏定义无效: BOOST_ALL_NO_LIB-DBOOST_ALL_NO_LIB ``` - 解决办法一: - 找到项目属性->C/C++->所有选项->预处理器定义, 可以看到有个`BOOST_ALL_NO_LIB-DBOOST_ALL_NO_LIB`的宏,可以参考链接,这个宏的作用是由于Boost大量使用了C++高级特性(如模板偏特化、ADL),因此不是所有的编译器都 能够很好地支持Boost。 - 在VC集成环境中使用嵌入工程编译的方式需要定义宏BOOST_ALL_NO_LIB或者 BOOST_XXX_NO_LIB(XXX是某个库的名称),以指示BOOST库不要使用自动链接功能。 - 因此,这里写错了,将`BOOST_ALL_NO_LIB-DBOOST_ALL_NO_LIB`改成`BOOST_ALL_NO_LIB`即可(也不知道为什么会生成这样的错误的宏?) - 解决办法二: - 既然是预处理宏定义出了问题,那么我们可以在CMakeLists.txt中使用`add_definitions(-DBOOST_ALL_NO_LIB)`添加`BOOST_ALL_NO_LIB`的预处理宏定义。也可以使用camke命令行`cmake /DBOOST_ALL_NO_LIB ..` 添加宏定义。参考[链接](https://blog.csdn.net/rangfei/article/details/125651845?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-125651845-blog-86192850.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-125651845-blog-86192850.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=2) - 不过要注意,这样并不能取消掉原有的`BOOST_ALL_NO_LIB-DBOOST_ALL_NO_LIB`宏定义,只是已经不会错了,可以去项目属性->C/C++->所有选项->预处理器定义,删除掉BOOST_ALL_NO_LIB-DBOOST_ALL_NO_LIB的宏。 - 这种方法可以直接msbuild,而不用打开vs进行生成。 # 2.5、未声明的变量 - 出现变量找不到的情况,问题如下:  - 这里实际上并没有做什么,问题很奇怪,明明声明了cloud变量的。经过长时间的代码对比,发现是中文注释影响了代码,确切来说是声明的cloud和magenta变量上方的中文注释导致的: ``` //初始化点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); ``` ``` //预处理点云颜色 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> magenta(cloud, 255, 0, 255); ``` - 因此删掉声明变量上方中文注释,或者加个标点符号,或者换一行,又或者改成英文的就好了。 - 这应该是和gbk和utf-8编码有关,因此我曾经在Clion下改变过项目文件的编码,我在CLion下将main.cpp切换成了UTF-8的格式,导致编译出错,而在不修改注释为英文的情况下,切回GBK,能正常编译,这启发我们要尽可能的使用英文注释。至于原因,可以[参考讨论](http://www.icodeguru.com/1/39.html) 网上关于中文注释影响编译的帖子也很多,基本都是文件编码问题:  - 此外,我们还可以设置CLion和VS的文件编码格式,前者默认是UTF-8的,而后者默认是GBK的,存在差异: - CLion设置编码格式:[链接](https://blog.csdn.net/CHYabc123456hh/article/details/108277863) - VS设置编码格式:[链接](https://blog.csdn.net/Love_Point/article/details/105658241?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-105658241-blog-76977281.pc_relevant_multi_platform_whitelistv6&spm=1001.2101.3001.4242.1&utm_relevant_index=3) # 2.6、无法进行写入 pclRegister还在后台运行,导致无法再次编译运行。 [参考](https://blog.csdn.net/shuiyixin/article/details/88238915?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-88238915-blog-116495852.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-88238915-blog-116495852.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=4)  # 2.7、 1.12版本PCL创建深度图出现bug - 使用1.12版本的PCL调用createFromPointCloud函数,创建深度图时出现如下断言错误: ``` Assertion failed: (internal::UIntPtr(array) & (31)) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily .org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****", file C:\Program Files\Eigen3\ include\eigen3\Eigen\src/Core/DenseStorage.h, line 128 ``` - 问题出在PCL在windows上的ALL-IN-One安装包默认不支持SSE/AVX(2) ,改用PCL 1.11可临时解决问题。 此外,参考[链接](https://github.com/PointCloudLibrary/pcl/issues/4987),在CMake中添加如下编译选项,可以从根本上解决这个问题: ``` # 1.12版本的PCL需要打开这个开关,否则生成深度图时会出错 target_compile_options(PointCloudMaster PUBLIC "/arch:AVX2") ``` 或者使用Visual Studio打开项目,在下面这里设置AVX、AVX2或者AVX512即可:  - [参考链接](https://github.com/PointCloudLibrary/pcl/issues/5019) # 参考 - pcl库[教程](https://robot.czxy.com/docs/pcl/) - [PCL-Notes](https://github.com/MNewBie/PCL-Notes) - [Windows下配置安装PCL开发环境](https://blog.csdn.net/qq_45006390/article/details/118928500) - 在[clion中使用PCL](https://blog.csdn.net/linmingan/article/details/80165554?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-80165554-blog-105291163.pc_relevant_multi_platform_whitelistv5&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-80165554-blog-105291163.pc_relevant_multi_platform_whitelistv5&utm_relevant_index=1)
上一篇:
雷达成像与融合相关技术
下一篇:
Windows+CLion+OpenCV环境
0
赞
121 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册