cartographer 体素滤波器 voxel_filter.cc

1、简介:

在cartographer/sensor/internal/voxel_filter.cc

在localTrajectoryBuild_2d.cc 中被调用

  const sensor::PointCloud& filtered_gravity_aligned_point_cloud =
      sensor::AdaptiveVoxelFilter(options_.adaptive_voxel_filter_options())
          .Filter(gravity_aligned_range_data.returns);

参数:  重力坐标系下,激光数据的returns 点,的点云

2、实现

1.AdaptiveVoxelFilter  构造:

AdaptiveVoxelFilter::AdaptiveVoxelFilter(
    const proto::AdaptiveVoxelFilterOptions& options)
    : options_(options) {}

  cartographer代码中 配置参数:

  adaptive_voxel_filter = {
    max_length = 0.5,
    min_num_points = 200,
    max_range = 50.,
  },

闭环自适应体素滤波器

  loop_closure_adaptive_voxel_filter = {
    max_length = 0.9,
    min_num_points = 100,
    max_range = 50.,
  },

2.Filter函数   

调用:AdaptiveVoxelFilter函数,体素滤波 返回所需点云   

FilterByMaxRange(point_cloud, options_.max_range())    筛选点云

PointCloud AdaptiveVoxelFilter::Filter(const PointCloud& point_cloud) const {
  return AdaptivelyVoxelFiltered(
      options_, FilterByMaxRange(point_cloud, options_.max_range()));
}

3.AdaptiveVoxelFilter函数   

对点云数据,根据指定范围max_range进行l2距离过滤,筛选点云数据

// l2范数,向量各个元素平方和的1/2次方

  PointCloud result;
  for (const RangefinderPoint& point : point_cloud) {
    if (point.position.norm() <= max_range) {
      result.push_back(point);
    }
  }
  return result;

4.AdaptiveVoxelFilter函数:

PointCloud AdaptivelyVoxelFiltered(
    const proto::AdaptiveVoxelFilterOptions& options,
    const PointCloud& point_cloud)

voxels_:表征一系列的Cell,每个Cell有一个size,piont以size为间距分布,实现稀疏表示。 Cell的数量和即为稀疏表达的point的数量和。

参数说明:

形参1:滤波器option,         形参2:待滤波的points

代码注解:

1. 'point_cloud'已经足够稀疏了  直接返回

  if (point_cloud.size() <= options.min_num_points()) {
    // 'point_cloud' is already sparse enough.
    return point_cloud;
  }

2.  以max_size为间距,稀疏提取point。   调用Filter函数

  PointCloud result = VoxelFilter(options.max_length()).Filter(point_cloud);

**.Filter函数:

PointCloud VoxelFilter::Filter(const PointCloud& point_cloud) {
  PointCloud results;
  for (const RangefinderPoint& point : point_cloud) {
    auto it_inserted =
        voxel_set_.insert(IndexToKey(GetCellIndex(point.position)));
    if (it_inserted.second) {
      results.push_back(point);
    }
  }
  return results;
}

GetCellIndex(point.position)  将三维点除以  分辨率 options.max_length()   四舍五入取整

IndexToKey       

  KeyType k_0(static_cast<uint32>(index[0]));
  KeyType k_1(static_cast<uint32>(index[1]));
  KeyType k_2(static_cast<uint32>(index[2]));
  return (k_0 << 2 * 32) | (k_1 << 1 * 32) | k_2;

 absl::flat_hash_set<KeyType> voxel_set_;

3.使用'max_length'过滤会产生足够密集的点云。

  if (result.size() >= options.min_num_points()) {
    // Filtering with 'max_length' resulted in a sufficiently dense point cloud.
    return result;
  }

4.以max_size为间距没有超过min_num.则继续减小edge大小,使得以low_length为间距。

