5.1激光数据处理流程
1.入口文件:node_main.cc
入口函数main,如下图:
::ros::init(argc, argv, "cartographer_node");
::ros::start();
cartographer_ros::ScopedRosLogSink ros_log_sink;
cartographer_ros::Run();
- void Run()
//加载配置文件,并返回给(node_options, trajectory_options)
std::tie(node_options, trajectory_options) =
LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);
//根据参数订阅相对应的主题消息
Node node(node_options, std::move(map_builder), &tf_buffer,
FLAGS_collect_metrics);
if (!FLAGS_load_state_filename.empty()) {
node.LoadState(FLAGS_load_state_filename, FLAGS_load_frozen_state);
}
//启动轨迹处
if (FLAGS_start_trajectory_with_default_topics) {
node.StartTrajectoryWithDefaultTopics(trajectory_options);
}
- 其中LoadOptions 转到node_options.cc 中,Node 就转到node.cc 定义发布器和订阅器
入口文件:node.cc
Node::Node(const NodeOptions& node_options, tf2_ros::Buffer* const tf_buffer): node_options_(node_options),
map_builder_bridge_(node_options_, tf_buffer)
{
//submap发布器,往kSubmapListTopic 发布
//::cartographer_ros_msgs::SubmapList 消息
submap_list_publisher_
//路径发布器,向kTrajectoryNodeListTopic这个Topic上发布了
//一个::visualization_msgs::MarkerArray型的message
trajectory_node_list_publisher_
//请求子图submap服务
kSubmapQueryServiceName
//定时器,发布获取子图
wall_timers_.push_back(node_handle_.createWallTimer(
::ros::WallDuration(node_options_.submap_publish_period_sec),
&Node::PublishSubmapList, this));
}
//启动轨迹
StartTrajectoryWithDefaultTopics
{
AddTrajectory(options, DefaultSensorTopics());
}
int Node::AddTrajectory(const TrajectoryOptions& options,
const cart