slam_config_outdoor.yaml 25.3 KB
Newer Older
1
2
3
#########################################################
#  Real-time LiDAR SLAM parameters for outdoor contexts #
#########################################################
4

5
6
# SLAM will compute the pose of tracking_frame in odometry_frame coordinates system, using measurements in input pointcloud frames.
odometry_frame: "odom"       # Frame in which SLAM odometry and maps are expressed (default: odom)
7
tracking_frame: "/base_link"  # Frame to track (ensure a valid TF tree is published to link input pointcloud frame_id) (default: base_link)
8
9
10

# Input LiDAR frames topics, expected as sensor_msgs/PointCloud2 messages with the following fields:
# - x, y, z (float): point coordinates
11
# - time (double): time offset to add to the pointcloud header timestamp to get approximate point-wise acquisition timestamp
12
13
# - intensity (float): intensity/reflectivity of the point
# - laser_id (uint16): numeric identifier of the laser ring that shot this point. The lowest/bottom laser ring should be 0, and it should increase upward.
14
# - device_id (uint8): numeric identifier of the LiDAR device/sensor. This id should be the same for all points of the cloud acquired by the same sensor.
15
# - label (uint8): optional input, not yet used.
16
input: "lidar_points"  # single LiDAR input (default: lidar_points)
17
# input:  # multi LiDAR inputs
18
#   - "lidar_points_1"  # Main topic: SLAM will be run each time a non-empty frame is received on this topic
19
20
#   - "lidar_points_2"  # Secondary topics: non-empty frames will be buffered and added to main frame for multi-LiDAR SLAM.
#   - "lidar_points_3"
21

22
# SLAM node outputs
23
# If set to true, LidarSlamNode will publish the given output to a topic or to the TF server (default to true if not specified).
24
output:
25
  registered_points: true  # Publish registered (and undistorted) SLAM pointcloud as LidarPoint PointCloud2 msg to topic 'slam_registered_points'.
26
  pose:
27
28
29
30
    odom: true             # Publish SLAM pose as an Odometry msg on 'slam_odom' topic.
    tf: true               # Publish SLAM pose as a TF from 'odometry_frame' to 'tracking_frame'.
    predicted_odom: false  # Publish latency-corrected SLAM pose as an Odometry msg on 'slam_predicted_odom' topic (default: false).
    predicted_tf: false    # Publish latency-corrected SLAM pose as a TF from 'odometry_frame' to '<tracking_frame>_prediction' (default: false).
31
  maps:
32
    edges: true            # Publish edges keypoints map as a LidarPoint PointCloud2 msg to topic 'maps/edges'.
33
    intensity_edges: true  # Publish intensity edges keypoints map as a LidarPoint PointCloud2 msg to topic 'maps/intensity_edges'.
34
35
    planes: true           # Publish planes keypoints map as a LidarPoint PointCloud2 msg to topic 'maps/planes'.
    blobs: true            # Publish blobs keypoints map as a LidarPoint PointCloud2 msg to topic 'maps/blobs'.
36
37
  submaps:
    edges: true            # Publish edges keypoints submap as a LidarPoint PointCloud2 msg to topic 'submaps/edges'.
38
    intensity_edges: true  # Publish intensity edges keypoints map as a LidarPoint PointCloud2 msg to topic 'maps/intensity_edges'.
39
40
41
    planes: true           # Publish planes keypoints submap as a LidarPoint PointCloud2 msg to topic 'submaps/planes'.
    blobs: true            # Publish blobs keypoints submap as a LidarPoint PointCloud2 msg to topic 'submaps/blobs'.
  # WARNING : The submaps only exist if update_maps is not 0 (the map is not fixed)
42
  keypoints:
43
    edges: true            # Publish extracted edges keypoints from current frame as a PointCloud2 msg to topic 'keypoints/edges'.
44
    intensity_edges: true  # Publish extracted intensity edges keypoints from current frame as a PointCloud2 msg to topic 'keypoints/intensity_edges'.
45
46
    planes: true           # Publish extracted planes keypoints from current frame as a PointCloud2 msg to topic 'keypoints/planes'.
    blobs: true            # Publish extracted blobs keypoints from current frame as a PointCloud2 msg to topic 'keypoints/blobs'.
47
  confidence: true         # Publish confidence estimators as a confidence msg to topic 'slam_confidence'.
48

