# Example: # # Bringup turtlebot3: # $ export TURTLEBOT3_MODEL=waffle # $ export LDS_MODEL=LDS-01 # $ ros2 launch turtlebot3_bringup robot.launch.py # # SLAM: # $ ros2 launch rtabmap_demos turtlebot3_rgbd_scan.launch.py # # Navigation (install nav2_bringup package): # $ ros2 launch nav2_bringup navigation_launch.py # $ ros2 launch nav2_bringup rviz_launch.py # # Teleop: # $ ros2 run turtlebot3_teleop teleop_keyboard from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, SetEnvironmentVariable from launch.substitutions import LaunchConfiguration from launch.conditions import IfCondition, UnlessCondition from launch_ros.actions import Node def generate_launch_description(): use_sim_time = LaunchConfiguration('use_sim_time') localization = LaunchConfiguration('localization') parameters={ 'frame_id':'base_footprint', 'use_sim_time':use_sim_time, 'subscribe_rgbd':True, 'subscribe_scan':True, 'use_action_for_goal':True, # RTAB-Map's parameters should be strings: 'Reg/Strategy':'1', 'Reg/Force3DoF':'true', 'RGBD/NeighborLinkRefining':'True', 'Grid/RayTracing':'true', # Fill empty space 'Grid/3D':'false', # Use 2D occupancy 'Grid/RangeMax':'3', 'Grid/NormalsSegmentation':'false', # Use passthrough filter to detect obstacles 'Grid/Sensor':'2', # Use both laser scan and camera for obstacle detection in global map 'Grid/MaxGroundHeight':'0.05', # All points above 5 cm are obstacles 'Grid/MaxObstacleHeight':'0.4', # All points over 1 meter are ignored 'Grid/RangeMin':'0.2', # ignore laser scan points on the robot itself 'Optimizer/GravitySigma':'0' # Disable imu constraints (we are already in 2D) } remappings=[ ('rgb/image', '/camera/image_raw'), ('rgb/camera_info', '/camera/camera_info'), ('depth/image', '/camera/depth/image_raw')] return LaunchDescription([ # Launch arguments DeclareLaunchArgument( 'use_sim_time', default_value='false', description='Use simulation (Gazebo) clock if true'), DeclareLaunchArgument( 'localization', default_value='false', description='Launch in localization mode.'), # Nodes to launch Node( package='rtabmap_sync', executable='rgbd_sync', output='screen', parameters=[{'approx_sync':False, 'use_sim_time':use_sim_time}], remappings=remappings), # SLAM Mode: Node( condition=UnlessCondition(localization), package='rtabmap_slam', executable='rtabmap', output='screen', parameters=[parameters], remappings=remappings, arguments=['-d']), # Localization mode: Node( condition=IfCondition(localization), package='rtabmap_slam', executable='rtabmap', output='screen', parameters=[parameters, {'Mem/IncrementalMemory':'False', 'Mem/InitWMWithAllNodes':'True'}], remappings=remappings), Node( package='rtabmap_viz', executable='rtabmap_viz', output='screen', parameters=[parameters], remappings=remappings), # Obstacle detection with the camera for nav2 local costmap. # First, we need to convert depth image to a point cloud. # Second, we segment the floor from the obstacles. Node( package='rtabmap_util', executable='point_cloud_xyz', output='screen', parameters=[{'decimation': 2, 'max_depth': 3.0, 'voxel_size': 0.02}], remappings=[('depth/image', '/camera/depth/image_raw'), ('depth/camera_info', '/camera/camera_info'), ('cloud', '/camera/cloud')]), Node( package='rtabmap_util', executable='obstacles_detection', output='screen', parameters=[parameters], remappings=[('cloud', '/camera/cloud'), ('obstacles', '/camera/obstacles'), ('ground', '/camera/ground')]), ])