Trying to achieve multiple turtlebot3 where each robot generates a map with rtab-map

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Trying to achieve multiple turtlebot3 where each robot generates a map with rtab-map

gabriele97
Hello,
I am relatively new to ROS and what I am trying to achieve as final goal is a system where I have multiple turtlebot3 that map a 3D world.

I am trying with RTAB-MAP but unsuccessfully for now.

My launch file is the following:
<launch>
  <!-- Arguments -->
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <arg name="first_tb3"  default="tb3_0"/>
  <arg name="second_tb3" default="tb3_1"/>
  <arg name="known_initial_pos" default="true"/>

  <arg name="first_tb3_x_pos" default="-10"/> <!-- Defaul -7.0-->
  <arg name="first_tb3_y_pos" default=" -2"/> <!-- Default -1.0-->

  <arg name="second_tb3_x_pos" default=" 4.0"/> <!-- Default 7.0-->
  <arg name="second_tb3_y_pos" default=" 2.0"/> <!-- Default -1.0-->

  <!-- Run the map expansion node -->
  <node pkg="multi_robot_exploration" type="map_node" name="multi_robot_exploration_map_node"/>

  <!-- Open two tb in gazebo and give spawn positions -->
  <include file="$(find multi_robot_exploration)/launch/spawn_robots.launch">
    <arg name="first_tb3_x_pos" value="$(arg first_tb3_x_pos)"/>
    <arg name="first_tb3_y_pos" value="$(arg first_tb3_y_pos)"/>

    <arg name="second_tb3_x_pos" value="$(arg second_tb3_x_pos)"/>
    <arg name="second_tb3_y_pos" value="$(arg second_tb3_y_pos)"/>
  </include>

  <!-- Open slam for each robot in their ns -->
  <include file = "$(find multi_robot_exploration)/launch/slam_online_synch.launch">
    <arg name="ns"  value="$(arg first_tb3)"/>
  </include>
  
  <include file = "$(find multi_robot_exploration)/launch/slam_online_synch.launch">
    <arg name="ns"  value="$(arg second_tb3)"/>
  </include>

  <!-- Merge the two robot maps -->
  <include file="$(find multi_robot_exploration)/launch/multi_robot_map_merge.launch">
    <arg name="known_initial_pos" value="$(arg known_initial_pos)"/>
  </include>

  <!-- Open rviz for two robots -->
  <node pkg="rviz" type="rviz" name="rviz"
    args="-d $(find multi_robot_exploration)/config/two_tb.rviz"/>
</launch>

and spawn_robots.launch is:

<launch>

  <!-- Initial position for the first turtlebot -->
  <arg name="first_tb3_x_pos" default="-7.0"/> <!-- Between -7.0 and 7.0 ???-->
  <arg name="first_tb3_y_pos" default=" -1.0"/> <!-- Between -7.0 and 7.0 ???-->

  <!-- Initial position for the second turtlebot -->
  <arg name="second_tb3_x_pos" default=" 7.0"/> <!-- Between -7.0 and 7.0 ???-->
  <arg name="second_tb3_y_pos" default=" -1.0"/> <!-- Between -7.0 and 7.0 ???-->

  <!-- Combine the inital positions into one argument for spawning -->
  <arg name="init_pose_0" default="-x $(arg first_tb3_x_pos) -y $(arg first_tb3_y_pos) -z 0.0" />
  <arg name="init_pose_1" default="-x $(arg second_tb3_x_pos) -y $(arg second_tb3_y_pos) -z 0.0" />

  <!-- Open the AWS bookstore gazebo world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <!-- <arg name="world_name" value="$(find multi_robot_exploration)/worlds/bookstore.world"/> -->
    <!-- <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/empty.world" /> -->
    <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/turtlebot3_world.world" />
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include> 

  <!-- Spawn tb3_0 and start it's robot descirption / robot state publisher -->
  <group ns="tb3_0">
    <param name="tf_prefix" value="tb3_0" />
    <include file="$(find multi_robot_exploration)/launch/tb3_0.launch" >
      <arg name="init_pose" value="$(arg init_pose_0)"/>
      <arg name="robot_name"  value="tb3_0" />
      <arg name="model" default="$(env TURTLEBOT3_MODEL)" />
    </include>


	<arg name="database_path" default="~/.ros/rtabmap.db" />

	<node name="rtabmap" pkg="rtabmap_slam" type="rtabmap" output="screen">
		<param name="databse_path" type="string" value="$(arg database_path)" />
		<param name="frame_id" type="string" value="tb3_0/base_link" />
		<param name="odom_frame_id" type="string" value="odom" />
		<param name="subscribe_depth" type="bool" value="true" />
		<param name="subscribe_laserScan" type="bool" value="false" />

		<remap from="rgb/image" to="camera/rgb/image_raw" />
		<remap from="depth/image" to="camera/depth/image_raw" />
		<remap from="rgb/camera_info" to="camera/rgb/camera_info" />
		<remap from="grid_map" to="map" />

		<param name="RGBD/ProximityBySpace" type="string" value="true"/>
		<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>
		<param name="Kp/MaxDepth" type="string" value="4.0"/>
		<param name="Reg/Strategy" type="string" value="2"/>
		<param name="Icp/CorrespondenceRatio" type="string" value="0.3"/>
		<param name="Vis/MinInliers" type="string" value="5"/>
		<param name="Vis/InlierDistance" type="string" value="0.1"/>
		<param name="RGBD/AngularUpdate" type="string" value="0.1"/>
		<param name="RGBD/LinearUpdate" type="string" value="0.1"/>
		<param name="Rtabmap/TimeThr" type="string" value="700"/>
		<param name="Mem/RehearsalSimilarity" type="string" value="0.30"/>
	</node>
    
  </group>

  <!-- Spawn tb3_1 and start it's robot descirption / robot state publisher -->
  <group ns="tb3_1">
    <param name="tf_prefix" value="tb3_1" />
    <include file="$(find multi_robot_exploration)/launch/tb3_1.launch" >
      <arg name="init_pose" value="$(arg init_pose_1)"/>
      <arg name="robot_name"  value="tb3_1" />
      <arg name="model" default="$(env TURTLEBOT3_MODEL)" />
    </include>
  </group>