49
50
51
52
53
54
55
# Save/load SLAM maps for reuse
maps:

  # Path prefix of SLAM maps that will be loaded at startup (if empty, no map will be loaded).
  # This is equivalent to publishing SlamCommand::LOAD_KEYPOINTS_MAPS to 'slam_command' topic at startup.
  initial_maps: ""

56
57
58
59
  # Initial SLAM pose in odometry_frame X, Y, Z, roll, pitch, yaw [m, rad] (default: 0, 0, 0, 0, 0, 0)
  # This could be useful to set if you're using an initial map estimate, but without starting at the map origin
  initial_pose: [0., 0., 0., 0., 0., 0.]

60
61
62
63

  # PCD file format to use to save SLAM maps: 0) ascii, 1) binary, 2) binary_compressed.
  # To save keypoints maps, send command SlamCommand::SAVE_KEYPOINTS_MAPS to 'slam_command' topic.
  export_pcd_format: 2
64

65
external_sensors:
66
  max_measures: 1000  # [nb] Maximum number of measures stored for each sensor
67
68
69
70
71
72
73
74
75
76
77
78
                      # (used to look for synchronized values + to get back in time in play back mode)
  time_threshold: 0.2 # [s] Maximum time difference between one measure and the studied pose to extrapolate
                      # and between two measures to interpolate
                      # /!\ For landmarks this parameter is also used to define a maximum time without seeing a tag
                      # to reset the absolute pose with new observation (only in the case no poses were initially needed).
  # Optional GPS position use (if 'gps/use_gps'=true), subscribing to Odometry msg on 'gps_odom' topic.
  # It allows to estimate calibration between GPS and SLAM trajectories,
  # or post-optimize SLAM trajectory with pose graph optimization (PGO).
  gps:

    # Optional GPS positions use to calibrate output SLAM pose to world coordinates and/or optimize SLAM trajectory.
    # If true, subscribes to topic 'gps_odom' (nav_msgs/Odometry), and logs GPS positions during 'slam/logging_timeout' seconds.
79
    # (WARNING Can be overridden in launch files with 'gps' arg).
80
81
82
83
84
85
86
87
    use_gps: false

  # Optional landmark detector (e.g. camera) use
  landmark_detector:
    use_tags: false          # [bool] To receive and use tags
    weight: 0.               # Weight to apply to one landmark constraint in the local optimization
                             # 0 disables the feature
                             # It is to be compared to each geometric constraint defined by a keypoint match
88
89
    position_only: true      # [bool] To decide whether to use the whole tag pose (orientation + position)
                             # in the optimization or only the position
90
91
    saturation_distance: 0.5 # [m] Saturation distance beyond which the landmark constraint
                             # is not taken into account in the local optimization
92
93
94
95
96
97
98
99
100
101
102
103
    # Two constraints are usable: the relative constraint and the absolute constraint
    # The absolute constraint requires loading the landmarks absolute pose in the global frame initially
    # whereas the relative constraint uses the landmarks as common keypoints.
    # The absolute constraint is:
    # - enabled if the path is set,
    # - disabled otherwise.
    landmarks_file_path: ""  # [path] File loaded at initialization containing the tag absolute poses
                             # in the global frame (same as the initial maps)
                             # format must be csv with one header line :
                             # id,x,y,z,roll,pitch,yaw,cov0,[...],cov35
                             # /!\ The order of the elements matters.
    publish_tags: false      # [bool] To publish the tags as tf
104

105
graph:
106
107
108
109
110
111
  g2o_file_name: ""    # File where to store the g2o log info (viewable with g2o_viewer tool)
  fix_first: false     # Fix the first pose of the graph. Can be done if one is sure
                       # about the first pose or want a map at the first pose origin
  fix_last: false      # Fix the last pose of the graph. Can be done if one wants to ensure
                       # the motion continuity
  publish_path: false  # If true, publish optimized SLAM trajectory to 'pgo_slam_path' latched topic
112

113
114
115
# SLAM parameters (see Slam.h for description). Comment parameter to get default value.
slam:

116
  # General parameters
117
  n_threads: 4      # Max number of threads to use for parallel processing (default: 1)
118
  2d_mode: false    # Optimize only 2D pose (X, Y, rZ) of tracking_frame relatively to odometry_frame.
