Cartographer-[1]概述

Catalogue
  1. 1. 1. Cartographer-[1]概述
  2. 2. 2. 整体架构
  3. 3. 3. 数据结构
  4. 4. 4. 标准定义
    1. 4.1. 4.1. Frames(坐标系)
    2. 4.2. 4.2. Transforms (变换)
  5. 5. 5. 文件目录结构
    1. 5.1. 5.1. cartographer核心库

1. Cartographer-[1]概述

2. 整体架构

Cartographer可以看作是两个独立的,但相互关联的子系统。

3. 数据结构

整个库采用protobuf数据格式,可参见configuration

  • cartographer.common.proto.CeresSolverOptions
  • cartographer.mapping.pose_graph.proto.ConstraintBuilderOptions
  • cartographer.mapping.pose_graph.proto.OptimizationProblemOptions
  • cartographer.mapping.proto.MapBuilderOptions
  • cartographer.mapping.proto.MotionFilterOptions
  • cartographer.mapping.proto.PoseGraphOptions
  • cartographer.mapping.proto.TrajectoryBuilderOptions
  • cartographer.mapping_2d.proto.LocalTrajectoryBuilderOptions
  • cartographer.mapping_2d.proto.RangeDataInserterOptions
  • cartographer.mapping_2d.proto.SubmapsOptions
  • cartographer.mapping_2d.scan_matching.proto.CeresScanMatcherOptions
  • cartographer.mapping_2d.scan_matching.proto.FastCorrelativeScanMatcherOptions
  • cartographer.mapping_2d.scan_matching.proto.RealTimeCorrelativeScanMatcherOptions
  • cartographer.mapping_3d.proto.LocalTrajectoryBuilderOptions
  • cartographer.mapping_3d.proto.RangeDataInserterOptions
  • cartographer.mapping_3d.proto.SubmapsOptions
  • cartographer.mapping_3d.scan_matching.proto.CeresScanMatcherOptions
  • cartographer.mapping_3d.scan_matching.proto.FastCorrelativeScanMatcherOptions
  • cartographer.sensor.proto.AdaptiveVoxelFilterOptions

4. 标准定义

4.1. Frames(坐标系)

  • global map frame

    这是表示全局 SLAM 结果的坐标系。 它是包含所有闭环和优化结果的固定地图坐标系。 当新的优化结果出现时,该帧与其他帧之间的转换可以跳转。 它的 z 轴指向上方,也就是重力加速度矢量指向-z 方向,也就是说加速计测量的重力分量是 + z 方向

  • local map frame

    局部SLAM结果的坐标系,不包括闭环以及位姿BA优化,对于给定某个时间点,该帧与全局地图之间的变换可能会发生变化,但是该帧和其他帧的变换不会发生变化。

  • submap frame

    每个子图都有一个单独的坐标系

  • tracking frame(跟踪坐标系)

    传感器数据表示的坐标系,不固定

  • gravity-aligned frame

    重力对准坐标系,只在2D中使用,与跟踪坐标系有相同位置,但是坐标系方向不一致,类似于导航坐标系

4.2. Transforms (变换)

  • local_pose(局部姿态)

    将数据从跟踪坐标系(Tracking frame)或者子图坐标系转换到local map frame的变换

  • global_pose(全局位姿)

    将数据从跟踪坐标系(Tracking frame)或者子图坐标系转换到全局坐标系的变换

  • local_submap_pose(局部子图位姿)

    将子图坐标系中的数据转换到local map 坐标系的变换

  • global_submap_pose(全局子图位姿)

    将子图坐标系中的数据转换到全局地图坐标系

5. 文件目录结构

整个cartographer_ros工程目录

1
2
3
4
.
├── cartographer #cartographer核心C++库
├── cartographer_ros #基于ROS的封装调用
└── ceres-solver #优化器

