cartographer解读 node_main.cc -1

void Run() {
  constexpr double kTfBufferCacheTimeInSeconds = 10.;
  tf2_ros::Buffer tf_buffer{::ros::Duration(kTfBufferCacheTimeInSeconds)};//保持10秒的变换历史
  tf2_ros::TransformListener tf(tf_buffer);//定义变换侦听器函数
  NodeOptions node_options;//定义 Cartographer ROS集成的顶级选项。
  TrajectoryOptions trajectory_options;//定义轨迹结构体
  std::tie(node_options, trajectory_options) = //保证数据实时更新
      LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);//载入配置文件
//std::tie : https://blog.csdn.net/qq100440110/article/details/51056306

  auto map_builder =
      cartographer::common::make_unique<cartographer::mapping::MapBuilder>(
          node_options.map_builder_options); //用到了智能
  Node node(node_options, std::move(map_builder), &tf_buffer); //将ROS主题连接到slam。
  if (!FLAGS_load_state_filename.empty()) {
    node.LoadState(FLAGS_load_state_filename, FLAGS_load_frozen_state); //从.pbstream文件加载序列化的slam状态}

  if (FLAGS_start_trajectory_with_default_topics) {
    node.StartTrajectoryWithDefaultTopics(trajectory_options);// 以默认主题开始第一个轨迹。
  }

  ::ros::spin();//循环且监听反馈函数(callback),后面的代码不会被执行

  node.FinishAllTrajectories();
  node.RunFinalOptimization();

  if (!FLAGS_save_state_filename.empty()) {
    node.SerializeState(FLAGS_save_state_filename);
  }
}
.pbstream : cartographer 生成的地图格式

Node node(node_options, std::move(map_builder), &tf_buffer);//将ROS主题连接到SLAM。
std::move : https://www.cnblogs.com/SZxiaochun/p/8017349.html

Node(const NodeOptions& node_options,//把引用作为参数
     std::unique_ptr<cartographer::mapping::MapBuilderInterface> map_builder,//用到了智能指针
     tf2_ros::Buffer* tf_buffer);

把引用作为参数:https://www.runoob.com/cplusplus/passing-parameters-by-references.html

std::unique_ptr :https://blog.csdn.net/lijinqi1987/article/details/79005794

举例:Stack<string> stringStack; // string 类型的栈

node.LoadState(FLAGS_load_state_filename, FLAGS_load_frozen_state);// 从.pbstream文件加载序列化的slam状态。

猜你喜欢

转载自blog.csdn.net/m0_37964922/article/details/89670973