
pcl1.12与vtk9.1 造成的点云窗口闪退解决方法
如果你在使用PCL 的cloudviewer 或者 PCLVisualizer 这两种方式可视化点云时发现你的点云窗口出现了一瞬间就消失了,接着编译器报segmentation fault。那么你很可能遇到了和我一样的问题。
问题描述
如果你在使用PCL 的cloudviewer 或者 PCLVisualizer 这两种方式可视化点云时,即使加了阻塞代码仍然发现你的点云窗口出现了一瞬间就消失了,接着编译器报segmentation fault。那么你很可能遇到了和我一样的问题。
问题原因
问题出在PCL 和 vtk的版本冲突。如果你的ubuntu是22.04且通过下列方式安装的pcl。那么你的pcl版本可能是1.12,如果你的vtk版本正好又是9.1。二者的冲突就会导致点云窗口闪退。
sudo apt install libpcl-dev
查看上述方法安装的PCL版本可以用以下命令
apt-cache show libpcl-dev
解决方法
根据github上的相关讨论。https://github.com/PointCloudLibrary/pcl/issues/5237 PCL的开发者在新版本1.13中已经修复了这个问题。那么你需要做的就是重新编译安装PCL。现在你有两种做法,一种是删除PCL1.12并安装PCL1.13,另一种是直接安装PCL1.13,让两个版本的PCL共存。
删除并安装
如果你是采用sudo apt install安装的PCL,那么你可以用以下命令卸载PCL
sudo apt-get remove libpcl-dev
具体的PCL安装方法可以参考链接,注意在github要下载1.13以上版本的PCL源码https://blog.csdn.net/z1314520cz/article/details/103856666?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-5-103856666-blog-125818620.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-5-103856666-blog-125818620.235%5Ev38%5Epc_relevant_anti_t3&utm_relevant_index=10该文采用观察cmake报错的方式来安装相关依赖十分省心。
如果你安装好了新版本PCL,那么应该就不会有问题,可以正常使用点云窗口。如果编译器(例如VSCode)或者终端报错如下,提示你两个库文件冲突
[cmake] Cannot generate a safe runtime search path for target visualOdometry
[cmake] because files in some directories may conflict with libraries in implicit
[cmake] directories:
[cmake]
[cmake] runtime library [libpcl_visualization.so.1.13] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
[cmake] /usr/local/lib
那么首先在CmakeLists中添加以下代码检查是否找到了正确的PCL版本
FIND_PACKAGE( PCL REQUIRED COMPONENTS common io visualization filters)
message(STATUS "PCL library status:")
message(STATUS " config: ${PCL_DIR}")
message(STATUS " version: ${PCL_VERSION}")
message(STATUS " libraries: ${PCL_LIBRARY_DIRS}")
message(STATUS " include path: ${PCL_INCLUDE_DIRS}")
如果输出如下,证明cmake找到了正确的PCL版本,相关路径是采用默认安装路径,你额外指定了别的路径那就是你指定的路径
[cmake] -- PCL library status:
[cmake] -- config: /usr/local/share/pcl-1.13
[cmake] -- version: 1.13.1.99
[cmake] -- libraries: /usr/local/lib
[cmake] -- include path: /usr/local/include/pcl-1.13;/usr/include/eigen3;/usr/include;/usr/include/ni;/usr/include/openni2
之所以找到了正确的路径还提示你冲突,是因为之前利用PCL1.12编译产生的makefile文件残留,并没有重头编译,直接把之前编译的build文件夹删了,让他重新编译就不会有问题了。
多版本PCL共存
如果你不想删除旧版的PCL1.12,也可以直接安装新的PCL,让两个PCL版本共存。思路可以参照https://zhuanlan.zhihu.com/p/338725301 里面提到的思路,重点就是指定新版本的安装位置。
更多推荐
所有评论(0)