当前位置:网站首页>4.1ROS运行管理/launch文件

4.1ROS运行管理/launch文件

2022-08-11 07:35:00 janedipan


在多级层深的ROS系统中,其实现与维护可能会出线一些问题,如何关联不同发package,繁多的node如何启动?package,node,topic,parameter重名时如何处理?不同主机上的node如何通信

ROS元功能包-MetaPackage

完成一个系统性的功能时,可能涉及多个功能包,若逐一安装功能包则效率低下,ROS提供一种方式将不同功能包打包成一个功能包,当需要使用某个功能包时,直接调用打包后的功能包即可;打包后的功能包称为元功能包
MetaPackage时Linux的一个文件管理系统的概念,可以理解为功能包的目录索引返回目标功能包的信息、地址,没有什么实质性的内容
本节将 把工作空间demo03下 plumbing_pub_sub, plumbing_server_client, plumbing_param_server三个自定义包打包为元功能包metapackage—plumbing_my

举例python实现
1.创建一个package—plumbing_my,然后确定依赖dependeces时先不填
2.修改package.xml文件,在末尾添加依赖,添加实现

<exec_depend>plumbing_pub_sub</exec_depend>
<exec_depend>plumbing_server_client</exec_depend>
<exec_depend>plumbing_param_server</exec_depend>

<export>
    <metapackage />
<export>

3.修改CMakeList.txt文件,将注释部分全部删除,在第4行加入以下函数
catkin_metapackage()
完成以上3步则编译,没问题即可


ROS节点管理launch文件

采用优化策略便是使用roslaunch命令来集合launch文件启动管理节点,一个程序可依次启动多个节点
launch文件时XML格式的文件,可以启动本地和远程的多个节点

launch

<launch>是所有launch文件的根标签,充当其他标签的容器,其他标签都是他的子集
属性:deprecated=“弃用声明”,在<launch>标签后输入该属性,则在roslaunch命令后,会抛出warn显示你传入的弃用声明:
start_turtle.launch

<launch deprecated="the file has been abandoned">
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" outpit="screen" />
</launch>

node

<node>标签用于指定ROS节点,注意:roslaunch命令不能保证按照node的声明顺序来启动节点
节点所属包
● type=“node Type” 节点可执行文件名
● name=“nodename” 节点名称
● args=“xxx xxx xxx” 传入参数
● machine=“机器名\设备名”
● respawn=“true\false” 如果节点退出,是否重新启动
● respawn_delay=“N” 设置Ns后重启系统
● required=“true“ 节点退出后是否退出整个roslaunch
● ns=”xx“ 为node节点设置命名空间–添加前置,可避免重名
● clear_params=“true | false” 在启动前,删除节点的私有空间的所有参数 慎用
● output=“log\screen” 日志发送目标,log日志文件(默认),sreen是屏幕


remap

用于话题topic重命名
from=“xx” 原始话题名称;to=“目标名称”
turtlesim_nodeturtle_teleop_key,两个节点使用的节点是/turtle1/cmd_vel,前者是订阅者,后者是发布者;若想使用 teleop_twist_keyboard节点控制turtle,其定义的话题是/cmd_vel,因此需要临时更改turtlesim_node的话题名称才能与控制方正常通信
launch01_basic/launch/start_turtle.launch

<launch deprecated="the file has been abandoned">
    <node pkg= "turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
    </node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" outpit="screen" />
</launch>

先启动launch文件,roslaunch launch01_basic start_turtle.launch
再启动noetic内置键盘控制节点 rosrun teleop_twist_keyboard teleop_twist_keyboard.py—即可使用新的键盘控制方式控制turtle


include

<include>用于将另外一个xml格式的launch文件导入当前文件
使用"file=$(find文件名)"调用
使用"ns=“xx” 在指定命名空间导入文件

<launch>
    <include file="$(find <package_name>/launch/<file.launch>" />
</launch>

param

主要用于参数服务器上设置参数,参数源可以在标签中通过value指定,也可以通过外部文件加载,在<node>标签中,相当于私有命名空间
● name=“命名空间/parameter_name”
● value=“xx”
● type=“str\int\double\bool\yaml”
launch01_basic/launch/start_turtle.launch

<launch deprecated="the file has been abandoned">
    <param name="param_A" type="int" value="100" /> #设置第一个参数A
    <node pkg= "turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
        <param name="param_B" type="double" value="3.14" /> 设置第二个参数B
    </node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" outpit="screen" />
</launch>

运行以上launch文件后,调用rosparam list,发现有新增/my_turtle/param_B/param_A 两个参数;再运行rosparam get \<parameter\>即可获取对应值


rosparam

可以从YAML文件导入参数,或将参数导出到YAML文件,也可以用来删除参数,当<rosparam>标签在<node>标签下设置,则被视作该node私有
● command=“load导入\dump导出\delete删除” 默认是load
file=“$(find 功能包)/文件路径/file.yaml”
● param=“parameter_name”
● ns=“命名空间”
1.需要先保存xml数据文件存放进workspace中,再使用<rosparam>的command=load即可将yaml文件的数据导入参数服务器中
launch01_basic/launch/params.yaml

bg_R: 100
bg_G: 50
bg_B: 255

launch01_basic/launch/start_turtle.launch

# launch01_basic/launch/start_turtle.launch
<launch deprecated="the file has been abandoned">
    <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml" /> #设置第一个参数A
    <node pkg= "turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
        <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml" /> 设置第二个参数B
    </node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" outpit="screen" />
</launch>

group

对节点分组,具有ns属性,可以让节点归属某个命名空间—分类
● ns=“命名空间”
● clear_params=“true\false” 删除命名空间中断的所有参数
实例:启动两个turtleGUI,分组管理
launch01_basic/launch/turtles.launch

<launch deprecated="the file has been abandoned">
    <group ns="first">
        <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
        <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" outpit="screen" />
    </group>
    <group ns="second">
        <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
        <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" outpit="screen" />
    </group>  
</launch>

arg

用于动态传参,类似于函数的参数,可以增强launch文件的灵活性
● name=“parameter”
● default=“默认值”
● value=“xx”
● doc=“description”

<launch>
    <arg name="car_length default="0.55" />
    <param name="A" value="$(arg car_length)" />
    <param name="B" value="$(arg car_length)" />
</launch>

在启动完launch文件后,执行rosparam list 可以发现/A, /B两个变量,执行rosparam get A 即可得到A对应的值;若是想不使用默认值,可以在执行roslaunch时动态传入参数 roslaunch launch01_basic/launch/arg.launch car_length:=0.6,然后再用rosparam get A 验证参数是否改变

原网站

版权声明
本文为[janedipan]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43831098/article/details/126262782