low_length是每个Cell的长度。 每个Cell“占据”的points不能超过min_num. 二分查找法: for()循环每次将edge减半 对每一个low_length: while()循环控制edge不能小于10% 满足要求则记录,否则将high折半。

  for (float high_length = options.max_length();
       high_length > 1e-2f * options.max_length(); high_length /= 2.f) {
    float low_length = high_length / 2.f;
    result = VoxelFilter(low_length).Filter(point_cloud);
    if (result.size() >= options.min_num_points()) {
      // Binary search to find the right amount of filtering. 'low_length' gave
      // a sufficiently dense 'result', 'high_length' did not. We stop when the
      // edge length is at most 10% off.
      while ((high_length - low_length) / low_length > 1e-1f) {
        const float mid_length = (low_length + high_length) / 2.f;
        const PointCloud candidate =
            VoxelFilter(mid_length).Filter(point_cloud);
        if (candidate.size() >= options.min_num_points()) {
          low_length = mid_length;
          result = candidate;
        } else {
          high_length = mid_length;
        }
      }
      return result;
    }
  }
  return result;

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Cartographer 是一个开源的地图制图工具,主要用于构建和绘制室内和室外环境的三维地图。它是以Lua语言作为脚本编写和扩展的。 首先,Lua是一种轻量级高级编程语言,被广泛应用于嵌入式系统、游戏开发、脚本编写等领域。Cartographer选择使用Lua作为其脚本编写语言,是因为Lua拥有简洁的语法和高度可扩展性,使得用户可以轻松地编写和修改Cartographer的功能。 使用Lua作为Cartographer的脚本语言,使得开发人员可以根据特定需求自定义各种功能和算法。他们可以通过编写Lua脚本来改变地图的生成方式、路径规划算法、环境感知等内容。这种灵活性使得Cartographer能够适应各种特定的应用场景和需求。 同时,Lua也是一个功能强大的脚本语言,拥有很多有用的函数库和模块,例如字符串处理、JSON解析、网络通信等。这些功能可以被利用来扩展Cartographer的能力,使得它具备更多的功能。例如,用户可以使用内置的JSON库来处理来自传感器的数据,然后将其集成到Cartographer的地图生成过程中。 总之,Cartographer中使用Lua作为脚本编写语言,给开发人员提供了一种灵活且可扩展的方式来定制和扩展地图生成和绘制的功能。通过编写Lua脚本,用户可以根据自己的需求来改变Cartographer的行为和输出,使其更好地适应各种应用场景。 ### 回答2: 在游戏开发中,cartographer(制图师)是一个很重要的角色,而Lua则是常用于游戏制作的脚本语言。Lua提供了简单、高效和可嵌入的特性,使得在游戏中实现制图功能变得更加容易。 制图师的工作是创建和设计游戏中的地图。他们使用图形工具来绘制地图的外貌,并使用Lua脚本来定义地图的行为、布局和特性。 使用Lua的主要好处之一是它的灵活性。制图师可以根据需要编写自定义脚本来控制地图元素的交互逻辑。例如,他们可以编写脚本来定义角色在地图上的移动、碰撞检测和触发事件等。这样可以为游戏增加更多的互动性和挑战性。 此外,Lua还提供了强大的扩展性。制图师可以利用Lua的扩展功能来添加自定义的地图特性,如随机生成地形、动态添加/移除地图元素等。这样可以使游戏的地图更加多样化和有趣。 另一个使用Lua的好处是它的易学性。相对于其他编程语言,Lua语法简洁明了,并且具有良好的文档和丰富的教程资源。制图师即使没有深厚的编程知识,也可以迅速上手并编写简单的脚本来完成地图设计。 总的来说,cartographer中的Lua在游戏开发中扮演着非常重要的角色。它为制图师提供了强大和灵活的工具,使他们能够轻松创建和定制游戏的地图。无论是添加互动性、扩展地图特性,还是实现复杂的游戏逻辑,Lua都是一个理想的选择。 ### 回答3: cartographer是一个用于构建并绘制地图的开源库,而lua是一种脚本语言,常用于嵌入式系统和游戏开发中。在cartographer中,可以使用lua来编写自定义的功能和逻辑。 使用lua可以为cartographer添加一些自定义的功能。比如,可以利用lua脚本来编写一些特定的算法,从而优化地图的构建和绘制过程。也可以通过lua脚本来实现特定的地图渲染效果,如灯光效果、阴影等。 此外,使用lua还可以在运行时动态加载和修改地图配置。通过编写lua脚本,可以实现在地图运行时根据特定条件对地图进行修改,例如动态生成障碍物、修改地图尺寸、添加额外的特征等。这使得cartographer在适应不同应用领域和需求时更加灵活。 同时,cartographer还提供了一些接口和函数来与lua进行交互。这些接口和函数可以让lua脚本获取和修改地图、传递数据给其他系统、控制执行流程等。通过这些交互方式,我们可以实现cartographer与其他部分的集成,或者将cartographer作为其他系统的一部分,以满足更具体的需求。 综上所述,cartographer中的lua提供了一种扩展和定制地图构建和绘制功能的方法,能够使cartographer更加灵活和适应不同的应用场景和需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值