mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 16:57:46 +08:00
First version rtabmap_launch working
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<node pkg="camera1394stereo" type="camera1394stereo_node" name="camera1394stereo_node" output="screen" >
|
||||
<param name="video_mode" value="format7_mode3" />
|
||||
<param name="format7_color_coding" value="raw16" />
|
||||
<param name="bayer_pattern" value="bggr" />
|
||||
<param name="bayer_method" value="" />
|
||||
<param name="stereo_method" value="Interlaced" />
|
||||
<param name="camera_info_url_left" value="" />
|
||||
<param name="camera_info_url_right" value="" />
|
||||
</node>
|
||||
|
||||
<arg name="gen_depth" default="false"/>
|
||||
<arg name="pi/2" value="1.5707963267948966" />
|
||||
<arg name="optical_rotate" value="0 0 0 -$(arg pi/2) 0 -$(arg pi/2)" />
|
||||
<node pkg="tf" type="static_transform_publisher" name="camera_base_link"
|
||||
args="$(arg optical_rotate) base_link stereo_camera 100" />
|
||||
|
||||
<!-- Run the ROS package stereo_image_proc (throttle to 10 Hz to avoid rectifying all images) -->
|
||||
<group ns="/stereo_camera" >
|
||||
<node pkg="nodelet" type="nodelet" name="stereo_throttle" args="standalone rtabmap_ros/stereo_throttle">
|
||||
<remap from="left/image" to="left/image_raw"/>
|
||||
<remap from="right/image" to="right/image_raw"/>
|
||||
<remap from="left/camera_info" to="left/camera_info"/>
|
||||
<remap from="right/camera_info" to="right/camera_info"/>
|
||||
|
||||
<param name="queue_size" type="int" value="10"/>
|
||||
<param name="rate" type="double" value="10"/>
|
||||
</node>
|
||||
|
||||
<node pkg="stereo_image_proc" type="stereo_image_proc" name="stereo_image_proc">
|
||||
<remap from="left/image_raw" to="left/image_raw_throttle"/>
|
||||
<remap from="left/camera_info" to="left/camera_info_throttle"/>
|
||||
<remap from="right/image_raw" to="right/image_raw_throttle"/>
|
||||
<remap from="right/camera_info" to="right/camera_info_throttle"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg gen_depth)" pkg="nodelet" type="nodelet" name="disparity2depth" args="standalone rtabmap_ros/disparity_to_depth"/>
|
||||
</group>
|
||||
</launch>
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<!--
|
||||
Examples:
|
||||
F2M (default VO):
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch
|
||||
$ rosbag play -.-clock V1_01_easy.bag
|
||||
|
||||
For MH sequences, we should set MH_seq to true because the ground truth source is different.
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch MH_seq:=true
|
||||
$ rosbag play -.-clock MH_01_easy.bag
|
||||
|
||||
MSCKF (VIO):
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 8"
|
||||
$ rosbag play -.-clock V1_01_easy.bag
|
||||
|
||||
We need to ignore the first 24 seconds for correct VIO initialization (drone should not move).
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 8" MH_seq:=true
|
||||
$ rosbag play -.-clock -s 24 MH_01_easy.bag
|
||||
|
||||
OKVIS (VIO):
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 6 OdomOKVIS/ConfigPath ~/okvis/config/config_fpga_p2_euroc.yaml" MH_seq:=true raw_images_for_odom:=true
|
||||
$ rosbag play -.-clock MH_01_easy.bag
|
||||
|
||||
VINS (VIO):
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 9 OdomVINS/ConfigPath ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml" MH_seq:=true raw_images_for_odom:=true
|
||||
$ rosbag play -.-clock MH_01_easy.bag
|
||||
|
||||
VINS (VO):
|
||||
$ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 9 OdomVINS/ConfigPath ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml" MH_seq:=true raw_images_for_odom:=true
|
||||
$ rosbag play -.-clock MH_01_easy.bag
|
||||
-->
|
||||
|
||||
<param name="use_sim_time" value="true"/>
|
||||
|
||||
<arg name="feature_type" default="6"/>
|
||||
<arg name="gravity_opt" default="false"/> <!-- Rtabmap will use IMU data to add gravity constraints to graph -->
|
||||
|
||||
<arg name="args" default=""/>
|
||||
<arg if="$(arg gravity_opt)" name="common_args" default="-d --RGBD/CreateOccupancyGrid false --Odom/FeatureType $(arg feature_type) --Kp/DetectorStrategy $(arg feature_type) --Optimizer/GravitySigma 0.3 $(arg args)"/>
|
||||
<arg unless="$(arg gravity_opt)" name="common_args" default="-d --RGBD/CreateOccupancyGrid false --Odom/FeatureType $(arg feature_type) --Kp/DetectorStrategy $(arg feature_type) $(arg args) "/>
|
||||
|
||||
<arg name="cfg" default=""/>
|
||||
<arg name="MH_seq" default="false"/> <!-- For MH sequences, the ground truth is coming from a different topic -->
|
||||
<arg name="raw_images_for_odom" default="false"/>
|
||||
<arg name="record_ground_truth" default="false"/>
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="rviz" default="false"/>
|
||||
|
||||
<!-- Image rectification and publishing synchronized camera_info-->
|
||||
<group ns="stereo_camera">
|
||||
|
||||
<node pkg="rtabmap_ros" type="yaml_to_camera_info.py" name="yaml_to_camera_info_left">
|
||||
<param name="yaml_path" value="$(find rtabmap_ros)/launch/calibration/euroc_left.yaml"/>
|
||||
<remap from="image" to="/cam0/image_raw"/>
|
||||
<remap from="camera_info" to="left/camera_info"/>
|
||||
</node>
|
||||
<node pkg="rtabmap_ros" type="yaml_to_camera_info.py" name="yaml_to_camera_info_right">
|
||||
<param name="yaml_path" value="$(find rtabmap_ros)/launch/calibration/euroc_right.yaml"/>
|
||||
<param name="frame_id" value="cam1"/>
|
||||
<remap from="image" to="/cam1/image_raw"/>
|
||||
<remap from="camera_info" to="right/camera_info"/>
|
||||
</node>
|
||||
|
||||
<node unless="$(arg raw_images_for_odom)" pkg="stereo_image_proc" type="stereo_image_proc" name="stereo_image_proc">
|
||||
<remap from="left/image_raw" to="/cam0/image_raw"/>
|
||||
<remap from="right/image_raw" to="/cam1/image_raw"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
<!-- TF frames -->
|
||||
<node pkg="tf" type="static_transform_publisher" name="imu_base_link" args="0 0 0 3.1415926 -1.570796 0 base_link imu4 5"/>
|
||||
<node pkg="tf" type="static_transform_publisher" name="cam0_imu_link" args="-0.021640 -0.064677 0.009811 1.555925 0.025777 0.003757 imu4 cam0 50"/>
|
||||
<node pkg="tf" type="static_transform_publisher" name="cam1_imu_link" args="-0.019844 0.045369 0.007862 1.558237 0.025393 0.017907 imu4 cam1 50"/>
|
||||
|
||||
<!-- For MH sequences, /leica/position doesn't give the orientation, so minimal ground truth error could be as high as 12 cm -->
|
||||
<node if="$(arg MH_seq)" pkg="tf" type="static_transform_publisher" name="leica_base_link" args="0.120209 -0.0184772 -0.0748903 0 0 0 leica base_link_gt 100"/>
|
||||
<node unless="$(arg MH_seq)" pkg="tf" type="static_transform_publisher" name="vicon_base_link" args="0.12395 -0.02781 -0.06901 0 0 0 vicon/firefly_sbx/firefly_sbx base_link_gt 100"/>
|
||||
|
||||
<node if="$(arg MH_seq)" pkg="rtabmap_ros" type="point_to_tf.py" name="point_to_tf">
|
||||
<remap from="point" to="/leica/position"/>
|
||||
<param name="frame_id" value="leica"/>
|
||||
<param name="fixed_frame_id" value="world"/>
|
||||
</node>
|
||||
<node unless="$(arg MH_seq)" pkg="rtabmap_ros" type="transform_to_tf.py" name="transform_to_tf">
|
||||
<remap from="transform" to="/vicon/firefly_sbx/firefly_sbx"/>
|
||||
<param name="frame_id" value="world"/>
|
||||
<param name="child_frame_id" value="vicon/firefly_sbx/firefly_sbx"/>
|
||||
</node>
|
||||
<node pkg="tf" type="static_transform_publisher" name="world_to_map" args="0.0 0.0 0.0 0.0 0.0 0.0 /world /map 100" />
|
||||
|
||||
<node pkg="imu_complementary_filter" type="complementary_filter_node" name="imu_filter" output="screen">
|
||||
<remap from="imu/data_raw" to="/imu0"/>
|
||||
<param name="use_mag" value="false"/>
|
||||
<param name="world_frame" value="enu"/>
|
||||
<param name="publish_tf" value="false"/>
|
||||
</node>
|
||||
|
||||
<!-- RTAB-Map -->
|
||||
<include file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg if="$(arg raw_images_for_odom)" name="rtabmap_args" value="$(arg common_args) --Rtabmap/ImagesAlreadyRectified false"/>
|
||||
<arg unless="$(arg raw_images_for_odom)" name="rtabmap_args" value="$(arg common_args)"/>
|
||||
<arg if="$(arg raw_images_for_odom)" name="odom_args" value="--Rtabmap/ImagesAlreadyRectified false"/>
|
||||
<arg if="$(arg raw_images_for_odom)" name="left_image_topic" value="/cam0/image_raw"/>
|
||||
<arg if="$(arg raw_images_for_odom)" name="right_image_topic" value="/cam1/image_raw"/>
|
||||
<arg name="stereo" value="true"/>
|
||||
<arg name="frame_id" value="base_link"/>
|
||||
<arg name="wait_for_transform" value="0.1"/>
|
||||
<arg if="$(arg record_ground_truth)" name="ground_truth_frame_id" value="world"/>
|
||||
<arg if="$(arg record_ground_truth)" name="ground_truth_base_frame_id" value="base_link_gt"/>
|
||||
<arg name="cfg" value="$(arg cfg)"/>
|
||||
<arg name="imu_topic" value="/imu/data"/>
|
||||
<arg name="rtabmapviz" value="$(arg rtabmapviz)"/>
|
||||
<arg name="rviz" value="$(arg rviz)"/>
|
||||
<arg name="wait_imu_to_init" value="true"/>
|
||||
</include>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Example to run rgbd datasets:
|
||||
$ wget http://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_long_office_household.bag
|
||||
$ rosbag decompress rgbd_dataset_freiburg3_long_office_household.bag
|
||||
$ wget https://gist.githubusercontent.com/matlabbe/897b775c38836ed8069a1397485ab024/raw/6287ce3def8231945326efead0c8a7730bf6a3d5/tum_rename_world_kinect_frame.py
|
||||
$ python tum_rename_world_kinect_frame.py rgbd_dataset_freiburg3_long_office_household.bag
|
||||
|
||||
$ roslaunch rtabmap_ros rgbdslam_datasets.launch
|
||||
$ rosbag play -.-clock rgbd_dataset_freiburg3_long_office_household.bag
|
||||
-->
|
||||
|
||||
<param name="use_sim_time" type="bool" value="True"/>
|
||||
|
||||
<!-- Choose visualization -->
|
||||
<arg name="rviz" default="true" />
|
||||
<arg name="rtabmapviz" default="false" />
|
||||
|
||||
<!-- TF FRAMES -->
|
||||
<node pkg="tf" type="static_transform_publisher" name="world_to_map"
|
||||
args="0.0 0.0 0.0 0.0 0.0 0.0 /world /map 100" />
|
||||
|
||||
|
||||
<group ns="rtabmap">
|
||||
|
||||
<!-- Odometry -->
|
||||
<node pkg="rtabmap_ros" type="rgbd_odometry" name="rgbd_odometry" output="screen">
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
|
||||
<param name="Odom/Strategy" type="string" value="0"/> <!-- 0=Frame-to-Map, 1=Frame-to-KeyFrame -->
|
||||
<param name="Odom/ResetCountdown" type="string" value="15"/>
|
||||
<param name="Odom/GuessSmoothingDelay" type="string" value="0"/>
|
||||
|
||||
<param name="frame_id" type="string" value="kinect"/>
|
||||
<param name="queue_size" type="int" value="10"/>
|
||||
<param name="wait_for_transform" type="bool" value="true"/>
|
||||
<param name="ground_truth_frame_id" type="string" value="world"/>
|
||||
<param name="ground_truth_base_frame_id" type="string" value="kinect_gt"/>
|
||||
</node>
|
||||
|
||||
<!-- Visual SLAM -->
|
||||
<!-- args: "delete_db_on_start" and "udebug" -->
|
||||
<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start">
|
||||
<param name="subscribe_depth" type="bool" value="true"/>
|
||||
|
||||
<param name="Rtabmap/StartNewMapOnLoopClosure" type="string" value="true"/>
|
||||
<param name="RGBD/CreateOccupancyGrid" type="string" value="false"/>
|
||||
<param name="Rtabmap/CreateIntermediateNodes" type="string" value="true"/>
|
||||
<param name="RGBD/LinearUpdate" type="string" value="0"/>
|
||||
<param name="RGBD/AngularUpdate" type="string" value="0"/>
|
||||
|
||||
<param name="frame_id" type="string" value="kinect"/>
|
||||
<param name="ground_truth_frame_id" type="string" value="world"/>
|
||||
<param name="ground_truth_base_frame_id" type="string" value="kinect_gt"/>
|
||||
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
|
||||
<param name="queue_size" type="int" value="10"/>
|
||||
</node>
|
||||
|
||||
<!-- Visualisation -->
|
||||
<node if="$(arg rtabmapviz)" pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" args="-d $(find rtabmap_ros)/launch/config/rgbd_gui.ini" output="screen">
|
||||
<param name="subscribe_depth" type="bool" value="true"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="queue_size" type="int" value="30"/>
|
||||
|
||||
<param name="frame_id" type="string" value="kinect"/>
|
||||
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
<node if="$(arg rviz)" pkg="rviz" type="rviz" name="rviz" args="-d $(find rtabmap_ros)/launch/config/rgbdslam_datasets.rviz"/>
|
||||
<node if="$(arg rviz)" pkg="nodelet" type="nodelet" name="points_xyzrgb" args="standalone rtabmap_ros/point_cloud_xyzrgb">
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
<remap from="cloud" to="voxel_cloud" />
|
||||
|
||||
<param name="queue_size" type="int" value="10"/>
|
||||
<param name="decimation" type="double" value="4"/>
|
||||
</node>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,146 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<!-- This launch assumes that you have already
|
||||
started you preferred RGB-D sensor and your IMU.
|
||||
TF between frame_id and the sensors should already be set too. -->
|
||||
|
||||
<arg name="frame_id" default="base_link" />
|
||||
<arg name="rgb_topic" default="/camera/rgb/image_rect_color" />
|
||||
<arg name="depth_topic" default="/camera/depth_registered/image_raw" />
|
||||
<arg name="camera_info_topic" default="/camera/rgb/camera_info" />
|
||||
<arg name="imu_topic" default="/imu/data" />
|
||||
<arg name="imu_ignore_acc" default="true" />
|
||||
<arg name="imu_remove_gravitational_acceleration" default="true" />
|
||||
|
||||
<!-- Localization-only mode -->
|
||||
<arg name="localization" default="false"/>
|
||||
<arg if="$(arg localization)" name="rtabmap_args" default=""/>
|
||||
<arg unless="$(arg localization)" name="rtabmap_args" default="--delete_db_on_start"/>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<!-- Visual Odometry -->
|
||||
<node pkg="rtabmap_ros" type="rgbd_odometry" name="visual_odometry" output="screen" args="$(arg rtabmap_args)">
|
||||
<remap from="rgb/image" to="$(arg rgb_topic)"/>
|
||||
<remap from="depth/image" to="$(arg depth_topic)"/>
|
||||
<remap from="rgb/camera_info" to="$(arg camera_info_topic)"/>
|
||||
<remap from="odom" to="/vo"/>
|
||||
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="publish_tf" type="bool" value="false"/>
|
||||
<param name="publish_null_when_lost" type="bool" value="true"/>
|
||||
<param name="guess_from_tf" type="bool" value="true"/>
|
||||
|
||||
<param name="Odom/FillInfoData" type="string" value="true"/>
|
||||
<param name="Odom/ResetCountdown" type="string" value="1"/>
|
||||
<param name="Vis/FeatureType" type="string" value="6"/>
|
||||
<param name="OdomF2M/MaxSize" type="string" value="1000"/>
|
||||
</node>
|
||||
|
||||
<!-- SLAM -->
|
||||
<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="$(arg rtabmap_args)">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
|
||||
<remap from="rgb/image" to="$(arg rgb_topic)"/>
|
||||
<remap from="depth/image" to="$(arg depth_topic)"/>
|
||||
<remap from="rgb/camera_info" to="$(arg camera_info_topic)"/>
|
||||
<remap from="odom" to="/odometry/filtered"/>
|
||||
|
||||
<param name="Kp/DetectorStrategy" type="string" value="6"/> <!-- use same features as odom -->
|
||||
|
||||
<!-- localization mode -->
|
||||
<param name="Mem/InitWMWithAllNodes" type="string" value="$(arg localization)"/>
|
||||
<param if="$(arg localization)" name="Mem/IncrementalMemory" type="string" value="false"/>
|
||||
<param unless="$(arg localization)" name="Mem/IncrementalMemory" type="string" value="true"/>
|
||||
|
||||
</node>
|
||||
</group>
|
||||
|
||||
<!-- Odometry fusion (EKF), refer to demo launch file in robot_localization for more info -->
|
||||
<node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization" clear_params="true" output="screen">
|
||||
|
||||
<param name="frequency" value="50"/>
|
||||
<param name="sensor_timeout" value="0.1"/>
|
||||
<param name="two_d_mode" value="false"/>
|
||||
|
||||
<param name="odom_frame" value="odom"/>
|
||||
<param name="base_link_frame" value="$(arg frame_id)"/>
|
||||
<param name="world_frame" value="odom"/>
|
||||
|
||||
<param name="transform_time_offset" value="0.0"/>
|
||||
|
||||
<param name="odom0" value="/vo"/>
|
||||
<param name="imu0" value="$(arg imu_topic)"/>
|
||||
|
||||
<!-- The order of the values is x, y, z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. -->
|
||||
<rosparam param="odom0_config">[true, true, true,
|
||||
false, false, false,
|
||||
true, true, true,
|
||||
false, false, false,
|
||||
false, false, false]</rosparam>
|
||||
|
||||
<rosparam if="$(arg imu_ignore_acc)" param="imu0_config">[
|
||||
false, false, false,
|
||||
true, true, true,
|
||||
false, false, false,
|
||||
true, true, true,
|
||||
false, false, false] </rosparam>
|
||||
<rosparam unless="$(arg imu_ignore_acc)" param="imu0_config">[
|
||||
false, false, false,
|
||||
true, true, true,
|
||||
false, false, false,
|
||||
true, true, true,
|
||||
true, true, true] </rosparam>
|
||||
|
||||
<param name="odom0_differential" value="false"/>
|
||||
<param name="imu0_differential" value="false"/>
|
||||
|
||||
<param name="odom0_relative" value="true"/>
|
||||
<param name="imu0_relative" value="true"/>
|
||||
|
||||
<param name="imu0_remove_gravitational_acceleration" value="$(arg imu_remove_gravitational_acceleration)"/>
|
||||
|
||||
<param name="print_diagnostics" value="true"/>
|
||||
|
||||
<!-- ======== ADVANCED PARAMETERS ======== -->
|
||||
<param name="odom0_queue_size" value="5"/>
|
||||
<param name="imu0_queue_size" value="50"/>
|
||||
|
||||
<!-- The values are ordered as x, y, z, roll, pitch, yaw, vx, vy, vz,
|
||||
vroll, vpitch, vyaw, ax, ay, az. -->
|
||||
<rosparam param="process_noise_covariance">[0.005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0.005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0.003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0.003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0.0025, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0.0025, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.002, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0015]</rosparam>
|
||||
|
||||
<!-- The values are ordered as x, y,
|
||||
z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. -->
|
||||
<rosparam param="initial_estimate_covariance">[1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9]</rosparam>
|
||||
|
||||
</node>
|
||||
</launch>
|
||||
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<arg name="localization" default="false"/>
|
||||
<arg name="uid"/>
|
||||
|
||||
<!-- Kinect: -->
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch">
|
||||
<arg name="depth_registration" value="true" />
|
||||
<arg name="publish_tf" value="false" />
|
||||
</include>
|
||||
|
||||
<!-- IMU Sensor: -->
|
||||
<node pkg="imu_brick" type="imu_brick_node" name="imu_brick">
|
||||
<param name="frame_id" value="imu_link"/>
|
||||
<param name="period_ms" value="10"/>
|
||||
<param name="uid" type="string" value="$(arg uid)"/>
|
||||
<param name="cov_orientation" type="double" value="0.0005"/>
|
||||
<param name="cov_velocity" type="double" value="0.00025"/>
|
||||
<param name="cov_acceleration" type="double" value="0.1"/>
|
||||
<param name="remove_gravitational_acceleration" type="bool" value="true"/>
|
||||
</node>
|
||||
|
||||
<!-- IMU frame: just over the RGB camera -->
|
||||
<node pkg="tf" type="static_transform_publisher" name="rgb_to_imu_tf"
|
||||
args="-0.032 0.0 0.032 0.0 0.0 0.0 /camera_rgb_frame /imu_link 100" />
|
||||
|
||||
<arg name="pi/2" value="1.5707963267948966" />
|
||||
<arg name="optical_rotate" value="0 0 0 -$(arg pi/2) 0 -$(arg pi/2)" />
|
||||
<node pkg="tf" type="static_transform_publisher" name="optical_rotation"
|
||||
args="$(arg optical_rotate) /camera_rgb_frame /camera_rgb_optical_frame 100" />
|
||||
|
||||
<include file="$(find rtabmap_ros)/launch/tests/sensor_fusion.launch">
|
||||
<arg name="frame_id" value="camera_rgb_frame"/>
|
||||
<arg name="localization" value="$(arg localization)"/>
|
||||
<arg name="imu_remove_gravitational_acceleration" value="false"/>
|
||||
</include>
|
||||
|
||||
</launch>
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 323 B |
@@ -0,0 +1,14 @@
|
||||
# AprilTags 2 code parameters
|
||||
# Find descriptions in apriltags2/include/apriltag.h:struct apriltag_detector
|
||||
# apriltags2/include/apriltag.h:struct apriltag_family
|
||||
tag_family: 'tag36h11' # options: tag36h11, tag36h10, tag25h9, tag25h7, tag16h5
|
||||
tag_border: 1 # default: 1
|
||||
tag_threads: 2 # default: 2
|
||||
tag_decimate: 1.0 # default: 1.0
|
||||
tag_blur: 0.0 # default: 0.0
|
||||
tag_refine_edges: 1 # default: 1
|
||||
tag_refine_decode: 0 # default: 0
|
||||
tag_refine_pose: 0 # default: 0
|
||||
tag_debug: 0 # default: 0
|
||||
# Other parameters
|
||||
publish_tf: true # default: false
|
||||
@@ -0,0 +1,59 @@
|
||||
# # Definitions of tags to detect
|
||||
#
|
||||
# ## General remarks
|
||||
#
|
||||
# - All length in meters
|
||||
# - Ellipsis (...) signifies that the previous element can be repeated multiple times.
|
||||
#
|
||||
# ## Standalone tag definitions
|
||||
# ### Remarks
|
||||
#
|
||||
# - name is optional
|
||||
#
|
||||
# ### Syntax
|
||||
#
|
||||
# standalone_tags:
|
||||
# [
|
||||
# {id: ID, size: SIZE, name: NAME},
|
||||
# ...
|
||||
# ]
|
||||
standalone_tags:
|
||||
[
|
||||
]
|
||||
# ## Tag bundle definitions
|
||||
# ### Remarks
|
||||
#
|
||||
# - name is optional
|
||||
# - x, y, z have default values of 0 thus they are optional
|
||||
# - qw has default value of 1 and qx, qy, qz have default values of 0 thus they are optional
|
||||
#
|
||||
# ### Syntax
|
||||
#
|
||||
# tag_bundles:
|
||||
# [
|
||||
# {
|
||||
# name: 'CUSTOM_BUNDLE_NAME',
|
||||
# layout:
|
||||
# [
|
||||
# {id: ID, size: SIZE, x: X_POS, y: Y_POS, z: Z_POS, qw: QUAT_W_VAL, qx: QUAT_X_VAL, qy: QUAT_Y_VAL, qz: QUAT_Z_VAL},
|
||||
# ...
|
||||
# ]
|
||||
# },
|
||||
# ...
|
||||
# ]
|
||||
tag_bundles:
|
||||
[
|
||||
{
|
||||
name: 'tag_bundle1',
|
||||
layout:
|
||||
[
|
||||
# for a pixel = ~8mm
|
||||
{id: 1, size: 0.0620, x: 0.0000, y: 0.0000, z: 0, qw: 1, qx: 0, qy: 0, qz: 0},
|
||||
{id: 2, size: 0.0620, x: 0.0770, y: 0.0000, z: 0, qw: 1, qx: 0, qy: 0, qz: 0},
|
||||
{id: 25, size: 0.0620, x: 0.0000, y: -0.0770, z: 0, qw: 1, qx: 0, qy: 0, qz: 0},
|
||||
{id: 26, size: 0.0620, x: 0.0770, y: -0.0770, z: 0, qw: 1, qx: 0, qy: 0, qz: 0},
|
||||
{id: 49, size: 0.0620, x: 0.0000, y: -0.1540, z: 0, qw: 1, qx: 0, qy: 0, qz: 0},
|
||||
{id: 50, size: 0.0620, x: 0.0770, y: -0.1540, z: 0, qw: 1, qx: 0, qy: 0, qz: 0}
|
||||
]
|
||||
},
|
||||
]
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
<!-- Print on the file tag_bundle1.png (with GIMP: set size in Image Settings to 160x240mm) -->
|
||||
<!-- Definition of the tag bundle is tags.yaml, make sure the camera is calibrated or adjust the size of the tag if needed -->
|
||||
<!-- The TF published by apriltag_ros should match the point cloud created by the camera -->
|
||||
<!-- Change Optimizer/Strategy below between 1 (g2o) and 2 (GTSAM), and landmark_angular_variance between 0.005 (optimize rotation) and 9999 (optimize only tag's XYZ) -->
|
||||
|
||||
<!-- $ roslaunch realsense2_camera rs_camera.launch align_depth:=true -->
|
||||
<!-- $ roslaunch rtabmap_ros test_apriltag_ros.launch rgb_topic:=/camera/color/image_raw camera_info_topic:=/camera/color/camera_info -->
|
||||
<!-- $ roslaunch rtabmap_ros rtabmap.launch depth_topic:=/camera/aligned_depth_to_color/image_raw rgb_topic:=/camera/color/image_raw camera_info_topic:=/camera/color/camera_info rviz:=true rtabmapviz:=false args:="-d -Optimizer/Strategy 1" landmark_angular_variance:=9999 -->
|
||||
|
||||
<arg name="camera_frame_id" default="camera_color_optical_frame"/>
|
||||
<arg name="rgb_topic" default="/camera/rgb/image_rect_color" />
|
||||
<arg name="camera_info_topic" default="/camera/rgb/camera_info" />
|
||||
|
||||
<!-- Set parameters -->
|
||||
<rosparam command="load" file="$(find rtabmap_ros)/launch/tests/tag_settings.yaml" ns="apriltag_ros_continuous_node" />
|
||||
<rosparam command="load" file="$(find rtabmap_ros)/launch/tests/tags.yaml" ns="apriltag_ros_continuous_node" />
|
||||
|
||||
<node pkg="apriltag_ros" type="apriltag_ros_continuous_node" name="apriltag_ros_continuous_node" clear_params="true" output="screen">
|
||||
<remap from="image_rect" to="$(arg rgb_topic)" />
|
||||
<remap from="camera_info" to="$(arg camera_info_topic)" />
|
||||
|
||||
<param name="camera_frame" type="str" value="$(arg camera_frame_id)" />
|
||||
<param name="publish_tag_detections_image" type="bool" value="true" /> <!-- default: false -->
|
||||
</node>
|
||||
</launch>
|
||||
@@ -0,0 +1,75 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<!-- Example usage of RTAB-Map with VINS-Fusion support for realsense D435i.
|
||||
Make sure to disable the IR emitter or put a tape on the IR emitter to
|
||||
avoid VINS tracking the fixed IR points (that would cause large drifts) -->
|
||||
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="rviz" default="false"/>
|
||||
<arg name="depth_mode" default="true"/>
|
||||
<arg name="odom_strategy" default="9"/> <!-- default VINS -->
|
||||
<arg name="unite_imu_method" default="copy"/> <!-- "copy" or "linear_interpolation" -->
|
||||
|
||||
<include file="$(find realsense2_camera)/launch/rs_camera.launch">
|
||||
<arg name="align_depth" value="$(arg depth_mode)"/>
|
||||
<arg name="unite_imu_method" value="$(arg unite_imu_method)"/>
|
||||
<arg name="enable_gyro" value="true"/>
|
||||
<arg name="enable_accel" value="true"/>
|
||||
<arg name="enable_infra1" value="true"/>
|
||||
<arg name="enable_infra2" value="true"/>
|
||||
<arg name="gyro_fps" value="200"/>
|
||||
<arg name="accel_fps" value="250"/>
|
||||
<arg name="enable_sync" value="true"/>
|
||||
</include>
|
||||
|
||||
<node pkg="imu_filter_madgwick" type="imu_filter_node" name="imu_filter_node">
|
||||
<param name="use_mag" value="false"/>
|
||||
<param name="publish_tf" value="false"/>
|
||||
<param name="world_frame" value="enu"/>
|
||||
<remap from="/imu/data_raw" to="/camera/imu"/>
|
||||
<remap from="/imu/data" to="/rtabmap/imu"/>
|
||||
</node>
|
||||
|
||||
<!-- RTAB-Map: depth mode -->
|
||||
<!-- We have to launch stereo_odometry externally from rtabmap.launch so that rtabmap can use RGB-D input -->
|
||||
<group ns="rtabmap">
|
||||
<node if="$(arg depth_mode)" pkg="rtabmap_ros" type="stereo_odometry" name="stereo_odometry" args="--Optimizer/GravitySigma 0.3 --Odom/Strategy $(arg odom_strategy) --OdomVINS/ConfigPath $(find vins)/../config/realsense_d435i/realsense_stereo_imu_config.yaml" output="screen">
|
||||
<remap from="left/image_rect" to="/camera/infra1/image_rect_raw"/>
|
||||
<remap from="right/image_rect" to="/camera/infra2/image_rect_raw"/>
|
||||
<remap from="left/camera_info" to="/camera/infra1/camera_info"/>
|
||||
<remap from="right/camera_info" to="/camera/infra2/camera_info"/>
|
||||
<remap from="imu" to="/rtabmap/imu"/>
|
||||
<param name="frame_id" value="camera_link"/>
|
||||
<param name="wait_imu_to_init" value="true"/>
|
||||
</node>
|
||||
</group>
|
||||
<include if="$(arg depth_mode)" file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg name="rtabmap_args" value="--delete_db_on_start --Optimizer/GravitySigma 0.3"/>
|
||||
<arg name="rgb_topic" value="/camera/color/image_raw"/>
|
||||
<arg name="depth_topic" value="/camera/aligned_depth_to_color/image_raw"/>
|
||||
<arg name="camera_info_topic" value="/camera/color/camera_info"/>
|
||||
<arg name="visual_odometry" value="false"/>
|
||||
<arg name="approx_sync" value="false"/>
|
||||
<arg name="frame_id" value="camera_link"/>
|
||||
<arg name="imu_topic" value="/rtabmap/imu"/>
|
||||
<arg name="rtabmapviz" value="$(arg rtabmapviz)"/>
|
||||
<arg name="rviz" value="$(arg rviz)"/>
|
||||
</include>
|
||||
|
||||
<!-- RTAB-Map: Stereo mode -->
|
||||
<include unless="$(arg depth_mode)" file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg name="rtabmap_args" value="--delete_db_on_start --Optimizer/GravitySigma 0.3 --Odom/Strategy $(arg odom_strategy) --OdomVINS/ConfigPath $(find vins)/../config/realsense_d435i/realsense_stereo_imu_config.yaml"/>
|
||||
<arg name="left_image_topic" value="/camera/infra1/image_rect_raw"/>
|
||||
<arg name="right_image_topic" value="/camera/infra2/image_rect_raw"/>
|
||||
<arg name="left_camera_info_topic" value="/camera/infra1/camera_info"/>
|
||||
<arg name="right_camera_info_topic" value="/camera/infra2/camera_info"/>
|
||||
<arg name="stereo" value="true"/>
|
||||
<arg name="frame_id" value="camera_link"/>
|
||||
<arg name="imu_topic" value="/rtabmap/imu"/>
|
||||
<arg name="wait_imu_to_init" value="true"/>
|
||||
<arg name="rtabmapviz" value="$(arg rtabmapviz)"/>
|
||||
<arg name="rviz" value="$(arg rviz)"/>
|
||||
</include>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,99 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- We test here ICP odometry using a guess from visual odometry -->
|
||||
|
||||
<arg name="rgbd" default="false"/>
|
||||
<arg name="pm" default="false"/>
|
||||
<arg name="nodelet" default="false"/>
|
||||
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch" >
|
||||
<arg name="depth_registration" value="true"/>
|
||||
<arg name="data_skip" value="3"/>
|
||||
</include>
|
||||
|
||||
<group ns="camera">
|
||||
<node pkg="nodelet" type="nodelet" name="points_xyz" args="load rtabmap_ros/point_cloud_xyz camera_nodelet_manager">
|
||||
<remap from="depth/image" to="depth_registered/image_raw"/>
|
||||
<remap from="depth/camera_info" to="depth_registered/camera_info"/>
|
||||
<remap from="cloud" to="/voxel_cloud" />
|
||||
|
||||
<param name="voxel_size" type="double" value="0.05"/>
|
||||
<param name="decimation" type="int" value="8"/>
|
||||
|
||||
<param name="Odom/AlignWithGround" type="string" value="true"/>
|
||||
</node>
|
||||
|
||||
<group if="$(arg nodelet)">
|
||||
<node if="$(arg rgbd)" pkg="nodelet" type="nodelet" name="rgbdicp_odometry" args="load rtabmap_ros/rgbdicp_odometry camera_nodelet_manager">
|
||||
<remap from="scan_cloud" to="/voxel_cloud"/>
|
||||
<remap from="depth/image" to="depth_registered/image_raw"/>
|
||||
<remap from="rgb/camera_info" to="rgb/camera_info"/>
|
||||
<remap from="rgb/image" to="rgb/image_rect_mono"/>
|
||||
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
<param name="scan_normal_k" type="int" value="10"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param name="Icp/PM" type="string" value="$(arg pm)"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.65"/>
|
||||
</node>
|
||||
<node unless="$(arg rgbd)" pkg="nodelet" type="nodelet" name="icp_odometry" args="load rtabmap_ros/icp_odometry camera_nodelet_manager" output="screen">
|
||||
<remap from="scan_cloud" to="/voxel_cloud"/>
|
||||
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
<param name="scan_normal_k" type="int" value="10"/>
|
||||
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param name="Icp/PM" type="string" value="$(arg pm)"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.65"/>
|
||||
<param name="Odom/GuessMotion" type="string" value="true"/>
|
||||
<param name="Odom/ResetCountdown" type="string" value="1"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
<group unless="$(arg nodelet)">
|
||||
<node if="$(arg rgbd)" pkg="rtabmap_ros" type="rgbdicp_odometry" name="rgbdicp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="/voxel_cloud"/>
|
||||
<remap from="depth/image" to="depth_registered/image_raw"/>
|
||||
<remap from="rgb/camera_info" to="rgb/camera_info"/>
|
||||
<remap from="rgb/image" to="rgb/image_rect_mono"/>
|
||||
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
<param name="scan_normal_k" type="int" value="10"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param name="Icp/PM" type="string" value="$(arg pm)"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.65"/>
|
||||
</node>
|
||||
<node unless="$(arg rgbd)" pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="/voxel_cloud"/>
|
||||
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
<param name="scan_normal_k" type="int" value="10"/>
|
||||
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param name="Icp/PM" type="string" value="$(arg pm)"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.65"/>
|
||||
<param name="Odom/GuessMotion" type="string" value="true"/>
|
||||
<param name="Odom/ResetCountdown" type="string" value="1"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</group>
|
||||
|
||||
<!-- We just use odometry without rtabmap node, so set a static /map->/odom
|
||||
transform so that rviz config below works out-of-the-box -->
|
||||
<node pkg="tf" type="static_transform_publisher" name="map_odom"
|
||||
args="0 0 0 0 0 0 map odom 100" />
|
||||
|
||||
<!-- Visualization RVIZ -->
|
||||
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find rtabmap_ros)/launch/config/rgbd.rviz"/>
|
||||
</launch>
|
||||
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
|
||||
<include file="$(find azure_kinect_ros_driver)/launch/driver.launch">
|
||||
<arg name="point_cloud" value="false"/>
|
||||
<arg name="rgb_point_cloud" value="false"/>
|
||||
<arg name="fps" value="15"/>
|
||||
</include>
|
||||
|
||||
<group ns="rtabmap">
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="points_xyz" args="standalone rtabmap_ros/point_cloud_xyz" output="screen">
|
||||
<remap from="depth/image" to="/depth_to_rgb/image_raw"/>
|
||||
<remap from="depth/camera_info" to="/depth_to_rgb/camera_info"/>
|
||||
<remap from="cloud" to="voxel_cloud" />
|
||||
|
||||
<param name="decimation" type="double" value="4"/>
|
||||
<param name="voxel_size" type="double" value="0.05"/>
|
||||
<param name="max_depth" type="double" value="5"/>
|
||||
<param name="normal_k" type="int" value="10"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="voxel_cloud"/>
|
||||
<param name="frame_id" type="string" value="camera_base"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
|
||||
<!-- Odom parameters -->
|
||||
<param name="OdomF2M/ScanSubtractRadius" type="string" value="0.05"/>
|
||||
<param name="OdomF2M/ScanMaxSize" type="string" value="5000"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" output="screen" args="-d">
|
||||
<param name="frame_id" type="string" value="camera_base"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgb" type="bool" value="false"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
|
||||
<remap from="scan_cloud" to="voxel_cloud"/>
|
||||
|
||||
<param name="RGBD/ProximityPathMaxNeighbors" type="string" value="0"/>
|
||||
<param name="RGBD/ProximityOdomGuess" type="string" value="true"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="0.5"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg rtabmapviz)" name="rtabmapviz" pkg="rtabmap_ros" type="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="camera_base"/>
|
||||
<param name="subscribe_rgb" type="bool" value="false"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="scan_cloud" to="voxel_cloud"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<!-- Build laser_assembler package from source to have periodic_snapshotter node -->
|
||||
<!-- Also use assemble_scans2 service in periodic_snapshotter, publish PointCloud2 and set duration to 1 second -->
|
||||
|
||||
<!-- Arguments -->
|
||||
<arg name="rtabmap_args" default="--delete_db_on_start --Rtabmap/DetectionRate 0 --RGBD/ProximityBySpace false --RGBD/LinearUpdate 0 --RGBD/AngularUpdate 0 --RGBD/ProximityPathMaxNeighbors 0"/>
|
||||
<arg name="rgb_topic" default="/camera/rgb/image_rect_color" />
|
||||
<arg name="depth_topic" default="/camera/depth_registered/image_raw" />
|
||||
<arg name="camera_info_topic" default="/camera/rgb/camera_info" />
|
||||
<arg name="rtabmapviz" default="true" />
|
||||
<arg name="rviz" default="false" />
|
||||
|
||||
<!-- Kinect -->
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch" >
|
||||
<arg name="depth_registration" value="true"/>
|
||||
<arg name="data_skip" value="3"/>
|
||||
</include>
|
||||
|
||||
<!-- Laser scan from Depth image -->
|
||||
<node type="depthimage_to_laserscan" pkg="depthimage_to_laserscan" name="depthimage_to_laserscan">
|
||||
<remap from="image" to="$(arg depth_topic)"/>
|
||||
<remap from="camera_info" to="$(arg camera_info_topic)"/>
|
||||
</node>
|
||||
|
||||
<!-- Laser assembler (convert to PointCloud2) -->
|
||||
<node type="laser_scan_assembler" pkg="laser_assembler" name="laser_assembler">
|
||||
<remap from="scan" to="scan"/>
|
||||
<param name="max_scans" type="int" value="400" />
|
||||
<param name="fixed_frame" type="string" value="odom" />
|
||||
</node>
|
||||
<node type="periodic_snapshotter" pkg="laser_assembler" name="periodic_snapshotter"/>
|
||||
|
||||
<!-- RTAB-Map -->
|
||||
<include file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg name="rtabmap_args" value="$(arg rtabmap_args)"/>
|
||||
|
||||
<arg name="queue_size" value="30" />
|
||||
<arg name="rgb_topic" value="$(arg rgb_topic)" />
|
||||
<arg name="depth_topic" value="$(arg depth_topic)" />
|
||||
<arg name="camera_info_topic" value="$(arg camera_info_topic)" />
|
||||
|
||||
<arg name="subscribe_scan_cloud" value="true"/>
|
||||
<arg name="scan_cloud_topic" value="/assembled_cloud2"/>
|
||||
|
||||
<arg name="rtabmapviz" value="$(arg rtabmapviz)"/>
|
||||
<arg name="rviz" value="$(arg rviz)"/>
|
||||
</include>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
<!-- Example to assemble 3D point clouds from depth when rtabmap is using scan for 2d occupancy grid :
|
||||
$ roslaunch rtabmap_ros demo_robot_mapping.launch rviz:=true rtabmapviz:=false
|
||||
$ roslaunch rtabmap_ros test_map_assembler.launch
|
||||
$ rosbag play -clock demo_mapping.bag
|
||||
-->
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="map_assembler" name="map_assembler">
|
||||
<remap from="mapData" to="mapData"/>
|
||||
<param name="regenerate_local_grids" value="true"/>
|
||||
</node>
|
||||
</group>
|
||||
</launch>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
<include file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg name="rtabmap_args" value="
|
||||
--delete_db_on_start
|
||||
--RGBD/OptimizeMaxError 0
|
||||
--Optimizer/Iterations 0
|
||||
--RGBD/ProximityBySpace false"/>
|
||||
<arg name="rtabmapviz" value="false"/>
|
||||
</include>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="map_optimizer" name="map_optimizer"/>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" output="screen">
|
||||
<remap from="mapData" to="mapData_optimized"/>
|
||||
<param name="frame_id" value="camera_link"/>
|
||||
<param name="subscribe_depth" value="false"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="map_assembler" name="map_assembler">
|
||||
<remap from="mapData" to="mapData_optimized"/>
|
||||
</node>
|
||||
</group>
|
||||
</launch>
|
||||
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0"?>
|
||||
<launch>
|
||||
|
||||
<!-- Use stereo_outdoorA.bag for testing -->
|
||||
<include file="$(find rtabmap_ros)/launch/demo/demo_stereo_outdoor.launch"/>
|
||||
|
||||
<group ns="/stereo_camera" >
|
||||
<node pkg="nodelet" type="nodelet" name="obstacles_manager" args="manager"/>
|
||||
<node pkg="nodelet" type="nodelet" name="disparity2cloud" args="load rtabmap_ros/point_cloud_xyz obstacles_manager">
|
||||
<remap from="disparity/image" to="disparity"/>
|
||||
<remap from="disparity/camera_info" to="right/camera_info_throttle"/>
|
||||
<remap from="cloud" to="cloudXYZ"/>
|
||||
|
||||
<param name="voxel_size" type="double" value="0.05"/>
|
||||
<param name="decimation" type="int" value="4"/>
|
||||
<param name="max_depth" type="double" value="4"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="obstacles_detection" args="load rtabmap_ros/obstacles_detection obstacles_manager">
|
||||
<remap from="cloud" to="cloudXYZ"/>
|
||||
|
||||
<param name="frame_id" type="string" value="base_footprint"/>
|
||||
<param name="wait_for_transform" type="bool" value="true"/>
|
||||
<param name="min_cluster_size" type="int" value="20"/>
|
||||
<param name="max_obstacles_height" type="double" value="0.0"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,139 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!--
|
||||
Hand-held 3D lidar mapping example using only a Ouster OS-1 (no camera).
|
||||
Prerequisities: rtabmap should be built with libpointmatcher
|
||||
Example:
|
||||
$ roslaunch rtabmap_ros test_ouster.launch os1_hostname:=os1-XXXXXXXXXXXX.local os1_udp_dest:=192.168.1.XXX
|
||||
$ rosrun rviz rviz -f map
|
||||
$ Show TF and /rtabmap/cloud_map topics
|
||||
ISSUE: You may have to reset odometry after receiving the first cloud if the map looks tilted. The problem seems
|
||||
coming from the first cloud sent by os1_cloud_node, which may be poorly synchronized with IMU data.
|
||||
-->
|
||||
|
||||
<arg name="use_sim_time" default="false"/>
|
||||
|
||||
<!-- Required: -->
|
||||
<arg unless="$(arg use_sim_time)" name="os1_hostname"/>
|
||||
<arg unless="$(arg use_sim_time)" name="os1_udp_dest"/>
|
||||
|
||||
<arg name="frame_id" default="os1_sensor"/>
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="scan_20_hz" default="true"/>
|
||||
<param if="$(arg use_sim_time)" name="use_sim_time" value="true"/>
|
||||
|
||||
<!-- Ouster -->
|
||||
<remap unless="$(arg use_sim_time)" from="/os1_cloud_node/imu" to="/os1_cloud_node/imu/data_raw"/>
|
||||
<include unless="$(arg use_sim_time)" file="$(find ouster_ros)/os1.launch">
|
||||
<arg name="os1_hostname" value="$(arg os1_hostname)"/>
|
||||
<arg name="os1_udp_dest" value="$(arg os1_udp_dest)"/>
|
||||
<arg if="$(arg scan_20_hz)" name="lidar_mode" value="1024x20"/>
|
||||
<arg unless="$(arg scan_20_hz)" name="lidar_mode" value="1024x10"/>
|
||||
</include>
|
||||
|
||||
<!-- IMU orientation estimation and publish tf accordingly to os1_sensor frame -->
|
||||
<node pkg="nodelet" type="nodelet" name="imu_nodelet_manager" args="manager">
|
||||
<remap from="imu" to="/os1_cloud_node/imu"/>
|
||||
</node>
|
||||
<node pkg="nodelet" type="nodelet" name="imu_filter" args="load imu_filter_madgwick/ImuFilterNodelet imu_nodelet_manager">
|
||||
<param name="use_mag" value="false"/>
|
||||
<param name="world_frame" value="enu"/>
|
||||
<param name="publish_tf" value="false"/>
|
||||
</node>
|
||||
<node pkg="nodelet" type="nodelet" name="imu_to_tf" args="load rtabmap_ros/imu_to_tf imu_nodelet_manager">
|
||||
<remap from="imu/data" to="/os1_cloud_node/imu/data"/>
|
||||
<param name="fixed_frame_id" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="base_frame_id" value="$(arg frame_id)"/>
|
||||
</node>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="/os1_cloud_node/points"/>
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param if="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="25"/>
|
||||
<param unless="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="15"/>
|
||||
|
||||
<remap from="imu" to="/os1_cloud_node/imu/data"/>
|
||||
<param name="guess_frame_id" type="string" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="wait_imu_to_init" type="bool" value="true"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="10"/>
|
||||
<param name="Icp/VoxelSize" type="string" value="0.2"/>
|
||||
<param name="Icp/DownsamplingStep" type="string" value="1"/> <!-- cannot be increased with ring-like lidar -->
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="2"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="1"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.1"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.01"/>
|
||||
|
||||
<!-- Odom parameters -->
|
||||
<param name="Odom/ScanKeyFrameThr" type="string" value="0.95"/>
|
||||
<param name="Odom/Strategy" type="string" value="0"/>
|
||||
<param name="OdomF2M/ScanSubtractRadius" type="string" value="0.2"/>
|
||||
<param name="OdomF2M/ScanMaxSize" type="string" value="15000"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" output="screen" args="-d">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgb" type="bool" value="false"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
|
||||
<remap from="scan_cloud" to="/os1_cloud_node/points"/>
|
||||
<remap from="imu" to="/os1_cloud_node/imu/data"/>
|
||||
|
||||
<!-- RTAB-Map's parameters -->
|
||||
<param name="Rtabmap/DetectionRate" type="string" value="1"/>
|
||||
<param name="RGBD/NeighborLinkRefining" type="string" value="false"/>
|
||||
<param name="RGBD/ProximityBySpace" type="string" value="true"/>
|
||||
<param name="RGBD/ProximityMaxGraphDepth" type="string" value="0"/>
|
||||
<param name="RGBD/ProximityPathMaxNeighbors" type="string" value="1"/>
|
||||
<param name="RGBD/AngularUpdate" type="string" value="0.05"/>
|
||||
<param name="RGBD/LinearUpdate" type="string" value="0.05"/>
|
||||
<param name="Mem/NotLinkedNodesKept" type="string" value="false"/>
|
||||
<param name="Mem/STMSize" type="string" value="30"/>
|
||||
<!-- param name="Mem/LaserScanVoxelSize" type="string" value="0.1"/ -->
|
||||
<!-- param name="Mem/LaserScanNormalK" type="string" value="10"/ -->
|
||||
<!-- param name="Mem/LaserScanRadius" type="string" value="0"/ -->
|
||||
|
||||
<param name="Reg/Strategy" type="string" value="1"/>
|
||||
<param name="Grid/CellSize" type="string" value="0.1"/>
|
||||
<param name="Grid/RangeMax" type="string" value="20"/>
|
||||
<param name="Grid/ClusterRadius" type="string" value="1"/>
|
||||
<param name="Grid/GroundIsObstacle" type="string" value="true"/>
|
||||
<param name="Optimizer/GravitySigma" type="string" value="0.3"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/VoxelSize" type="string" value="0.3"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/PointToPlane" type="string" value="false"/>
|
||||
<param name="Icp/Iterations" type="string" value="10"/>
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="3"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="1"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.4"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg rtabmapviz)" name="rtabmapviz" pkg="rtabmap_ros" type="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="scan_cloud" to="/os1_cloud_node/points"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,191 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!--
|
||||
Hand-held 3D lidar mapping example using only a Ouster GEN2 (no camera).
|
||||
Prerequisities: rtabmap should be built with libpointmatcher
|
||||
|
||||
Example:
|
||||
|
||||
$ roslaunch rtabmap_ros test_ouster_gen2.launch sensor_hostname:=os-XXXXXXXXXXXX.local udp_dest:=192.168.1.XXX
|
||||
$ rosrun rviz rviz -f map
|
||||
RVIZ: Show TF and /rtabmap/cloud_map topics
|
||||
|
||||
ISSUE: You may have to reset odometry after receiving the first cloud if the map looks tilted. The problem seems
|
||||
coming from the first cloud sent by os_cloud_node, which may be poorly synchronized with IMU data.
|
||||
|
||||
PTP mode (synchronize timestamp with host computer time)
|
||||
|
||||
* Install:
|
||||
|
||||
$ sudo apt install linuxptp httpie
|
||||
$ printf "[global]\ntx_timestamp_timeout 10\n" >> ~/os.conf
|
||||
|
||||
* Running:
|
||||
|
||||
(replace "XXXXXXXXXXXX" by your ouster serial, as well as XXX by its IP address)
|
||||
(replace "eth0" by the network interface used to communicate with ouster)
|
||||
|
||||
$ http PUT http://os-XXXXXXXXXXXX.local/api/v1/time/ptp/profile <<< '"default-relaxed"'
|
||||
$ sudo ptp4l -i eth0 -m -f ~/os.conf -S
|
||||
$ roslaunch rtabmap_ros test_ouster_gen2.launch sensor_hostname:=os-XXXXXXXXXXXX.local udp_dest:=192.168.1.XXX ptp:=true
|
||||
|
||||
-->
|
||||
|
||||
<arg name="use_sim_time" default="false"/>
|
||||
|
||||
<!-- Required: -->
|
||||
<arg unless="$(arg use_sim_time)" name="sensor_hostname"/>
|
||||
<arg unless="$(arg use_sim_time)" name="udp_dest"/>
|
||||
|
||||
<arg name="frame_id" default="os_sensor"/>
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="deskewing" default="true"/>
|
||||
<arg name="slerp" default="false"/>
|
||||
<arg name="scan_20_hz" default="true"/>
|
||||
<arg name="voxel_size" default="0.15"/> <!-- indoor: 0.1 to 0.3, outdoor: 0.3 to 0.5 -->
|
||||
<arg name="assemble" default="false"/>
|
||||
<arg name="ptp" default="false"/> <!-- See comments in header to start before launching the launch -->
|
||||
<arg name="imu_topic" default="/os_cloud_node/imu"/>
|
||||
<arg name="scan_topic" default="/os_cloud_node/points"/>
|
||||
|
||||
<param if="$(arg use_sim_time)" name="use_sim_time" value="true"/>
|
||||
|
||||
<!-- Ouster -->
|
||||
<include unless="$(arg use_sim_time)" file="$(find ouster_ros)/ouster.launch">
|
||||
<arg name="sensor_hostname" value="$(arg sensor_hostname)"/>
|
||||
<arg name="udp_dest" value="$(arg udp_dest)"/>
|
||||
<arg name="image" value="true"/>
|
||||
<arg if="$(arg scan_20_hz)" name="lidar_mode" value="1024x20"/>
|
||||
<arg unless="$(arg scan_20_hz)" name="lidar_mode" value="1024x10"/>
|
||||
<arg if="$(arg ptp)" name="timestamp_mode" value="TIME_FROM_PTP_1588"/>
|
||||
</include>
|
||||
|
||||
<!-- IMU orientation estimation and publish tf accordingly to os_sensor frame -->
|
||||
<node pkg="nodelet" type="nodelet" name="imu_nodelet_manager" args="manager">
|
||||
<remap from="imu/data_raw" to="$(arg imu_topic)"/>
|
||||
<remap from="imu/data" to="$(arg imu_topic)/filtered"/>
|
||||
</node>
|
||||
<node pkg="nodelet" type="nodelet" name="imu_filter" args="load imu_filter_madgwick/ImuFilterNodelet imu_nodelet_manager">
|
||||
<param name="use_mag" value="false"/>
|
||||
<param name="world_frame" value="enu"/>
|
||||
<param name="publish_tf" value="false"/>
|
||||
</node>
|
||||
<node pkg="nodelet" type="nodelet" name="imu_to_tf" args="load rtabmap_ros/imu_to_tf imu_nodelet_manager">
|
||||
<remap from="imu/data" to="$(arg imu_topic)/filtered"/>
|
||||
<param name="fixed_frame_id" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="base_frame_id" value="$(arg frame_id)"/>
|
||||
</node>
|
||||
|
||||
<!-- Lidar Deskewing -->
|
||||
<node if="$(arg deskewing)" pkg="nodelet" type="nodelet" name="lidar_deskewing" args="standalone rtabmap_ros/lidar_deskewing" output="screen">
|
||||
<param name="wait_for_transform" value="0.01"/>
|
||||
<param name="fixed_frame_id" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="slerp" value="$(arg slerp)"/>
|
||||
<remap from="input_cloud" to="$(arg scan_topic)"/>
|
||||
</node>
|
||||
|
||||
<arg if="$(arg deskewing)" name="scan_topic_deskewed" default="$(arg scan_topic)/deskewed"/>
|
||||
<arg unless="$(arg deskewing)" name="scan_topic_deskewed" default="$(arg scan_topic)"/>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<remap from="imu" to="$(arg imu_topic)/filtered"/>
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param if="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="25"/>
|
||||
<param unless="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="15"/>
|
||||
|
||||
<param name="guess_frame_id" type="string" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="wait_imu_to_init" type="bool" value="true"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="10"/>
|
||||
<param name="Icp/VoxelSize" type="string" value="$(arg voxel_size)"/>
|
||||
<param name="Icp/DownsamplingStep" type="string" value="1"/> <!-- cannot be increased with ring-like lidar -->
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="2"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="1"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.1"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.01"/>
|
||||
|
||||
<!-- Odom parameters -->
|
||||
<param name="Odom/ScanKeyFrameThr" type="string" value="0.95"/>
|
||||
<param name="Odom/Strategy" type="string" value="0"/>
|
||||
<param name="OdomF2M/ScanSubtractRadius" type="string" value="$(arg voxel_size)"/>
|
||||
<param name="OdomF2M/ScanMaxSize" type="string" value="15000"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" output="screen" args="-d">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgb" type="bool" value="false"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
|
||||
<remap if="$(arg assemble)" from="scan_cloud" to="assembled_cloud"/>
|
||||
<remap unless="$(arg assemble)" from="scan_cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<remap from="imu" to="$(arg imu_topic)/filtered"/>
|
||||
|
||||
<!-- RTAB-Map's parameters -->
|
||||
<param if="$(arg assemble)" name="Rtabmap/DetectionRate" type="string" value="0"/> <!-- already set 1 Hz in point_cloud_assembler -->
|
||||
<param unless="$(arg assemble)" name="Rtabmap/DetectionRate" type="string" value="1"/>
|
||||
<param name="RGBD/NeighborLinkRefining" type="string" value="false"/>
|
||||
<param name="RGBD/ProximityBySpace" type="string" value="true"/>
|
||||
<param name="RGBD/ProximityMaxGraphDepth" type="string" value="0"/>
|
||||
<param name="RGBD/ProximityPathMaxNeighbors" type="string" value="1"/>
|
||||
<param name="RGBD/LocalRadius" type="string" value="2"/>
|
||||
<param name="RGBD/AngularUpdate" type="string" value="0.05"/>
|
||||
<param name="RGBD/LinearUpdate" type="string" value="0.05"/>
|
||||
<param name="Mem/NotLinkedNodesKept" type="string" value="false"/>
|
||||
<param name="Mem/STMSize" type="string" value="30"/>
|
||||
<!-- param name="Mem/LaserScanVoxelSize" type="string" value="0.1"/ -->
|
||||
<!-- param name="Mem/LaserScanNormalK" type="string" value="10"/ -->
|
||||
<!-- param name="Mem/LaserScanRadius" type="string" value="0"/ -->
|
||||
|
||||
<param name="Reg/Strategy" type="string" value="1"/>
|
||||
<param name="Optimizer/GravitySigma" type="string" value="0.5"/>
|
||||
<param name="Optimizer/Strategy" type="string" value="1"/>
|
||||
<param name="Grid/CellSize" type="string" value="0.1"/>
|
||||
<param name="Grid/RangeMax" type="string" value="20"/>
|
||||
<param name="Grid/ClusterRadius" type="string" value="1"/>
|
||||
<param name="Grid/GroundIsObstacle" type="string" value="true"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/VoxelSize" type="string" value="$(arg voxel_size)"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="10"/>
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="3"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="1"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.2"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg assemble)" pkg="rtabmap_ros" type="point_cloud_assembler" name="point_cloud_assembler" output="screen">
|
||||
<remap from="cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<remap from="odom" to="odom"/>
|
||||
<param name="assembling_time" type="double" value="1" />
|
||||
<param name="fixed_frame_id" type="string" value="" />
|
||||
</node>
|
||||
|
||||
<node if="$(arg rtabmapviz)" name="rtabmapviz" pkg="rtabmap_ros" type="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="scan_cloud" to="odom_filtered_input_scan"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,83 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch" >
|
||||
<arg name="depth_registration" value="true"/>
|
||||
<arg name="data_skip" value="3"/>
|
||||
</include>
|
||||
|
||||
<group ns="camera">
|
||||
<node pkg="nodelet" type="nodelet" name="data_throttle" args="load rtabmap_ros/data_throttle camera_nodelet_manager">
|
||||
<remap from="rgb/image_in" to="rgb/image_rect_color"/>
|
||||
<remap from="depth/image_in" to="depth_registered/image_raw"/>
|
||||
<remap from="rgb/camera_info_in" to="depth_registered/camera_info"/>
|
||||
|
||||
<param name="decimation" type="int" value="2"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="points_xyzrgb" args="load rtabmap_ros/point_cloud_xyzrgb camera_nodelet_manager">
|
||||
<remap from="rgb/image" to="rgb/image_out"/>
|
||||
<remap from="depth/image" to="depth/image_out"/>
|
||||
<remap from="rgb/camera_info" to="rgb/camera_info_out"/>
|
||||
<remap from="cloud" to="/voxel_cloud_xyzrgb" />
|
||||
|
||||
<param name="voxel_size" type="double" value="0.02"/>
|
||||
<param name="decimation" type="int" value="2"/>
|
||||
<param name="noise_filter_radius" type="double" value="0.05"/>
|
||||
<param name="normal_k" type="int" value="6"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="points_xyz" args="load rtabmap_ros/point_cloud_xyz camera_nodelet_manager">
|
||||
<remap from="depth/image" to="depth/image_out"/>
|
||||
<remap from="depth/camera_info" to="rgb/camera_info_out"/>
|
||||
<remap from="cloud" to="/voxel_cloud_xyz" />
|
||||
|
||||
<param name="voxel_size" type="double" value="0.02"/>
|
||||
<param name="decimation" type="int" value="2"/>
|
||||
<param name="noise_filter_radius" type="double" value="0.05"/>
|
||||
<param name="normal_k" type="int" value="6"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
<!-- stereo test with stereo_outdoorA.bag -->
|
||||
<!--
|
||||
<param name="use_sim_time" value="true"/>
|
||||
|
||||
<node name="republish_left" type="republish" pkg="image_transport" args="compressed in:=/stereo_camera/left/image_raw_throttle raw out:=/stereo_camera/left/image_raw_throttle_relay" />
|
||||
<node name="republish_right" type="republish" pkg="image_transport" args="compressed in:=/stereo_camera/right/image_raw_throttle raw out:=/stereo_camera/right/image_raw_throttle_relay" />
|
||||
|
||||
<group ns="/stereo_camera" >
|
||||
<node pkg="stereo_image_proc" type="stereo_image_proc" name="stereo_image_proc">
|
||||
<remap from="left/image_raw" to="left/image_raw_throttle_relay"/>
|
||||
<remap from="left/camera_info" to="left/camera_info_throttle"/>
|
||||
<remap from="right/image_raw" to="right/image_raw_throttle_relay"/>
|
||||
<remap from="right/camera_info" to="right/camera_info_throttle"/>
|
||||
<param name="disparity_range" value="128"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="standalone_nodelet" args="manager" output="screen"/>
|
||||
<node pkg="nodelet" type="nodelet" name="stereo_throttle" args="load rtabmap_ros/stereo_throttle standalone_nodelet">
|
||||
<remap from="left/image" to="/stereo_camera/left/image_rect_color"/>
|
||||
<remap from="right/image" to="/stereo_camera/right/image_rect"/>
|
||||
<remap from="left/camera_info" to="/stereo_camera/left/camera_info_throttle"/>
|
||||
<remap from="right/camera_info" to="/stereo_camera/right/camera_info_throttle"/>
|
||||
|
||||
<param name="decimation" type="int" value="2"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="points_xyzrgb" args="load rtabmap_ros/point_cloud_xyzrgb standalone_nodelet">
|
||||
<remap from="left/image" to="/stereo_camera/left/image_rect_color_throttle"/>
|
||||
<remap from="right/image" to="/stereo_camera/right/image_rect_throttle"/>
|
||||
<remap from="left/camera_info" to="/stereo_camera/left/camera_info_throttle_throttle"/>
|
||||
<remap from="right/camera_info" to="/stereo_camera/right/camera_info_throttle_throttle"/>
|
||||
<remap from="cloud" to="/voxel_cloud" />
|
||||
|
||||
<param name="decimation" type="int" value="2"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
</node>
|
||||
-->
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Example with rgbd datasets:
|
||||
$ wget http://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_long_office_household.bag
|
||||
$ rosbag decompress rgbd_dataset_freiburg3_long_office_household.bag
|
||||
$ chmod +x test_prior_rename_kinect_bag_tf.py
|
||||
$ ./test_prior_rename_kinect_bag_tf.py
|
||||
|
||||
We simulate an external "global_pose" by republishing ground truth TF (VICON) with some
|
||||
covariance, normally you should not have to use test_prior_tf_to_pose.py as the node
|
||||
publishing the global pose would give it directly as a pose with correct covariance.
|
||||
|
||||
Rename all child_frame_id "/kinect" to "/kinect_gt" Tf in the bag
|
||||
using test_prior_rename_kinect_bag_tf.py in this directory!
|
||||
|
||||
$ roslaunch rtabmap_ros test_prior.launch
|
||||
$ chmod +x test_prior_tf_to_pose.py
|
||||
$ ./test_prior_tf_to_pose.py
|
||||
$ rosbag play -.-clock rgbd_dataset_freiburg3_long_office_household_tf_renamed.bag
|
||||
-->
|
||||
|
||||
<param name="use_sim_time" type="bool" value="True"/>
|
||||
|
||||
<!-- Choose visualization -->
|
||||
<arg name="rviz" default="true" />
|
||||
<arg name="rtabmapviz" default="false" />
|
||||
|
||||
<!-- TF FRAMES -->
|
||||
<node pkg="tf" type="static_transform_publisher" name="world_to_map"
|
||||
args="0.0 0.0 0.0 0.0 0.0 0.0 /world /map 100" />
|
||||
|
||||
<group ns="rtabmap">
|
||||
|
||||
<!-- Odometry -->
|
||||
<node pkg="rtabmap_ros" type="rgbd_odometry" name="rgbd_odometry" output="screen">
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
<remap from="odom" to="vis_odom"/>
|
||||
|
||||
<param name="odom_frame_id" type="string" value="vis_odom"/>
|
||||
<param name="frame_id" type="string" value="kinect"/>
|
||||
</node>
|
||||
|
||||
<!-- Visual SLAM -->
|
||||
<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start">
|
||||
<param name="subscribe_depth" type="bool" value="true"/>
|
||||
<param name="frame_id" type="string" value="kinect"/>
|
||||
|
||||
<param name="RGBD/CreateOccupancyGrid" type="string" value="false"/>
|
||||
<param name="Optimizer/PriorsIgnored" type="string" value="false"/>
|
||||
<param name="Optimizer/Strategy" type="string" value="1"/>
|
||||
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
<remap from="odom" to="vis_odom"/>
|
||||
<remap from="global_pose" to="/global_pose"/>
|
||||
<param name="ground_truth_frame_id" type="string" value="world"/>
|
||||
<param name="ground_truth_base_frame_id" type="string" value="kinect_gt"/>
|
||||
</node>
|
||||
|
||||
<!-- Visualisation -->
|
||||
<node if="$(arg rtabmapviz)" pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" args="-d $(find rtabmap_ros)/launch/config/rgbd_gui.ini" output="screen">
|
||||
<param name="subscribe_depth" type="bool" value="true"/>
|
||||
<param name="subscribe_laserScan" type="bool" value="false"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="queue_size" type="int" value="30"/>
|
||||
|
||||
<param name="frame_id" type="string" value="kinect"/>
|
||||
|
||||
<remap from="rgb/image" to="/camera/rgb/image_color"/>
|
||||
<remap from="depth/image" to="/camera/depth/image"/>
|
||||
<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>
|
||||
<remap from="odom" to="vis_odom"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
<node if="$(arg rviz)" pkg="rviz" type="rviz" name="rviz" args="-d $(find rtabmap_ros)/launch/config/rgbdslam_datasets.rviz"/>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
import rosbag
|
||||
from tf.msg import tfMessage
|
||||
with rosbag.Bag('rgbd_dataset_freiburg3_long_office_household_tf_renamed.bag', 'w') as outbag:
|
||||
for topic, msg, t in rosbag.Bag('rgbd_dataset_freiburg3_long_office_household.bag').read_messages():
|
||||
if topic == "/tf" and msg.transforms:
|
||||
newList = [];
|
||||
for m in msg.transforms:
|
||||
if m.child_frame_id != "/kinect":
|
||||
newList.append(m)
|
||||
else:
|
||||
m.child_frame_id = "/kinect_gt"
|
||||
newList.append(m)
|
||||
print 'kinect frame renamed!'
|
||||
if len(newList)>0:
|
||||
msg.transforms = newList
|
||||
outbag.write(topic, msg, t)
|
||||
else:
|
||||
outbag.write(topic, msg, t)
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python
|
||||
import rospy
|
||||
import tf
|
||||
import numpy
|
||||
import tf2_ros
|
||||
from geometry_msgs.msg import PoseWithCovarianceStamped
|
||||
|
||||
if __name__ == '__main__':
|
||||
rospy.init_node('tf_to_pose', anonymous=True)
|
||||
listener = tf.TransformListener()
|
||||
frame = rospy.get_param('~frame', 'world')
|
||||
childFrame = rospy.get_param('~child_frame', 'kinect_gt')
|
||||
outputFrame = rospy.get_param('~output_frame', 'kinect')
|
||||
cov = rospy.get_param('~cov', 1)
|
||||
rateParam = rospy.get_param('~rate', 30) # 10hz
|
||||
pub = rospy.Publisher('global_pose', PoseWithCovarianceStamped, queue_size=1)
|
||||
|
||||
print 'start loop!'
|
||||
rate = rospy.Rate(rateParam)
|
||||
while not rospy.is_shutdown():
|
||||
poseOut = PoseWithCovarianceStamped()
|
||||
try:
|
||||
now = rospy.get_rostime()
|
||||
listener.waitForTransform(frame, childFrame, now, rospy.Duration(0.033))
|
||||
(trans,rot) = listener.lookupTransform(frame, childFrame, now)
|
||||
except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException, tf2_ros.TransformException), e:
|
||||
print str(e)
|
||||
rate.sleep()
|
||||
continue
|
||||
|
||||
poseOut.header.stamp.nsecs = now.nsecs
|
||||
poseOut.header.stamp.secs = now.secs
|
||||
poseOut.header.frame_id = outputFrame
|
||||
poseOut.pose.pose.position.x = trans[0]
|
||||
poseOut.pose.pose.position.y = trans[1]
|
||||
poseOut.pose.pose.position.z = trans[2]
|
||||
poseOut.pose.pose.orientation.x = rot[0]
|
||||
poseOut.pose.pose.orientation.y = rot[1]
|
||||
poseOut.pose.pose.orientation.z = rot[2]
|
||||
poseOut.pose.pose.orientation.w = rot[3]
|
||||
poseOut.pose.covariance = (cov * numpy.eye(6, dtype=numpy.float64)).tolist()
|
||||
poseOut.pose.covariance = [item for sublist in poseOut.pose.covariance for item in sublist]
|
||||
|
||||
print str(poseOut)
|
||||
pub.publish(poseOut)
|
||||
rate.sleep()
|
||||
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Kinect: -->
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch">
|
||||
<arg name="depth_registration" value="true" />
|
||||
</include>
|
||||
|
||||
<arg name="compressed" default="false"/>
|
||||
<arg name="compressed_rate" default="0"/>
|
||||
|
||||
<group ns="camera">
|
||||
<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="load rtabmap_ros/rgbd_sync camera_nodelet_manager" output="screen">
|
||||
<remap from="rgb/image" to="rgb/image_rect_color"/>
|
||||
<remap from="depth/image" to="depth_registered/image_raw"/>
|
||||
<remap from="rgb/camera_info" to="rgb/camera_info"/>
|
||||
<param name="compressed_rate" value="$(arg compressed_rate)"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
<!-- Nodes -->
|
||||
<group ns="rtabmap">
|
||||
|
||||
<!-- RGB-D Odometry -->
|
||||
<node pkg="rtabmap_ros" type="rgbd_odometry" name="rgbd_odometry" output="screen">
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<remap if="$(arg compressed)" from="rgbd_image" to="/camera/rgbd_image/compressed"/>
|
||||
<remap unless="$(arg compressed)" from="rgbd_image" to="/camera/rgbd_image"/>
|
||||
|
||||
<param name="Odom/AlignWithGround" type="string" value="true"/>
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
</node>
|
||||
|
||||
<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start">
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
<param name="approx_sync" type="string" value="false"/>
|
||||
<remap if="$(arg compressed)" from="rgbd_image" to="/camera/rgbd_image/compressed"/>
|
||||
<remap unless="$(arg compressed)" from="rgbd_image" to="/camera/rgbd_image"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" output="screen">
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="frame_id" type="string" value="camera_link"/>
|
||||
<param name="approx_sync" type="string" value="false"/>
|
||||
<remap if="$(arg compressed)" from="rgbd_image" to="/camera/rgbd_image/compressed"/>
|
||||
<remap unless="$(arg compressed)" from="rgbd_image" to="/camera/rgbd_image"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Kinect: -->
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch">
|
||||
<arg name="depth_registration" value="true" />
|
||||
</include>
|
||||
|
||||
<arg name="frame_id" default="camera_link"/>
|
||||
<arg name="rtabmap_args" default="--delete_db_on_start"/> <!-- delete_db_on_start, udebug -->
|
||||
<arg name="odom_args" default="$(arg rtabmap_args)"/>
|
||||
|
||||
<!-- RGB-D related topics -->
|
||||
<arg name="rgb_topic" default="/camera/rgb/image_rect_color" />
|
||||
<arg name="depth_topic" default="/camera/depth_registered/image_raw" />
|
||||
<arg name="camera_info_topic" default="/camera/rgb/camera_info" />
|
||||
|
||||
<group ns="camera">
|
||||
|
||||
<!-- Use RGBD synchronization -->
|
||||
<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="load rtabmap_ros/rgbd_sync camera_nodelet_manager">
|
||||
<remap from="rgb/image" to="$(arg rgb_topic)"/>
|
||||
<remap from="depth/image" to="$(arg depth_topic)"/>
|
||||
<remap from="rgb/camera_info" to="$(arg camera_info_topic)"/>
|
||||
</node>
|
||||
|
||||
<!-- RGB-D Odometry -->
|
||||
<node pkg="nodelet" type="nodelet" name="rgbd_odometry" args="load rtabmap_ros/rgbd_odometry camera_nodelet_manager $(arg odom_args)">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
</node>
|
||||
|
||||
<!-- RTAB-Map -->
|
||||
<node pkg="nodelet" type="nodelet" name="rtabmap" args="load rtabmap_ros/rtabmap camera_nodelet_manager $(arg rtabmap_args)">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
</node>
|
||||
|
||||
<!-- Visualisation -->
|
||||
<node pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Testing 2 Kinects localizing in the same map at the same time -->
|
||||
<!-- Prerequisities: the default ~/.ros/rtabmap.db should be
|
||||
already created with one of the Kinect using mapping tutorial:
|
||||
http://wiki.ros.org/rtabmap_ros/Tutorials/HandHeldMapping
|
||||
$ roslaunch freenect_launch freenect.launch depth_registration:=true
|
||||
$ roslaunch rtabmap_ros rtabmap.launch args:="-d"
|
||||
-->
|
||||
|
||||
|
||||
<!-- Cameras -->
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch">
|
||||
<arg name="depth_registration" value="True" />
|
||||
<arg name="camera" value="camera1" />
|
||||
<arg name="device_id" value="#1" />
|
||||
</include>
|
||||
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch">
|
||||
<arg name="depth_registration" value="True" />
|
||||
<arg name="camera" value="camera2" />
|
||||
<arg name="device_id" value="#2" />
|
||||
</include>
|
||||
|
||||
<include file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg name="namespace" value="rtabmap1"/>
|
||||
<arg name="localization" value="true" />
|
||||
<arg name="frame_id" value="camera1_link" />
|
||||
<arg name="vo_frame_id" value="odom1" />
|
||||
|
||||
<arg name="rgb_topic" value="/camera1/rgb/image_rect_color" />
|
||||
<arg name="depth_topic" value="/camera1/depth_registered/image_raw" />
|
||||
<arg name="camera_info_topic" value="/camera1/rgb/camera_info" />
|
||||
|
||||
<arg name="rtabmapviz" value="false"/>
|
||||
</include>
|
||||
|
||||
<include file="$(find rtabmap_ros)/launch/rtabmap.launch">
|
||||
<arg name="namespace" value="rtabmap2"/>
|
||||
<arg name="localization" value="true" />
|
||||
<arg name="frame_id" value="camera2_link" />
|
||||
<arg name="vo_frame_id" value="odom2" />
|
||||
|
||||
<arg name="rgb_topic" value="/camera2/rgb/image_rect_color" />
|
||||
<arg name="depth_topic" value="/camera2/depth_registered/image_raw" />
|
||||
<arg name="camera_info_topic" value="/camera2/rgb/camera_info" />
|
||||
|
||||
<arg name="rtabmapviz" value="false"/>
|
||||
</include>
|
||||
|
||||
<!-- Visualization RVIZ -->
|
||||
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find rtabmap_ros)/launch/config/rgbd.rviz"/>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Kinect: -->
|
||||
<include file="$(find openni2_launch)/launch/openni2.launch">
|
||||
<arg name="depth_registration" value="true" />
|
||||
</include>
|
||||
|
||||
<arg name="depth" default="/camera/depth_registered/image_raw" />
|
||||
<arg name="model" default="$(find rtabmap_ros)/launch/calibration/distortion_model_PS1080.bin" /> <!-- XTION Live Pro -->
|
||||
|
||||
<group ns="camera">
|
||||
<!-- Undistort depth image -->
|
||||
<node pkg="nodelet" type="nodelet" name="undistort" args="load rtabmap_ros/undistort_depth camera_nodelet_manager">
|
||||
<remap from="depth" to="$(arg depth)"/>
|
||||
<param name="model" value="$(arg model)"/>
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<launch>
|
||||
|
||||
<!-- Kinect: -->
|
||||
<include file="$(find freenect_launch)/launch/freenect.launch">
|
||||
<arg name="depth_registration" value="true" />
|
||||
</include>
|
||||
|
||||
<arg name="frame_id" default="camera_link"/>
|
||||
<arg name="rtabmap_args" default="--delete_db_on_start"/> <!-- delete_db_on_start, udebug -->
|
||||
<arg name="odom_args" default="$(arg rtabmap_args)"/>
|
||||
|
||||
<!-- RGB-D related topics -->
|
||||
<arg name="rgb_topic" default="/camera/rgb/image_rect_color" />
|
||||
<arg name="depth_topic" default="/camera/depth_registered/image_raw" />
|
||||
<arg name="camera_info_topic" default="/camera/rgb/camera_info" />
|
||||
|
||||
<group ns="camera">
|
||||
|
||||
<!-- Use RGBD synchronization -->
|
||||
<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="load rtabmap_ros/rgbd_sync camera_nodelet_manager">
|
||||
<remap from="rgb/image" to="$(arg rgb_topic)"/>
|
||||
<remap from="depth/image" to="$(arg depth_topic)"/>
|
||||
<remap from="rgb/camera_info" to="$(arg camera_info_topic)"/>
|
||||
</node>
|
||||
|
||||
<!-- RGB-D Odometry -->
|
||||
<node pkg="nodelet" type="nodelet" name="rgbd_odometry" args="load rtabmap_ros/rgbd_odometry camera_nodelet_manager $(arg odom_args)">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="keep_color" type="bool" value="true"/>
|
||||
</node>
|
||||
|
||||
<!-- RTAB-Map -->
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" args="$(arg rtabmap_args)" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="rgbd_image" to="odom_rgbd_image"/>
|
||||
</node>
|
||||
|
||||
<!-- Visualisation -->
|
||||
<node pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_rgbd" type="bool" value="true"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
</node>
|
||||
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- -->
|
||||
<launch>
|
||||
|
||||
<!--
|
||||
Hand-held 3D lidar mapping example using only a Velodyne PUCK (no camera).
|
||||
Prerequisities: rtabmap should be built with libpointmatcher
|
||||
Example:
|
||||
$ roslaunch rtabmap_ros test_velodyne.launch
|
||||
$ rosrun rviz rviz -f map
|
||||
$ Show TF and /rtabmap/cloud_map topics
|
||||
-->
|
||||
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="use_imu" default="false"/> <!-- Assuming IMU fixed to lidar with /velodyne -> /imu_link TF -->
|
||||
<arg name="imu_topic" default="/imu/data"/>
|
||||
<arg name="scan_20_hz" default="false"/> <!-- If we launch the velodyne with "rpm:=1200" argument -->
|
||||
<arg name="deskewing" default="true"/>
|
||||
<arg name="slerp" default="false"/> <!-- If true, a slerp between the first and last time will be used to deskew each point, which is faster than using tf for every point but less accurate -->
|
||||
<arg name="organize_cloud" default="$(arg deskewing)"/> <!-- Should be organized if deskewing is enabled -->
|
||||
<arg name="scan_topic" default="/velodyne_points"/>
|
||||
<arg name="use_sim_time" default="false"/>
|
||||
<param if="$(arg use_sim_time)" name="use_sim_time" value="true"/>
|
||||
|
||||
<arg name="frame_id" default="velodyne"/>
|
||||
<arg name="queue_size" default="10"/> <!-- Set to 100 for kitti dataset to make sure all scans are processed -->
|
||||
<arg name="queue_size_odom" default="1"/> <!-- Set to 100 for kitti dataset to make sure all scans are processed -->
|
||||
<arg name="loop_ratio" default="0.2"/>
|
||||
|
||||
<arg name="resolution" default="0.05"/> <!-- set 0.05-0.3 for indoor, set 0.3-0.5 for outdoor (0.4 for kitti) -->
|
||||
<arg name="iterations" default="10"/>
|
||||
|
||||
<!-- Grid parameters -->
|
||||
<arg name="ground_is_obstacle" default="true"/>
|
||||
<arg name="grid_max_range" default="20"/>
|
||||
|
||||
<!-- For F2M Odometry -->
|
||||
<arg name="ground_normals_up" default="false"/> <!-- set to true when velodyne is always horizontal to ground (ground robot, car, kitti) -->
|
||||
<arg name="local_map_size" default="15000"/>
|
||||
<arg name="key_frame_thr" default="0.6"/>
|
||||
|
||||
<!-- For FLOAM Odometry -->
|
||||
<arg name="floam" default="false"/> <!-- RTAB-Map should be built with FLOAM http://official-rtab-map-forum.206.s1.nabble.com/icp-odometry-with-LOAM-crash-tp8261p8563.html -->
|
||||
<arg name="floam_sensor" default="0"/> <!-- 0=16 rings (VLP16), 1=32 rings, 2=64 rings (kitti dataset) -->
|
||||
|
||||
<include unless="$(arg use_sim_time)" file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
|
||||
<arg if="$(arg scan_20_hz)" name="rpm" value="1200"/>
|
||||
<arg unless="$(arg scan_20_hz)" name="rpm" value="600"/>
|
||||
<arg name="organize_cloud" value="$(arg organize_cloud)"/>
|
||||
</include>
|
||||
|
||||
<!-- IMU orientation estimation and publish tf -->
|
||||
<node if="$(arg use_imu)" pkg="nodelet" type="nodelet" name="imu_nodelet_manager" args="manager">
|
||||
<remap from="imu/data_raw" to="$(arg imu_topic)"/>
|
||||
<remap from="imu/data" to="$(arg imu_topic)/filtered"/>
|
||||
</node>
|
||||
<node if="$(arg use_imu)" pkg="nodelet" type="nodelet" name="imu_filter" args="load imu_filter_madgwick/ImuFilterNodelet imu_nodelet_manager">
|
||||
<param name="use_mag" value="false"/>
|
||||
<param name="world_frame" value="enu"/>
|
||||
<param name="publish_tf" value="false"/>
|
||||
</node>
|
||||
<node if="$(arg use_imu)" pkg="nodelet" type="nodelet" name="imu_to_tf" args="load rtabmap_ros/imu_to_tf imu_nodelet_manager">
|
||||
<remap from="imu/data" to="$(arg imu_topic)/filtered"/>
|
||||
<param name="fixed_frame_id" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="base_frame_id" value="$(arg frame_id)"/>
|
||||
</node>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="$(arg scan_topic)"/>
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="deskewing" type="bool" value="$(arg deskewing)"/>
|
||||
<param name="deskewing_slerp" type="bool" value="$(arg slerp)"/>
|
||||
<param name="queue_size" type="int" value="$(arg queue_size_odom)"/>
|
||||
<param name="wait_for_transform_duration" type="double" value="0.2"/>
|
||||
<param if="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="25"/>
|
||||
<param unless="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="15"/>
|
||||
|
||||
<remap if="$(arg use_imu)" from="imu" to="$(arg imu_topic)/filtered"/>
|
||||
<param if="$(arg use_imu)" name="guess_frame_id" type="string" value="$(arg frame_id)_stabilized"/>
|
||||
<param if="$(arg use_imu)" name="wait_imu_to_init" type="bool" value="true"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="$(arg iterations)"/>
|
||||
<param if="$(arg floam)" name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param unless="$(arg floam)" name="Icp/VoxelSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Icp/DownsamplingStep" type="string" value="1"/> <!-- cannot be increased with ring-like lidar -->
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param if="$(arg floam)" name="Icp/PointToPlaneK" type="string" value="0"/>
|
||||
<param unless="$(arg floam)" name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="2"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="$(eval resolution*10)"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.01"/>
|
||||
<param if="$(arg ground_normals_up)" name="Icp/PointToPlaneGroundNormalsUp" type="string" value="0.8"/>
|
||||
|
||||
<!-- Odom parameters -->
|
||||
<param name="Odom/ScanKeyFrameThr" type="string" value="$(arg key_frame_thr)"/>
|
||||
<param if="$(arg floam)" name="Odom/Strategy" type="string" value="11"/>
|
||||
<param unless="$(arg floam)" name="Odom/Strategy" type="string" value="0"/>
|
||||
<param name="OdomF2M/ScanSubtractRadius" type="string" value="$(arg resolution)"/>
|
||||
<param name="OdomF2M/ScanMaxSize" type="string" value="$(arg local_map_size)"/>
|
||||
<param name="OdomLOAM/Sensor" type="string" value="$(arg floam_sensor)"/>
|
||||
<param name="OdomLOAM/Resolution" type="string" value="$(arg resolution)"/>
|
||||
<param if="$(eval not deskewing and scan_20_hz)" name="OdomLOAM/ScanPeriod" type="string" value="0.05"/>
|
||||
<param if="$(eval not deskewing and not scan_20_hz)" name="OdomLOAM/ScanPeriod" type="string" value="0.1"/>
|
||||
<param if="$(arg deskewing)" name="OdomLOAM/ScanPeriod" type="string" value="0"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" output="screen" args="-d">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgb" type="bool" value="false"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<param name="wait_for_transform_duration" type="double" value="0.2"/>
|
||||
|
||||
<remap from="scan_cloud" to="assembled_cloud"/>
|
||||
<remap from="imu" to="$(arg imu_topic)/filtered"/>
|
||||
|
||||
<!-- RTAB-Map's parameters -->
|
||||
<param name="Rtabmap/DetectionRate" type="string" value="1"/>
|
||||
<param name="RGBD/NeighborLinkRefining" type="string" value="false"/>
|
||||
<param name="RGBD/ProximityBySpace" type="string" value="true"/>
|
||||
<param name="RGBD/ProximityMaxGraphDepth" type="string" value="0"/>
|
||||
<param name="RGBD/ProximityPathMaxNeighbors" type="string" value="1"/>
|
||||
<param name="RGBD/AngularUpdate" type="string" value="0.05"/>
|
||||
<param name="RGBD/LinearUpdate" type="string" value="0.05"/>
|
||||
<param name="Mem/NotLinkedNodesKept" type="string" value="false"/>
|
||||
<param name="Mem/STMSize" type="string" value="30"/>
|
||||
<param name="Mem/LaserScanNormalK" type="string" value="20"/>
|
||||
|
||||
<param name="Reg/Strategy" type="string" value="1"/>
|
||||
<param name="Grid/CellSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Grid/RangeMax" type="string" value="$(arg grid_max_range)"/>
|
||||
<param name="Grid/ClusterRadius" type="string" value="1"/>
|
||||
<param name="Grid/GroundIsObstacle" type="string" value="$(arg ground_is_obstacle)"/>
|
||||
<param name="Optimizer/GravitySigma" type="string" value="0.3"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/VoxelSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="$(arg iterations)"/>
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="3"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="$(eval resolution*10)"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="$(arg loop_ratio)"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg rtabmapviz)" name="rtabmapviz" pkg="rtabmap_ros" type="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="scan_cloud" to="odom_filtered_input_scan"/>
|
||||
<remap from="odom_info" to="odom_info"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="point_cloud_assembler" args="standalone rtabmap_ros/point_cloud_assembler" output="screen">
|
||||
<remap if="$(arg deskewing)" from="cloud" to="odom_filtered_input_scan"/>
|
||||
<remap unless="$(arg deskewing)" from="cloud" to="$(arg scan_topic)"/>
|
||||
<remap from="odom" to="odom"/>
|
||||
<param if="$(arg scan_20_hz)" name="max_clouds" type="int" value="20" />
|
||||
<param unless="$(arg scan_20_hz)" name="max_clouds" type="int" value="10" />
|
||||
<param name="fixed_frame_id" type="string" value="" />
|
||||
<param name="queue_size" type="int" value="$(arg queue_size)" />
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,200 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- -->
|
||||
<launch>
|
||||
|
||||
<!--
|
||||
Hand-held 3D lidar mapping example using a Velodyne PUCK, an external IMU and color camera (using D435i as example).
|
||||
Prerequisities: rtabmap should be built with libpointmatcher
|
||||
We use D435i imu only for lidar deskewing and icp_odometry guess in this example.
|
||||
Example:
|
||||
$ roslaunch rtabmap_ros test_velodyne_d435i_deskewing.launch
|
||||
$ rosrun rviz rviz -f map
|
||||
$ Show TF and /rtabmap/cloud_map topics
|
||||
-->
|
||||
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="scan_20_hz" default="false"/> <!-- If we launch the velodyne with "rpm:=1200" argument -->
|
||||
<arg name="deskewing" default="true"/>
|
||||
<arg name="slerp" default="false"/> <!-- If true, a slerp between the first and last time will be used to deskew each point, which is faster than using tf for every point but less accurate -->
|
||||
<arg name="scan_topic" default="/velodyne_points"/>
|
||||
<arg name="use_sim_time" default="false"/>
|
||||
<param if="$(arg use_sim_time)" name="use_sim_time" value="true"/>
|
||||
|
||||
<arg name="imu_topic" default="/camera/imu"/>
|
||||
<arg name="frame_id" default="velodyne"/> <!-- base frame of the robot: for this example, we use velodyne as base frame -->
|
||||
<arg name="queue_size" default="10"/>
|
||||
<arg name="queue_size_odom" default="1"/>
|
||||
<arg name="loop_ratio" default="0.2"/>
|
||||
|
||||
<arg name="resolution" default="0.05"/> <!-- set 0.05-0.3 for indoor, set 0.3-0.5 for outdoor -->
|
||||
<arg name="iterations" default="10"/>
|
||||
|
||||
<!-- Grid parameters -->
|
||||
<arg name="ground_is_obstacle" default="true"/>
|
||||
<arg name="grid_max_range" default="20"/>
|
||||
|
||||
<!-- For F2M Odometry -->
|
||||
<arg name="ground_normals_up" default="false"/> <!-- set to true when velodyne is always horizontal to ground (ground robot, car) -->
|
||||
<arg name="local_map_size" default="15000"/>
|
||||
<arg name="key_frame_thr" default="0.6"/>
|
||||
|
||||
<!-- For FLOAM Odometry -->
|
||||
<arg name="floam" default="false"/> <!-- RTAB-Map should be built with FLOAM http://official-rtab-map-forum.206.s1.nabble.com/icp-odometry-with-LOAM-crash-tp8261p8563.html -->
|
||||
<arg name="floam_sensor" default="0"/> <!-- 0=16 rings (VLP16), 1=32 rings, 2=64 rings -->
|
||||
|
||||
<!-- Static transform between velodyne and D435i: TODO: Adjust with real position/orientation!!! -->
|
||||
<node unless="$(arg use_sim_time)" pkg="tf" type="static_transform_publisher" name="velodyne_to_camera_tf" args="0.03 0.064 -0.055 0 -0.02 0 velodyne camera_link 100"/>
|
||||
|
||||
<!-- Velodyne sensor VLP16 -->
|
||||
<include unless="$(arg use_sim_time)" file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
|
||||
<arg if="$(arg scan_20_hz)" name="rpm" value="1200"/>
|
||||
<arg unless="$(arg scan_20_hz)" name="rpm" value="600"/>
|
||||
<arg name="organize_cloud" value="true"/> <!-- should be organized for deskewing -->
|
||||
</include>
|
||||
|
||||
<!-- D435i -->
|
||||
<group unless="$(arg use_sim_time)">
|
||||
<include file="$(find realsense2_camera)/launch/rs_camera.launch">
|
||||
<arg name="unite_imu_method" value="copy"/>
|
||||
<arg name="enable_gyro" value="true"/>
|
||||
<arg name="enable_accel" value="true"/>
|
||||
</include>
|
||||
</group>
|
||||
|
||||
<!-- IMU orientation estimation and publish tf accordingly to os_sensor frame -->
|
||||
<node pkg="nodelet" type="nodelet" name="imu_nodelet_manager" args="manager">
|
||||
<remap from="imu/data_raw" to="$(arg imu_topic)"/>
|
||||
<remap from="imu/data" to="$(arg imu_topic)/filtered"/>
|
||||
</node>
|
||||
<node pkg="nodelet" type="nodelet" name="imu_filter" args="load imu_filter_madgwick/ImuFilterNodelet imu_nodelet_manager">
|
||||
<param name="use_mag" value="false"/>
|
||||
<param name="world_frame" value="enu"/>
|
||||
<param name="publish_tf" value="false"/>
|
||||
</node>
|
||||
<node pkg="nodelet" type="nodelet" name="imu_to_tf" args="load rtabmap_ros/imu_to_tf imu_nodelet_manager">
|
||||
<remap from="imu/data" to="$(arg imu_topic)/filtered"/>
|
||||
<param name="fixed_frame_id" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="base_frame_id" value="$(arg frame_id)"/>
|
||||
</node>
|
||||
|
||||
<!-- Lidar Deskewing -->
|
||||
<node if="$(arg deskewing)" pkg="nodelet" type="nodelet" name="lidar_deskewing" args="standalone rtabmap_ros/lidar_deskewing" output="screen">
|
||||
<param name="wait_for_transform" value="0.01"/>
|
||||
<param name="fixed_frame_id" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="slerp" value="$(arg slerp)"/>
|
||||
<remap from="input_cloud" to="$(arg scan_topic)"/>
|
||||
</node>
|
||||
|
||||
<arg if="$(arg deskewing)" name="scan_topic_deskewed" default="$(arg scan_topic)/deskewed"/>
|
||||
<arg unless="$(arg deskewing)" name="scan_topic_deskewed" default="$(arg scan_topic)"/>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<remap from="imu" to="$(arg imu_topic)/filtered"/>
|
||||
<param name="guess_frame_id" type="string" value="$(arg frame_id)_stabilized"/>
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="queue_size" type="int" value="$(arg queue_size_odom)"/>
|
||||
<param name="wait_imu_to_init" type="bool" value="true"/>
|
||||
<param name="wait_for_transform_duration" type="double" value="0.2"/>
|
||||
<param if="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="25"/>
|
||||
<param unless="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="15"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="$(arg iterations)"/>
|
||||
<param if="$(arg floam)" name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param unless="$(arg floam)" name="Icp/VoxelSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Icp/DownsamplingStep" type="string" value="1"/> <!-- cannot be increased with ring-like lidar -->
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param if="$(arg floam)" name="Icp/PointToPlaneK" type="string" value="0"/>
|
||||
<param unless="$(arg floam)" name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="2"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="$(eval resolution*10)"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.01"/>
|
||||
<param if="$(arg ground_normals_up)" name="Icp/PointToPlaneGroundNormalsUp" type="string" value="0.8"/>
|
||||
|
||||
<!-- Odom parameters -->
|
||||
<param name="Odom/ScanKeyFrameThr" type="string" value="$(arg key_frame_thr)"/>
|
||||
<param if="$(arg floam)" name="Odom/Strategy" type="string" value="11"/>
|
||||
<param unless="$(arg floam)" name="Odom/Strategy" type="string" value="0"/>
|
||||
<param name="OdomF2M/ScanSubtractRadius" type="string" value="$(arg resolution)"/>
|
||||
<param name="OdomF2M/ScanMaxSize" type="string" value="$(arg local_map_size)"/>
|
||||
<param name="OdomLOAM/Sensor" type="string" value="$(arg floam_sensor)"/>
|
||||
<param name="OdomLOAM/Resolution" type="string" value="$(arg resolution)"/>
|
||||
<param if="$(eval not deskewing and scan_20_hz)" name="OdomLOAM/ScanPeriod" type="string" value="0.05"/>
|
||||
<param if="$(eval not deskewing and not scan_20_hz)" name="OdomLOAM/ScanPeriod" type="string" value="0.1"/>
|
||||
<param if="$(arg deskewing)" name="OdomLOAM/ScanPeriod" type="string" value="0"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" output="screen" args="-d">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgb" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="true"/>
|
||||
<param name="wait_for_transform_duration" type="double" value="0.2"/>
|
||||
|
||||
<remap from="scan_cloud" to="assembled_cloud"/>
|
||||
<remap from="rgb/image" to="/camera/color/image_raw"/>
|
||||
<remap from="rgb/camera_info" to="/camera/color/camera_info"/>
|
||||
<remap from="imu" to="$(arg imu_topic)/filtered"/>
|
||||
|
||||
<!-- RTAB-Map's parameters -->
|
||||
<param name="Rtabmap/DetectionRate" type="string" value="1"/>
|
||||
<param name="RGBD/NeighborLinkRefining" type="string" value="false"/>
|
||||
<param name="RGBD/ProximityBySpace" type="string" value="true"/>
|
||||
<param name="RGBD/ProximityMaxGraphDepth" type="string" value="0"/>
|
||||
<param name="RGBD/ProximityPathMaxNeighbors" type="string" value="1"/>
|
||||
<param name="RGBD/AngularUpdate" type="string" value="0.05"/>
|
||||
<param name="RGBD/LinearUpdate" type="string" value="0.05"/>
|
||||
<param name="Mem/NotLinkedNodesKept" type="string" value="false"/>
|
||||
<param name="Mem/STMSize" type="string" value="30"/>
|
||||
<param name="Mem/LaserScanNormalK" type="string" value="20"/>
|
||||
|
||||
<param name="Reg/Strategy" type="string" value="1"/>
|
||||
<param name="Grid/CellSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Grid/RangeMax" type="string" value="$(arg grid_max_range)"/>
|
||||
<param name="Grid/ClusterRadius" type="string" value="1"/>
|
||||
<param name="Grid/GroundIsObstacle" type="string" value="$(arg ground_is_obstacle)"/>
|
||||
<param name="Optimizer/GravitySigma" type="string" value="0.3"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/VoxelSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="$(arg iterations)"/>
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="3"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="$(eval resolution*10)"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="$(arg loop_ratio)"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg rtabmapviz)" name="rtabmapviz" pkg="rtabmap_ros" type="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="scan_cloud" to="odom_filtered_input_scan"/>
|
||||
<remap from="odom_info" to="odom_info"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="point_cloud_assembler" args="standalone rtabmap_ros/point_cloud_assembler" output="screen">
|
||||
<remap from="cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<remap from="odom" to="odom"/>
|
||||
<param if="$(arg scan_20_hz)" name="max_clouds" type="int" value="20" />
|
||||
<param unless="$(arg scan_20_hz)" name="max_clouds" type="int" value="10" />
|
||||
<param name="fixed_frame_id" type="string" value="" />
|
||||
<param name="queue_size" type="int" value="$(arg queue_size)" />
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
@@ -0,0 +1,185 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- -->
|
||||
<launch>
|
||||
|
||||
<!--
|
||||
Hand-held 3D lidar mapping example using only a Velodyne PUCK and external odometry (using t265 as example).
|
||||
Prerequisities: rtabmap should be built with libpointmatcher
|
||||
We use T265 only for lidar deskewing and icp_odometry guess in this example.
|
||||
Example:
|
||||
$ roslaunch rtabmap_ros test_velodyne_t265_deskewing.launch
|
||||
$ rosrun rviz rviz -f map
|
||||
$ Show TF and /rtabmap/cloud_map topics
|
||||
-->
|
||||
|
||||
<arg name="rtabmapviz" default="true"/>
|
||||
<arg name="scan_20_hz" default="false"/> <!-- If we launch the velodyne with "rpm:=1200" argument -->
|
||||
<arg name="deskewing" default="true"/>
|
||||
<arg name="slerp" default="false"/> <!-- If true, a slerp between the first and last time will be used to deskew each point, which is faster than using tf for every point but less accurate -->
|
||||
<arg name="scan_topic" default="/velodyne_points"/>
|
||||
<arg name="use_sim_time" default="false"/>
|
||||
<param if="$(arg use_sim_time)" name="use_sim_time" value="true"/>
|
||||
|
||||
<arg name="odom_frame_id" default="t265_odom_frame"/> <!-- input odometry: here we use T265 odometry, but it could be wheel odometry -->
|
||||
<arg name="frame_id" default="velodyne"/> <!-- base frame of the robot: for this example, we use velodyne as base frame -->
|
||||
<arg name="queue_size" default="10"/>
|
||||
<arg name="queue_size_odom" default="1"/>
|
||||
<arg name="loop_ratio" default="0.2"/>
|
||||
|
||||
<arg name="resolution" default="0.05"/> <!-- set 0.05-0.3 for indoor, set 0.3-0.5 for outdoor -->
|
||||
<arg name="iterations" default="10"/>
|
||||
|
||||
<!-- Grid parameters -->
|
||||
<arg name="ground_is_obstacle" default="true"/>
|
||||
<arg name="grid_max_range" default="20"/>
|
||||
|
||||
<!-- For F2M Odometry -->
|
||||
<arg name="ground_normals_up" default="false"/> <!-- set to true when velodyne is always horizontal to ground (ground robot, car) -->
|
||||
<arg name="local_map_size" default="15000"/>
|
||||
<arg name="key_frame_thr" default="0.6"/>
|
||||
|
||||
<!-- For FLOAM Odometry -->
|
||||
<arg name="floam" default="false"/> <!-- RTAB-Map should be built with FLOAM http://official-rtab-map-forum.206.s1.nabble.com/icp-odometry-with-LOAM-crash-tp8261p8563.html -->
|
||||
<arg name="floam_sensor" default="0"/> <!-- 0=16 rings (VLP16), 1=32 rings, 2=64 rings -->
|
||||
|
||||
<!-- Static transform between velodyne and T265: TODO: Adjust with real position/orientation!!! -->
|
||||
<node unless="$(arg use_sim_time)" pkg="tf" type="static_transform_publisher" name="T265_to_velodyne_tf" args="-0.01 0 0.055 0 0 0 t265_link velodyne 100"/>
|
||||
|
||||
<!-- Velodyne sensor VLP16 -->
|
||||
<include unless="$(arg use_sim_time)" file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
|
||||
<arg if="$(arg scan_20_hz)" name="rpm" value="1200"/>
|
||||
<arg unless="$(arg scan_20_hz)" name="rpm" value="600"/>
|
||||
<arg name="organize_cloud" value="true"/> <!-- should be organized for deskewing -->
|
||||
</include>
|
||||
|
||||
<!-- T265 -->
|
||||
<group unless="$(arg use_sim_time)" ns="t265">
|
||||
<include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
|
||||
<arg name="device_type" value="t265"/>
|
||||
<arg name="serial_no" value=""/>
|
||||
<arg name="tf_prefix" value="t265"/>
|
||||
<arg name="initial_reset" value="false"/>
|
||||
<arg name="enable_fisheye1" value="false"/>
|
||||
<arg name="enable_fisheye2" value="false"/>
|
||||
<arg name="topic_odom_in" value=""/>
|
||||
<arg name="calib_odom_file" value=""/>
|
||||
<arg name="enable_pose" value="true"/>
|
||||
</include>
|
||||
</group>
|
||||
|
||||
<!-- Lidar Deskewing -->
|
||||
<node if="$(arg deskewing)" pkg="nodelet" type="nodelet" name="lidar_deskewing" args="standalone rtabmap_ros/lidar_deskewing" output="screen">
|
||||
<param name="wait_for_transform" value="0.01"/>
|
||||
<param name="fixed_frame_id" value="$(arg odom_frame_id)"/>
|
||||
<param name="slerp" value="$(arg slerp)"/>
|
||||
<remap from="input_cloud" to="$(arg scan_topic)"/>
|
||||
</node>
|
||||
|
||||
<arg if="$(arg deskewing)" name="scan_topic_deskewed" default="$(arg scan_topic)/deskewed"/>
|
||||
<arg unless="$(arg deskewing)" name="scan_topic_deskewed" default="$(arg scan_topic)"/>
|
||||
|
||||
<group ns="rtabmap">
|
||||
<node pkg="rtabmap_ros" type="icp_odometry" name="icp_odometry" output="screen">
|
||||
<remap from="scan_cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<param name="guess_frame_id" type="string" value="$(arg odom_frame_id)"/>
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="queue_size" type="int" value="$(arg queue_size_odom)"/>
|
||||
<param name="wait_for_transform_duration" type="double" value="0.2"/>
|
||||
<param if="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="25"/>
|
||||
<param unless="$(arg scan_20_hz)" name="expected_update_rate" type="double" value="15"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="$(arg iterations)"/>
|
||||
<param if="$(arg floam)" name="Icp/VoxelSize" type="string" value="0"/>
|
||||
<param unless="$(arg floam)" name="Icp/VoxelSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Icp/DownsamplingStep" type="string" value="1"/> <!-- cannot be increased with ring-like lidar -->
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param if="$(arg floam)" name="Icp/PointToPlaneK" type="string" value="0"/>
|
||||
<param unless="$(arg floam)" name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="2"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="$(eval resolution*10)"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="0.01"/>
|
||||
<param if="$(arg ground_normals_up)" name="Icp/PointToPlaneGroundNormalsUp" type="string" value="0.8"/>
|
||||
|
||||
<!-- Odom parameters -->
|
||||
<param name="Odom/ScanKeyFrameThr" type="string" value="$(arg key_frame_thr)"/>
|
||||
<param if="$(arg floam)" name="Odom/Strategy" type="string" value="11"/>
|
||||
<param unless="$(arg floam)" name="Odom/Strategy" type="string" value="0"/>
|
||||
<param name="OdomF2M/ScanSubtractRadius" type="string" value="$(arg resolution)"/>
|
||||
<param name="OdomF2M/ScanMaxSize" type="string" value="$(arg local_map_size)"/>
|
||||
<param name="OdomLOAM/Sensor" type="string" value="$(arg floam_sensor)"/>
|
||||
<param name="OdomLOAM/Resolution" type="string" value="$(arg resolution)"/>
|
||||
<param if="$(eval not deskewing and scan_20_hz)" name="OdomLOAM/ScanPeriod" type="string" value="0.05"/>
|
||||
<param if="$(eval not deskewing and not scan_20_hz)" name="OdomLOAM/ScanPeriod" type="string" value="0.1"/>
|
||||
<param if="$(arg deskewing)" name="OdomLOAM/ScanPeriod" type="string" value="0"/>
|
||||
</node>
|
||||
|
||||
<node pkg="rtabmap_ros" type="rtabmap" name="rtabmap" output="screen" args="-d">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="subscribe_depth" type="bool" value="false"/>
|
||||
<param name="subscribe_rgb" type="bool" value="false"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<param name="wait_for_transform_duration" type="double" value="0.2"/>
|
||||
|
||||
<remap from="scan_cloud" to="assembled_cloud"/>
|
||||
|
||||
<!-- RTAB-Map's parameters -->
|
||||
<param name="Rtabmap/DetectionRate" type="string" value="1"/>
|
||||
<param name="RGBD/NeighborLinkRefining" type="string" value="false"/>
|
||||
<param name="RGBD/ProximityBySpace" type="string" value="true"/>
|
||||
<param name="RGBD/ProximityMaxGraphDepth" type="string" value="0"/>
|
||||
<param name="RGBD/ProximityPathMaxNeighbors" type="string" value="1"/>
|
||||
<param name="RGBD/AngularUpdate" type="string" value="0.05"/>
|
||||
<param name="RGBD/LinearUpdate" type="string" value="0.05"/>
|
||||
<param name="Mem/NotLinkedNodesKept" type="string" value="false"/>
|
||||
<param name="Mem/STMSize" type="string" value="30"/>
|
||||
<param name="Mem/LaserScanNormalK" type="string" value="20"/>
|
||||
|
||||
<param name="Reg/Strategy" type="string" value="1"/>
|
||||
<param name="Grid/CellSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Grid/RangeMax" type="string" value="$(arg grid_max_range)"/>
|
||||
<param name="Grid/ClusterRadius" type="string" value="1"/>
|
||||
<param name="Grid/GroundIsObstacle" type="string" value="$(arg ground_is_obstacle)"/>
|
||||
<param name="Optimizer/GravitySigma" type="string" value="0.3"/>
|
||||
|
||||
<!-- ICP parameters -->
|
||||
<param name="Icp/VoxelSize" type="string" value="$(arg resolution)"/>
|
||||
<param name="Icp/PointToPlaneK" type="string" value="20"/>
|
||||
<param name="Icp/PointToPlaneRadius" type="string" value="0"/>
|
||||
<param name="Icp/PointToPlane" type="string" value="true"/>
|
||||
<param name="Icp/Iterations" type="string" value="$(arg iterations)"/>
|
||||
<param name="Icp/Epsilon" type="string" value="0.001"/>
|
||||
<param name="Icp/MaxTranslation" type="string" value="3"/>
|
||||
<param name="Icp/MaxCorrespondenceDistance" type="string" value="$(eval resolution*10)"/>
|
||||
<param name="Icp/PM" type="string" value="true"/>
|
||||
<param name="Icp/PMOutlierRatio" type="string" value="0.7"/>
|
||||
<param name="Icp/CorrespondenceRatio" type="string" value="$(arg loop_ratio)"/>
|
||||
</node>
|
||||
|
||||
<node if="$(arg rtabmapviz)" name="rtabmapviz" pkg="rtabmap_ros" type="rtabmapviz" output="screen">
|
||||
<param name="frame_id" type="string" value="$(arg frame_id)"/>
|
||||
<param name="odom_frame_id" type="string" value="odom"/>
|
||||
<param name="subscribe_odom_info" type="bool" value="true"/>
|
||||
<param name="subscribe_scan_cloud" type="bool" value="true"/>
|
||||
<param name="approx_sync" type="bool" value="false"/>
|
||||
<remap from="scan_cloud" to="odom_filtered_input_scan"/>
|
||||
<remap from="odom_info" to="odom_info"/>
|
||||
</node>
|
||||
|
||||
<node pkg="nodelet" type="nodelet" name="point_cloud_assembler" args="standalone rtabmap_ros/point_cloud_assembler" output="screen">
|
||||
<remap from="cloud" to="$(arg scan_topic_deskewed)"/>
|
||||
<remap from="odom" to="odom"/>
|
||||
<param if="$(arg scan_20_hz)" name="max_clouds" type="int" value="20" />
|
||||
<param unless="$(arg scan_20_hz)" name="max_clouds" type="int" value="10" />
|
||||
<param name="fixed_frame_id" type="string" value="" />
|
||||
<param name="queue_size" type="int" value="$(arg queue_size)" />
|
||||
</node>
|
||||
</group>
|
||||
|
||||
</launch>
|
||||
Reference in New Issue
Block a user