Ask Your Question
1

Fail to control two husky robots in Gazebo

asked 2016-02-09 17:44:44 -0500

Devin gravatar image

updated 2016-02-10 12:49:00 -0500

I want to control two husky robots in Gazebo but only one of them can be controled. launch file 1:

<?xml version="1.0"?>

<launch>

  <arg name="world_name" default="worlds/empty.world"/>

  <arg name="laser_enabled" default="true"/>
  <arg name="ur5_enabled" default="false"/>
  <arg name="kinect_enabled" default="false"/>


  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(arg world_name)"/> <!-- world_name is wrt GAZEBO_RESOURCE_PATH environment variable -->
    <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>

<group ns="husky1">
    <param name="tf_prefix" value="husky1_tf" /> 
    <include file="$(find husky_gazebo)/launch/spawn_huskys.launch">
      <arg name="laser_enabled" value="$(arg laser_enabled)"/>
      <arg name="ur5_enabled" value="$(arg ur5_enabled)"/>
      <arg name="kinect_enabled" value="$(arg kinect_enabled)"/>
      <arg name="x" value="1.0"/>
      <arg name="y" value="-1.0"/>
      <arg name="robotNamespace" value="husky1"/>
      <arg name="model" value="husky1"/>
    </include>
  </group>

  <group ns="husky2">
    <param name="tf_prefix" value="husky2_tf" /> 
    <include file="$(find husky_gazebo)/launch/spawn_huskys.launch">
      <arg name="laser_enabled" value="$(arg laser_enabled)"/>
      <arg name="ur5_enabled" value="$(arg ur5_enabled)"/>
      <arg name="kinect_enabled" value="$(arg kinect_enabled)"/>
      <arg name="x" value="-3.0"/>
      <arg name="y" value="-1.0"/>
      <arg name="robotNamespace" value="husky2"/>
      <arg name="model" value="husky2"/>
    </include>
  </group>

</launch>

another launch file:

<?xml version="1.0"?>
<launch>

  <arg name="laser_enabled" default="true"/>
  <arg name="ur5_enabled" default="false"/>
  <arg name="kinect_enabled" default="false"/>
 <!-- Robot pose -->

  <arg name="x" default="10"/>
  <arg name="y" default="10"/>
  <arg name="z" default="0"/>
  <arg name="roll" default="0"/>
  <arg name="pitch" default="0"/>
  <arg name="yaw" default="0"/>
  <arg name="model" default="husky"/>
  <arg name="robotNamespace" default="husky"/>
  <param name="robot_description" command="$(find xacro)/xacro.py '$(env HUSKY_GAZEBO_DESCRIPTION)'
    laser_enabled:=$(arg laser_enabled)
    ur5_enabled:=$(arg ur5_enabled)
    kinect_enabled:=$(arg kinect_enabled)
    " />

  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

  <!-- Load Husky control information -->
  <include file="$(find husky_control)/launch/control.launch"/>

  <!-- Include ros_control configuration for ur5, only used in simulation -->
  <group if="$(arg ur5_enabled)">

    <!-- Load UR5 controllers -->
    <rosparam command="load" file="$(find husky_control)/config/control_ur5.yaml" />
    <node name="arm_controller_spawner" pkg="controller_manager" type="spawner" args="arm_controller --shutdown-timeout 3"/>

    <!-- Fake Calibration -->
    <node pkg="rostopic" type="rostopic" name="fake_joint_calibration" args="pub calibrated std_msgs/Bool true" />

    <!-- Stow the arm -->
    <node pkg="husky_control" type="stow_ur5" name="stow_ur5"/>

  </group>

  <group if="$(arg kinect_enabled)">

    <!-- Include poincloud_to_laserscan if simulated Kinect is attached -->
    <node pkg="pointcloud_to_laserscan" type="pointcloud_to_laserscan_node" name="pointcloud_to_laserscan" output="screen">

        <remap from="cloud_in" to="camera/depth/points"/>
        <remap from="scan" to="camera/scan"/>
        <rosparam>
            target_frame: base_link # Leave empty to output scan in the pointcloud frame
            tolerance: 1.0
            min_height: 0.05
            max_height: 1.0

            angle_min: -0.52 # -30.0*M_PI/180.0
            angle_max: 0.52 # 30.0*M_PI/180.0
            angle_increment: 0.005 # M_PI/360.0
            scan_time: 0.3333
            range_min: 0.45
            range_max: 4.0
            use_inf: true

            # Concurrency level, affects number of pointclouds queued for processing and number of threads used
            # 0 : Detect number of cores
            # 1 : Single threaded
            # 2->inf : Parallelism level
            concurrency_level: 1
        </rosparam>
    </node>

  </group>

  <!-- Spawn robot in gazebo -->
    <node name="spawn_husky_model" pkg="gazebo_ros" type="spawn_model ...
