ROS进阶学习手记6.1 – Launch File
在以后的ROS运用中,我们逐渐需要运行多个nodes,而launch file的编写是ROS高级运用的基础。
官方的launch file wiki文档好像不是很好用:wiki.ros.org/roslaunch/
这里我主要参考:A Gentle Introduction to ROS by JasonM. O’Kane 的 Chapter6
先来尝尝鲜:
接着就是好好读书。
这里只会写一点总结文字。 :)
== roslaunch - Commands and launch file ==
1. How to usd launch file:
Command:
$ roslaunch package-name launch-file-name
$ roslaunch ~/{workspace}/src/{pkgname}/example.launch
All of the nodes in a launch file are started at roughly the same time.
Request verbose output:
$ roslaunch -v package-name launch-file-name
2. Creating launch files:
2.1 Where to place launch files
{pkg directory}/launch/launchfile.launch
2.2 Basic ingredients
The simplest launch files consist of a root element containing several node elements.
<launch>
<node pkg="package-name" type="executable-name" name="node-name" />
</launch>
You can also also write the closing tag explicitly:
<node pkg="..." type="... " name="... "></node>
In fact, this explicit closing tag is needed if the node has children, such as remap or
paramelements.
pkg 和 type 两个属性指定了ROS应该运行哪个程序来启动这个节点。相当于两行rosrun命令,一行指定pkg name,一行指定excutabel name。
name 属性给这个node分配了一个名称。它会覆盖node代码中ros::init段给自己分配的那个name.
看下面这个例子:
<node
pkg="turtlesim"
type="turtle_teleop_key"
name="teleop_key "
required="true "
launch −prefix="xterm −e"
ns="sim1 "
/>
默认下,$ROS_HOME/log会存储roslaunch运行后的log文件。通过output=“log|screen”(optional) 来改。
roslaunch --screen package-name launch-file-name
output=“screen” or “log”
Requesting respawning: respawn=“true”
Requiring nodes: required=“true”
Launching nodes in their own windows:
launch-prefix="command-prefix"
launch-prefix="xterm -e"
xterm -e rosrun turtlesim turtle_teleop_key
node标签还有一些属性,也非常有用. 更多请见:
http://wiki.ros.org/roslaunch/XML/node#Attributes
2.3 Launching nodes inside a namespace
ROS supports relative names, which utilize the concept of a default namespace. The usual way to set the default namespace for a node—a process often called pushing down into a namespace—is to use a launch file, and assign the ns attribute in its node element:
ns=“namespace”
e.g.
———————————
1. <launch>
2. <node
3. name="turtlesim_node"
4. pkg="turtlesim"
5. type="turtlesim_node"
6. ns="sim1"
7. />
8. <node
9. pkg="turtlesim"
10. type="turtle_teleop_key"
11. name="teleop_key"
12. required="true"
13. launch−prefix="xterm−e"
14. ns="sim1"
15. />
16. <node
17. name="turtlesim_node"
18. pkg="turtlesim"
19. type="turtlesim_node"
20. ns="sim2"
21. />
22. <node
23. pkg="agitr"
24. type="pubvel"
25. name="velocity_publisher"
26. ns="sim2"
27. />
28. </launch>
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
—————————-
In this case, both nodes have the same relative name, turtlesim_node. Such identical relative names
are not a problem, however, because the global names to which they are resolved, namely /sim1/turtlesim_node and /sim2/turtlesim_node, are different.
3. Remapping names
任何node的名字都可以被重映射,当它在命令行中launched时。这是一个ROS的强大功能。它可以让你通过命令行在多种配置下,运行同样的node,而不冲突。还可以为private node prarmeter 提供 assignment. 这个可以让你区别复杂的名字(defer complex name assignments to the actual runtime loading of the system. )在系统运行期间。
http://wiki.ros.org/Remapping%20Arguments
3.1 Creating remappings
There are two ways create remappings when starting a node.
original-name:=new-name
or:
3.2 Reversing a turtle
写一个broadcaster,收听cmd_vel,翻转,发布一个叫做cmd_vel_reversed的topic。然后让turtlesim_node remapping到cmd_vel_reversed上。
4. Other launch file elements
我们以下面这个launch file为例,说几个Other launch file elements
=========================
1. 1 <launch>
2. 2 <include
3. 3 file="$(findagitr)/doublesim.launch"
4. 4 />
5. 5 <arg
6. 6 name="use_sim3"
7. 7 default="0"
8. 8 />
9. 9
10. 10 <groupns="sim3"if="$(arguse_sim3)">
11. 11 <node
12. 12 name="turtlesim_node"
13. 13 pkg="turtlesim"
14. 14 type="turtlesim_node"
15. 15 />
16. 16 <node
17. 17 pkg="turtlesim"
18. 18 type="turtle_teleop_key"
19. 19 name="teleop_key"
20. 20 required="true"
21. 21 launch−prefix="xterm−e"
22. 22 />
23. 23 </group>
24. 24</launch>
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
=========================
4.1 Including other files
<include file="path-to-launch-file" />
<include file="$(find package-name)/launch-file-name" />
<include file=". . . " ns="namespace" />
4.2 Launch arguments
让launch files 是可以配置的, roslaunch命令支持launch arguments, 也叫做arguments or args.
这有点像可执行文件的局部变量。好处是比如每次运行时,有些小地方的不同,通过使用一些arguments,你可以避开代码的重复。
Declaring arguments
To declare the existence of an argument, use an arg element:
Assigning argument values
launch file里的argument必须要赋值,You can provide a value on the roslaunch command line:
$ roslaunch package-name launch-file-name arg-name:=arg-value
Alternatively, in your launchfile, using one of these two syntaxes:
<arg name="arg-name" default="arg-value" />
<arg name="arg-name" value="arg-value" />
注意:argument values set by “value” cannot be changed.
Accessing argument values
Once an argument is declared and a value assigned to it, you can use its value using an arg substitution, like this:
$(arg arg-name)
Sending argument values to included launch files
<include file=“path-to-launch-file”>
. . .
4.3 Creating groups
One final launch file feature is the group element, which provides a convenient way to organize nodes in a large launch file.
Groups can push several nodes into the same namespace.
. . .
Every node within the group starts with the given default namespace.
Group还可以加一些条件,使某些节点使能或使不能。更多详情请参见教材。。
总结
这里我们看到通过launch file和 roslaunch 命令,如何实现 启动nodes, 加上复杂的配置。具体的内容参见教材。
《A Gentle Introduction to ROS by JasonM. O’Kane》南卡罗来纳州立大学教授写的。免费pdf