在Jetson Nano上学习ROS的记录(版本Ubuntu18.04,课程来源赵虚左老师的《ROS理论与实践》)第八章 元功能包、节点运行管理launch文件(teleop_twist安装方法)

系列文章目录

第一章 ROS空间创建、helloworld的实现、开启多个节点
第二章 话题通信
第三章 服务通信
第四章 参数服务器
第五章 常用指令
第六章 通信机制实操
第七章 ROS通信机制进阶(常用API、Python模块的导入)
第八章 元功能包、节点运行管理launch文件(teleop_twist安装方法)
第九章 重名问题、分布式通信
第十章-第一节 TF坐标变换(内含PyKDL 和PyInit__tf2功能缺失等解决)
第十章-第二节 TF坐标变换实操
第十章-第三节 rosbag、rqt工具箱
第十一章-第一节 机器人系统仿真(URDF相关)
第十一章-第二节 机器人系统仿真(Gazebo相关)
第十二章 机器人导航(仿真)


前言

现在大二,之前大一有幸参加了2021的国赛,很壮烈的拿了个江苏赛区的二等奖。但发现无人机这个题,真的是往堆钱上走了。不上ROS不行,现在来记录一下一个纯小白学习ROS的过程和遇到的问题。防止学弟、学妹们再走我走过的弯路。板子用的是学长给的Jetson Nano(4GB),版本是Ubuntu18.04(已配置好基础ROS所需配置)

一、ROS元功能包

显而易见的,逐一安装功能包的效率低下,在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。

  1. 新建一个功能包 (依赖项为空即可)
    修改package.xml ,内容如下:
    51行:
  <buildtool_depend>catkin</buildtool_depend>
  <exec_depend>plumbing_pub_sub</exec_depend>
  <exec_depend>plumbing_server_client</exec_depend>
  <exec_depend>plumbing_param_server</exec_depend>

59行:

  <export>
    <!-- Other tools can request additional information be placed here -->
    <metapackage />
  </export>
  1. 修改 CMakeLists.txt,内容如下:(把原有的所有行都删除)
cmake_minimum_required(VERSION 3.0.2)
project(plumbing_my)
find_package(catkin REQUIRED)
catkin_metapackage()

二、ROS节点运行管理launch文件

1.引入

launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。简化节点的配置与启动,提高ROS程序的启动效率。

  1. 建立功能包,(依赖: roscpp rospy std_msgs turtlesim)在功能包下添加 launch目录, 目录下新建
    xxxx.launch 文件,编辑 launch 文件。 代码如下:
<launch>
<!--启动的节点   pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
    <node pkg="turtlesim" type="turtlesim_node"     name="my_turtle" output="screen" />
    <!--键盘控制节点-->
    <node pkg="turtlesim" type="turtle_teleop_key"  name="my_key" output="screen" />
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch

注意:roslaunch 命令执行launch文件时,首先会判断是否启动了 roscore,如果启动了,则不再启动,否则,会自动调用 roscore

2.launch文件标签之launch

<launch>标签是所有 launch 文件的根标签,充当其他标签的容器

  1. 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
    代码如下:
<launch deprecated ="此文件已经过时">
    <!--启动的节点   pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
    <node pkg="turtlesim" type="turtlesim_node"     name="my_turtle" output="screen" />
    <!--键盘控制节点-->
    <node pkg="turtlesim" type="turtle_teleop_key"  name="my_key" output="screen" />
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch

3.launch文件标签之node

<node>标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)

  • pkg=“包名”
    节点所属的包
  • type=“nodeType”
    节点类型(与之相同名称的可执行文件)
  • name=“nodeName”
    节点名称(在 ROS 网络拓扑中节点的名称)
  • argv=“xxx xxx xxx” (可选)
    将参数传递给节点
  • machine=“机器名”
    在指定机器上启动节点
  • respawn=“true | false” (可选)
    如果节点退出,是否自动重启
  • respawn_delay=" N" (可选)
    如果 respawn 为 true, 那么延迟 N 秒后启动节点
  • required=“true | false” (可选)
    该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch
  • ns=“xxx” (可选)
    在指定命名空间 xxx 中启动节点
  • clear_params=“true | false” (可选)
    在启动前,删除节点的私有空间的所有参数
  • output=“log | screen” (可选)
    日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log
  1. 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
    代码如下:
<launch>
    <!--启动的节点   pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
    <!--respawn="true"节点关闭后自动重启-->
    <!--required="true"节点退出后,关闭整个系统-->
    <!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
    <!--键盘控制节点-->
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch

4.launch文件标签之include

<include>标签用于将另一个 xml 格式的 launch 文件导入到当前文件,即调用另一个launch文件里的节点

  1. 在launch目录下新建 xxxx.launch 文件,编辑 launch 文件。 代码如下:
<!--需要copy start_turtle.launch-->
<launch>
    <!--包含以下launch文件中节点:file="$(find 包名)/xxx/xxx.launch"-->
    <include file="$(find launch01_basic)/launch/start_turtle.launch"/>
    <!--其他节点-->
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle_use.launch

注意:若被调用的launch文件指定了命名空间,则在调用他的launch中也需指定命名空间导入文件
ns=“xxx” (可选)
在指定命名空间导入文件

5.launch文件标签之remap(teleop_twist_keyboard功能包安装)

用于话题重命名

  1. 安装teleop_twist_keyboard功能包
    在工作空间下,安装功能包。
cd 工作空间/src
git clone https://github.com/ros-teleop/teleop_twist_keyboard
cd 工作空间
catkin_make
source ~/工作空间/devel/setup.bash
source ~/.bashrc

将编译好的功能包路径添加到环境变量中,在其他终端也可以使用teleop_twist_keyboard功能包了。操作如下:
新开一个终端:gedit ~/.bashrc :
在打开的文件中添加编译好的setup.bach文件: source ~/工作空间/devel/setup.bash
启动roscore,新开一个命令行输入:rosrun teleop_twist_keyboard teleop_twist_keyboard.py 即可使用键盘控制。

  1. 以下是统一teleop_twist_keyboard与我开的乌龟话题的方法:
    建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
    代码如下:
<launch>
    <!--启动的节点   pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
    <!--respawn="true"节点关闭后自动重启-->
    <!--required="true"节点退出后,关闭整个系统-->
    <!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
    <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" output="screen" />
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch

新开一个命令行:rosrun teleop_twist_keyboard teleop_twist_keyboard.py
即:
from=“xxx”
#原始话题名称

to=“yyy”
#目标名称
注意:若launch文件指定了命名空间,则话题名称需要更换!!

6.launch文件标签之param

<param>标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在标签中时,会给参数名称+一个前缀,相当于私有命名空间。

  • name=“命名空间/参数名”
    参数名称,可以包含命名空间
  • value=“xxx” (可选)
    定义参数值,如果此处省略,必须指定外部文件作为参数源
  • type=“str | int | double | bool | yaml” (可选)
    指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
    如果包含 ‘.’ 的数字解析未浮点型,否则为整型
    “true” 和 “false” 是 bool 值(不区分大小写)
    其他是字符串
  1. 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
    代码如下:
<launch>
    <!--启动的节点   pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
    <!--respawn="true"节点关闭后自动重启-->
    <!--required="true"节点退出后,关闭整个系统-->
    <!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
    <!--param 使用:向参数服务器设置参数-->
    <!--格式1:launch下,node外-->
    <param name="param_A" type="int" value="100" />
    <node pkg="turtlesim" type="turtlesim_node"     name="my_turtle" output="screen">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
        <!--格式2:node下 私有命名空间-->
        <param name="param_B" type="double" value="3.14" />
    </node>
    <!--键盘控制节点-->
    <node pkg="turtlesim" type="turtle_teleop_key"  name="my_key" output="screen" />
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch

