cartographer代码阅读(3)——motion_filter
运动滤波,间隔一段时间、一段距离和角度,对odometry的数据进行关键帧采样。
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())); }
具体可以看看MotionFilter,判断两帧数据是否相似,以减少重复数据。在静止时,避免插入scan数据等操作。
//间隔时间,间隔距离,间隔角度大于阈值,return false bool MotionFilter::IsSimilar(const common::Time time, const transform::Rigid3d& pose) { LOG_IF_EVERY_N(INFO, num_total_ >= 500, 500) << "Motion filter reduced the number of nodes to " << 100. * num_different_ / num_total_ << "%."; ++num_total_; if (num_total_ > 1 && time - last_time_ <= common::FromSeconds(options_.max_time_seconds()) && (pose.translation() - last_pose_.translation()).norm() <= options_.max_distance_meters() && transform::GetAngle(pose.inverse() * last_pose_) <= options_.max_angle_radians()) { return true; } last_time_ = time; last_pose_ = pose; ++num_different_; return false; }
这些阈值参数可以在cartographer/configuration_files/trajectory_builder_2d.lua文件中找到
motion_filter = { max_time_seconds = 5., max_distance_meters = 0.2, max_angle_radians = math.rad(1.), },
作者:水水滴答
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。