119

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  # How to estimate Ego-Motion (approximate relative motion since last frame).
  # The ego-motion step aims to give a fast and approximate initialization of new
  # frame world pose to ensure faster and more precise convergence in Localization step.
  #  0) No ego-motion step is performed : relative motion is Identity, new estimated
  #     Tworld is equal to previous Tworld. Fast, but may lead to unstable and imprecise
  #     Localization step if motion is important.
  #  1) Previous motion is linearly extrapolated to estimate new Tworld pose from the
  #     2 previous poses. Fast and precise if motion is roughly constant and continuous
  #  2) Estimate Trelative (and therefore Tworld) by globally registering new frame
  #     on previous frame. Slower and need textured enough environment, but do not
  #     rely on constant motion hypothesis.
  #  3) Previous motion is linearly extrapolated to estimate new Tworld pose from
  #     the 2 previous poses. Then this estimation is refined by globally registering
  #     new frame on previous frame. Slower and need textured enough environment,
  #     but should be more precise and rely less on constant motion hypothesis.
  ego_motion: 1

  # Undistortion mode, to correct rolling shutter distortion during frame acquisition.
138
139
140
  # The undistortion should greatly improve the accuracy for smooth motions,
  # but might be unstable for high-frequency motions.
  #  0) NONE: no undistortion is performed :
141
  #     - End scan pose is optimized using rigid registration of raw scan and map.
142
143
144
145
146
147
148
149
  #     - Raw input scan is added to map.
  #  1) ONCE: undistortion is performed only one using estimated ego-motion:
  #     - Begin and end scan poses are linearly interpolated using estimated ego-motion.
  #     - Scan is linearly undistorted between begin and end scan poses.
  #     - Scan pose is iteratively optimized using rigid registration of undistorted scan and map.
  #     - Undistorted scan is added to map.
  #  2) REFINED: undistortion is iteratively refined using optimized ego-motion:
  #     - Begin and end scan poses are linearly interpolated using ego-motion.
150
  #     - Scan is linearly undistorted between begin and end scan poses.
151
152
153
154
  #     - Scan pose is optimized using rigid registration of undistorted scan and map.
  #     - Iterate the three previous steps with updated ego-motion and poses.
  #     - Undistorted scan is added to map.
  undistortion: 2
155

156
157
158
  # Verbosity level :
  #  0) print errors, warnings or one time info
  #  1) 0 + frame number, total frame processing time
159
  #  2) 1 + extracted features, used keypoints, localization variance, ego-motion and localization summary
160
161
162
163
164
  #  3) 2 + sub-problems processing duration
  #  4) 3 + ceres optimization summary
  #  5) 4 + logging/maps memory usage
  verbosity: 3

165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
  logging:
    # Optional logging of computed pose, localization covariance and keypoints of each processed frame.
    #  - A value of 0. will disable logging.
    #  - A negative value will log all incoming data, without any timeout.
    #  - A positive value will keep only most recent data, forgetting all previous data older than LoggingTimeout seconds.
    # Logged data will be used for pose graph optimization, GPS antenna/LiDAR sensor calibration using GPS data
    # and velocity/acceleration estimations.
    # WARNING : the time window duration must be set lower than this value.
    timeout: 0  # [s]

    # How to store pointclouds data during keypoints logging (if logging_timeout != 0):
    #  0) PCL pointcloud                    (in RAM,     no compression,      no overhead)
    #  1) Octree compressed binary data     (in RAM,    ~5x compression,   ~3 ms overhead)
    #  2) Ascii format PCD file             (on disk, ~0.6x compression,   ~5 ms overhead)
    #  3) Binary format PCD file            (on disk, ~1.3x compression, ~0.3 ms overhead)
    #  4) Binary compressed format PCD file (on disk, ~1.5x compression, ~0.8 ms overhead)
    storage_type: 0

    # Decide whether to log all frames or only keyframes
    # /!\ All log frames are used in post graph processing
    only_keyframes: false
186

187
  # ICP and LM parameters for Ego-Motion registration step (used only if ego_motion is 2 or 3)
188
  ego_motion_registration:
189
    # Match
190
    max_neighbors_distance: 5.      # [m] Max distance allowed between a current keypoint and its neighbors.
191
    # Point to edge match
192
193
    edge_nb_neighbors: 8            # [>=2] Initial number of edge neighbors to extract, that will be filtered out to keep best candidates.
    edge_min_nb_neighbors: 3        # [>=2] Min number of resulting filtered edge neighbors (max 1 per scan line) to approximate the corresponding line model.
