PCL 1.12.1调用setInputCloud触发Eigen SFINAE运行时断言错误求助
问题
- 环境:Ubuntu 22,PCL 1.12.1,Eigen3 3.4.0
- 现象:使用PCL积分图像法线估计官方代码,编译无错误,但运行时调用
pcl::IntegralImageNormalEstimation<PointInT, PointOutT>::setInputCloud()触发断言错误,程序终止 - 错误信息:
normal_estimation_using_integral_images: /usr/include/eigen3/Eigen/src/Core/util/XprHelper.h:133: Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value = 3]: Assertion `v == T(Value)' failed.
- 调用栈:
libc.so.6!__pthread_kill_implementation(int no_tid, int signo, pthread_t threadid) (pthread_kill.c:44) libc.so.6!__pthread_kill_internal(int signo, pthread_t threadid) (pthread_kill.c:78) libc.so.6!__GI___pthread_kill(pthread_t threadid, int signo) (pthread_kill.c:89) libc.so.6!__GI_raise(int sig) (raise.c:26) libc.so.6!__GI_abort() (abort.c:79) libc.so.6!__assert_fail_base(const char * fmt, const char * assertion, const char * file, unsigned int line, const char * function) (assert.c:92) libc.so.6!__GI___assert_fail(const char * assertion, const char * file, unsigned int line, const char * function) (assert.c:101) libpcl_features.so.1.12![Unknown/Just-In-Time compiled code] (Unknown Source:0) libpcl_features.so.1.12!pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal>::initAverage3DGradientMethod() (Unknown Source:0) pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal>::setInputCloud(pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> * const this, const pcl::PointCloud<pcl::PointXYZ>::ConstPtr & cloud) (/usr/include/pcl-1.12/pcl/features/integral_image_normal.h:251) main() (/home/sagal/bire/pcl_tutorial/src/normal_estimation_using_integral_images.cpp:91)
- 怀疑方向:PCL即时生成代码未通过Eigen的SFINAE检查,不清楚类型测试位置
解决方案
方法1:切换法线估计方法
IntegralImageNormalEstimation默认使用的AVERAGE_3D_GRADIENT方法在Eigen3.4+与PCL1.12的组合下存在兼容性问题,可切换为其他稳定方法:
// 切换为协方差矩阵法 normal_estimator.setNormalEstimationMethod(pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal>::COVARIANCE_MATRIX); // 或切换为平均深度变化法 normal_estimator.setNormalEstimationMethod(pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal>::AVERAGE_DEPTH_CHANGE);
方法2:降级Eigen版本
Eigen3.4.0的内部类型检查逻辑调整导致与PCL1.12.1不兼容,可降级到Eigen3.3.x版本(以3.3.9为例):
- 卸载当前Eigen:
sudo apt remove libeigen3-dev
- 下载并编译安装Eigen3.3.9:
wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz tar -xzf eigen-3.3.9.tar.gz cd eigen-3.3.9 mkdir build && cd build cmake .. sudo make install
方法3:修改PCL源码补丁
若不想降级Eigen,可修改PCL的integral_image_normal.h文件(路径:/usr/include/pcl-1.12/pcl/features/integral_image_normal.h):
找到initAverage3DGradientMethod函数,将涉及Eigen固定大小矩阵的初始化代码,显式指定维度为3,确保与模板参数匹配,避免Eigen断言触发。
内容的提问来源于stack exchange,提问作者Sanghun Ahn
相关产品推荐
相关产品推荐

