rosrun和roslaunch命令比较

在ros中运行节点的命令有2个,rosrun和roslaunch

官网解释如下:

rosrun allows you to run an executable in an arbitrary package without having to cd (or roscd) there first.

 roslaunch is a tool for easily launching multiple ROS nodes locally and remotely via SSH, as well as setting parameters on the Parameter Server. It includes options to automatically respawn processes that have already died. roslaunch takes in one or more XML configuration files (with the .launch extension) that specify the parameters to set and nodes to launch, as well as the machines that they should be run on.

roslaunch可以用来启动定义在launch文件中的多个节点,通常的命名方案是以.launch作为启动文件的后缀,启动文件是xml文件,一般把启动文件存储在取名为launch的目录中,用法

$ roslaunch [package] [filename.launch]


可以看出:rosrun是运行一个单独节点的命令,如果要运行多个节点,则需要使用多次rosrun命令,roslaunch采用xml的格式对需要运行的节点进行描述,可以同时运行多个节点,例如

<launch>
  <node name="listener" pkg="rospy_tutorials" type="listener.py" output="screen"/>
  <node name="publish_on_shutdown" pkg="rospy_tutorials" type="publish_on_shutdown.py" output="screen"/>
</launch>

可以同时运行listener和publish_on_shutdown两个节点

launch文件解析

1. 每个xml文件都必须要包含一个根元素,根元素由一对launch标签定义:<launch>...<launch>元素都应该包含在这两个标签之内

2.在节点标签末尾的斜杠”/“是必须的,也可以显示的给出结束标志,name属性给节点指派了名称,它将覆盖任何通过调用ros::int来赋予节点的名称。

<node pkg=”package-name” type=”executable-name” name=”node-name”/>
<node pkg=”…”type=”…” name=”…”></node>#显式地给出结束标签

3.若该节点有子节点,例如remap或者param元素,那么该显式结束标签是必不可少的,

4.在默认状态下,从启动文件启动节点的标准输出被定向到日志文件中,若想输出到控制台,只需在节点元素中配置:output="screen",配置了该属性的节点将标准输出显示在屏幕上而不是记录到日志文档,

5.对于每个节点,设置复位属性为真respawn="true",这样当节点停止的时候,roslaunch会重新启动该节点。比如在某个节点因为软件崩溃或硬件故障以及其他原因导致过早退出系统的时候会起到作用。

6.ns="namespace",

7.名称重映射,重映射是基于替换的思想,每个重映射包含一个原始名称和一个新名称。每当节点使用重映射中的原始名称时,ROS客户端就会将它默默地替换成相应的新名称,例如,运行一个turtlesime的实例,如果想把海归的姿态数据发布到话题/tim,而不是/turtle/pose,就可以使用如下命令rosrun turtlesim turtlesim_node turtle1/pose:=tim,通过启动文件的方式,只需在启动文件内使用重映射remap元素即可,

<remap from=”turtle1/pose” to= ”tim”/>

8. 包含其他文件:

如果想在启动文件中包含其他文件的内容(包括所有的节点和参数),可以使用包含include元素<include file="$(find package-name)/launch-file-name">,由于直接输入路径信息很繁琐且容易出错,大多数包含元素都使用查找find命令搜错功能包的位置来替代直接输入路径

<include file="$(find safety_control)/launch/safety_controller.launch"/>

 9.启动参数,在ros中parameter和argument是不同的,虽然翻译一样,parameter是运行中的ros系统个使用的数值,存储在参数服务器(parameter server)中,每个活跃的节点都可以通过ros::param::get函数来获取parameter的值,用户也可以通过rosparm来获得parameter的值,而argument只在启动文件内才有意义他们的值是不能被节点直接获取的。

 <arg name="odom_topic" default="odom" />
<launch>#这里以launch标签开头以表明这是一个launch文件

  <group ns="turtlesim1"> #这里创建了一个名为turtlesim1的节点分组并以命名空间(namespace)标签来区分,
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>#这两个组里使用相同的turtlesim节点并命名为'sim',这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <node pkg="turtlesim" name="mimic" type="mimic">#在这里启动模仿节点,并将所有话题的输入和输出分别重命名为turtlesim1和trutlesim2,这样就会使turtlesim2模仿turtlesim1
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/83862907