How to get a clean map
Closed this issue · 2 comments
I'm using a Oak-D-Pro-W, with the depth_ai ROS2 drivers, along with their launch file and params file as below.
But, I'm getting a very chaotic map, which is not able to distinguish between free space and ground. If someone can point in the direction, what to troubleshoot or tweak.
`import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
def generate_launch_description():
parameters=[{'frame_id':'oak-d-base-frame',
'subscribe_rgbd':True,
'subscribe_odom_info':True,
'approx_sync':False,
'wait_imu_to_init':True}]
remappings=[('imu', '/imu/data')]
rtabmap_d_params = os.path.join(get_package_share_directory('sdros2_bringup'), 'config', 'rtabmap.yaml')
return LaunchDescription([
# Launch camera driver
IncludeLaunchDescription(
PythonLaunchDescriptionSource([os.path.join(
get_package_share_directory('depthai_examples'), 'launch'),
'/stereo_inertial_node.launch.py']),
launch_arguments={'depth_aligned': 'false',
'enableRviz': 'false',
'monoResolution': '400p'}.items(),
),
# Sync right/depth/camera_info together
Node(
package='rtabmap_sync', executable='rgbd_sync', output='screen',
parameters=parameters,
remappings=[('rgb/image', '/right/image_rect'),
('rgb/camera_info', '/right/camera_info'),
('depth/image', '/stereo/depth')]),
# Compute quaternion of the IMU
Node(
package='imu_filter_madgwick', executable='imu_filter_madgwick_node', output='screen',
parameters=[{'use_mag': False,
'world_frame':'enu',
'publish_tf':False}],
remappings=[('imu/data_raw', '/imu')]),
# Visual odometry
Node(
package='rtabmap_odom', executable='rgbd_odometry', output='screen',
parameters=parameters,
remappings=remappings),
# VSLAM
Node(
package='rtabmap_slam', executable='rtabmap', output='screen', name='rtabmap',
parameters=[rtabmap_d_params],
remappings=remappings,
arguments=['-d']),
# Visualization
Node(
package='rtabmap_viz', executable='rtabmap_viz', output='screen',
parameters=parameters,
remappings=remappings)
])
`
Params file
`
/rtabmap:
ros__parameters:
subscribe_depth: false
subscribe_rgbd: true
subscribe_stereo: false
subscribe_scan: false
subscribe_scan_cloud: false
subscribe_user_data: false
subscribe_odom_info: true
approx_sync: false
wait_imu_to_init: true
frame_id: oak-d-base-frame
map_frame_id: map
odom_frame_id: odom # odometry from odom msg to have covariance - Remapped by launch file
odom_tf_angular_variance: 0.03 # If TF is used to get odometry, this is the default angular variance
odom_tf_linear_variance: 0.04 # If TF is used to get odometry, this is the default linear variance
tf_delay: 0.02
publish_tf: true # Set to false if fusing different poses (map->odom) with UKF
odom_sensor_sync: true
wait_for_transform_duration: 0.2
approx_sync: true
queue_size: 10
scan_normal_k: 0
Optimizer:
Robust: false
Strategy: 2
g20:
Optimizer: 0
PixelVariance: 1
Solver: 0
Reg:
Force3DoF: true
Grid:
3D: false
FlatObstacleDetected: true
MapFrameProjection: false
GroundIsObstacle: false
PreVoxelFiltering: true
RayTracing: false
FromDepth: true
NormalsSegmentation: true
CellSize: 0.05
ClusterRadius: 0.1
MinClusterSize: 20
DepthDecimation: 1
DepthRoiRatios: [0.0, 0.0, 0.0, 0.0]
FootprintHeight: 0.5
FootprintLength: 0.40
FootprintWidth: 0.33
MaxGroundAngle: 30.0
# MinGroundHeight: -0.5
MinGroundHeight: 0.0
# MaxGroundHeight: -0.4
MaxGroundHeight: 0.0
# MaxObstacleHeight: 0.1
MaxObstacleHeight: 1.0
NoiseFilteringMinNeighbors: 5
NoiseFilteringRadius: 0.1
NormalK: 20
RangeMin: 0.3
# RangeMax: 10.0
# RangeMax: 5.0
RangeMax: 2.5
GridGlobal:
Eroded: false # Erode obstacle cells
FootprintRadius: 0.22 # Footprint radius (m) used to clear all obstacles under the graph
FullUpdate: true # When the graph is changed, the whole map will be reconstructed instead of moving individually each cells of the map. Also, data added to cache won't be released after updating the map. This process is longer but more robust to drift that would erase some parts of the map when it should not
MaxNodes: 0 # Maximum nodes assembled in the map starting from the last node (0=unlimited)
MinSize: 1.0 # Minimum map size (m)
OccupancyThr: 0.55 # Occupancy threshold (value between 0 and 1)
ProbClampingMax: 0.971 # Probability clamping maximum (value between 0 and 1)
ProbClampingMin: 0.1192 # Probability clamping minimum (value between 0 and 1)
ProbHit: 0.7 # Probability of a hit (value between 0.5 and 1)
ProbMiss: 0.4 # Probability of a miss (value between 0 and 0.5)
UpdateError: 0.01 # Graph changed detection error (m). Update map only if poses in new optimized graph have moved more than this value
Rtabmap:
DetectionRate: 10
# Mem:
# IncrementalMemory: false
# InitWMWithAllNodes: false
# NotLinkedNodesKept: false
# BinDataKept: false
`
Duplicate. Moved it here