代码编译问题
编译代码的过程中遇到了g2o和pcl两个库的问题,因此做一个记录.
G2O编译问题
1. 引用方式问题
在使用G2O库时遇到了下面的问题:
error: ‘VectorX’ was not declared in this scope 54 | typedef std::vector<VectorX, Eigen::aligned_allocator< VectorX>>
通过调试我发现问题就出在 slam_in_autonomous_driving/cmake/packages.cmake
文件对G2O库引用方式里面.
原始代码如下(有问题):
# g2o 使用thirdparty中的
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/g2o/)
set(g2o_libs
${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_stuff.so
${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_core.so
# ${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_solver_cholmod.so
${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_solver_dense.so
${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_solver_csparse.so
${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_csparse_extension.so
${PROJECT_SOURCE_DIR}/thirdparty/g2o/lib/libg2o_types_sba.so
${CSPARSE_LIBRARY}
${CHOLMOD_LIBRARY}
)
2. make_unique问题
在取消直接引用,会引用我安装在环境中的G2O库,但是我在环境中的G2O库版本比较高,并没有完全解决问题,会遇到下面的情况:
error
make_unique
is not a member of g2o
我自己安装的版本比较新,而代码里面使用的G2O版本为1.0.0,应该为Github中2020年的那一版,因此需要安装下载的G2O,保证版本匹配.
3. 问题解决
我把G2O配置了一下安装到指定位置,然后将 g2o/cmake_modules/FinsG2O.cmake
文件添加到slam_in_autonomous_driving/cmake
文件夹内,修改cmake文件查找路径,修改后代码如下(无问题):
# g2o 使用thirdparty中的
# 需要设置自己G2O安装路径
set(G2O_ROOT "/home/.../slam_in_autonomous_driving/install/g2o")
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIR})
set(g2o_libs
${G2O_CORE_LIBRARY}
${G2O_STUFF_LIBRARY}
${G2O_CLI_LIBRARY}
${G2O_SOLVER_CHOLMOD}
${G2O_SOLVER_CSPARSE}
${G2O_SOLVER_CSPARSE_EXTENSION}
${G2O_SOLVER_DENSE}
${G2O_SOLVER_PCG}
${G2O_SOLVER_SLAM2D_LINEAR}
${G2O_SOLVER_STRUCTURE_ONLY}
${G2O_SOLVER_EIGEN}
${G2O_TYPES_DATA}
${G2O_TYPES_ICP}
${G2O_TYPES_SBA}
${G2O_TYPES_SCLAM2D}
${G2O_TYPES_SIM3}
${G2O_TYPES_SLAM2D}
${G2O_TYPES_SLAM3D}
)
上面指定这么多库有些时不需要的,但为了省事我都引用了.
4. 解决问题思路
对于库引用不正确,或者没有引用自己想要的版本,现在我觉得最佳解决思路就是首先确认自己引用的是哪一个版本,我看到 slam_in_autonomous_driving/src/ch4
文件目录下的CMakeLists文件内引用了${g2o_libs}
,因此可以在其下面加入打印 ${g2o_libs}
的命令.
修改后代码如下:
add_executable(run_gins_pre_integ run_gins_pre_integ.cc)
target_link_libraries(run_gins_pre_integ
${PROJECT_NAME}.ch3
${PROJECT_NAME}.ch4
${g2o_libs}
)
# 下面为加入的内容
message("-------------------------")
message("${g2o_libs}")
message("-------------------------")
最开始我使用了类似 https://blog.csdn.net/weixin_44684139/article/details/104876193 文章内的解决办法,但是发现引用的库并不对(通过输出结果查看).
后面查看 FindG2O.cmake
文件,找到可以引用的LIB,如最后解决方案所示,终于引用到了正确的库 .so
文件.
PCL库问题
1. PCL库链接问题
在编译文件的时候,到了第5章,我发现总会遇到PCL链接问题,如下:
`bool pcl::visualization::PCLVisualizer::fromHandlersToScreen< pcl::PointXYZI>(pcl::visualization::PointCloudGeometryHandler< pcl::PointXYZI> const&, pcl::visualization::PointCloudColorHandler< pcl::PointXYZI> const&, std::__cxx11::basic_string<char, std::char_traits< char>, std::allocator< char> > const&, int, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&)':
遇到这个问题第一时间我找网上有什么解决方案,发现都是类似 https://blog.csdn.net/aoxuestudy/article/details/111638474 文章中,说是版本不够新.在更新版本之后并没有解决问题.
2. 问题原因
通过测试我发现我安装的PCL库版本为1.13.0,但是每次被使用的PCL版本都是1.10.0,通过测试发现 slam_in_autonomous_driving/cmake/packages.cmake
文件中下面的代码决定了PCL库的位置:
# ros
# 为了2D scan, pointcloud2
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
sensor_msgs
pcl_ros
pcl_conversions
)
而下面的代码决定了PCL其他模块的位置:
# pcl
# 设置自己的PCL库安装位置, <PCLConfig.cmake>文件的所在目录
set(PCL_DIR "/home/.../slam_in_autonomous_driving/install/pcl/share/pcl-1.10")
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
链接出问题明显就是PCL库版本不同造成的.
3. 进一步说明
因为我使用Ubuntu20.04,安装的ros可以直接下载的pcl版本为1.10.0,因此为了使用RSO里面的pcl内容只能把自己安装的PCL版本更换为1.10.0.
更换之后问题就解决了.