194
195
    edge_max_model_error: 0.2       # [m] Max RMSE allowed between neighborhood and its fitted line model to create a point to line constraint.
    # Point to plane match
196
    plane_nb_neighbors: 5           # [>=3] Number of plane neighbors to extract to approximate the corresponding plane model.
197
198
    planarity_threshold: 0.04       # Min ratio between the 2 highest eigen values of the plane neighborhood to create a point to plane constraint :
                                    # Contained in [0, 1]. OK if l1/l2 > planarity_threshold (with l2>l1>l0)
199
200
201
202
    plane_max_model_error: 0.1      # [m] Max RMSE allowed between neighborhood and its fitted plane model to create a point to plane constraint.
    # Optimization
    ICP_max_iter: 4                 # Number of ICP-optim iterations (building ICP matches then optimizing them) to perform.
    LM_max_iter: 15                 # Max number of iterations of the Levenberg-Marquardt optimizer to solve the ICP problem.
203
204
    init_saturation_distance: 5.    # [m] Initial distance beyond which residuals are saturated using Tukey loss to limit outlier contribution.
    final_saturation_distance: 1.   # [m] Final distance beyond which residuals are saturated using Tukey loss to limit outlier contribution.
205
206
  # ICP and LM parameters for Localization step
  localization:
207
    # Match
208
    max_neighbors_distance: 5.      # [m] Max distance allowed between a current keypoint and its neighbors.
209
    # Point to edge match
210
211
    edge_nb_neighbors: 9            # [>=2] Initial number of edge neighbors to extract, that will be filtered out to keep best candidates.
    edge_min_nb_neighbors: 5        # [>=2] Min number of resulting filtered edge neighbors (close to best line candidate) to approximate the corresponding line model.
212
213
    edge_max_model_error: 0.2       # [m] Max RMSE allowed between neighborhood and its fitted line model to create a point to line constraint.
    # Point to plane match
214
    plane_nb_neighbors: 7           # [>=3] Number of plane neighbors to extract to approximate the corresponding plane model.
215
216
    planarity_threshold: 0.04       # Min ratio between the 2 highest eigen values of the plane neighborhood to create a point to plane constraint :
                                    # Contained in [0, 1]. OK if l1/l2 > planarity_threshold (with l2>l1>l0)
217
218
    plane_max_model_error: 0.1      # [m] Max RMSE allowed between neighborhood and its fitted plane model to create a point to plane constraint..
    # Point to blob match
219
    blob_nb_neighbors: 10           # [>=4] Number of blob neighbors to extract to approximate the corresponding ellipsoid model.
220
221
222
    # Optimization
    ICP_max_iter: 3                 # Number of ICP-optim iterations (building ICP matches then optimizing them) to perform.
    LM_max_iter: 15                 # Max number of iterations of the Levenberg-Marquardt optimizer to solve the ICP problem
223
224
    init_saturation_distance: 2.    # [m] Initial distance beyond which residuals are saturated using Tukey loss to limit outlier contribution.
    final_saturation_distance: 0.5  # [m] Final distance beyond which residuals are saturated using Tukey loss to limit outlier contribution.
225

226
227
228
229
  # Keyframes parameters. Only keyframes points are added to the maps.
  keyframes:
    distance_threshold: 0.5  # [m] Min distance to travel since last KF to add a new one
    angle_threshold: 5.      # [°] Min angle to rotate since last KF to add a new one
230
231
  # WARNING : these parameters are linked to the confidence threshold parameter
  # If they are reduced, the confidence threshold may need to be increased to not take too many moving objects
232

233
234
  # Confidence estimators on pose output
  confidence:
235
    overlap:                     # Estimate how much the current scan is well registered on the current maps.
236
      sampling_ratio: 0.33       # [0-1] Ratio of points to compute overlap on to save some time.
237
                                 # 1 uses all points, 0.5 uses 1 point over 2, etc., 0 disables overlap computation.
238
239
240
241
242
    motion_limits:               # Physical constraints on motion to check pose credibility.
      acceleration: [.inf, .inf] # [linear_acc (m/s2), angular_acc (°/s2)] Acceleration limits.
      velocity:     [.inf, .inf] # [linear_vel (m/s ), angular_vel (°/s )] Velocity limits.
      time_window_duration:  0.  # [s] Duration on which to compute the local velocity/acceleration.
                                 # 0 disables motion limits check.
