Gazeboでkobukiを二台出す

Xubuntu12.04上のHydro上でkobukiを二台だす.

前提として
http://wiki.ros.org/kobuki_gazebo
でkobukiが一台出せているとします.

同じ感じでlaunchファイルを作ります.
ワークスペース

catkin_create_pkg hoge
roscd kobuki_gazebo

してkobuki_gazeboに移動,以下をhogeへコピーします
/launch/includes/*.xml
/launch/turtlebot_empty_world.launch
/worlds/empty.world

package.xmlのrun_dependをコピーします.

これで

roslaunch hoge turtlebot_empty_world.launch

すると一台のkobukiが出るはず.
まぁ,この時点ではincludes以下のxmlは参照してないのですが.

/launch/turtlebot_empty_world.launch
を以下のように編集します.
findの参照先に注意してください.

<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="use_sim_time" value="true"/>
    <arg name="debug" value="false"/>
    <arg name="world_name" value="$(find hoge)/worlds/empty.world"/>
  </include>

  <arg name="base"      value="$(optenv TURTLEBOT_BASE kobuki)"/> <!-- create, roomba -->
  <arg name="battery"   value="$(optenv TURTLEBOT_BATTERY /proc/acpi/battery/BAT0)"/>  <!-- /proc/acpi/battery/BAT0 --> 
  <arg name="stacks"    value="$(optenv TURTLEBOT_STACKS hexagons)"/>  <!-- circles, hexagons --> 
  <arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR kinect)"/>  <!-- kinect, asus_xtion_pro --> 

  <group ns="r1">
    <include file="$(find hoge)/launch/includes/$(arg base).launch.xml">
      <arg name="base" value="$(arg base)"/>
      <arg name="stacks" value="$(arg stacks)"/>
      <arg name="3d_sensor" value="$(arg 3d_sensor)"/>
      <arg name="robot_name" value="r1"/>
      <arg name="init_pose" value="-x 1 -y 1 -z 0"/>
    </include>
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
      <param name="publish_frequency" type="double" value="30.0" />
    </node>
  </group>
  
  <group ns="r2">
    <include file="$(find hoge)/launch/includes/$(arg base).launch.xml">
      <arg name="base" value="$(arg base)"/>
      <arg name="stacks" value="$(arg stacks)"/>
      <arg name="3d_sensor" value="$(arg 3d_sensor)"/>
      <arg name="robot_name" value="r2"/>
      <arg name="init_pose" value="-x 1 -y 4 -z 0"/>
    </include>
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
      <param name="publish_frequency" type="double" value="30.0" />
    </node>
  </group>
</launch>

/launch/includes/kobuki.launch.xml
を以下のように編集します

<launch>
  <arg name="base"/>
  <arg name="stacks"/>
  <arg name="3d_sensor"/>
  <arg name="robot_name"/>
  <arg name="init_pose"/>

  <arg name="urdf_file" default="$(find xacro)/xacro.py '$(find turtlebot_description)/robots/$(arg base)_$(arg stacks)_$(arg 3d_sensor).urdf.xacro'" />
  <param name="robot_description" command="$(arg urdf_file)" />

  <!-- Gazebo model spawner -->
  <node name="spawn_turtlebot_model" pkg="gazebo_ros" type="spawn_model"
        args="$(arg init_pose) -unpause -urdf -param robot_description -model $(arg robot_name)"/>

  <!-- Velocity muxer -->
  <node pkg="nodelet" type="nodelet" name="mobile_base_nodelet_manager" args="manager"/>
  <node pkg="nodelet" type="nodelet" name="cmd_vel_mux"
        args="load yocs_cmd_vel_mux/CmdVelMuxNodelet mobile_base_nodelet_manager">
    <param name="yaml_cfg_file" value="$(find turtlebot_bringup)/param/mux.yaml" />
    <remap from="cmd_vel_mux/output" to="mobile_base/commands/velocity"/>
  </node>

  <!-- Bumper/cliff to pointcloud (not working, as it needs sensors/core messages) -->
  <include file="$(find turtlebot_bringup)/launch/includes/kobuki/bumper2pc.launch.xml"/>
</launch>

これで

roslaunch hoge turtlebot_empty_world.launch

すると二台のkobukiが出るはず.
要はそれぞれのモデルに名前をつけてくださいという,チュートリアルにもあったことです.

動かすには以下の様な感じでscriptsを作ってrosrunすればいいです.
dependencyにrospyとgeometry_msgs追加してください.

import rospy
from geometry_msgs.msg import Twist

if __name__=="__main__":
        rospy.init_node('it')

        p=rospy.Publisher('r1/commands/velocity',Twist)
        twist = Twist()
        twist.linear.x = -0.5;
        twist.linear.y = 0.0;
        twist.linear.z = 0.0;

        twist.angular.x = 0.0;
        twist.angular.y = 0.0;
        twist.angular.z = 0.0;
        for i in range(10):
                p.publish(twist);
                rospy.sleep(0.5)

フォーマッタとか色々設定してないので汚いのは容赦してほしい.
仮想マシン上のそういう設定全くやる気が起きないんだよなぁ….