2016年10月5日,谷歌宣布开放一个名为cartographer的即时定位与地图建模库,开发人员可以使用该库实现机器人在二维或三维条件下的定位及建图功能。cartograhper的设计目的是在计算资源有限的情况下,实时获取相对较高精度的2D地图。考虑到基于模拟策略的粒子滤波方法在较大环境下对内存和计算资源的需求较高,cartographer采用基于图网络的优化方法。目前cartographer主要基于激光雷达来实现SLAM,谷歌希望通过后续的开发及社区的贡献支持更多的传感器和机器人平台,同时不断增加新的功能。 cartographer功能包 cartographer功能包已经与ROS集成,现在已经提供二进制安装包,本次采用源码编译的方式进行安装。为了不与已有功能包冲突,最好为cartographer专门创建一个工作空间,这里我们新创建了一个工作空间catkin_google_ws,然后使用如下步骤下载源码并完成编译。 1.安装工具 可以使用如下命令安装工具:
$ sudo apt-get update
$ sudo apt-get install -y python-wstool python-rosdep ninja-build
2.初始化工作空间 使用如下命令初始化工作空间:
$ cd catkin_google_ws
$ wstool init src
3.加入cartographer_ros.rosinstall并更新依赖 命令如下:
$ wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
$ wstool update -t src
4.安装依赖并下载cartographer相关功能包 命令如下:
$ rosdep update
$ rosdep install ——from-paths src ——ignore-src ——rosdistro=${ROS_DISTRO} -y
5.编译并安装 命令如下
$ catkin_make_isolated ——install ——use-ninja
$ source install_isolated/setup.bash
这个是从官方翻译下来的安装方式,大家也可以尝试一下别的:这里发现一篇不错的文章,总结的很好 如果下载服务器无法连接,也可以使用如下命令修改ceres-solver源码的下载地址为https://github.com/ceres-solver/ceres-solver.git
$ gedit catkin_google_ws/src/.rosinstall
修改完成后重新运行编译安装的命令,如果没有出错,则cartographer的相关功能包安装成功。 大家可以运行一下谷歌提供的demo感受一下,这里不做演示,直接上实物小车。
cartographer节点的配置与运行
cartographer_demo.launch cartographer的核心是cartographer_node节点,可以参考cartographer功能包中的demo_revo_lds.launch。在cartographer_ros功能包的launch文件夹下复制demo_revo_lds.launch,重命名为cartographer_demo_delta_lidar.launch,并修改为以下代码。
<!-- 请复制该文件到cartographer_ros/cartographer_ros/launch中使用 -->
<launch>
<param name="/use_sim_time" value="true" />
<node name="cartographer_node" pkg="cartographer_ros"
type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename delta_lidar.lua"
output="screen">
<remap from="scan" to="scan" />
</node>
<node name="rviz" pkg="rviz" type="rviz" required="true"
args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
</launch>
该launch文件主要包含两部分工作:一是运行cartographer_node节点,二是启动rviz可视化界面。当运行cartographer_node节点时,需要用到一个由Lua编写的代码文件delta_lidar.lua,该文件的主要作用是进行参数配置,与gmapping、hector在launch文件中直接配置参数的方法稍有不同。 delta_lidar.lua
-- 请复制该文件到cartographer_ros/cartographer_ros/configuration_files中编译
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "base_link",
published_frame = "odom",
odom_frame = "base_link",
provide_odom_frame = false,
use_odometry = true,
num_laser_scans = 1,
num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1
SPARSE_POSE_GRAPH.optimization_problem.huber_scale = 1e2
SPARSE_POSE_GRAPH.optimize_every_n_scans = 35
SPARSE_POSE_GRAPH.constraint_builder.min_score = 0.65
return options
有些比较明了的参数根据自己的要求进行更改,其他的我们暂时默认就好。 配置完成后回到catkin_google_ws路径下,使用如下命令再次编译:
$ catkin_make_isolated ——install ——use-ninja
过Lua脚本配置参数的方法,每次修改参数后需要重新编译,否则参数无法生效。 现在可以在MRobot上运行cartographer功能包来建立真实环境的地图了: (机器人端)运行起来底盘和雷达
$ roslaunch cartographer_ros cartographer_demo_rplidar.launch(PC端)
我只把小车放在桌面上试运行了一下,就可以看出来他的建图效果和过程是让人很震撼的!