/**:
  icp_odometry:
    ros__parameters:
      wait_for_transform: 0.2
      expected_update_rate: 15.0
      wait_imu_to_init: true

      # Ros versions of Icp/... parameters
      scan_voxel_size: 0.1
      scan_range_min: 0.5
      scan_range_max: 40.0
      scan_normal_k: 20
      scan_normal_radius: 0.0
      scan_normal_ground_up: 0.9 # helps keeping normals up when moving on flat ground (only when scanner is horizontal)

      # silence warnings (migrated to ros parameters)
      Icp/VoxelSize: "0"
      Icp/PointToPlaneK: "0"

      Icp/Strategy: "1"
      Icp/Iterations: "10"
      Icp/Epsilon: "0.001"
      Icp/MaxTranslation: "1"
      Icp/MaxRotation: "1"
      Icp/MaxCorrespondenceDistance: "1" # Can be about 10 to 15 times the voxelsize
      Icp/OutlierRatio: "0.6" # Keep in 0.5 to 1.0
      Icp/CorrespondenceRatio: "0.01" # low like 0.01 favors bad odometry over no odometry at all
      Icp/PointToPlane: "true"
      Icp/CCFilterOutFarthestPoints: "true"

      Odom/ScanKeyFrameThr: "0.4"

      OdomF2M/ScanSubtractRadius: "0.1" # Can be about 10 to 15 times the voxelsize
      # OdomF2M/ScanSubtractAngle: "45"
      OdomF2M/ScanMaxSize: "30000" # 15000 or higher to have a bigger local scan map
      OdomF2M/BundleAdjustment: "false"

  rtabmap:
    ros__parameters:
      subscribe_depth: false
      subscribe_rgb: false
      subscribe_scan_cloud: true
      approx_sync: true # only false if odom and cloud are synchronized
      wait_for_transform: 0.2

      # odom either from TF or topic
      # topic: has covariances and twist, but best with synced topics
      # TF: correct transform, but no covariances
      odom_tf_linear_variance: 1e-2
      odom_tf_angular_variance: 1e-2

      # Silence warnings
      Grid/Sensor: "0"
      Kp/MaxFeatures: "-1"
      RGBD/ProximityPathMaxNeighbors: "1"

      Rtabmap/DetectionRate: "1" # 0 follows input topic rate

      RGBD/ProximityMaxGraphDepth: "0"
      RGBD/AngularUpdate: "0.05" # the movement needed to allow update?
      RGBD/LinearUpdate: "0.05" # the movement needed to allow update?
      RGBD/CreateOccupancyGrid: "false"
      # RGBD/ProximityAngle: "1"
      # RGBD/ProximityPathFilteringRadius: "10"
      # RGBD/ProximityOdomGuess: "true"

      Mem/NotLinkedNodesKept: "false"
      Mem/STMSize: "30"
      Mem/LaserScanNormalK: "20"

      Reg/Strategy: "1"

      Icp/VoxelSize: "0.05" # About 20 to 30cm indoor would work
      Icp/PointToPlaneK: "20"
      Icp/PointToPlaneRadius: "0"
      Icp/PointToPlane: "true"
      Icp/Iterations: "10"
      Icp/Epsilon: "0.001"
      Icp/MaxTranslation: "3"
      Icp/MaxRotation: "1.6"
      Icp/MinRange: "0.5"
      Icp/MaxRange: "40"
      Icp/MaxCorrespondenceDistance: "1" # Can be about 10 to 15 times the voxelsize
      Icp/Strategy: "1"
      Icp/OutlierRatio: "0.7"
      Icp/CorrespondenceRatio: "0.2" # high like 0.2 can avoid loop closures on very small overlaps

  rtabmap_viz:
    ros__parameters:
      subscribe_odom_info: false
      subscribe_scan_cloud: true
      approx_sync: true # only false if odom and cloud are synchronized
      wait_for_transform: 1.0
