ROS launch 要点

本文详细介绍ROS中的Launch文件,包括如何创建、使用Launch文件来启动多个节点,以及如何配置节点属性如命名空间、重命名等。此外,还介绍了如何包含其他Launch文件、设置参数和条件执行节点组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢原作者的分享https://blog.youkuaiyun.com/fengmengdan/article/details/42984429

Launch 文件

  1 使用Launch文件
  2 创建Launch文件
  3 namespace中启动nodes
  4 remapping names
  5 其他的launch元素

 

使用launch文件

Launch文件是ROS提供的,可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,在ROS packages中使用广泛。

1.1 运行launch文件
$ roslaunch package_name launch_file_name

Eg: roslaunch turtlesim example.launch

(1)Tip1: rosrun只能运行一个nodes, roslaunch可以同时运行多个nodes.

Tip2: launch文件可以不被包含于package中。此时,只需指出该launch文件的绝对路径,即可运行。

$ roslaunch completely_path

Eg$ roslaunch ~/opt/ros/indigo/share/turtlesim/launch/example.launch

Tip3: 为便于执行,每个node最好是相互独立的。

(2)详细显示(request verbosity)

$ roslaunch -v package_name launch_file_name

(3) 结束launch文件

ctrl+c

 

创建launch文件

(1) launch文件一般以.launch后缀作为文件名,放在packagelaunch文件夹下。最简单的launch文件可以仅包含几个nodes

(2) Launch文件是XML文件,每个XML文件必须有一个root element。而launch文件的root element由一对launch 标签定义。

<launch>

...

</launch>

Launch文件中的其他elements必须都在这一对tags之间。

(3) launch文件的核心是一系列node elements,每个node element启动一个nodeNode element看起来如下:

<node

  pkg=”package_name” type=”executable_name” name=”node_name”

/>

Tip1: 最后的“/”是必不可少的。

Tip2: 也可以写成<node pkg=”..” type=”...” name=”...”></node>

如果该node中有其他tags,则必须使用这种形式。

(4) 一个node element包含三个必须的属性:pkg, type, name.

pkgtype属性指出ROS应该运行哪个pkg中的哪个node,注意:此处的type是可执行文件的名称,而name则是可以任意给出的,它覆盖了原有文件中ros::init指定的node name

