Bootstrap

Cartographer(二):cartographer_ros源码及代码框架

cartongraphe_ros中的源文件:

assets_writer.cc
assets_writer_main.cc
configuration_files_test.cc
map_builder_bridge.cc
msg_conversion.cc
msg_conversion_test.cc
node.cc
node_constants.cc
node_main.cc
node_options.cc
occupancy_grid_node_main.cc
offline_node.cc
offline_node_main.cc
pbstream_map_publisher_main.cc
pbstream_to_ros_map_main.cc
playable_bag.cc
rosbag_validate_main.cc
ros_log_sink.cc
ros_map.cc
ros_map_writing_points_processor.cc
sensor_bridge.cc
submap.cc
tf_bridge.cc
time_conversion.cc
time_conversion_test.cc
trajectory_options.cc
urdf_reader.cc

主要的文件及类之间的关系:

在这里插入图片描述

node_main.cc
1、main函数所在
2、创建NodeOptions、TrajectoryOptions、TransformListener等
3、创建Node实例,其参数中有nodeoptions实例的map_builder_options成员
4、通过LoadOptions函数将lua等配置文件中的参数加载到程序中
5、通过StartTrajectoryWithDefaultTopics开始一条轨迹(可以理解为开始建图)

node.cc
1、node_main.cc中创建Node实例,调用StartTrajectoryWithDefaultTopics函数,其参数为trajectory_options
2、StartTrajectoryWithDefaultTopics函数实现

void Node::StartTrajectoryWithDefaultTopics(const TrajectoryOptions& options) {
  absl::MutexLock lock(&mutex_);
  CHECK(ValidateTrajectoryOptions(options));
  AddTrajectory(options);
}

3、Node class的相关函数及调用关系,主要如下图(绿色为调用了map_builder_bridge中函数,黄色为通过map_builder_bridge实例调用的sensor_bridge指针,蓝色为调用的sensor_bridge的函数):
在这里插入图片描述

node_options.cc
1、node_main.cc 中调用的LoadOptions函数的实现

std::tuple<NodeOptions, TrajectoryOptions> LoadOptions(
    const std::string& configuration_directory,
    const std::string& configuration_basename) {
...
  return std::make_tuple(CreateNodeOptions(&lua_parameter_dictionary),
                         CreateTrajectoryOptions(&lua_parameter_dictionary));

2、创建该结构体的函数
CreateNodeOptions( ::cartographer::common::LuaParameterDictionary* const lua_parameter_dictionary)
在其中创建了map_builder_options (即::cartographer::mapping::proto::MapBuilderOptions的实例)

trajectory_options.cc
1、对里程计、单(多)线激光、点云格式、gps以及传感器采样频率等的说明;该结构体与lua文件中的配置项相对应
2、创建该结构体函数
CreateTrajectoryOptions(::cartographer::common::LuaParameterDictionary* const lua_parameter_dictionary);

map_builder_bridge.cc
1、其成员函数在Node类中均有被调用
2、有一个SensorBridge类的实例,调用其相关函数传输数据到cartongrapher中

sensor_bridge.cc
1、其主要功能有两个a、将ros格式的消息转化为cartongrapher计算需要的格式 b、将数据加入到cartongrapher计算
2、主要函数及调用关系如下:
在这里插入图片描述

3、通过::cartographer::mapping::TrajectoryBuilderInterface* trajectory_builder与cartongrapher建立联系

;