</launch>

The error I see is

[ WARN] [1719348537.260067020, 61.759000000]: Could not get transform from tb3_0/base_link to base_footprint after 0.200000 seconds (for stamp=61.298000)! Error="canTransform: source_frame base_footprint does not exist.. canTransform returned after 0.2 timeout was 0.2.".

I don't knwo what I am doint wrong, hope you can help me. Thank you!
Reply | Threaded
Open this post in threaded view
|

Re: Trying to achieve multiple turtlebot3 where each robot generates a map with rtab-map

matlabbe
Administrator
Do you have also a rtabmap node for tb3_1? Not sure who is asking for base_footprint. Is odometry publishing from odom to base_footprint?

Otherwise, you may want to set a differnt database name for each robot. You also need to set a different map_frame_id for each robot. The "odom" frame you are using would need to be unique for each robot, like "tb3_0/odom" and "tb3_1/odom" frames.
	<node name="rtabmap" pkg="rtabmap_slam" type="rtabmap" output="screen">
		<param name="databse_path" type="string" value="~/.ros/map_tb3_0.db" />
		<param name="frame_id" type="string" value="tb3_0/base_link" />
		<param name="odom_frame_id" type="string" value="tb3_0/odom" />
		<param name="map_frame_id" type="string" value="tb3_0/map" />
		...

	</node>

cheers,
Mathieu
Reply | Threaded
Open this post in threaded view
|

Re: Trying to achieve multiple turtlebot3 where each robot generates a map with rtab-map

gabriele97
Thank you for your answer.

I tried to set a different db name for each robot, specifying a different map_Frame_id and odom but it doesn't work. The second database is not created and from RVIZ I don't see anything.

