cartographer的参数

 当我们配置完环境之后咋样运行呢?

launch文件的关键。

<!-- 启动cartographer -->
  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename (name).lua"
      output="screen">
    <remap from="scan" to="front_scan" />
    <remap from="odom" to="odom_scout" />
    <remap from="imu" to="imu" />
  </node>

  <!-- 生成ros格式的地图 -->
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

 

在launch文件中<name>.lua是我们需要在上面所展现的路径中添加一个lua文件。

然后将节点内部的 "scan" 话题重映射到名为 "front_scan" 的话题上

odom与imu同理。

最后生成地图,启动 Cartographer 的 Occupancy Grid 节点,并设置生成的 Occupancy Grid 地图的分辨率为 0.05 米。

在lua文件中是对参数进行设置的文件。

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,                -- map_builder.lua的配置信息
  trajectory_builder = TRAJECTORY_BUILDER,  -- trajectory_builder.lua的配置信息
  
  map_frame = "map",                        -- 地图坐标系的名字
  tracking_frame = "imu_link",              -- 将所有传感器数据转换到这个坐标系下
  published_frame = "footprint",            -- tf: map -> footprint
  odom_frame = "odom",                      -- 里程计的坐标系名字
  provide_odom_frame = false,               -- 是否提供odom的tf, 如果为true,则tf树为map->odom->footprint
                                            -- 如果为false tf树为map->footprint
  publish_frame_projected_to_2d = false,    -- 是否将坐标系投影到平面上
  --use_pose_extrapolator = false,            -- 发布tf时是使用pose_extrapolator的位姿还是前端计算出来的位姿

  use_odometry = false,                     -- 是否使用里程计,如果使用要求一定要有odom的tf
  use_nav_sat = false,                      -- 是否使用gps
  use_landmarks = false,                    -- 是否使用landmark
  num_laser_scans = 0,                      -- 是否使用单线激光数据
  num_multi_echo_laser_scans = 0,           -- 是否使用multi_echo_laser_scans数据
  num_subdivisions_per_laser_scan = 1,      -- 1帧数据被分成几次处理,一般为1
  num_point_clouds = 1,                     -- 是否使用点云数据
  
  lookup_transform_timeout_sec = 0.2,       -- 查找tf时的超时时间
  submap_publish_period_sec = 0.3,          -- 发布数据的时间间隔
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 30e-3,

  rangefinder_sampling_ratio = 1.,          -- 传感器数据的采样频率
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.use_imu_data = true
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 100.
TRAJECTORY_BUILDER_2D.min_z = 0.2
--TRAJECTORY_BUILDER_2D.max_z = 1.4
--TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.02

--TRAJECTORY_BUILDER_2D.adaptive_voxel_filter.max_length = 0.5
--TRAJECTORY_BUILDER_2D.adaptive_voxel_filter.min_num_points = 200.
--TRAJECTORY_BUILDER_2D.adaptive_voxel_filter.max_range = 50.

--TRAJECTORY_BUILDER_2D.loop_closure_adaptive_voxel_filter.max_length = 0.9
--TRAJECTORY_BUILDER_2D.loop_closure_adaptive_voxel_filter.min_num_points = 100
--TRAJECTORY_BUILDER_2D.loop_closure_adaptive_voxel_filter.max_range = 50.

TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = false
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.occupied_space_weight = 1.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 1.
--TRAJECTORY_BUILDER_2D.ceres_scan_matcher.ceres_solver_options.max_num_iterations = 12

--TRAJECTORY_BUILDER_2D.motion_filter.max_distance_meters = 0.1
--TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = 0.004
--TRAJECTORY_BUILDER_2D.imu_gravity_time_constant = 1.

TRAJECTORY_BUILDER_2D.submaps.num_range_data = 80.
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.resolution = 0.1

POSE_GRAPH.optimize_every_n_nodes = 160.
POSE_GRAPH.constraint_builder.sampling_ratio = 0.3
POSE_GRAPH.constraint_builder.max_constraint_distance = 15.
POSE_GRAPH.constraint_builder.min_score = 0.48
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.60