新开一个命令行:rosparam list
即可查看到响应:

/my_turtle/background_b
/my_turtle/background_g
/my_turtle/background_r  
/my_turtle/param_B
/param_A
/rosdistro
/roslaunch/uris/host_lzl_desktop__35979
/rosversion
/run_id

7.launch文件标签之rosparam

<rosparam>标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,标签在标签中时被视为私有。

  • command=“load | dump | delete” (可选,默认 load)
    加载、导出或删除参数
  • file=“$(find xxxxx)/xxx/yyy…”
    加载或导出到的 yaml 文件
  • param=“参数名称”
    ns=“命名空间” (可选)
  1. 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件(2个),编辑 launch 文件。
    代码1如下:
<launch>
    <!--启动的节点   pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
    <!--respawn="true"节点关闭后自动重启-->
    <!--required="true"节点退出后,关闭整个系统-->
    <!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
    <!--param 使用:向参数服务器设置参数-->
    <!--格式1:launch下,node外-->
    <param name="param_A" type="int" value="100" />

    <!--rosparam 使用:操作参数服务器数据-->
    <!--格式1:launch下,node外-->
    <!--加载参数-->
    <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>
    <!--导出参数 rosparam的优先级比node高-->
   

    <node pkg="turtlesim" type="turtlesim_node"     name="my_turtle" output="screen">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
        <!--格式2:node下 私有命名空间-->
        <param name="param_B" type="double" value="3.14" />

        <!--格式2:node下 私有命名空间-->
        <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>
    </node>
    <!--键盘控制节点-->
    <node pkg="turtlesim" type="turtle_teleop_key"  name="my_key" output="screen" />
</launch>

代码2如下:

<launch>
     <rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml"/>
    <!--删除参数-->
    <rosparam command="delete" param="bg_B" />
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch

新开一个命令行:

source ./devel/setup.bash
roslaunch launch01_basic dump.launch

8.launch文件标签之group

<group>标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间。子级标签是除了launch 标签外的其他标签。

  • ns=“名称空间” (可选)
  • clear_params=“true | false” (可选)
    启动前,是否删除组名称空间的所有参数(慎用…此功能危险)
  1. 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
    代码如下:
<launch>
    <!--启动两对乌龟GUI与键盘控制节点-->

    <group ns="first">
        <node pkg="turtlesim" type="turtlesim_node"     name="my_turtle" output="screen"/>
        <node pkg="turtlesim" type="turtle_teleop_key"  name="my_key" output="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" output="screen" />
    </group>
</launch>
  1. 编译运行
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic turtles.launch

新开一个命令行:rosnode list
即可看到响应结果:

/first/my_key
/first/my_turtle
/rosout
/second/my_key
/second/my_turtle

9.launch文件标签之arg

<arg>标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性

  • name=“参数名称”

  • default=“默认值” (可选)

  • value=“数值” (可选)
    不可以与 default 并存

  • doc=“描述”
    参数说明

  1. 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
    代码如下:
<launch>
    <!--需求:演示arg的使用,需要设置多个参数,这些参数的使用是同一个值(小车的长度),怎么设置-->
    <!-- <param name="A" value="0.55"/>
    <param name="B" value="0.55"/>
    <param name="C" value="0.55"/> -->

    <arg name="car_length" default="0.55"/>

    <param name="A" value="$(arg car_length)"/>
    <param name="B" value="$(arg car_length)"/>
    <param name="C" value="$(arg car_length)"/>
</launch>
  1. 编译运行 roscore
    新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic arg.launch
rosparam list

还可以直接修改参数:roslaunch launch01_basic arg.launch car_length:=0.6

总结

以上就是今天要讲的内容,本文仅仅简单记录了ROS元功能包、节点运行管理launch文件(teleop_twist安装方法),如果有问题请在博客下留言或者咨询邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/layra_liu/article/details/124465151