243
                                 # WARNING : the logging time out must be set greater than this value.
244

245
  # Keypoints maps, saved as downsampled voxel grids
246
  voxel_grid:
247
248
249
250
251
252
253
254
255
256
257
    # How to update the maps:
    #  0) No update is performed. Initial maps are kept as they are.
    #     WARNING: Do not set this parameter to 0 if no initial maps have been loaded!
    #  1) New keypoints are added if they lie in a free voxel relatively to an initial map
    #  2) All new keypoints are added and the map is updated (initial keypoints can disappear)
    #     1) and 2) will be equivalent if no initial maps have been loaded.
    # This is equivalent to publishing :
    #          *SlamCommand::DISABLE_SLAM_MAP_UPDATE
    #          *SlamCommand::ENABLE_SLAM_MAP_EXPANSION
    #          *SlamCommand::ENABLE_SLAM_MAP_UPDATE
    # to 'slam_command' topic at startup.
Julia Sanchez's avatar
Julia Sanchez committed
258
    update_maps: 2
259
260
    leaf_size:
      edges: 0.30             # [m] Resolution used to downsample the edges map with a VoxelGrid filter.
261
      intensity_edges: 0.20   # [m] Resolution used to downsample the edges map with a VoxelGrid filter.
262
263
      planes: 0.60            # [m] Resolution used to downsample the planes map with a VoxelGrid filter.
      blobs: 0.30             # [m] Resolution used to downsample the blobs map with a VoxelGrid filter.
264
265
    # WARNING: the leaf sizes are linked with the confidence threshold parameter
    # if they are reduced the confidence threshold may need to by reduced as well to extract enough target keypoints
266
267
    size: 50                # [voxels] Size of the voxel grid used to store keypoints maps : n*n*n voxels.
    resolution: 10.         # [m/voxel] Resolution of a voxel.
268
269
270
271
272
273
    # The sampling modes allow to decide which point to keep when downsampling the map using a voxel grid.
    # 0) Keep the first point scanned in the voxel,
    # 1) Get the last point scanned in the voxel,
    # 2) Select the point with max intensity,
    # 3) Select the closest point to the voxel center,
    # 4) Compute the centroid of all points laying in the voxel.
274
275
    sampling_mode:
      edge: 2
276
      intensity_edge: 2
277
278
      plane: 2
      blob: 2
279
    decaying_threshold: -1  # [s] Time duration after which to eliminate a not fixed keypoint from the map.
280
    min_frames_per_voxel: 2 # Minimum number of frames that must have reached a map voxel
281
282
283
284
                            # to consider the voxel contains a target keypoint.
                            # It is used to reject moving objects from the map
                            # WARNING: this parameter may need to be adapted to the velocity of the robot,
                            # and the parameterization : see leaf_size keyframes parameters for more details
285

286
  # Keypoint extractor for each LiDAR sensor
287
  ke:
288
    # Single LiDAR input
289
290
    enable:
      edge: true
291
      intensity_edge: true
292
293
      plane: true
      blob: false
294
295
    max_points: 1000                   # Maximum number of keypoints of each type to extract
    voxel_grid_resolution: 1.          # [m/voxel] Size of a voxel to downsample the extracted keypoints
296
    input_sampling_ratio: 1.           # Ratio of points from which to extract the keypoints (for computation time issues)
297
    min_distance_to_sensor: 1.5        # [m] Minimal point to sensor distance to consider a point as valid.
298
299
    min_azimuth: 0.                    # [°] Minimal azimuth angle to consider the point as keypoint. Right thumb rule between min/max azimuth angles.
    max_azimuth: 360.                  # [°] Maximal azimuth angle to consider the point as keypoint. Right thumb rule between min/max azimuth angles.
300
    min_beam_surface_angle: 10.        # [°] Minimal angle between the point surface and the laser beam to consider a point as valid.
301
302
303
    neighbor_width: 4                  # [>1] Width of the neighborhood used to compute discrete differential operators.
    plane_sin_angle_threshold: 0.5     # [0-1] Sharpness threshold to select a planar keypoint (selected if sin angle is less than threshold).
    edge_sin_angle_threshold: 0.86     # [0-1] Sharpness threshold to select an edge keypoint (selected if sin angle is more than threshold).
