Cartographer使用篇:保存地图

工作环境:

ubuntu16.04+ROS(Kinetic)+Cartographer-1.0.0

地图文件

  • .pbstream

    cartographer格式地图文件,本质上是一个压缩protobuf文件,内部包含轨迹等状态。运行时为了实时性,扔掉了大部分传感器数据,里面记录十分粗糙。

  • .bag

    全部的传感器数据文件。

只有当算法完成,建好了最佳轨迹,再将.pbstream、.bag(全部传感器数据)、.urdf(传感器外参)、.lua(配置文件)结合起来创建高分辨率地图。

主要程序可以去阅读assets_writer,进行点云的染色、滤波以及导出不同格式的点云,相关程序在cartographer/io路径下。简单介绍一下,io路径实现了点云的读取和存储,模块化程序,不同的头文件对应不同流水线的处理器,类似于链表,分阶段式执行。其中,points_processor.h定义了基类PointsProcessor,抽象了所有处理器的公有接口。

地图调参

配置文件: assets_writer_backpack_3d.lua,提供给cartographer/io路径下的程序使用;

  • color_points

    根据frame_id给点云添加颜色;主要成员color、frame_id;

  • dump_num_points

    记录输出处理的点数量;主要成员num_points;

  • fixed_ratio_sampler

    采样过滤器,控制固定采样频率的点通过;主要成员sampling_ratio;

  • frame_id_filter

    帧过滤器,控制黑名单或者白名单的帧点通过;主要成员keep_frames、drop_frames;

  • write_hybrid_grid

    创建大尺寸体素混合网格,控制通过的光线;主要成员voxel_size、range_data_inserter;

  • intensity_to_color

    将光强转化为颜色;主要成员min_intensity_、max_intensity_、frame_id_;

  • min_max_range_filtering

    距离过滤器;主要成员min_range_、max_range_;

  • voxel_filter_and_remove_moving_objects

    体素滤波,滤除动态物体;主要成员voxel_size_;

  • write_pcd

    存储pcd格式点云;

  • write_ply

    存储ply格式点云;

  • write_probability_grid

    存储指定分辨率概率栅格;主要成员resilution、range_data_inserter;

  • write_xray_image

    存储切片透明图片;主要成员voxel_size;

  • write_xyz

    存储XYZ(ASCII)点

地图保存

这里以Public 3D 德国博物馆 Data b3-2016-04-05-14-14-00.bag 为例,演示如何保存地图。

  1. 运行离线节点

    $ roslaunch cartographer_ros offline_backpack_3d.launch bag_filenames:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag
    
  2. 保存.pbstrem文件

    $ rosservice call /finish_trajectory 0
    $ rosservice call /write_state "{filename: '${HOME}/Downloads/b3-2016-04-05-14-14-00.bag.pbstream', include_unfinished_submaps: 'true'}"
    
  3. 保存ply地图

    (1)修改assets_writer_backpack_3d.lua

    VOXEL_SIZE = 5e-2
    
    include "transform.lua"
    
    options = {
     tracking_frame = "base_link",
     pipeline = {
         {
             action = "min_max_range_filter",
             min_range = 1.,
             max_range = 60.,
         },
         {
             action = "fixed_ratio_sampler",
             sampling_ratio = 0.001,
         },
         {
             action = "intensity_to_color",
             min_intensity = 0.,
             max_intensity = 4095.,
         },
         {
             action = "write_ply",
             filename = "points.ply",
         },
     }
    }
    

    (2)运行assets_writer节点,保存地图

    $ roslaunch cartographer_ros assets_writer_backpack_3d.launch bag_filenames:='${HOME}/Downloads/b3-2016-04-05-14-14-00.bag' pose_graph_filename:='${HOME}/Downloads/b3-2016-04-05-14-14-00.bag.pbstream'
    
Cartographer使用篇:保存地图_第1张图片
节点运行结果图

上述节点运行完成,我们就可以在bag路径下看到b3-2016-04-05-14-14-00.bag_points.ply点云文件了:

.ply文件路径

这里我们使用CloudCompare软件打开看一下。

Cartographer使用篇:保存地图_第2张图片
.ply点云

至此,关于cartographer如何保存地图就介绍完了,如果有什么问题可以评论区探讨或者私信都可以。


参考资料:

[1]. Exploiting the map generated by Cartographer ROS

[2]. 【cartographer源码分析】系列的第四部分【io源码分析】

[3]. Public Data - Deutsches Museum

你可能感兴趣的:(#,Cartographer,cartographer,SLAM,点云,SLAM,ROS,建图导航,自主避障,路径规划)