Hello all,
I'm relatively new to ROS and I'm working on simulation of multiple Clearpath Huskies running some simple obstacle avoidance code that I've written. I've installed and used the husky_gazebo package to successfully simulate a single robot with my code, but I'm running into difficulties when I try to add more. The way I'm hoping to accomplish this is through the use of namespaces, but I'm afraid I don't understand them very well. Here is the launch file where I'm attempting to do this:
<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)"/>
<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>
<param name="robot_description" command="$(find xacro)/xacro.py '$(find husky_gazebo)/urdf/description.gazebo.xacro'
laser_enabled:=$(arg laser_enabled)
ur5_enabled:=$(arg ur5_enabled)
kinect_enabled:=$(arg kinect_enabled)
" />
<group ns="husky1">
<param name="tf_prefix" value="husky1_tf" />
<include file="$(find husky_gazebo)/launch/spawn_husky.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"/>
</include>
</group>
<group ns="husky2">
<param name="tf_prefix" value="husky2_tf" />
<include file="$(find husky_gazebo)/launch/spawn_husky.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"/>
</include>
</group>
</launch>
This calls another launch file to actually spawn the vehicle:
<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="0"/>
<arg name="y" default="0"/>
<arg name="z" default="0"/>
<arg name="roll" default="0"/>
<arg name="pitch" default="0"/>
<arg name="yaw" default="0"/>
<param name="robot_description" command="$(find xacro)/xacro.py '$(find mtu_husky_gazebo)/urdf/mtu_description.gazebo.xacro'
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 mtu_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 mtu_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: 0
</rosparam>
</node>
</group>
<!-- Spawn robot in gazebo -->
<node name="spawn_husky_model" pkg="gazebo_ros" type="spawn_model"
args="-x $(arg x) -y $(arg y) -z $(arg z) -R $(arg roll) -P $(arg pitch) -Y $(arg yaw)
-unpause -urdf -param robot_description -model mobile_base"/>
</launch>
But when I actually run the code, several errors occur. The first seems to be keeping me from spawning a second model of the same robot. [ERROR] [1454450853.949772124, 1298.480000000]: SpawnModel: Failure - model name mobile_base already exist.
And then there are two of these errors: [WARN] [WallTime: 1454450882.509616] [1326.730000] Controller Spawner couldn't find the expected controller_manager ROS interface. Which seem to be a problem that the namespace is causing with the robot controller.
I'm just looking for anyone who might be doing similar work who would be willing to share or possibly someone who understands these errors well enough to tell me what they mean. I'll update this question as I figure out more.
Thanks!
Originally posted by nbeyers on ROS Answers with karma: 161 on 2016-02-02
Post score: 3