cartorgapher的编译与运行

发布于:2025-07-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

cartorgapher的编译环境

cartorgapher的编译

cartographer的运行

参数的详解与调参总结

降低延迟与减小计算量


cartorgapher的编译环境

系统环境
推荐在 ubuntu16.04 或者 18.04 上进行编译
推荐使用刚装好的 ubuntu 系统
ubuntu 的软件源设置成清华的或者其他的中国境内的源 , 更换完源之后要执行一下 sudo apt
get update
照着 wiki.ros.org 安装完对应版本的 ROS
并在 .bashrc 中的末尾添加这条句语句 , 要把 <distro> 改成对应的 ROS 版本
source /opt/ros/<distro>/setup.bash
其中 sudo rosdep init ; rosdep update 这条语句执行不成功 , 不管他 , 不是必须执行的
依赖库的安装
cartographer 的依赖库脚本完成一键安装 .
如下是具体步骤 :
第一步 : 下载安装包
链接: https://pan.baidu.com/s/1q9f5aNTfrbpFpwGCwD6E4A
提取码: slam
在网盘链接里 安装包文件夹 中下载 cartographer_install-20210613.zip, 放到 ubuntu 系统里并解压
第二步 : 打开终端
进入到 cartographer_install 文件夹 , 在文件夹内部空白处单击鼠标右键 , 打开终端
第三步 使用脚本完成依赖项的安装
在终端中输入 ./auto - carto - build.sh
如果提示脚本不是一个可执行的文件 , 那就通过 chmod +x auto - carto - build.sh 为这个脚本添加可执
行权限即可 , 之后在通过 ./auto - carto - build.sh 执行脚本
第三步 使用脚本完成依赖项的安装
在终端中输入 ./auto - carto - build.sh
如果提示脚本不是一个可执行的文件 , 那就通过 chmod +x auto - carto - build.sh 为这个脚本添加可执
行权限即可 , 之后在通过 ./auto - carto - build.sh 执行脚本 .
解释说明
脚本里进行了 4 个库的编译与安装
cartographer 的依赖库有 3 , 分别是 abseil-cpp, ceres-solver, protobuf.
在脚本的最后 , 也将 cartographer 安装到系统里了 . 安装 cartographer , 就可以在工作空间中只对
cartographer_ros 进行编译了 , 这样修改 launch lua 文件后就不需要执行一次编译指令了 .
注意 : 如果之前安装过 ceres-solver, protobuf, cartographer 的话 , 执行脚本时可能会报有些函数没
有定义的错误 , 这是由于 protobuf 或者 cartographer 不一致版本导致的 , 可以先将之前安装的库卸载掉 ,
再执行安装依赖的脚本
一定要确保脚本执行之后没有错误输出 , 否则之后编译代码会编译不通过

cartorgapher的编译

第一步 : 下载注释的代码
讲师注释的代码的 github 地址为
https://github.com/xiangli0608/cartographer_detailed_comments_ws
在某个文件夹内部空白处单击鼠标右键 , 打开终端 , 输入如下执行进行代码的下载 .
git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git
注意 , 一定要通过 git clone 的方式下载代码 , 因为代码的注释是处于更新状态的 , 要定期通过 git pull
origin master 来更新代码 .
要是在 github 中下载代码的 zip 压缩文件 , 这样下载的代码里不含有 .git 文件夹 , 就不能通过 git pull
行代码的更新了 .
如果执行 git clone 后没有下载代码 , 是由于没有连上 github 导致的 , 可以按 ctrl c 中断当前下载 ,
次执行 git clone , 重复几次试试 , 如果还不行 , 就在群里问问吧 .
第二步 : cartorgapher 的编译
进入到 cartographer_detailed_comments_ws , 在文件夹内打开终端 , 输入
./catkin_make.sh
完成对 cartographer cartographer_ros 的编译 .
注意 : 一定要确保之前的依赖项全部安装成功 , 否则这里的编译就会报错

cartographer的运行