304
    edge_depth_gap_threshold: 1.       # [m] Threshold upon depth gap in neighborhood to select an edge keypoint.
305
    edge_nb_gap_points: 10             # [points] Minimum number of successive missing points to consider a space gap.
306
    edge_intensity_gap_threshold: 50.  # [0-255] Threshold upon intensity gap to select an edge keypoint.
307
308

    # # Multi LiDAR inputs
309
    # # The multiple devices to use for SLAM.
310
311
312
313
    # # A keypoint extractor will be initialized for each device.
    # device_ids: [0, 10]
    # # Keypoint extractors parameters for each LiDAR sensor "device_<device_id>"
    # device_0:
314
315
    #   enable:
    #     edge: true
316
    #     intensity_edge: true
317
318
    #     plane: true
    #     blob: false
319
320
    #   max_points: 1000                   # Maximum number of keypoints of each type to extract
    #   voxel_grid_resolution: 1.          # [m/voxel] Size of a voxel to downsample the extracted keypoints
321
    #   input_sampling_ratio: 0.6          # Ratio of points from which to extract the keypoints (for computation time issues)
322
    #   min_distance_to_sensor: 1.5        # [m] Minimal point to sensor distance to consider a point as valid.
323
324
    #   min_azimuth: -45                   # [°] Minimal azimuth angle to consider the point as keypoint. Right thumb rule between min/max azimuth angles.
    #   max_azimuth: 45                    # [°] Maximal azimuth angle to consider the point as keypoint. Right thumb rule between min/max azimuth angles.
325
    #   min_beam_surface_angle: 10.        # [°] Minimal angle between the point surface and the laser beam to consider a point as valid.
326
327
328
    #   neighbor_width: 4                  # [>1] Width of the neighborhood used to compute discrete differential operators.
    #   plane_sin_angle_threshold: 0.5     # [0-1] Sharpness threshold to select a planar keypoint (selected if sin angle is less than threshold).
    #   edge_sin_angle_threshold: 0.86     # [0-1] Sharpness threshold to select an edge keypoint (selected if sin angle is more than threshold).
329
330
    #   edge_depth_gap_threshold: 1.5      # [m] Threshold upon depth gap in neighborhood to select an edge keypoint.
    #   edge_nb_gap_points: 10             # [points] Minimum number of successive missing points to consider a space gap.
331
    #   edge_intensity_gap_threshold: 30.  # [0-255] Threshold upon intensity gap to select an edge keypoint.
332
    # device_10:
333
334
    #   enable:
    #     edge: true
335
    #     intensity_edge: true
336
337
    #     plane: true
    #     blob: false
338
339
    #   max_points: 1000                   # Maximum number of keypoints of each type to extract
    #   voxel_grid_resolution: 1.          # [m/voxel] Size of a voxel to downsample the extracted keypoints
340
    #   input_sampling_ratio: 1.           # Ratio of points from which to extract the keypoints (for computation time issues)
341
    #   min_distance_to_sensor: 1.5        # [m] Minimal point to sensor distance to consider a point as valid.
342
343
    #   min_azimuth: -45                   # [°] Minimal azimuth angle to consider the point as keypoint. Right thumb rule between min/max azimuth angles.
    #   max_azimuth: 45                    # [°] Maximal azimuth angle to consider the point as keypoint. Right thumb rule between min/max azimuth angles.
344
    #   min_beam_surface_angle: 10.        # [°] Minimal angle between the point surface and the laser beam to consider a point as valid.
345
346
347
    #   neighbor_width: 4                  # [>1] Width of the neighborhood used to compute discrete differential operators.
    #   plane_sin_angle_threshold: 0.5     # [0-1] Sharpness threshold to select a planar keypoint (selected if sin angle is less than threshold).
    #   edge_sin_angle_threshold: 0.86     # [0-1] Sharpness threshold to select an edge keypoint (selected if sin angle is more than threshold).
348
349
    #   edge_depth_gap_threshold: 1.5      # [m] Threshold upon depth gap in neighborhood to select an edge keypoint.
    #   edge_nb_gap_points: 10             # [points] Minimum number of successive missing points to consider a space gap.
350
    #   edge_intensity_gap_threshold: 200. # [0-255] Threshold upon intensity gap to select an edge keypoint.