谢谢这位博主的灵感!https://blog.csdn.net/qq_43427457/article/details/125052803
自定义的点云数据类型调用pcl的icp和滤波等库的时候遇到undefined reference的问题,开始以为是CMakeList写的有问题,比如缺set directory等等,但是尝试了很久都没有用。本来想改一下数据类型但是感觉pcl不至于这么蠢。。。
偶然又看到了这篇,尝试了一下发现是work的。
在pcl库里搜索报错相关的头文件,举个例子:
然后include对应的头文件
成功解决!
再记录自定义点云类型调用pcl库时候的另一个坑:
总出现Eigen相关的报错
error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),
error: no matching function for call to ‘Eigen::internal::transform_construct_from_matrix<Eigen::Matrix<float, 4, 4>, 2, 0, 3, 4, 4, 4>::run(Eigen::Transform<double, 3, 2>*, const Eigen::Matrix<float, 4, 4>&)’
internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());
note: candidate: static void Eigen::internal::transform_construct_from_matrix<Other, Mode, Options, Dim, HDim, HDim, HDim>::run(Eigen::Transform<typename Other::Scalar, Dim, Mode, Options>*, const Other&) [with Other = Eigen::Matrix<float, 4, 4>; int Mode = 2; int Options = 0; int Dim = 3; int HDim = 4; typename Other::Scalar = float]
static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
note: no known conversion for argument 1 from ‘Eigen::Transform<double, 3, 2>*’ to ‘Eigen::Transform<float, 3, 2>*’
3rdparty/include/eigen3/Eigen/src/Core/AssignEvaluator.h: In instantiation of ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<double, 4, 4>; Src = Eigen::Matrix<float, 4, 4>; Func = Eigen::internal::assign_op<double, float>]’:
开始考虑是Eigen维度或者是版本的问题(师兄建议我升级到3.3版本),但是项目环境不想随便改动。
参考了这篇,怀疑是Matrix的数据类型的问题,就把矩阵输入输出数据类型从double改成了float
https://blog.csdn.net/unlimitedai/article/details/108533828
但是这个改动方法有点蠢,虽然暂时不报错了,但是有什么更好的方法再来改进。。