(more)
edit retag flag offensive close merge delete

Comments

And I get nothing in rviz. I can collect sensor data when I run one husky robot.

Devin gravatar imageDevin ( 2016-02-09 18:00:54 -0500 )edit

3 Answers

Sort by ยป oldest newest most voted
2

answered 2016-02-10 17:02:46 -0500

nbeyers gravatar image

I'm kind of a newbie myself, but I'm working on a similar problem and it looks like what's happening here is that your robot_description includes both robots. The first launch file calls two versions of the spawn_husky.launch file: one for each robot. Each robot then loads a description here:

  <param name="robot_description" command="$(find xacro)/xacro.py '$(env HUSKY_GAZEBO_DESCRIPTION)'

Where the environment variable points to the description.gazebo.xacro file. This file then opens the controller plug-in for both robots. But since you're calling this part of the code twice, this might be where the problems are coming from. Just a thought though. But here's the way I've done it:

In the spawn_husky file

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find husky_gazebo)/urdf/$(arg namespace)description.gazebo.xacro'
    laser_enabled:=$(arg laser_enabled)
    ur5_enabled:=$(arg ur5_enabled)
    kinect_enabled:=$(arg kinect_enabled)
    " />

Then I have husky1description.gazebo.xacro and husky2description.gazebo.xacro which look like this:

<robot name="husky_robot_gazebo" xmlns:xacro="http://ros.org/wiki/xacro">
  <xacro:arg name="laser_enabled" default="true" />
  <xacro:arg name="ur5_enabled" default="false" />
  <xacro:arg name="kinect_enabled" default="false" />

  <xacro:include filename="$(find mtu_husky_description)/urdf/husky.urdf.xacro" />
  <xacro:include filename="$(find mtu_husky_gazebo)/urdf/husky1.gazebo.xacro" />

  <!-- Gazebo plugin for ROS Control -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/husky1</robotNamespace>
    </plugin>
  </gazebo>

  <xacro:husky_robot />

  <xacro:husky_robot_gazebo />

</robot>

This works for me and allows control of both robots independently. However, I've having an issue where it's caused the "odom" frame to stop being published. So let me know if anyone has been able to figure that one out.

edit flag offensive delete link more

Comments

Thanks! It works.

Devin gravatar imageDevin ( 2016-02-11 11:38:37 -0500 )edit
0

answered 2016-02-10 16:42:57 -0500

Devin gravatar image

I think I find the answer

edit flag offensive delete link more
-1

answered 2018-04-27 08:31:44 -0500

topkek gravatar image

why am i always getting this error??

included file [/home/user/catkin_ws/src/husky_simulator/husky_gazebo/launch/spawn_husky.launch] requires the 'namespace' arg to be set The traceback for the exception was written to the log file

edit flag offensive delete link more

Comments

1

Please don't post this as an answer, as it's not an answer. Open a new question for this.

gvdhoorn gravatar imagegvdhoorn ( 2018-04-27 11:29:28 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2016-02-09 17:44:44 -0500

Seen: 875 times

Last updated: Apr 27 '18