5.1. cartographer核心库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
.
├── BUILD.bazel
├── cloud //建图服务器相关
│   ├── BUILD.bazel
│   ├── client
│   ├── internal
│   ├── map_builder_server_interface.cc
│   ├── map_builder_server_interface.h
│   ├── map_builder_server_main.cc
│   ├── map_builder_server_options.cc
│   ├── map_builder_server_options.h
│   ├── metrics
│   └── proto
├── common //通用库
│   ├── blocking_queue.h #阻塞
│   ├── blocking_queue_test.cc
│   ├── ceres_solver_options.cc #优化器选项
│   ├── ceres_solver_options.h
│   ├── config.h.cmake
│   ├── configuration_file_resolver.cc
│   ├── configuration_file_resolver.h
│   ├── configuration_files_test.cc
│   ├── fixed_ratio_sampler.cc
│   ├── fixed_ratio_sampler.h #采样器
│   ├── fixed_ratio_sampler_test.cc
│   ├── histogram.cc
│   ├── histogram.h #直方图
│   ├── internal
│   ├── lockless_queue.h #锁
│   ├── lockless_queue_test.cc
│   ├── lua.h #lua配置文件读取
│   ├── lua_parameter_dictionary.cc
│   ├── lua_parameter_dictionary.h
│   ├── lua_parameter_dictionary_test.cc
│   ├── lua_parameter_dictionary_test_helpers.h
│   ├── make_unique.h #基于C++11实现的make_unique
│   ├── math.h #数学转换库
│   ├── math_test.cc
│   ├── mutex.h #线程锁
│   ├── optional.h
│   ├── optional_test.cc
│   ├── port.h #压缩、解压库
│   ├── proto
│   ├── rate_timer.h
│   ├── rate_timer_test.cc
│   ├── task.cc
│   ├── task.h
│   ├── task_test.cc
│   ├── thread_pool.cc
│   ├── thread_pool.h #线程池
│   ├── thread_pool_test.cc
│   ├── time.cc
│   └── time.h #时间转换
├── ground_truth
│   ├── autogenerate_ground_truth_main.cc
│   ├── compute_relations_metrics_main.cc
│   ├── proto
│   ├── relations_text_file.cc
│   └── relations_text_file.h
├── io
│   ├── color.cc
│   ├── color.h
│   ├── coloring_points_processor.cc
│   ├── coloring_points_processor.h
│   ├── counting_points_processor.cc
│   ├── counting_points_processor.h
│   ├── draw_trajectories.cc
│   ├── draw_trajectories.h
│   ├── fake_file_writer.cc
│   ├── fake_file_writer.h
│   ├── fake_file_writer_test.cc
│   ├── file_writer.cc
│   ├── file_writer.h
│   ├── fixed_ratio_sampling_points_processor.cc
│   ├── fixed_ratio_sampling_points_processor.h
│   ├── frame_id_filtering_points_processor.cc
│   ├── frame_id_filtering_points_processor.h
│   ├── hybrid_grid_points_processor.cc
│   ├── hybrid_grid_points_processor.h
│   ├── image.cc
│   ├── image.h
│   ├── intensity_to_color_points_processor.cc
│   ├── intensity_to_color_points_processor.h
│   ├── internal
│   ├── migrate_serialization_format_main.cc
│   ├── min_max_range_filtering_points_processor.cc
│   ├── min_max_range_filtering_points_processor.h
│   ├── null_points_processor.h
│   ├── outlier_removing_points_processor.cc
│   ├── outlier_removing_points_processor.h
│   ├── pcd_writing_points_processor.cc
│   ├── pcd_writing_points_processor.h
│   ├── ply_writing_points_processor.cc
│   ├── ply_writing_points_processor.h
│   ├── points_batch.cc
│   ├── points_batch.h
│   ├── points_processor.h
│   ├── points_processor_pipeline_builder.cc
│   ├── points_processor_pipeline_builder.h
│   ├── points_processor_pipeline_builder_test.cc
│   ├── probability_grid_points_processor.cc
│   ├── probability_grid_points_processor.h
│   ├── proto_stream.cc
│   ├── proto_stream_deserializer.cc
│   ├── proto_stream_deserializer.h
│   ├── proto_stream_deserializer_test.cc
│   ├── proto_stream.h
│   ├── proto_stream_interface.h
│   ├── proto_stream_test.cc
│   ├── serialization_format_migration.cc
│   ├── serialization_format_migration.h
│   ├── serialization_format_migration_test.cc
│   ├── submap_painter.cc
│   ├── submap_painter.h
│   ├── xray_points_processor.cc
│   ├── xray_points_processor.h
│   ├── xyz_writing_points_processor.cc
│   └── xyz_writing_points_processor.h
├── mapping
│   ├── 2d
│   ├── 3d
│   ├── detect_floors.cc
│   ├── detect_floors.h
│   ├── grid_interface.h
│   ├── id.h
│   ├── id_test.cc
│   ├── imu_tracker.cc
│   ├── imu_tracker.h
│   ├── imu_tracker_test.cc
│   ├── internal
│   ├── local_slam_result_data.h
│   ├── map_builder.cc
│   ├── map_builder.h
│   ├── map_builder_interface.h
│   ├── map_builder_test.cc
│   ├── pose_extrapolator.cc
│   ├── pose_extrapolator.h
│   ├── pose_extrapolator_test.cc
│   ├── pose_graph.cc
│   ├── pose_graph.h
│   ├── pose_graph_interface.h
│   ├── pose_graph_test.cc
│   ├── pose_graph_trimmer.cc
│   ├── pose_graph_trimmer.h
│   ├── pose_graph_trimmer_test.cc
│   ├── probability_values.cc
│   ├── probability_values.h
│   ├── probability_values_test.cc
│   ├── proto
│   ├── range_data_inserter_interface.cc
│   ├── range_data_inserter_interface.h
│   ├── submaps.h
│   ├── submaps_test.cc
│   ├── trajectory_builder_interface.cc
│   ├── trajectory_builder_interface.h
│   ├── trajectory_node.cc
│   ├── trajectory_node.h
│   └── trajectory_node_test.cc
├── metrics
│   ├── counter.cc
│   ├── counter.h
│   ├── family_factory.h
│   ├── gauge.cc
│   ├── gauge.h
│   ├── histogram.cc
│   ├── histogram.h
│   ├── register.cc
│   └── register.h
├── sensor
│   ├── collator_interface.h
│   ├── compressed_point_cloud.cc
│   ├── compressed_point_cloud.h #点云压缩
│   ├── compressed_point_cloud_test.cc
│   ├── data.h #根据传感器id,进行数据封装
│   ├── fixed_frame_pose_data.cc
│   ├── fixed_frame_pose_data.h #固定坐标系的数据如gps
│   ├── imu_data.cc
│   ├── imu_data.h #imu数据结构
│   ├── internal #进一步实现
│   ├── landmark_data.cc
│   ├── landmark_data.h #路标点数据结构
│   ├── landmark_data_test.cc
│   ├── map_by_time.h #按时间戳进行轨迹拼接?
│   ├── map_by_time_test.cc
│   ├── odometry_data.cc
│   ├── odometry_data.h #里程计数据结构
│   ├── point_cloud.cc
│   ├── point_cloud.h #点云数据结构
│   ├── point_cloud_test.cc
│   ├── proto
│   ├── range_data.cc
│   ├── range_data.h #激光数据储存结构
│   ├── range_data_test.cc
│   ├── timed_point_cloud_data.cc
│   └── timed_point_cloud_data.h #带时间戳的点云
└── transform //2D、3D变换
├── proto
├── rigid_transform.cc #定义刚体变换2D/3D
├── rigid_transform.h
├── rigid_transform_test.cc
├── rigid_transform_test_helpers.h
├── timestamped_transform.cc #带时间戳的刚体变换数据结构
├── timestamped_transform.h
├── transform.cc #变换,2D/3D数据结构相互转换,proto/Eigen数据转换
├── transform.h
├── transform_interpolation_buffer.cc #根据时间戳线性插值
├── transform_interpolation_buffer.h
├── transform_interpolation_buffer_test.cc
└── transform_test.cc