ROS学习笔记6:launch文件

前言

本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满20篇(6/20)。
环境:Ubuntu20.04、ROS1:noetic
环境配置:严格按照下方学习链接的教程配置,基本一次成功。
学习链接:【Autolabor初级教程】ROS机器人入门
对应链接文档:ROS机器人入门课程《ROS理论与实践》
笔记绝大部分代码使用Python语言编写。
本期关键词:launch文件标签

launch

  1. launch标签是所有launch文件的根标签
  2. 属性:deprecated="弃用声明",表示该版本的launch文件已被弃用。(但仍可使用,会有Warning提示)
  3. 如下:


    
    


  1. 指令执行时会输出:
WARNING: [/home/用户名/XXX_ws/src/helloworld/launch/start_turtle.launch] DEPRECATED: discard

node

  1. 属性
    • pkg=“包名”
    • type=“nodeType”,可执行文件
    • name=“节点名称”
    • args=“xxx xxx xxx” (可选),将参数传递给节点
    • respawn=“true | false”(可选),如果节点退出,是否自动重启
    • respawn_delay=" N" (可选),如果 respawn 为 true, 那么延迟 N 秒后启动节点
    • required=“true | false” (可选),如果为true节点退出时将杀死整个roslaunch
    • ns=“xxx” (可选),在指定命名空间中启动节点,可以避免名称冲突
    • output=“log | screen” (可选),log为日志文件,设置为log则终端无输出
  2. node标签的属性比较多,pkgtypenameoutput我们应该都很熟悉了,下面介绍几个之前没提到的但是也很常用的。
  3. 需要注意:roslaunch指令不能保证顺序执行节点。也就是说launch文件里节点的启动时序是不确定的,以乌龟运动控制为例,roslaunch指令可能是先启动gui节点,也有可能先启动key节点。
  4. respawn。代码如下:
<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="gui" respawn="true"/>
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" />

launch>

令界面显示节点的respawn="true",当运行该launch文件时,我们将乌龟显示界面关闭之后,会自动重新打开(节点退出后自动重启)。
4. required。代码如下:

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="gui" required="true"/>
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" />

launch>

运行该launch文件,我们将乌龟显示界面关闭之后会发现进程也随之关闭。
5. ns="名称"。会给节点名称添加前缀(私有命名空间),在一定程度上可以避免重名问题。代码如下:



    
    


运行launch文件后,执行rosnode list命令,结果如下:

/hello111/gui
/hello222/key

include

  1. include标签用于将另一个xml格式的launch文件导入到当前文件。
  2. 代码如下:
<launch>

    <include file="$(find helloworld)/launch/start_turtle.launch" ns="test"/>

launch>
  1. 属性:
    • file=“$(find 包名)/xxx/xxx.launch”
    • ns=“xxx” (可选)
  2. ns属性最好加上,确保节点的唯一性。以乌龟运动控制为例,如果这里不加上ns属性,我们运行该launch文件的同时,运行被导入的launch文件,这时先运行的节点就会被强制退出。

remap

  1. 很常用的一个标签,用于话题重命名。
  2. 先看示例代码:
<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="gui" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
    node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" />
    
launch>
  1. remap标签的作用是将原来的/turtle1/cmd_vel话题重命名为目标话题/cmd_vel
  2. 这里将话题重命名的目的,是更换乌龟的运动控制方式,原先我们使用的是turtle_teleop_key节点来控制乌龟运动,但是在使用的过程中我们可以感受到,这个节点的控制操作局限性很大,控制起来也不方便。
  3. 在这里我们选择ROS包中自带的teleop_twist_keyboard节点来控制乌龟运动,而这个节点发布的话题名称为“cmd_vel”,原来乌龟运动控制节点发布的话题名称为“/turtle1/cmd_vel”
  4. 运行该launch文件后,运行以下指令即可控制乌龟运动。
rosrun teleop_twist_keyboard teleop_twist_keyboard.py 
# 注意:第一次输入这个指令,按tab键是不会自动补全的
# 如果显示没安装,就运行下面这条指令
sudo apt-get install ros-noetic-teleop-twist-keyboard

param

  1. param标签主要用于在参数服务器上设置参数。
  2. 示例代码如下所示:
<launch>

    <param name="P_A" type="int" value="123" />
    <node pkg="turtlesim" type="turtlesim_node" name="gui" >
        <param name="P_B" type="double" value="1.23" />
    node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" />

launch>
  1. param标签有两种格式,一种是位于launch下,node外,另一种是在node内。两者的主要区别是,在node内的param标签设置的参数,会带上前缀(节点名作为前缀)。
  2. type参数可选的类型有:strintdoubleboolyaml。如果未指定参数类型,roslaunch会尝试确定参数类型:带有.的数字解析为浮点数(double),否则为整数(int),其他的解析为字符串(str)。

rosparam

  1. rosparam标签可以从YAML文件导入参数或导出参数,也可删除参数。
  2. param标签类似,rosparam标签也有两种格式。一种是位于launch下,node外,另一种是在node内。
  3. 示例代码如下:我们会发现,下面这个launch文件的保存在yaml文件下的参数和我们rosparam list查看到的并不一样,原因见要点4。
<launch>

    <rosparam command="dump" file="$(find helloworld)/launch/params.yaml" />
    <node pkg="turtlesim" type="turtlesim_node" name="gui" >
        <param name="P_B" type="double" value="1.23" />
    node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" />

launch>
  1. rosparam具有执行优先权,只有他执行完了其他才能执行;所以有时候rosparamdump指令结果会不符合预期。
  2. 解决方法就是rosparam标签单独在一个launch文件下创建,先执行其他launch文件,最后执行含有rosparam标签的launch文件。
  3. 示例代码如下:
<launch>
    <rosparam command="dump" file="$(find helloworld)/launch/params.yaml" />
    <rosparam command="delete" param="P_A"/>
launch>

group

  1. group标签具有ns属性,可以让节点归属某个命名空间。
  2. 示例代码如下:
<launch>
    <group ns="first">
        <node pkg="turtlesim" type="turtlesim_node" name="gui" />
        <node pkg="turtlesim" type="turtle_teleop_key" name="key" />
    group>

    <group ns="second">
        <node pkg="turtlesim" type="turtlesim_node" name="gui" />
        <node pkg="turtlesim" type="turtle_teleop_key" name="key" />
    group>
launch>

arg

  1. arg标签用于动态传参。
  2. 属性:
    • name=“参数名称”
    • default=“默认值” (可选)
    • value=“数值” (可选,如果value没有设置,则值为default)
  3. 代码示例如下:
<launch>

    <arg name="test_Arg" default="0.123" />

    <param name="test_A" value="$(arg test_Arg)" />
    <param name="test_B" value="$(arg test_Arg)" />

launch>
  1. 上述文件代码中,test_Atest_B共用test_Arg的值,只需要改变test_Arg的值,另外两个值也会跟着改变
  2. 在终端执行指令时,也可通过以下指令修改test_Arg参数的值:
roslaunch helloworld arg_test.launch test_Arg:=666

往期内容

  1. ROS学习笔记1:基础知识
  2. ROS学习笔记2:话题通信
  3. ROS学习笔记3:服务通信与参数服务器
  4. ROS常用命令记录
  5. ROS学习笔记4:通信机制实操
  6. ROS学习笔记5:常用API和模块导入

你可能感兴趣的:(学习,笔记,python,c++,服务器,vscode)