目录
launch
launch文件是一种可以可实现多节点启动 和参数配置的xml文件,launch文件用于启动和配置ROS节点、参数和其他相关组件。launch文件通常使用XML格式编写,其主要目的是方便地启动ROS节点和设置节点之间的连接关系。
launch常用标签:
<launch>
标签:launch文件的根标签,表示这是一个launch文件。
<node>
标签 :用于启动ROS节点。例如,<node pkg="my_package" type="my_node" name="node_name" output="screen"/>
表示启动名为my_node
的ROS节点,该节点属于my_package
软件包,并且节点的名称为node_name
,output="screen"
表示将节点输出重定向到屏幕。
<arg>
标签 :用于定义参数,可以在启动launch文件时传递给节点。例如,<arg name="my_arg" default="default_value"/>
定义了一个名为my_arg
的参数,并设置了默认值为default_value
。
<param>
标签 :用于设置ROS参数。例如,<param name="my_param" type="int" value="42"/>
表示设置一个名为my_param
的整数类型参数,其值为42。
<include>
标签 :++用于包含其他launch文件。这使得launch文件可以模块化并重用。例如,<include file="$(find my_package)/launch/other_launch_file.launch"/>
表示包含了my_package
软件包中的other_launch_file.launch
文件++。或者
<group>
标签 :用于将一组节点放入一个组中。例如,可以使用<group ns="my_namespace">...</group>
来指定一个命名空间,并且其中的所有节点都将位于这个命名空间下。
node标签
<node>
标签是在ROS中用于启动ROS节点的XML标签(等同于rosrun)。通过<node>
标签,可以指定要启动的ROS节点的相关信息,如软件包名称、节点类型、节点名称等。
ROS程序运行单位是是node即节点,运行单个node的指令是rosrun
rosrun
是 ROS 中用于直接运行已编译的节点程序的命令。使用 rosrun
命令可以方便地启动指定软件包中的节点,而无需指定软件包的路径。
语法为:rosrun <package_name> <node_name>
<package_name>
:指定要运行节点所属的软件包名称。<node_name>
:指定要运行的节点的名称要运行一个名为
my_node
的节点,它属于my_package
软件包:rosrun my_package my_node
rosrun
命令会自动查找指定软件包,并在该软件包的目录下寻找对应的节点可执行文件并运行。使用
rosrun
命令相对于直接使用可执行文件路径的好处是,它会自动设置 ROS 环境变量和节点名称空间,并提供了更方便的方式来启动节点。此外,rosrun
命令还支持其他选项和参数,可以通过运行rosrun --help
查看详细信息。
<node>
标签的一般结构和常用属性:++<node pkg="package_name" type="node_type" name="node_name" [args="arg1 arg2 ..."] [output="output_option"]/>++
pkg
: 指定ROS节点所属的软件包名称。type
: 指定要启动的ROS节点类型(即可执行文件名)。name
: 指定为ROS节点设置的名称。通常用于在ROS图中唯一标识该节点。args
: 可选属性,用于传递参数给要启动的ROS节点。参数以空格分隔。output
: 可选属性,用于指定如何处理节点的输出信息。常见的选项包括log
(将输出信息记录到日志文件)、screen
(将输出信息打印到屏幕)等。示例:
<node pkg="my_package" type="my_node" name="my_node" output="screen"/>
这个示例中,
<node>
标签会启动my_node
节点,该节点属于my_package
软件包,节点的名称为my_node
,并且节点的输出信息会打印到屏幕上。
参数
<param>
, <rosparam>
和 <arg>
是用于在launch文件中设置参数和传递参数的标签(tags)。
<param>
标签:<param>
标签用于在ROS的launch文件中设置节点参数的数值。通过 <param>
标签可以为特定节点设置参数值,这些参数值将会在节点启动时传递给该节点。
例如,可以使用以下方式在launch文件中设置参数值:
<param name="parameter_name" value="parameter_value"/>
<rosparam>
标签:<rosparam>
标签用于从文件或字符串中加载参数,并将这些参数设置到ROS参数服务器上。通过 <rosparam>
标签可以加载包含参数值的YAML文件,这些参数值可以在ROS节点中访问。
例如,可以使用以下方式在launch文件中加载参数文件:
<rosparam file="path/to/params.yaml"/>
<arg>
标签:<arg>
标签用于定义参数并将其传递给其他标签或节点。<arg>
标签通常用于传递参数值,以便在launch文件中重用参数
例如,可以使用以下方式定义一个参数并传递给节点:
<arg name="my_param" default="default_value"/> <node name="my_node" pkg="my_package" type="my_node" output="screen" arg="my_param"/>
参数服务器
参数服务器是一个用于存储和检索参数值的全局参数数据库。它允许ROS节点在运行时动态地获取参数值,并且这些参数值可以在节点之间共享和调整。参数服务器为ROS系统提供了一种方便的方法来管理配置参数,使得节点之间可以共享和访问这些参数。
全局性: 参数服务器是全局性的,意味着所有的ROS节点都可以访问参数服务器上的参数值。
动态性: 节点可以在运行时动态地读取和更改参数服务器中的参数值。
命名空间: 参数服务器支持命名空间,因此可以对参数进行组织和分类,使得参数更加清晰和易于管理。
在ROS中,可以使用rosparam
命令行工具或者在节点代码中使用ROS参数服务器 API来访问和设置参数服务器中的参数值。例如,可以使用rosparam set
命令来设置参数的值,使用rosparam get
命令来获取参数的值。
在节点代码中,可以使用ros::param
(C++)或rospy.get_param
(Python)等函数来访问和修改参数服务器中的参数值。
节点分组
节点分组是一种将相关节点组织在一起的方式,以便更好地管理和控制节点的行为。节点分组可以通过ROS的launch文件或者命令行进行设置和配置
通过launch文件进行节点分组 :可以使用ROS的launch文件来将相关节点分组到一个launch文件中。在launch文件中,可以使用<group>
标签将多个节点组合在一起,并定义它们的启动顺序、命名空间等信息。
e.g.
<launch>
<group ns="my_group">
<node name="node1" pkg="my_package" type="node1" />
<node name="node2" pkg="my_package" type="node2" />
</group>
</launch>
上述示例中,
<group>
标签将node1
和node2
节点组合到一个命名空间为 "my_group" 的分组中。
<group>
标签用于创建一个节点分组,其中ns
属性定义了这个分组的命名空间。在这个命名空间下启动的节点将会共享这个命名空间,这意味着它们的名称将会被加上这个命名空间前缀。例如,如果在
<group>
分组内启动了两个节点,一个叫做node1
,另一个叫做node2
,它们的完整名称将会是my_group/node1
和my_group/node2
。
重命名
在ROS中,可以使用<remap>
标签来进行节点话题或服务的重命名。这样可以避免不同节点之间的名称冲突,也可以方便地修改节点之间的通信关系。
在ROS的launch文件中,<remap>
标签用于重命名节点的话题或服务。
重命名节点的话题:
XML
<launch>
<node name="my_node" pkg="my_package" type="my_node_type">
<remap from="input_topic" to="new_input_topic" />
<remap from="output_topic" to="new_output_topic" />
</node>
</launch>
重命名节点的服务:
XML
<launch>
<node name="my_service" pkg="my_package" type="my_service_type" >
<remap from="input_service" to="new_input_service" />
<remap from="output_service" to="new_output_service" />
</node>
</launch>
<remap>
标签指定了要重命名的来源(from
)和目标(to
)。这意味着节点内部将使用新的名称 来订阅和发布消息,而不是原来的名称
注意:<remap>
标签只是在启动时进行动态的重命名,并不会真正修改节点的代码或定义。