publish_tracked_pose 和 use_pose_extrapolator
新版本增加的参数publish_tracked_pose,默认false1
2
3
4
5
6
7
8
9
10
11struct NodeOptions {
  ::cartographer::mapping::proto::MapBuilderOptions map_builder_options;
  std::string map_frame;
  double lookup_transform_timeout_sec;
  double submap_publish_period_sec;
  double pose_publish_period_sec;
  double trajectory_publish_period_sec;
  bool publish_to_tf = true;
  bool publish_tracked_pose = false;
  bool use_pose_extrapolator = true;
};
在Node构造函数中的部分1
2
3
4
5if (node_options_.publish_tracked_pose) {
    tracked_pose_publisher_ =
        node_handle_.advertise<::geometry_msgs::PoseStamped>(
            kTrackedPoseTopic, kLatestOnlyPublisherQueueSize);
  }
发布消息的部分在Node::PublishLocalTrajectoryData的最后。
这里用到了新版本的另一个新内容: 参数use_pose_extrapolator
Node里的位姿估计器,作用是融合里程计和IMU,推测出一个位姿。 如果use_pose_extrapolator参数为true,发布出的这个位姿不准,因为是先验的位姿,没有经过雷达校准,除非IMU和里程计特别准。因此这个参数一般都是false
如果参数publish_tracked_pose为false,use_pose_extrapolator其实就无效了
Node::MaybeWarnAboutTopicMismatch
新版本中的Node::AddTrajectory添加1
2
3wall_timers_.push_back(node_handle_.createWallTimer(
      ::ros::WallDuration(kTopicMismatchCheckDelaySec),
      &Node::MaybeWarnAboutTopicMismatch, this, /*oneshot=*/true)  );
创建一个3s执行一次的定时器,由于oneshot=true,所以只执行一次。检查设置的topic名字在ROS中是否存在,不存在则报错
pose_graph_odometry_motion_filter
CreateGlobalTrajectoryBuilder2D的参数增加 pose_graph_odometry_motion_filter里程计的滤波器,但没有初始化
1  | absl::optional<MotionFilter> pose_graph_odometry_motion_filter;  | 
GetTrajectoryStates 改名为 GetLocalTrajectoryData
原因在于后端里也有GetTrajectoryStates,容易混淆
Node构造函数 —— Node::PublishLocalTrajectoryData —— map_builder_bridge_.GetLocalTrajectoryData()
最后用到的local_slam_data_在MapBuilderBridge::OnLocalSlamResult中赋值
