创建功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_launch (不需要依赖)
$ cd learning_launch
$ mkdir launch (创建一个文件夹,方便资源管理)
然后再launch文件夹下创建文本,编写代码
$ touch 文本名 例如: $ touch simple.launch
launch语法1:
<launch> launch文件中的根元素采用<launch>标签定义
<node> : 启动节点
<node pkg = "package-name" type = "executable=name" name = "node-name" output = "log|screen|both" />
- pkg:节点所在的功能包名称
- type:节点的可执行文件名称
- name:节点运行时的名称
output:
- log:这是系统的默认设置。当选择此设置时,节点的输出信息会被重定向到 ROS 的日志文件中。这些日志文件通常存放在
~/.ros/log
目录下。如果你希望避免终端被大量的输出信息占据,那么这个设置会很实用。 - screen:若将
output
属性设为screen
,节点的输出信息就会直接显示在启动该节点的终端上。这一设置适合用于调试阶段,方便你实时查看节点的输出情况。 - both:当设置为
both
时,节点的输出信息会同时被发送到终端和日志文件中。这样一来,你既能在终端看到实时的输出,又能在后续通过日志文件进行详细分析。
simple.launch代码:(写代码的时候可以修改文本显示语法----点击文本右下角的 “纯文本” ,搜索 “xml” 或者 点击文本右上角的三个横向 ---> "查看" ---> "高亮模式")
<launch>
<node pkg = "learning_topic" type = "person_subscriber" name="taker" output = "screen" />
<node pkg = "learning_topic" type ="person_publisher" name = "listener" output = "screen" />
</launch>
运行该代码:
$ roslaunch learning_launch simple.launch
分析:
type的内容为learning_topic功能包下CMakeListstxt下的可执行文件
name的内容是在节点运行时会覆盖默认节点名,节点的默认名称通常由代码中的ros::init()指定
launch语法2:参数设置
<param> :设置ROS系统运行中的参数,存储在参数服务器中
<param name = "output_frame" value = "odom" />
- name: 参数名
- value: 参数值
<rosparam> : 加载参数文件中的多个参数:
<rosparam file = "params.yaml" command = "load" ns = "params" />
- file :指定要加载的 YAML 文件路径,格式可以是绝对路径,或使用 ROS 包相对路径(如
$(find package_name)/path/to/file.yaml
) -
command
:指定对参数执行的操作类型 -
可选值:
load
(默认):从 YAML 文件加载参数到参数服务器。dump
:将参数服务器中的参数导出到指定文件(需配合file
)。delete
:删除指定命名空间下的所有参数(需配合ns
)。
- ns:指定参数加载的目标命名空间,YAML 文件中的所有参数将被加载到该命名空间下。
注意:若省略 command
,默认为 load
。
<arg> : launch文件内部的局部变量,仅限于launch文件使用
<arg name = "arg-name" default = "arg-value" />
- name : 参数名
- value : 参数值
调用:
<param name = "foo" value = "$(arg arg-name)" />
<node name = "node" pkg = "package" type = "type" args = "$(arg arg-name)" />
创建yaml文件
$ cd ~/catkin_src/learning_launch
$ mkdir config
$ cd config/
$ touch param.yaml
内容如下:
# A: 123之间的空格不能省略
A: 123
B: "Hello"
# 命令空间
group:
c: 450
D: "Hello"
turtlesim_parameter_config.launch文件代码:
<launch>
<param name = "/turtle_number" value = "2" />
<node pkg = "turtlesim" type = "turtlesim_node" name = "turtlesim_node">
<param name = "turtle_name1" value = "Tom" />
<param name = "turtle_name2" value = "Jerry" />
<rosparam file = "$(find learning_launch)/config/param.yaml" command = "load" />
</node>
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "turtle_teleop_key" output = "screen" />
</launch>
运行代码:
$ roslaunch learning_launch turtlesim_parameter_config.launch
分析:
turle_name1和turtle_name2前面都有一个 turtlesim_node ,这是因为设置该参数的时候缩在 turtlesim_node 下面
这些参数都与我们turtlesim_parameter_config.launch文件内容一一对应
start_tf_demo_c++.launch文件代码:(实现海龟跟随)
<launch>
<!-- Turtlesim Node-->
<node pkg = "turtlesim" type = "turtlesim_node" name = "sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name ="teleop" output = "screen"/>
<node pkg = "learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
<node pkg = "learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />
<node pkg = "learning_tf" type="turtle_tf_listener" name="listener" />
</launch>
运行代码:
$ roslaunch learning_launch start_tf_demo_c++.launch
launch 语法3
<remap> : 重映射ROS计算图资源的命名
<remap from = "/turtlebot/cmd_vel" to = "/cmd_vel"
- form : 原命名
- to : 映射之后的命名
<include> : 包含其他launch文件,类似C语言文件的头文件包含
<include file = "$(dirname)/other.launch" />
- file : 包含其他launch文件路径
turtlesim_remap.launch文件代码:
<launch>
<include file = "$(find learning_launch)/launch/simple.launch" />
#启动turtlesim包中的turtlesim_node节点,并且把该节点默认的/turtle1/cmd_vel话题重新映射为/cmd_vel
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<remap from ="/turtle1/cmd_vel" to="/cmd_vel"/>
</node>
</launch>
运行代码:
$ roslaunch learning_launch turtlesim_remap.launch
simple.launch文件和海归仿真器同时运行
查看话题列表
$ rostopic list
节点默认的/turtle1/cmd_vel
话题重新映射变为/cmd_vel,
其他节点就能通过/cmd_vel
话题来控制turtlesim
里的海龟运动,例如:
$ rostopic pub /cmd_vel (双击Tab键补全)
海龟会按照设置的指令运动 (只动一小会)