Robotics StackExchange | Archived questions

Controlling Two different robots in Gazebo

Hello, I am having this strange issue in gazebo where I can spawn two robots, each with its own namespace, but I can only control one of them.

Here are the list of topics:

/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/ns1/achieveddrone/imu
/ns1/camera_info
/ns1/cmd_vel
/ns1/drone/down_camera/image_raw
/ns1/drone/gt_acc
/ns1/drone/gt_pose
/ns1/drone/gt_vel
/ns1/drone/imu
/ns1/drone/land
/ns1/drone/posctrl
/ns1/drone/reset
/ns1/drone/sonar
/ns1/drone/takeoff
/ns1/drone/vel_mode
/ns2/achieveddrone/imu
/ns2/camera_info
/ns2/cmd_vel
/ns2/drone/down_camera/image_raw
/ns2/drone/gt_acc
/ns2/drone/gt_pose
/ns2/drone/gt_vel
/ns2/drone/imu
/ns2/drone/land
/ns2/drone/posctrl
/ns2/drone/reset
/ns2/drone/sonar
/ns2/drone/takeoff
/ns2/drone/vel_mode
/rosout
/rosout_agg

As you can see, each drone has its own namespace. When I execute:

rostopic pub /ns2/drone/takeoff std_msgs/Empty '{}'

drone2 was able to take off. However, if I then execute:

rostopic pub /ns1/drone/takeoff std_msgs/Empty '{}'

Instead of drone1 taking off, drone2 will continue flying up. Meanwhile, drone1 will not move.

Here is my launch file:

<launch>

  <arg name="paused" value="false"/>
  <arg name="use_sim_time" value="true"/>
  <arg name="gui" default="false"/>
  <arg name="headless" value="false"/>
  <arg name="debug" value="false"/>
  <arg name="world_name" default="$(find sjtu_drone)/worlds/contest.world"/>

  <!-- start gzserver and load the map -->
  <node name="gazebo" pkg="sjtu_drone" type="start_gzserver" args="$(arg world_name)" respawn="false"/>

<!-- start gzclient -->
  <node name="gui" pkg="sjtu_drone" type="start_gui" args="$(arg world_name)" respawn="false"/>

    <group ns="ns1">
        <arg name="robot_name" value="sjtu_drone" />
        <arg name="x" value="0.0" />
        <arg name="y" value="0.0" />
        <arg name="z" value="1.0" />
        <arg name="roll" value="0"/>
        <arg name="pitch" value="0"/>
        <arg name="yaw" value="0.0" />
        <arg name="sdf_robot_file" value="$(find sjtu_drone)/models/sjtu_drone/sjtu_drone.sdf" />
        <node name="$(arg robot_name)_spawn_urdf" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
            args="-file $(arg sdf_robot_file) -sdf -x $(arg x) -y $(arg y) -z $(arg z)  -R $(arg roll) -P $(arg pitch) -Y $(arg yaw) -model $(arg robot_name)"/>
    </group>

    <group ns="ns2">
        <arg name="robot_name" value="sjtu_drone1" />
        <arg name="x" value="1.0" />
        <arg name="y" value="1.0" />
        <arg name="z" value="1.0" />
        <arg name="roll" value="0"/>
        <arg name="pitch" value="0"/>
        <arg name="yaw" value="0.0" />
        <arg name="sdf_robot_file" value="$(find sjtu_drone)/models/sjtu_drone/sjtu_drone.sdf" />
        <node name="$(arg robot_name)_spawn_urdf" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
            args="-file $(arg sdf_robot_file) -sdf -x $(arg x) -y $(arg y) -z $(arg z)  -R $(arg roll) -P $(arg pitch) -Y $(arg yaw) -model $(arg robot_name)"/>
    </group>

Same thing happens to drone1 if it is the one takeoff first. What went wrong here? Why can't I control them both?

Asked by Kolohe113 on 2021-06-07 13:28:42 UTC

Comments

Answers