下载数据集
在网盘链接里 数据集文件夹 中下载数据集 , 使用的数据集有 3 ,
rslidar-outdoor-gps.zip 这个是讲师自己录制的数据 , 包括了速腾 16 线点云数据 , 由点云数据生成的
单线雷达数据 , imu, 里程计 , rtk/gps, tf tf_static
rslidar-outdoor-gps-notf.zip 这个与上边的是同一个 , 只不过这个将 tf 的话题去掉了
landmarks_demo_uncalibrated.zip 是从 cartographer 官网上下载的数据 , 旨在展示一下如何在
cartographer 中使用 landmark
bag 文件放到指定的文件夹下
首先 , 用户文件夹 下新建一个文件夹 , 并命名为 bagfiles , 然后将下载好的 3 bag 文件放入 bagfiles 文件 夹中.
开始二维建图
进入到 cartographer_detailed_comments_ws 文件夹内 , 在文件夹内右键打开终端 , 输入
source install_isolated/setup.bash
rospack profile
roslaunch cartographer_ros lx_rs16_2d_outdoor.launch
source 命令的目的
source 命令是设置当前的终端 可以执行的包与节点的地址集合的 , 不执行 source
install_isolated/setup.bash 这个命令 , 直接启动 roslaunch 时就会出现 找不到包或找不到节点的
错误提示 .
为了防止每次启动终端都要执行一次 source install_isolated/setup.bash 这个指令 , 我们可以将
这个指令写到 ~/.bashrc 文件中 , 每次启动终端时 , 会自动 source ~/.bashrc 这个文件 , 这个文件中的所有
内容都会被 source 一遍
~ 代表用户文件夹 , 例如我自己电脑的用户名为 lx, 我自己的用户文件夹就是 /home/lx/ , 这个文件夹地址
也可以用 ~ 来代替 .
ctrl h 可以显示隐藏文件 , 找到 .bashrc 文件进行编辑 , 在文件底部输入
source ~/path - to - carto/cartographer_detailed_comments_ws/install_isolated/setup.bash
其中 path - to - carto 要改成自己实际的文件夹名字
rospack profile 命令的目的
新下载的包在编译之后 , 有时没有被加载到 ros 的包的地址集合中 ,.
这时即使执行力 source 指令 , 在启动 roslaunch 时也可能会报错 , 提示找不到包或者可执行节点 .
通过 rospack profile 命令可以将新下载的包加载到 ros 的包的地址集合 , 再执行 roslaunch 时就不
会再报错了 .
保存 2d 轨迹 , 并生成 ros 格式的地图
./finish_slam_2d.sh
其中 map_dir 是保存地图的文件夹名字 , 可以改成自己想要保存的文件夹地址 .
纯定位模式
roslaunch cartographer_ros lx_rs16_2d_outdoor_localization.launch
3d 建图指令
roslaunch cartographer_ros lx_rs16_3d.launch
保存 3d 轨迹
./finish_slam_3d.sh
使用 asset 生成 ros 格式的 2d 栅格地图
roslaunch cartographer_ros assets_writer_2d.launch
使用 asset 生成 3d 点云地图
roslaunch cartographer_ros assets_writer_3d.launch
landmark 使用示例
roslaunch cartographer_ros landmark_mir_100.launch
odom 坐标系发布重复
bag 或者机器人中本身存在 odom 坐标系 , provide_odom_frame 又设置成了 true, 就会导致 odom
标系重复发布 .
会导致机器人位姿发生来回的跳动 .

参数的详解与调参总结

TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 100.
TRAJECTORY_BUILDER_2D.min_z = 0.2 -- / -0.8
TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.02
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.occupied_space_weight = 10.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 1.
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 80.
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.resolution = 0.1 -- / 0.02
POSE_GRAPH.optimize_every_n_nodes = 160. -- 2倍的num_range_data以上
POSE_GRAPH.constraint_builder.sampling_ratio = 0.3
POSE_GRAPH.constraint_builder.max_constraint_distance = 15.
POSE_GRAPH.constraint_builder.min_score = 0.48
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.60

降低延迟与减小计算量

前端部分
减小 max_range, 减小了需要处理的点数 , 在雷达数据远距离的点不准时一定要减小这个值
增大 voxel_filter_size, 相当于减小了需要处理的点数
增大 submaps.resolution, 相当于减小了匹配时的搜索量
对于自适应体素滤波 减小 min_num_points max_range, 增大 max_length, 相当于减小了需要处
理的点数
后端部分
增大 optimize_every_n_nodes, 降低优化频率 , 减小了计算量
增大 MAP_BUILDER.num_background_threads, 增加计算速度
减小 global_sampling_ratio, 减小计算全局约束的频率
减小 constraint_builder.sampling_ratio, 减少了约束的数量
增大 constraint_builder.min_score, 减少了约束的数量
减小分枝定界搜索窗的大小 , 包括 linear_xy_search_window,inear_z_search_window,
angular_search_window
增大 global_constraint_search_after_n_seconds, 减小计算全局约束的频率
减小 max_num_iterations, 减小迭代次数
降低内存
增大子图的分辨率 submaps.resolution
降低纯定位时错误重定位的概率
修改 pose_graph.lua 中的如下参数
提高 optimize_every_n_nodes , 减小了优化的次数
减小 sampling_ratio, 减小了计算约束的次数
减小 max_constraint_distance, 减小了计算约束的距离
提高 min_score, 减小了计算约束的数量 , 提高约束正确的概率
提高 global_localization_min_score, 减小了计算约束的数量 , 提高约束正确的概率
提高 global_constraint_search_after_n_seconds , 减小了回环的次数 ( 隔多长时间计算一次 )

网站公告

今日签到

点亮在社区的每一天
去签到