根据教程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主题。因此,我使用了重映射,但它仍然没有工作,出现同样的问题。
一个robot.launch
<?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
。我想帮助你解决这个问题,我花了很多时间来解决这个问题。非常感谢你!
是给定节点的选项。因此,我认为它需要添加到节点标记下。所以它必须在<node> ... </node>
区块内。
此外,您尝试执行的操作可以通过在适当的命名空间下启动您的远程节点来实现,可以在启动文件中使用<group ns="XXX">
,也可以在启动远程节点之前通过运行export ROS_NAMESPACE=XXX
在终端中启动。
当你这样说时,它让我觉得重映射正在起作用:
当运行“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