SLAM学习笔记 1. 笛卡尔坐标系也称为直角坐标系就是普通的x,y平面直角坐标系和x,y,z空间直角坐标系2.lio-sam建立地图建立先验地图priori map生成的点云地图文件格式为.pcdrosbag info 数据集名称 :查看数据集话题信息3.安装liosam过程遇到的问题/usr/include/pcl-1.10/pcl/point_representation.h:308:7: required from here /usr/include/pcl-1.10/pcl/point_representation.h:252:48: error: the value of ‘NrDims’ is not usable in a constant expression安装过程参考https://blog.csdn.net/weixin_57071388/article/details/139114050?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-139114050-blog-122322116.235^v43^pc_blog_bottom_relevance_base8spm1001.2101.3001.4242.1utm_relevant_index2解决过程核心问题是PCL点云库版本与 LIO-SAM 代码兼容性冲突LIO-SAM 原始代码基于 Ubuntu 16.04ROS Kinetic PCL 1.7/1.8开发若当前系统是 Ubuntu 20.04ROS Noetic PCL 1.10必然存在兼容性问题优先通过修改代码适配新版 PCL避免降级系统库。在cmakelist中添加set(CMAKE_CXX_STANDARD 14)强制编译器使用 C14 标准进行编译确保代码中使用的 C14 特性如智能指针增强、lambda 表达式改进、constexpr扩展等能被正确解析。LIO-SAM 代码中可能包含依赖 C11 及以上标准的语法如std::shared_ptr、范围 for 循环等指定CMAKE_CXX_STANDARD 14可避免因编译器默认标准过低导致的语法错误。4.运行rosdep update后liosam建图就报错了process[robot_b/lio_sam_original_imuPreintegration-1]: started with pid [12413] /home/ras/liosam_original_ws/devel/lib/lio_sam_original/lio_sam_original_imuPreintegration: symbol lookup error: /home/ras/liosam_original_ws/devel/lib/lio_sam_original/lio_sam_original_imuPreintegration: undefined symbol: _ZN5gtsam5ISAM26updateERKNS_20NonlinearFactorGraphERKNS_6ValuesERKSt6vectorImN3tbb13tbb_allocatorImEEERKN5boost8optionalINS_7FastMapImiEEEERKNSF_INS_8FastListImEEEESP_b [robot_b/lio_sam_original_imuPreintegration-1] process has died [pid 12413, exit code 127, cmd /home/ras/liosam_original_ws/devel/lib/lio_sam_original/lio_sam_original_imuPreintegration __name:lio_sam_original_imuPreintegration __log:/home/ras/.ros/log/d6af000e-f925-11f0-9133-453323bb98be/robot_b-lio_sam_original_imuPreintegration-1.log]. log file: /home/ras/.ros/log/d6af000e-f925-11f0-9133-453323bb98be/robot_b-lio_sam_original_imuPreintegration-1*.log原因运行 LIOSAM 的 imuPreintegration 节点时出现GTSAM 库符号未定义错误exit code 127这是rosdep update后rosdep update会更新系统的 ROS 依赖索引GTSAM 库版本不匹配或编译链接异常导致的典型问题解决方案重装GTSAM后重新编译LIOSAM,让 LIOSAM 链接新安装的 GTSAM 库a.进入GTSAM功能包里的build删除所有内容后在当前终端运行cmake ..cmake ....是一个路径表示「当前目录的上一级目录」。cmake .. 表示用上一级目录里的CMakeLists. txt在当前目录生成构建文件如 Makefileb.在当前终端中编译GTSAM, -j 后接CPU核心数比如4加速编译。make -j8c.安装 GTSAM 到系统目录sudo make install命令解释i.sudo获取管理员权限因为要把 GTSAM 安装到/usr/local/lib、/usr/local/include这类系统级目录普通用户没有写入权限必须用sudo提权否则会报 “Permission denied”权限拒绝错误。ii.make执行编译 / 安装指令make是 Linux 下的编译构建工具它会读取源码目录下的Makefile文件由之前的cmake ..生成执行里面定义的指令。iii.install: make 的 “安装” 目标make的一个指令参数类似函数的参数告诉make不要只编译还要执行 “安装” 步骤。你可以把这个过程类比成 “安装软件到电脑”cmake ..相当于 “配置安装路径、选择安装功能”比如勾选 “启用 TBB”make相当于 “把软件的安装包解压、编译成可运行的程序”但还在临时文件夹里sudo make install相当于 “把临时文件夹里的程序复制到电脑的 Program Files 目录让所有软件都能调用它”。d. catkin_make 重新编译LIOSAM并source ./devel/setup.bash5.slam相关知识数据集里面的发布数据话题一般来说imu数据话题是imu_correctgps数据是gps/fix点云数据是points_raw。先启动传感器(机器人底盘、相机、雷达、IMU、GPS)记录bag包之后运行bag包在运行liosam代码建立点云地图pcd图。slam中的坐标系查看建立的点云地图命令pcl_viewer GlobalMap.pcd10月11号桌面上有两个工作空间的名字不同但是内容相似的liosam代码liosam_ws和liosam_original_ws开机后必须先运行liosam_ws才可以成功运行liosam_original_ws。先运行liosam_original_ws会出现如下报错原因功能包重名导致路径优先级冲突两个工作空间的 package.xml 和 CMakeLists.txt 均声明包名为 lio_samROS 在查找包时通过 ROS_PACKAGE_PATH会优先选择先加载的路径导致 liosam_original_ws 实际引用 liosam_ws 的资源如参数、节点、消息。解决方法步骤一将 liosam_original_ws 的 package.xml 中 name 改为 lio_sam_originalCMakeLists.txt 中 project() 同步改为 lio_sam_original步骤二修正自定义消息的引用 全局替换源码中消息命名空间如 lio_sam::cloud_info 改为 lio_sam_original::cloud_info并在 CMakeLists.txt 中确保消息生成依赖正确add_dependencies 包含消息生成目标。步骤三更改launch 文件、params.yaml等配置文件中跟包名字相关的路径。步骤四彻底清理并重新编译删除 liosam_original_ws 的 build 和 devel 目录在全新终端中仅加载系统 ROS 环境重新编译并 source 新环境确保编译产物不依赖 liosam_ws。10月15日gtsam::Vector3表示 三维向量 的数据类型通常用于存储空间中的位置、速度、加速度、角速度等物理量或数学运算中的三维向量。可直接与 Eigen 库的 Eigen::Vector3d 互相转换方便调用 Eigen 的数学运算接口遇到问题滤除NAN点之后就可以建图了。vectorint indices;pcl::removeNaNFromPointCloud(*laserCloudIn, *laserCloudIn, indices);线程与线程锁锁的数量由需要保护的共享资源数量决定这里是imuQueue和odomQueue两个因此两个锁。线程数量由需要并行处理的任务数量决定这里是激光、IMU、里程计三个回调任务因此三个线程。ROS 中的线程如MultiThreadedSpinner创建的线程主要用于并行执行回调函数。当有多个回调函数如订阅多个传感器话题时多线程可以避免单个回调函数的耗时操作阻塞其他回调的执行。12月10日直接将bag包从回收站用鼠标拖出导致未建立索引终端中运行rosbag reindex命令修复索引