基于教程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>
multiple_robots.launch
中进行重映射时,该重映射才能起作用,但是对我来说这实际上是不可能的,因为在那里我们不知道机器人名称,而只是在one_robot.launch
中。我想得到您的帮助来解决此问题,我在此上花费了很多时间。非常感谢你!
答案 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