return options
tracking_frame imu link 就设置成 imu link, 没有就设置成 base_link
published_frame cartographer 发布的 tf 的最下边一个坐标系 , 就是 bag 文件中 tf
树的最上边的一个坐标系
provide_odom_frame 是否提供里程计 , 如果 bag 中有里程计的坐标系 , 这个就是
false, 如果没有 , 就根据需要决定是否提供里程计的坐标系
use_pose_extrapolator = false 这个一定要设置成 false
use_odometry 是否使用里程计的传感器数据 , 如果为 true, tf 树中一定要存在
odom 这个坐标系
use_nav_sat/use_landmarks 是否订阅里程计话题的数据 , 以及 landmark 话题的
数据
num_laser_scans/num_point_clouds 单线点云与多线点云的话题的数量 , 可以同
时为 1, 不可以同时为 0
num_subdivisions_per_laser_scan 一帧点云数据会被分成几次处理 , 设置成 1
行了
MAP_BUILDER.use_trajectory_builder_2d = true 建二维图时一定要有这句话 ,
三维图就把 2d 改成 3d
TRAJECTORY_BUILDER_2D.use_imu_data 是否使用 imu, 如果用 imu,
tracking_frame 一定要设置成 imu link
TRAJECTORY_BUILDER_2D.min_z 点云的最小 z 的范围 , 单线点云不能设置大
0 的值 ( 不设置 ), 多线点云的这个值要大于 0
这几个参数是重点。

还有对话题的问题。
我们将话题重映射后在node_constants.h文件中,例如:
constexpr char kLaserScanTopic[] = "scan";

constexpr(编译时常量)的字符数组,它的名字是 kLaserScanTopic,并初始化为字符串 "scan"。
常调的参数
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 100.
TRAJECTORY_BUILDER_2D.min_z = 0.2 -- / -0.8
TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.02
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.occupied_space_weight = 10.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 1.
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 80.
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.resolution = 0.1 -- / 0.02
POSE_GRAPH.optimize_every_n_nodes = 160. -- 2 倍的 num_range_data 以上
POSE_GRAPH.constraint_builder.sampling_ratio = 0.3
POSE_GRAPH.constraint_builder.max_constraint_distance = 15.
POSE_GRAPH.constraint_builder.min_score = 0.48
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.60
降低延迟与减小计算量

前端部分
• 减小 max_range, 减小了需要处理的点数, 在雷达数据远距离的点不准时一定要减
小这个值
• 增大 voxel_filter_size, 相当于减小了需要处理的点数
• 增大 submaps.resolution, 相当于减小了匹配时的搜索量
• 对于自适应体素滤波 减小 min_num_points 与 max_range, 增大 max_length, 相当于减小了需要处里的点数

后端部分
• 增大 optimize_every_n_nodes, 降低优化频率, 减小了计算量
• 增大 MAP_BUILDER.num_background_threads, 增加计算速度
• 减小 global_sampling_ratio, 减小计算全局约束的频率
• 减小 constraint_builder.sampling_ratio, 减少了约束的数量
• 增大 constraint_builder.min_score, 减少了约束的数量
• 减小分枝定界搜索窗的大小, 包括
linear_xy_search_window,inear_z_search_window, angular_search_window
• 增大 global_constraint_search_after_n_seconds, 减小计算全局约束的频率
• 减小 max_num_iterations, 减小迭代次数


