3 from ament_index_python.packages
import get_package_share_directory
4 from launch
import LaunchDescription
5 from launch.substitutions
import LaunchConfiguration, PythonExpression
6 from launch.conditions
import IfCondition, UnlessCondition
7 from launch_ros.actions
import Node
8 from launch.actions
import DeclareLaunchArgument
12 ld = LaunchDescription()
13 sick_scan_pkg_prefix = get_package_share_directory(
'sick_scan_xd')
14 sick_launch_file_path = os.path.join(sick_scan_pkg_prefix,
'launch/sick_multiscan_rtabmap.launch')
15 sick_node_arguments=[sick_launch_file_path]
19 if len(arg.split(
":=")) == 2:
20 sick_node_arguments.append(arg)
23 package=
'sick_scan_xd',
24 executable=
'sick_generic_caller',
26 arguments=sick_node_arguments
30 wait_for_transform = 0.01
31 point_cloud_topic =
"/cloud_all_fields_fullframe"
32 point_cloud_frame_id =
"cloud"
33 imu_topic =
"/multiScan/imu"
37 point_cloud_topic_desk = f
"{point_cloud_topic}/deskewed"
38 deskewing_node = Node(
39 package=
'rtabmap_util', executable=
'lidar_deskewing', name=
"lidar_deskewing", output=
"screen",
41 "wait_for_transform": wait_for_transform,
42 "fixed_frame_id": point_cloud_frame_id,
45 remappings=[(
"input_cloud", point_cloud_topic)],
47 namespace=
"deskewing")
49 point_cloud_topic_desk = point_cloud_topic
53 rtabmap_odom_node = Node(
54 package=
'rtabmap_odom', executable=
'icp_odometry', name=
"icp_odometry", output=
"screen",
56 "frame_id": point_cloud_frame_id,
57 "odom_frame_id":
"odom",
58 "guess_frame_id": point_cloud_frame_id,
59 "wait_imu_to_init":
True,
60 "wait_for_transform_duration": str(wait_for_transform),
61 "Icp/PointToPlane":
"True",
62 "Icp/Iterations":
"10",
63 "Icp/VoxelSize":
"0.2",
64 "Icp/DownsamplingStep":
"1",
65 "Icp/Epsilon":
"0.001",
66 "Icp/PointToPlaneK":
"20",
67 "Icp/PointToPlaneRadius":
"0",
68 "Icp/MaxTranslation":
"2",
69 "Icp/MaxCorrespondenceDistance":
"1",
71 "Icp/PMOutlierRatio":
"0.1",
72 "Icp/CorrespondenceRatio":
"0.01",
73 "Icp/ReciprocalCorrespondences":
"False",
74 "Odom/ScanKeyFrameThr":
"0.8",
76 "OdomF2M/ScanSubtractRadius":
"0.2",
77 "OdomF2M/ScanMaxSize":
"15000",
79 remappings=[(
"scan_cloud", point_cloud_topic_desk), (
"imu", imu_topic)],
85 rtabmap_slam_node = Node(
86 package=
'rtabmap_slam', executable=
'rtabmap', name=
"rtabmap", output=
"screen",
88 "frame_id": point_cloud_frame_id,
89 "subscribe_depth":
False,
90 "subscribe_rgb":
False,
91 "subscribe_rgbd":
False,
92 "subscribe_scan":
False,
93 "subscribe_scan_cloud":
True,
95 "Rtabmap/DetectionRate":
"1",
96 "RGBD/NeighborLinkRefining":
"False",
97 "RGBD/ProximityBySpace":
"True",
98 "RGBD/ProximityMaxGraphDepth":
"0",
99 "RGBD/ProximityPathMaxNeighbors":
"1",
100 "RGBD/AngularUpdate":
"0.05",
101 "RGBD/LinearUpdate":
"0.05",
102 "Mem/NotLinkedNodesKept":
"False",
105 "Grid/CellSize":
"0.1",
106 "Grid/RangeMax":
"20",
107 "Grid/ClusterRadius":
"1",
108 "Grid/GroundIsObstacle":
"True",
109 "Optimizer/GravitySigma":
"0.3",
110 "Icp/VoxelSize":
"0.3",
111 "Icp/PointToPlaneK":
"20",
112 "Icp/PointToPlaneRadius":
"0",
113 "Icp/PointToPlane":
"False",
114 "Icp/Iterations":
"10",
115 "Icp/Epsilon":
"0.001",
116 "Icp/MaxTranslation":
"3",
117 "Icp/MaxCorrespondenceDistance":
"1",
119 "Icp/PMOutlierRatio":
"0.7",
120 "Icp/CorrespondenceRatio":
"0.4",
122 remappings=[(
"scan_cloud", point_cloud_topic_desk), (
"imu", imu_topic)],
127 rtabmap_viz_node = Node(
128 package=
'rtabmap_viz', executable=
'rtabmap_viz', name=
"rtabmap_viz", output=
"screen",
130 "frame_id": point_cloud_frame_id,
131 "odom_frame_id":
"odom",
132 "subscribe_odom_info":
False,
133 "subscribe_scan_cloud":
True,
134 "approx_sync":
False,
136 remappings=[(
"scan_cloud", point_cloud_topic_desk)],
140 ld.add_action(sick_node)
142 ld.add_action(deskewing_node)
143 ld.add_action(rtabmap_odom_node)
144 ld.add_action(rtabmap_slam_node)
145 ld.add_action(rtabmap_viz_node)