cartographer新版本的变化

publish_tracked_pose 和 use_pose_extrapolator

新版本增加的参数publish_tracked_pose,默认false

1
2
3
4
5
6
7
8
9
10
11
struct 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
5
if (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
3
wall_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
2
3
4
5
6
7
absl::optional<MotionFilter> pose_graph_odometry_motion_filter;
if (trajectory_options.has_pose_graph_odometry_motion_filter())
{
LOG(INFO) << "Using a motion filter for adding odometry to the pose graph.";
pose_graph_odometry_motion_filter.emplace(
MotionFilter(trajectory_options.pose_graph_odometry_motion_filter()));
}

GetTrajectoryStates 改名为 GetLocalTrajectoryData

原因在于后端里也有GetTrajectoryStates,容易混淆

Node构造函数 —— Node::PublishLocalTrajectoryData —— map_builder_bridge_.GetLocalTrajectoryData()

最后用到的local_slam_data_MapBuilderBridge::OnLocalSlamResult中赋值