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状态。