【问题标题】:ROS Remap topic doesn't work - Multiple RobotsROS Remap 主题不起作用 - 多个机器人
【发布时间】:2019-03-23 14:06:12
【问题描述】:

根据教程here,我尝试创建启动以在凉亭中运行多个机器人。 每个机器人都有一个节点 [称为 stopper] 负责移动它。我希望每个机器人单独移动,所以我将发布到 {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 中。

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

【问题讨论】:

    标签: xml ros launch robotics robot


    【解决方案1】:

    是给定节点的选项。因此我认为它需要添加到节点标签下。所以它必须在&lt;node&gt; ... &lt;/node&gt; 块内。

    此外,您可以通过在适当的命名空间下启动远程操作节点来实现您想要做的事情,或者在启动文件中使用&lt;group ns="XXX"&gt;,或者在启动远程操作节点之前在终端中运行export ROS_NAMESPACE=XXX

    【讨论】:

    • 我在 ... 下添加了重新映射,但它仍然无法正常工作,并且出现了我之前描述的问题。你有想法吗?谢谢。
    • 已更新。我想得到你的帮助。
    • 尝试运行 rostopic info 和 echo 以查看发布到哪个主题停止器。
    • 我有两个停止器实例(每个机器人一个)。第一个发布到robot1/robot1/cmd_vel_mux/input/teleop,第二个发布到robot2/robot2/cmd_vel_mux/input/teleop。但是,上述主题根本没有订阅者——这就是我尝试使用“重新映射”的原因,但它对我不起作用。 /mobile_base_nodelet_manager 订阅 /cmd_vel_mux/input/teleop 主题。
    • 你想发布到robot1/...而不是robot1/robot1/...所以你需要从某个地方获取命名空间。
    【解决方案2】:

    当你这么说的时候,它让我觉得重新映射是有效的:

    在运行“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

    【讨论】:

    • 谢谢。关于“{robot_name}/cmd_vel_mux/input/teleop”发布者,它存在是因为我在我的代码中发布到这个主题(没有重新映射)。此外,我同意我必须对我的订阅者进行“重新映射”。但是,这个问题仍然存在,因为正如我所写,如果我在 one_robot.lanuch 中重新映射,则重新映射实际上不起作用(我不知道为什么)。我也尝试在 ... 内重新映射(不起作用)以及“”行之后。 one_robot.launch 和重映射都不起作用。任何的想法?谢谢。
    • 尝试将重映射移至robots.launch。我有一种感觉,group 标签和单独的命名空间正在造成麻烦。您可能想尝试的组标签还有一个 remap 属性。 标签文档:wiki.ros.org/roslaunch/XML/group
    • 将'remap'放入robot.launch 对发布者有用,但我仍然没有订阅者。我希望每个机器人都有一个发布者到“{robot_name}/cmd_vel_mux/input/teleop,并且 {robot_name}/mobile_base_nodelet_manager 作为订阅者,但我根本没有这个订阅者。也许你能告诉我如何实现这一点? 我不确定我应该如何为这个订阅者做'remap',这是一个由 ros 编写的类。
    • 编辑启动订阅者节点的启动文件并在那里重新映射。或者复制打开订阅者节点的旧启动文件,并使用remap 标记对其进行修改,然后调用新启动文件而不是旧启动文件。
    猜你喜欢
    • 2020-03-19
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多