This is the launch file:
<launch>

  <!-- Initial position for the first turtlebot -->
  <arg name="first_tb3_x_pos" default="-7.0"/> <!-- Between -7.0 and 7.0 ???-->
  <arg name="first_tb3_y_pos" default=" -1.0"/> <!-- Between -7.0 and 7.0 ???-->

  <!-- Initial position for the second turtlebot -->
  <arg name="second_tb3_x_pos" default=" 7.0"/> <!-- Between -7.0 and 7.0 ???-->
  <arg name="second_tb3_y_pos" default=" -1.0"/> <!-- Between -7.0 and 7.0 ???-->

  <!-- Combine the inital positions into one argument for spawning -->
  <arg name="init_pose_0" default="-x $(arg first_tb3_x_pos) -y $(arg first_tb3_y_pos) -z 0.0" />
  <arg name="init_pose_1" default="-x $(arg second_tb3_x_pos) -y $(arg second_tb3_y_pos) -z 0.0" />

  <!-- Open the AWS bookstore gazebo world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find multi_robot_exploration)/worlds/trying3.world"/>
    <!-- <arg name="world_name" value="$(find multi_robot_exploration)/worlds/bookstore.world"/> -->
    <!-- <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/empty.world" /> -->
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include> 

  <!-- Spawn tb3_0 and start it's robot descirption / robot state publisher -->
  <group ns="tb3_0">
    <param name="tf_prefix" value="tb3_0" />
    <include file="$(find multi_robot_exploration)/launch/tb3_0.launch" >
      <arg name="init_pose" value="$(arg init_pose_0)"/>
      <arg name="robot_name"  value="tb3_0" />
      <arg name="model" default="$(env TURTLEBOT3_MODEL)" />
    </include>

	<!-- <arg name="database_path" default="~/.ros/rtabmap.db" /> -->

	<node name="rtabmap" pkg="rtabmap_slam" type="rtabmap" output="screen">
		<param name="databse_path" type="string" value="~/.ros/rtabmap.db" />
		<param name="frame_id" type="string" value="tb3_0/base_link" />
		<param name="odom_frame_id" type="string" value="tb3_0/odom" />
		<param name="map_frame_id" type="string" value="tb3_0/map" />
		<param name="subscribe_depth" type="bool" value="true" />
		<param name="subscribe_laserScan" type="bool" value="false" />

		<remap from="rgb/image" to="camera/rgb/image_raw" />
		<remap from="depth/image" to="camera/depth/image_raw" />
		<remap from="rgb/camera_info" to="camera/rgb/camera_info" />
		<!-- <remap from="grid_map" to="gridgrid_map" /> -->
		<remap from="grid_map" to="map" />

		<param name="RGBD/ProximityBySpace" type="string" value="true"/>
		<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>
		<param name="Kp/MaxDepth" type="string" value="4.0"/>
		<param name="Reg/Strategy" type="string" value="2"/>
		<param name="Icp/CorrespondenceRatio" type="string" value="0.3"/>
		<param name="Vis/MinInliers" type="string" value="5"/>
		<param name="Vis/InlierDistance" type="string" value="0.1"/>
		<param name="RGBD/AngularUpdate" type="string" value="0.1"/>
		<param name="RGBD/LinearUpdate" type="string" value="0.1"/>
		<param name="Rtabmap/TimeThr" type="string" value="700"/>
		<param name="Mem/RehearsalSimilarity" type="string" value="0.30"/>
	</node>

  </group>

  <!-- Spawn tb3_1 and start it's robot descirption / robot state publisher -->
  <group ns="tb3_1">
    <param name="tf_prefix" value="tb3_1" />
    <include file="$(find multi_robot_exploration)/launch/tb3_1.launch" >
      <arg name="init_pose" value="$(arg init_pose_1)"/>
      <arg name="robot_name"  value="tb3_1" />
      <arg name="model" default="$(env TURTLEBOT3_MODEL)" />
    </include>

	<!-- <arg name="database_path" default="~/.ros/rtabmap2.db" /> -->

	<node name="rtabmap" pkg="rtabmap_slam" type="rtabmap" output="screen">
		<param name="databse_path" type="string" value="~/.ros/rtabmap2.db" />
		<param name="frame_id" type="string" value="tb3_1/base_link" />
		<param name="odom_frame_id" type="string" value="tb3_1/odom" />
		<param name="map_frame_id" type="string" value="tb3_1/map" />
		<param name="subscribe_depth" type="bool" value="true" />
		<param name="subscribe_laserScan" type="bool" value="false" />

		<remap from="rgb/image" to="camera/rgb/image_raw" />
		<remap from="depth/image" to="camera/depth/image_raw" />
		<remap from="rgb/camera_info" to="camera/rgb/camera_info" />
		<remap from="grid_map" to="map" />

		<param name="RGBD/ProximityBySpace" type="string" value="true"/>
		<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>
		<param name="Kp/MaxDepth" type="string" value="4.0"/>
		<param name="Reg/Strategy" type="string" value="2"/>
		<param name="Icp/CorrespondenceRatio" type="string" value="0.3"/>
		<param name="Vis/MinInliers" type="string" value="5"/>
		<param name="Vis/InlierDistance" type="string" value="0.1"/>
		<param name="RGBD/AngularUpdate" type="string" value="0.1"/>
		<param name="RGBD/LinearUpdate" type="string" value="0.1"/>
		<param name="Rtabmap/TimeThr" type="string" value="700"/>
		<param name="Mem/RehearsalSimilarity" type="string" value="0.30"/>
	</node>

  </group>

</launch>





If you want I can share the project with you so that you can see better what is happening and what I can improve. Thank you!
Reply | Threaded
Open this post in threaded view
|

Re: Trying to achieve multiple turtlebot3 where each robot generates a map with rtab-map

matlabbe
Administrator
Is the project on github? or is that only a launch file using default turtlebot3 stuff?

Not sure why the second database is not created. Are there warnings/errors in terminal? Is the node running?