降低内存
增大子图的分辨率 submaps.resolution
降低纯定位时错误重定位的概率
修改 pose_graph.lua 中的如下参数
• 提高 optimize_every_n_nodes , 减小了优化的次数
• 减小 sampling_ratio, 减小了计算约束的次数
• 减小 max_constraint_distance, 减小了计算约束的距离
• 提高 min_score, 减小了计算约束的数量, 提高约束正确的概率
• 提高 global_localization_min_score, 减小了计算约束的数量, 提高约束正确的概率
• 提高 global_constraint_search_after_n_seconds , 减小了回环的次数(隔多长时间
计算一次)
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: cartographer参数配置是指在进行地图绘制和制图过程中,根据具体需求对cartographer(地图绘制软件)进行设置和调整的过程。通过合理配置参数,可以达到更好的绘图效果和符合实际需求的地图制作。参数配置涉及到包括投影方式、坐标系统、地形高程、符号样式等多个方面。 首先,投影方式是参数配置中重要的一部分,可以选择不同的投影方式,比如等距圆柱投影、等面积投影、等角圆柱投影等,以适应实际应用需求。其次,坐标系统的选择也很关键,可以根据地图绘制的范围和精度选择合适的坐标系,如WGS84坐标系、Web墨卡托投影坐标系等。地形高程参数配置可以根据地理要素的高度信息进行设置,如山脉、高原、海洋等,可以使用等高线、渐变色等方式进行显示。符号样式的配置可以根据绘制目的和地图主题进行选择和调整,如图标、颜色、线型、填充样式等。 此外,还可以根据具体绘图需求进行更细致的参数配置。比如,地图比例尺、标注字体、注记位置、边框样式、图例等配置项。通过合理配置这些参数可以达到更好的地图效果和可视化效果。 总之,cartographer参数配置是地图绘制过程中的重要一环,通过合理设置各种参数可以制作出符合实际需求的地图,从而更好地展示和传达地理信息。 ### 回答2: Cartographer是谷歌开发的一种强大的SLAM算法,用于构建3D地图。在使用Cartographer进行参数配置时,可以根据具体的应用需求不同来进行相应的设置。 首先,可以调整Cartographer的传感器配置参数。这包括传感器的帧率、分辨率等参数。帧率设置越高,可以获得更多的数据,但也会增加处理数据的复杂度。分辨率可以根据需要进行调整,高分辨率可以获得更多细节,但也会占用更多的存储空间。 其次,需要对Cartograher的地面过滤器参数进行配置。地面过滤器可用于去除地面的杂乱数据,使地图更加准确。地面过滤器的参数设置包括地面点云高度阈值、地面点云最小点数等。这取决于实际地面的特征和要求。 另外,还可以配置Cartographer的回环检测参数。回环检测是指在建立地图过程中,检测到之前已经经过的地方,并将其与新观测的数据进行匹配,从而完善地图。回环检测参数的设置包括回环检测范围、回环关联的匹配阈值等。这些参数的设置直接影响到回环检测的准确性和效率。 最后,可以根据应用需求调整Cartograher的运行速度和精度之间的权衡参数。这些参数可以根据具体的情况进行调整,包括优化器迭代次数、点云配准的误差阈值等。通过调整这些参数,可以在满足实际应用需求的同时提高运行效率或提高地图的精度。 总之,Cartographer参数配置是一个根据具体应用需求进行调整的过程,通过合理配置参数,可以提高地图构建的准确性和效率,满足不同应用场景下的需求。 ### 回答3: cartographer是谷歌开发的一种用于构建实时二维或三维地图的SLAM(即时定位与地图构建)算法。该算法能够结合多个传感器的数据,如激光雷达和相机,来进行地图的构建和定位。 在使用cartographer时,有一些参数配置可以根据具体的应用场景进行调整,以达到更好的地图构建和定位效果。 其中一些重要的参数配置包括: 1. map_resolution(地图分辨率):该参数决定了地图中每个栅格的大小。较小的分辨率可以捕捉更多的细节,但会增加地图的大小和计算量。 2. num_submaps(子地图数量):cartographer将整个地图划分为多个子地图,该参数配置了子地图的数量。较大的值可以提高地图的准确性,但也会增加计算量。 3. submap_size(子地图大小):决定了每个子地图的尺寸。较大的尺寸可以包含更多的环境信息,但也会增加计算和存储开销。 4. scans_per_fog_update(每次迭代更新的扫描次数):用于控制每次迭代更新时使用的激光雷达扫描次数。较大的值可以提高地图的质量,但会增加计算开销。 5. matching_submaps_options(子地图匹配选项):用于配置子地图之间的匹配方式,如匹配窗口大小和难度。根据环境特点进行调整,可以提高地图匹配的准确性。 6. motion_filter_options(运动滤波器选项):用于筛选掉不符合运动规律的激光雷达数据点,以减少噪音和误差。根据传感器和环境特点进行调整,可以提高定位的准确性。 以上是一些常见的cartographer参数配置,根据具体的应用需求和环境特点,可以对这些参数进行调整,以达到更好的地图构建和定位效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值