(5) 使用匿名(anonymous name

  name=”$(anon base_name)”

(6) node 日志文件(log file

运行roslaunch和用rosrun运行单个节点的区别之一是,默认情况下,roslaunch运行的nodes的标准输出会重定向到log file,不显示在控制台。

该日志文件的位置和名称如下:

~/.ros/log/run_id/node_name-number-stdout.log

其中,run_idmaster启动后生成的特殊标识符,number是表示nodes数量的整数。如,turtlesim-1-stdout.log; teleop_key-3-stdout.log.

(7) 输出到控制台

output属性, output=”screen”;这种方法仅显示一个node

若显示所有nodes的输出,用--screen命令行。

$ roslaunch --screen package_name launch_file_name

如果正在运行的文件没有显示想要对输出,可以查看该node属性集中是否有 output=”screen”.

(8) 要求重生(request respawning)

    开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。

    respawn=”true”

(10) 必需的nodes

required属性与respawn相反,不能同时对同一个node使用。

required=”true”

当一个required node终止后,所有其他的nodes都会终止,并退出。这种命令有时很有用。比如,当一个很重要的node失败后,整个会话都会被扔掉,那些加上了respawn属性的nodes也会停止。

(11) 在独立的窗口运行各nodes

我们在各自的termin运行rosrun node_name;但是运行roslaunch时,所有的nodes共用一个相同的terminal,这对于那些需要从控制台输入的nodes很不方便。可以使用launch-prefix属性。

launch-prefix=”command-prefix”

Eglaunch-prefix=”xterm -e”

等价于 xterm -e rosrun turtlesim turtle_teleop_key

xterm 命令表示新建一个terminal; -e参数告诉xterm执行剩下的命令行。

当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdbvalgrind),或用于降低进程的执行顺序(通过nice.

 

namespace中执行nodes

node设置默认的namespace的常用方法——被称为“pushing down into a namespace”的进程,用于launch文件,并在其node element中指定ns属性。

ns=”namespace”

launch文件中的node namesrelative names。同一个launch文件中,允许不同namespace中出现相同的node namesRoslaunch要求node names必须是base names——不指定任何namespacesrelative names;如果node element中出现node nameglobal name,则会报错。

 

重映射namesremapping names

除了解析relative namesprivate namesROS也支持重映射,用于修改nodes当前使用的名称。

重映射相当于换名,每次重映射需提供一个original name和一个new name。每次node使用它的original name, ROS client library都会将其替换为remapping name


创建remapping name两种方法:

1. 对于单个node,在命令行进行remapping(remap对象可以是nodetopic)

   original-name:=new-name

Eg: $ rosrun turtlesim turtlesim_node turtle1/pose:=tim


2. 在launch文件内remap names,使用remap element

  <remap from=”original_name” to “new_name”>

如果remap出现在launch文件开头,作为launch文件的子元素,则该remapping将被用于随后所有的nodes。如果remap作为某个node的子元素,则只用于该节点。

Eg<node pkg=”turtlesim” type=”turtlesim_node” name=”turtle1”>

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

</node>

注意:在ROS进行remapping之前,remaping的所有name,包括originalnew names,都将被解析为global names。所以,remapping之后所有的名字通常都是relative names

 

其他的launch elements

5.1 including其他文件

为包含其他launch文件,包括这些launch文件的所有nodesparameters,用include element

<include file=”path-to-launch-file”>

这种情况下,file属性必须写出该launch文件的全部路径名称,显得很繁琐。因此,常用

<include file=”$(find package_name)/launch_file_name”/>

注意,执行该launch文件时,roslaunch会搜索该package下的所有子目录;因此,必须给出package_name。此外,include也支持ns属性,将它的内容放进指定的namespace

<include file=”...” ns=”namespace_name”/>


5.2 Launch arguments

为便于launch文件重构,roslaunch支持launch arguments,也成为arguments或者args,类似于局部变量。

注意:尽管argumentparameter有时可互换,但他们在ROS中的意义完全不同。ParametersROS系统使用的数值,存在parameter server上,nodes可通过ros::param::get函数编程得到,用户可通过rosparam获取。与之不同,arguments仅在launch文件内部有意义,nodes不能直接获取它们的值。

(1)声明argument

<arg name=”arg_name”>

(2)指定argument的值

Launch文件中的每个argument都必须有指定值。赋值方法有好几种。

第一种,在命令行赋值

$ roslaunch package_name launch_file_name arg-name:=arg_value

第二种,在声明argument时赋值

<arg name=”arg_name” default=”arg_name”/>

<arg name=”arg_name” value=”arg_name”/>

上面两行的区别在于,命令行参数可以覆盖default,但是不能重写value的值。

(3)获取变量值

一旦声明某个argument并赋值后,我们可以通过arg使用该argument.

$(arg arg-name)

如果该行出现,roslaunch将会用给定arg-name的值替换其左边的值。

(4)将argument值传给included launch文件

<include file=”path-to-file”>

<arg name=”arg_name” value=”arg_value”/>

......

</include>

若在launch文件中,launch文件及其包含的launch文件出现出现相同的arguments,则需在launch文件及included launch文件中同时写:

<arg name=”arg_name” value=”$(arg arg_name)”/>

第一个arg_name表示indluded launch文件中的argument,第二个arg_name表示launch文件中的argument.其结果是指定的argumentlaunch文件及included launch文件中都有相同的值。

 

5.3 创建groups

Group element可以再大型的launch文件中将指定的nodes组织起来。它有两个用处:

其一,group可以将几个nodes放进同一个namespace

<group ns=”namespace”>

<node pkg=”..” .../>

<node pkg=”..” .../>

......

</group>

注意,如果grouped node已经有它自己的namespace,并且是relative name,那么该nodenamespace是其relative name,并以group namespace为后缀。

其二,group可以同时启动或者终止一组nodes

<group if=”0 or 1”>

......

</group>

如果该属性的值是1,一切正常;如果该属性的值为0,那么group内所有的nodes都不会运行。

同理,除了if,还有unless

<group unless=”0 or 1”>

......

</group>

注意,这些属性的合法值只有01.

另外,group element中只能使用nsifunless这三个属性。

Launch 文件

  1 使用Launch文件
  2 创建Launch文件
  3 namespace中启动nodes
  4 remapping names
  5 其他的launch元素

 

使用launch文件

Launch文件是ROS提供的,可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,在ROS packages中使用广泛。

1.1 运行launch文件
$ roslaunch package_name launch_file_name

Eg: roslaunch turtlesim example.launch

(1)Tip1: rosrun只能运行一个nodes, roslaunch可以同时运行多个nodes.

Tip2: launch文件可以不被包含于package中。此时,只需指出该launch文件的绝对路径,即可运行。

$ roslaunch completely_path

Eg$ roslaunch ~/opt/ros/indigo/share/turtlesim/launch/example.launch

Tip3: 为便于执行,每个node最好是相互独立的。

(2)详细显示(request verbosity)

$ roslaunch -v package_name launch_file_name

(3) 结束launch文件

ctrl+c

 

创建launch文件

(1) launch文件一般以.launch后缀作为文件名,放在packagelaunch文件夹下。最简单的launch文件可以仅包含几个nodes

(2) Launch文件是XML文件,每个XML文件必须有一个root element。而launch文件的root element由一对launch 标签定义。

<launch>

...

</launch>

Launch文件中的其他elements必须都在这一对tags之间。

(3) launch文件的核心是一系列node elements,每个node element启动一个nodeNode element看起来如下:

<node

  pkg=”package_name” type=”executable_name” name=”node_name”

/>

Tip1: 最后的“/”是必不可少的。

Tip2: 也可以写成<node pkg=”..” type=”...” name=”...”></node>

如果该node中有其他tags,则必须使用这种形式。

(4) 一个node element包含三个必须的属性:pkg, type, name.

pkgtype属性指出ROS应该运行哪个pkg中的哪个node,注意:此处的type是可执行文件的名称,而name则是可以任意给出的,它覆盖了原有文件中ros::init指定的node name

(5) 使用匿名(anonymous name

  name=”$(anon base_name)”

(6) node 日志文件(log file

运行roslaunch和用rosrun运行单个节点的区别之一是,默认情况下,roslaunch运行的nodes的标准输出会重定向到log file,不显示在控制台。

该日志文件的位置和名称如下:

~/.ros/log/run_id/node_name-number-stdout.log

其中,run_idmaster启动后生成的特殊标识符,number是表示nodes数量的整数。如,turtlesim-1-stdout.log; teleop_key-3-stdout.log.

(7) 输出到控制台

output属性, output=”screen”;这种方法仅显示一个node

若显示所有nodes的输出,用--screen命令行。

$ roslaunch --screen package_name launch_file_name

如果正在运行的文件没有显示想要对输出,可以查看该node属性集中是否有 output=”screen”.

(8) 要求重生(request respawning)

    开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。

    respawn=”true”

(10) 必需的nodes

required属性与respawn相反,不能同时对同一个node使用。

required=”true”

当一个required node终止后,所有其他的nodes都会终止,并退出。这种命令有时很有用。比如,当一个很重要的node失败后,整个会话都会被扔掉,那些加上了respawn属性的nodes也会停止。

(11) 在独立的窗口运行各nodes

我们在各自的termin运行rosrun node_name;但是运行roslaunch时,所有的nodes共用一个相同的terminal,这对于那些需要从控制台输入的nodes很不方便。可以使用launch-prefix属性。

launch-prefix=”command-prefix”

Eglaunch-prefix=”xterm -e”

等价于 xterm -e rosrun turtlesim turtle_teleop_key

xterm 命令表示新建一个terminal; -e参数告诉xterm执行剩下的命令行。

当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdbvalgrind),或用于降低进程的执行顺序(通过nice.

 

namespace中执行nodes

node设置默认的namespace的常用方法——被称为“pushing down into a namespace”的进程,用于launch文件,并在其node element中指定ns属性。

ns=”namespace”

launch文件中的node namesrelative names。同一个launch文件中,允许不同namespace中出现相同的node namesRoslaunch要求node names必须是base names——不指定任何namespacesrelative names;如果node element中出现node nameglobal name,则会报错。

 

重映射namesremapping names

除了解析relative namesprivate namesROS也支持重映射,用于修改nodes当前使用的名称。

重映射相当于换名,每次重映射需提供一个original name和一个new name。每次node使用它的original name, ROS client library都会将其替换为remapping name


创建remapping name两种方法:

1. 对于单个node,在命令行进行remapping(remap对象可以是nodetopic)

   original-name:=new-name

Eg: $ rosrun turtlesim turtlesim_node turtle1/pose:=tim


2. 在launch文件内remap names,使用remap element

  <remap from=”original_name” to “new_name”>

如果remap出现在launch文件开头,作为launch文件的子元素,则该remapping将被用于随后所有的nodes。如果remap作为某个node的子元素,则只用于该节点。

Eg<node pkg=”turtlesim” type=”turtlesim_node” name=”turtle1”>

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

</node>

注意:在ROS进行remapping之前,remaping的所有name,包括originalnew names,都将被解析为global names。所以,remapping之后所有的名字通常都是relative names

 

其他的launch elements

5.1 including其他文件

为包含其他launch文件,包括这些launch文件的所有nodesparameters,用include element

<include file=”path-to-launch-file”>

这种情况下,file属性必须写出该launch文件的全部路径名称,显得很繁琐。因此,常用

<include file=”$(find package_name)/launch_file_name”/>

注意,执行该launch文件时,roslaunch会搜索该package下的所有子目录;因此,必须给出package_name。此外,include也支持ns属性,将它的内容放进指定的namespace

<include file=”...” ns=”namespace_name”/>


5.2 Launch arguments

为便于launch文件重构,roslaunch支持launch arguments,也成为arguments或者args,类似于局部变量。

注意:尽管argumentparameter有时可互换,但他们在ROS中的意义完全不同。ParametersROS系统使用的数值,存在parameter server上,nodes可通过ros::param::get函数编程得到,用户可通过rosparam获取。与之不同,arguments仅在launch文件内部有意义,nodes不能直接获取它们的值。

(1)声明argument

<arg name=”arg_name”>

(2)指定argument的值

Launch文件中的每个argument都必须有指定值。赋值方法有好几种。

第一种,在命令行赋值

$ roslaunch package_name launch_file_name arg-name:=arg_value

第二种,在声明argument时赋值

<arg name=”arg_name” default=”arg_name”/>

<arg name=”arg_name” value=”arg_name”/>

上面两行的区别在于,命令行参数可以覆盖default,但是不能重写value的值。

(3)获取变量值

一旦声明某个argument并赋值后,我们可以通过arg使用该argument.

$(arg arg-name)

如果该行出现,roslaunch将会用给定arg-name的值替换其左边的值。

(4)将argument值传给included launch文件

<include file=”path-to-file”>

<arg name=”arg_name” value=”arg_value”/>

......

</include>

若在launch文件中,launch文件及其包含的launch文件出现出现相同的arguments,则需在launch文件及included launch文件中同时写:

<arg name=”arg_name” value=”$(arg arg_name)”/>

第一个arg_name表示indluded launch文件中的argument,第二个arg_name表示launch文件中的argument.其结果是指定的argumentlaunch文件及included launch文件中都有相同的值。

 

5.3 创建groups

Group element可以再大型的launch文件中将指定的nodes组织起来。它有两个用处:

其一,group可以将几个nodes放进同一个namespace

<group ns=”namespace”>

<node pkg=”..” .../>

<node pkg=”..” .../>

......

</group>

注意,如果grouped node已经有它自己的namespace,并且是relative name,那么该nodenamespace是其relative name,并以group namespace为后缀。

其二,group可以同时启动或者终止一组nodes

<group if=”0 or 1”>

......

</group>

如果该属性的值是1,一切正常;如果该属性的值为0,那么group内所有的nodes都不会运行。

同理,除了if,还有unless

<group unless=”0 or 1”>

......

</group>

注意,这些属性的合法值只有01.

另外,group element中只能使用nsifunless这三个属性。

Launch 文件

  1 使用Launch文件
  2 创建Launch文件
  3 namespace中启动nodes
  4 remapping names
  5 其他的launch元素

 

使用launch文件

Launch文件是ROS提供的,可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,在ROS packages中使用广泛。

1.1 运行launch文件
$ roslaunch package_name launch_file_name

Eg: roslaunch turtlesim example.launch

(1)Tip1: rosrun只能运行一个nodes, roslaunch可以同时运行多个nodes.

Tip2: launch文件可以不被包含于package中。此时,只需指出该launch文件的绝对路径,即可运行。

$ roslaunch completely_path

Eg$ roslaunch ~/opt/ros/indigo/share/turtlesim/launch/example.launch

Tip3: 为便于执行,每个node最好是相互独立的。

(2)详细显示(request verbosity)

$ roslaunch -v package_name launch_file_name

(3) 结束launch文件

ctrl+c

 

创建launch文件

(1) launch文件一般以.launch后缀作为文件名,放在packagelaunch文件夹下。最简单的launch文件可以仅包含几个nodes

(2) Launch文件是XML文件,每个XML文件必须有一个root element。而launch文件的root element由一对launch 标签定义。

<launch>

...

</launch>

Launch文件中的其他elements必须都在这一对tags之间。

(3) launch文件的核心是一系列node elements,每个node element启动一个nodeNode element看起来如下:

<node

  pkg=”package_name” type=”executable_name” name=”node_name”

/>

Tip1: 最后的“/”是必不可少的。

Tip2: 也可以写成<node pkg=”..” type=”...” name=”...”></node>

如果该node中有其他tags,则必须使用这种形式。

(4) 一个node element包含三个必须的属性:pkg, type, name.

pkgtype属性指出ROS应该运行哪个pkg中的哪个node,注意:此处的type是可执行文件的名称,而name则是可以任意给出的,它覆盖了原有文件中ros::init指定的node name

(5) 使用匿名(anonymous name

  name=”$(anon base_name)”

(6) node 日志文件(log file

运行roslaunch和用rosrun运行单个节点的区别之一是,默认情况下,roslaunch运行的nodes的标准输出会重定向到log file,不显示在控制台。

该日志文件的位置和名称如下:

~/.ros/log/run_id/node_name-number-stdout.log

其中,run_idmaster启动后生成的特殊标识符,number是表示nodes数量的整数。如,turtlesim-1-stdout.log; teleop_key-3-stdout.log.

(7) 输出到控制台

output属性, output=”screen”;这种方法仅显示一个node

若显示所有nodes的输出,用--screen命令行。

$ roslaunch --screen package_name launch_file_name

如果正在运行的文件没有显示想要对输出,可以查看该node属性集中是否有 output=”screen”.

(8) 要求重生(request respawning)

    开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。

    respawn=”true”

(10) 必需的nodes

required属性与respawn相反,不能同时对同一个node使用。

required=”true”

当一个required node终止后,所有其他的nodes都会终止,并退出。这种命令有时很有用。比如,当一个很重要的node失败后,整个会话都会被扔掉,那些加上了respawn属性的nodes也会停止。

(11) 在独立的窗口运行各nodes

我们在各自的termin运行rosrun node_name;但是运行roslaunch时,所有的nodes共用一个相同的terminal,这对于那些需要从控制台输入的nodes很不方便。可以使用launch-prefix属性。

launch-prefix=”command-prefix”

Eglaunch-prefix=”xterm -e”

等价于 xterm -e rosrun turtlesim turtle_teleop_key

xterm 命令表示新建一个terminal; -e参数告诉xterm执行剩下的命令行。

当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdbvalgrind),或用于降低进程的执行顺序(通过nice.

 

namespace中执行nodes

node设置默认的namespace的常用方法——被称为“pushing down into a namespace”的进程,用于launch文件,并在其node element中指定ns属性。

ns=”namespace”

launch文件中的node namesrelative names。同一个launch文件中,允许不同namespace中出现相同的node namesRoslaunch要求node names必须是base names——不指定任何namespacesrelative names;如果node element中出现node nameglobal name,则会报错。

 

重映射namesremapping names

除了解析relative namesprivate namesROS也支持重映射,用于修改nodes当前使用的名称。

重映射相当于换名,每次重映射需提供一个original name和一个new name。每次node使用它的original name, ROS client library都会将其替换为remapping name


创建remapping name两种方法:

1. 对于单个node,在命令行进行remapping(remap对象可以是nodetopic)

   original-name:=new-name

Eg: $ rosrun turtlesim turtlesim_node turtle1/pose:=tim


2. 在launch文件内remap names,使用remap element

  <remap from=”original_name” to “new_name”>

如果remap出现在launch文件开头,作为launch文件的子元素,则该remapping将被用于随后所有的nodes。如果remap作为某个node的子元素,则只用于该节点。

Eg<node pkg=”turtlesim” type=”turtlesim_node” name=”turtle1”>

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

</node>

注意:在ROS进行remapping之前,remaping的所有name,包括originalnew names,都将被解析为global names。所以,remapping之后所有的名字通常都是relative names

 

其他的launch elements

5.1 including其他文件

为包含其他launch文件,包括这些launch文件的所有nodesparameters,用include element

<include file=”path-to-launch-file”>

这种情况下,file属性必须写出该launch文件的全部路径名称,显得很繁琐。因此,常用

<include file=”$(find package_name)/launch_file_name”/>

注意,执行该launch文件时,roslaunch会搜索该package下的所有子目录;因此,必须给出package_name。此外,include也支持ns属性,将它的内容放进指定的namespace

<include file=”...” ns=”namespace_name”/>


5.2 Launch arguments

为便于launch文件重构,roslaunch支持launch arguments,也成为arguments或者args,类似于局部变量。

注意:尽管argumentparameter有时可互换,但他们在ROS中的意义完全不同。ParametersROS系统使用的数值,存在parameter server上,nodes可通过ros::param::get函数编程得到,用户可通过rosparam获取。与之不同,arguments仅在launch文件内部有意义,nodes不能直接获取它们的值。

(1)声明argument

<arg name=”arg_name”>

(2)指定argument的值

Launch文件中的每个argument都必须有指定值。赋值方法有好几种。

第一种,在命令行赋值

$ roslaunch package_name launch_file_name arg-name:=arg_value

第二种,在声明argument时赋值

<arg name=”arg_name” default=”arg_name”/>

<arg name=”arg_name” value=”arg_name”/>

上面两行的区别在于,命令行参数可以覆盖default,但是不能重写value的值。

(3)获取变量值

一旦声明某个argument并赋值后,我们可以通过arg使用该argument.

$(arg arg-name)

如果该行出现,roslaunch将会用给定arg-name的值替换其左边的值。

(4)将argument值传给included launch文件

<include file=”path-to-file”>

<arg name=”arg_name” value=”arg_value”/>

......

</include>

若在launch文件中,launch文件及其包含的launch文件出现出现相同的arguments,则需在launch文件及included launch文件中同时写:

<arg name=”arg_name” value=”$(arg arg_name)”/>

第一个arg_name表示indluded launch文件中的argument,第二个arg_name表示launch文件中的argument.其结果是指定的argumentlaunch文件及included launch文件中都有相同的值。

 

5.3 创建groups

Group element可以再大型的launch文件中将指定的nodes组织起来。它有两个用处:

其一,group可以将几个nodes放进同一个namespace

<group ns=”namespace”>

<node pkg=”..” .../>

<node pkg=”..” .../>

......

</group>

注意,如果grouped node已经有它自己的namespace,并且是relative name,那么该nodenamespace是其relative name,并以group namespace为后缀。

其二,group可以同时启动或者终止一组nodes

<group if=”0 or 1”>

......

</group>

如果该属性的值是1,一切正常;如果该属性的值为0,那么group内所有的nodes都不会运行。

同理,除了if,还有unless

<group unless=”0 or 1”>

......

</group>

注意,这些属性的合法值只有01.

另外,group element中只能使用nsifunless这三个属性。

### 修改CMake文件以适应从ROSROS2的迁移 当从ROS迁移到ROS2时,CMake配置文件需要做出相应调整来兼容新的构建工具`colcon`以及遵循ROS2特有的标准和实践。 #### 更新依赖项声明 在旧版ROS项目中的`find_package(catkin REQUIRED COMPONENTS ...)`语句应当被替换为适用于ROS2的形式。对于ROS2而言,这通常意味着采用ament_cmake作为基础框架,并指定具体的组件名称而非通过catkin管理[^1]。 ```cmake # 原始ROS风格 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs) # 迁移至ROS2后的形式 if(NOT CMAKE_CROSSCOMPILING) find_package(ament_cmake REQUIRED) endif() find_package(rclcpp REQUIRED) find_package(rclpy REQUIRED) find_package(std_msgs REQUIRED) ``` #### 调整目标属性设置 针对每一个可执行文件或库的目标定义部分也需要更新。原有的`add_executable()`命令保持不变;但是后续用于链接库和其他资源的操作则需改为利用`ament_target_dependencies()`函数处理依赖关系,而不是原先的`target_link_libraries()`方法[^2]。 ```cmake # ROS方式下创建节点并连接依赖 add_executable(talker src/talker.cpp) target_link_libraries(talker ${catkin_LIBRARIES}) # 改进为ROS2的方式 add_executable(talker src/talker.cpp) ament_target_dependencies(talker rclcpp std_msgs) ``` #### 安装指令变更 最后,在安装阶段也要做适当改动。原本可能直接指定了某些路径来进行安装操作,现在推荐按照官方文档指导下的模式进行简化——即仅调用一次全局性的`install(TARGETS...)`即可完成大部分工作,而不再单独为各个子目录设定特定规则[^3]。 ```cmake # ROS传统做法 install(TARGETS talker DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) install(DIRECTORY launch/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch) # 对应于ROS2的新写法 install(TARGETS talkler EXPORT export_${PROJECT_NAME} INCLUDE DESTINATION include/${PROJECT_NAME} LIBRARY DESTINATION lib/${PROJECT_NAME} ARCHIVE DESTINATION lib/${PROJECT_NAME} RUNTIME DESTINATION bin) ``` 以上就是将现有基于ROS的工作空间转换成支持ROS2所需的主要更改要点。需要注意的是实际过程中还涉及到更多细节上的差异,建议参照官方提供的最新指南逐步实施改造计划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值