目录
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 , 减小了回环的次数(隔多长时间计算一次)