自动驾驶与机器人中的SLAM技术-代码编译

代码编译问题

编译代码的过程中遇到了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.
更换之后问题就解决了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
SLAM(同时定位与地图构建)技术自动驾驶具有重要的应用和解决难点。SLAM是指通过感知和计算来同时完成车辆在未知环境的定位以及地图构建的过程。 在自动驾驶SLAM可以帮助车辆实时地感知周围环境,通过激光雷达、摄像头等传感器获取环境的信息,并利用这些信息来构建地图。随后,车辆根据地图进行定位,以便更准确地进行路径规划和导航。 SLAM自动驾驶面临的主要难点包括传感器数据的融合、实时性要求和环境复杂性等。首先,传感器数据融合是指将来自多个传感器的数据进行整合,以准确获取车辆周围环境的信息。这需要对不同传感器的数据进行校准和融合算法的设计,以提高地图的精确性和定位的准确性。 其次,自动驾驶对实时性的要求非常高,快速准确地感知和定位是保证安全行驶的关键。因此,SLAM系统需要在高速行驶时迅速更新地图和定位结果,同时处理大量的传感器数据和进行高效的计算。 此外,自动驾驶车辆通常面临复杂多变的交通环境,包括车道线、交通标志、其他车辆等各种要素。SLAM系统需要能够准确感知并识别这些要素,并进行高精度地图构建和定位。同样,环境的动态物体和障碍物对SLAM技术也提出了挑战,需要通过运动估计和更新机制来及时更新地图和定位信息。 总而言之,SLAM技术自动驾驶的应用非常重要,可以为自动驾驶车辆提供准确的地图和定位信息。然而,传感器数据的融合、实时性要求和环境复杂性是SLAM技术自动驾驶的主要难点,需要通过算法优化和工程实践来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值