ROS重映射主题不起作用-多个机器人

时间:2019-03-23 14:06:13

标签: xml ros launch robotics robot

基于教程here,我尝试创建启动以在凉亭中运行多个机器人。 每个机器人都有一个节点(称为“止动器”),负责移动它。我希望每个机器人都可以单独移动,所以我将发布到{robot_name} / cmd_vel_mux / input / teleop主题。

当运行“ rostopic info / cmd_vel_mux / input / teleop”时,我注意到我只有mobile_base_nodelet_manager作为订阅者,没有发布者(发布者位于{robot_name} / cmd_vel_mux / input / teleop主题中。 因此,我使用了remap,但仍然无法正常工作,并且出现了相同的问题。

one_robot.lanuch

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

   <arg name="robot_name"/>
   <arg name="init_pose"/>

   <node name="spawn_minibot_model" pkg="gazebo_ros" type="spawn_model"
     args="$(arg init_pose) -urdf -param /robot_description -model $(arg robot_name)"
    respawn="false" output="screen" />

    <!-- Launch stopper node -->
    <node name="stopper" pkg="stopper" type="stopper" output="screen" args="$(arg robot_name)">
     <remap from="scan" to="$(arg robot_name)/scan"/>
     <remap from="cmd_vel_mux/input/teleop" to="$(arg robot_name)/cmd_vel_mux/input/teleop"/>

    </node>
</launch>

robots.launch

 <?xml version="1.0"?>
<launch>
  <!-- No namespace here as we will share this description. 
         Access with slash at the beginning -->
  <param name="robot_description"
          command="$(find xacro)/xacro.py $(find turtlebot_description)/robots/kobuki_hexagons_asus_xtion_pro.urdf.xacro"/>

 <!-- BEGIN ROBOT 1-->
 <group ns="robot1">
    <param name="tf_prefix" value="robot1_tf" />
    <include file="$(find stopper)/launch/one_robot.launch" >
      <arg name="init_pose" value="-x 1 -y 1 -z 0" />
      <arg name="robot_name"  value="Robot1" />
    </include>
 </group>

 <!-- BEGIN ROBOT 2-->
 <group ns="robot2">
    <param name="tf_prefix" value="robot2_tf" />
   <include file="$(find stopper)/launch/one_robot.launch" >
     <arg name="init_pose" value="-x -1 -y 1 -z 0" />
     <arg name="robot_name"  value="Robot2" />
   </include>
 </group>
</launch>

multiple_robots.launch

   <?xml version="1.0"?>
   <launch>
      <param name="/use_sim_time" value="true" />

      <!-- include our robots -->
      <include file="$(find stopper)/launch/robots.launch"/>

      <!-- start world -->
      <include file="$(find turtlebot_gazebo)/launch/turtlebot_world.launch"/>       
   </launch>
  • 看起来,我尝试在one_robot.launch中重新映射,但是如前所述,它仍然不起作用。 我注意到,仅当我在multiple_robots.launch中进行重映射时,该重映射才能起作用,但是对我来说这实际上是不可能的,因为在那里我们不知道机器人名称,而只是在one_robot.launch中。

我想得到您的帮助来解决此问题,我在此上花费了很多时间。非常感谢你!

2 个答案:

答案 0 :(得分:0)

是给定节点的选项。因此,我认为它需要在node标签下添加。因此它必须在<node> ... </node>块之内。

此外,您可以尝试通过在适当的名称空间下启动Teleop节点来实现目标,或者在启动Teleop之前在启动文件中使用<group ns="XXX">或在终端中通过运行export ROS_NAMESPACE=XXX在终端中运行节点。

答案 1 :(得分:0)

当你这样说时,这让我认为重新映射正在工作:

  

当运行“ rostopic info / cmd_vel_mux / input / teleop”时,我注意到我只有mobile_base_nodelet_manager作为订阅者,而没有发布者(发布者存在于{robot_name} / cmd_vel_mux / input / teleop主题中。

旧主题/cmd_vel_mux/input/teleop不再具有发布者,如果重新映射有效,这将是正确的。而且您说发布者存在重新映射的主题{robot_name}/cmd_vel_mux/input/teleop,这意味着重新映射有效。

您说mobile_base_nodelet_manager订阅了旧主题,但是应该订阅了新主题。重新映射不会更改发布者和订阅者的主题。重新映射不是全局的。

我将确保正在订阅旧主题的节点现在正在订阅新主题。您还必须在订阅服务器上进行重新映射,这样他们才能知道新主题是什么并且可以订阅它。

ROS文档描述了在订户节点上重新映射:Remap Docs