机器人操作系统(ROS)浅析(肖军浩 博士 译) 学习笔记二(第六章到第十章)

第 6 章 启动文件 
利用启动文件一次性配置和运行多个节点 。 
roslaunch :这是一个自适应工具,如果启动多节点时没有节点管理器运行,它会自动启动节点管理器;如果已经有一个节点 管理器在运行,则会使用已有的。    
利用启动文件一次性配置和运行多个节点。任何包含两个或两个以上节点的系统都可以利 用启动文件来指定和配置需要使用的节点。本章将对启动文件和运行启动文件的 roslaunch 工具进行介绍。
6.1 使用启动文件  
    (1)执行启动文件 想要运行一个启动文件,可以像下面这样使用 roslaunch命令 : roslaunch package-name launch-file-name 
launch-file-name正常情况下创建于一个package中。
注意:使用roslaunch命令之前需要先:source devel/setup.bash
    (2)ROS 也允许使用不归属于任何功能包的启 动文件,此时需要向 roslaunch 提供启动文件的路径:roslaunch ~/ros/src/agitr/example.launch 

    终止启动过程可以使用 Ctrl-C 来终止一个活跃的 roslaunch。
6.2 创建启动文件 
    (1)启动文件的存储位置 :
        每一个启动文件都应该和一个特定的功能包关联起来。
        example.launch具体位置:

    (2)启动文件是 XML 文件。
        插入根元素 :
            
    (3)启动节点:
        节点元素的形式为: 
            
        ——》斜杠“/”是很容易忘记的,但是它很重要。它表明不必再等待结束标签(“</node>”),并且该节点元素是完整的。
    每个节点元素有如下三个必需的属性:
    ——》pkg 和 type 属性定义了 ROS 应该运行哪个程序来启动这个节点。即给出功能包名和可执行文件的名称。 
        pkg=”package-name”
        type=”executable-name”  
        name=”node-name” 
    ——》name 属性给节点指派了名称,它将覆盖任何通过调用 ros::int 来赋予节点的名称。
为节点保留独立的终端:Launch-prefix=“command-prefix” 。
        查看节点日志文件:从启动文件启动节点的标准输出被重定向到一个日志文件中,该日志文件的名称是: 
            ~/.ros/log/run_id/node_name-number-stout.log 
    
在控制台中输出信息对于某个单独的节点,只需在节点元素中配置 output 属性就可以达到该目的: 
            output=”screen”——》配置了该属性的节点会将标准输出显示在屏幕上而不是记录到之前讨论的日志文档。
使用--screen 命令行选项来令 roslaunch 在控制台中显示所有节点的输出: 
            roslaunch –screen package-name launch-file-name 
请求复位:对于每个节点,我们可以设置 respawn 属性为真,这样当节点停止的时候, roslaunch 会重新启动该节点。 
            respawn=”true” 
必要节点(requiring node) :
    将一个节 点声明为必要节点:
        required=”true” 
  当一个必要节点终止的时候,roslaunch 会终止所有其他活跃节点并退出。
为节点维护独立的窗口 :
        ——》使用 roslaunch 的一个缺点是所有的节点共享一个终端。
    roslaunch 提供了一个 对某个节点提供所需要依赖控制台输入的终端 的简洁方法—— 对节点元素使用启动前缀(launch-prefix)属性: 
            launch-prefix=“command-prefix” 
        
        launch-prefix=“xterm -e” 
它与下列命令等价:
     xterm -e rosrun turtlesim turtle_teleop_key 
xterm 命令将打开一个简单终端窗口。参数-e 告诉 xterm 在新打开的终端中执行该命令行的剩余部分(这里是 rosrun turtle_teleop_key)。
    
6.3 在命名空间内启动节点 
    对一个节点设置默认命名空间的通常方法是使用 一个启动文件,并对其节点元素配置命名空间(ns)属性: (ns = namespace)
            
6.4 名称重映射(REMAPPING NAMES) 
    当启动一个节点的时候,有两种方法来创建重映射。:
    (1)当使用命令行启动节点时,分别给出原始名称和新名称,中间由一个:=分开,如下所示: 
            original-name := new-name 
        e.g:rosrun turtlesim turtlesim_node turtle1/pose:=tim 
    (2)通过启动文件的方式,只需在启动文件内使用重映射(remap) 元素即可:
        <remap from=”original-name”to ”new-name”/> 
如果该属性在顶层,即作为 launch 元素的子元素出现,重映 射将会应用到所有的后续节点。
        这些重映射元素也可以作为 一个节点元素的子元素,如: 
        <node node-attributes> 
            <remap from=”original-name”to ”new-name”/> 
        </node> ——》在这种情况下,给出的重映射只应用于其所在的节点。
    有一点需要牢记:在 ROS 应用任何重映射之前,所有的名称都要先解析为全局名称,包括重映射中的原始名称和新名称。

6.5 启动文件的其他元素 
    (1)如果想在启动文件中包含其他启动文件的内容:<include file=”path-to-launch-file”> 
        ——》此处 file 属性的值应该是我们想包含的文件的完整路径。
        由于直接输入路径信息很繁琐且容易出错,大多数包含元素都使用 查找(find)命令搜索功能包的位置来替代直接输入路径: 
            <include file=”$(find package-name)/launch-file-name”>
    当roslaunch 命令行工具在搜索一个功能包中的 启动文件时,会搜索功能包内的所有子目录。
        包含元素同样支持命名空间属性,可以将内容压入一个指定 的命名空间中去: 
        <include file=”…” ns=”namespace”/> 
    (2)为了使启动文件便于配置,roslaunch还支持启动参数,有时 也简称为参数甚至args。
        声明参数: 为了声明一个参数,可以使用 arg 元素:
        <arg name=”agr-name”> 
        参数赋值: 启动文件中的每一个参数都要进行赋值,三种方法:
            A:roslaunch package-name launch-file-name arg-name:=arg-value 
            B:<arg name=”arg-name” default=”arg-value”/> 
                <arg name=”arg-name” value=”arg-value”/>
        A和B的区别在于命令行参数可以覆盖默认值 default,但 是不能覆盖参数值 value。 value 设置的参数值是不能更改的。
        获取参数值 :$(arg arg-name) 
        向包括的启动文件中发送参数值 :
        

    创建组:组(group)元素,它提供了一种在大型启动文件内管理节点的便捷方式 。
    ——》组元素可以完成如下两种任务:
        (1)组可以把若干个节点放入同一个命名空间内。 
            <group ns=”namespace”/> 
            … 
            </group>  
        (2)组可以有条件地使能或禁用一个节点。
            
 
6.6 展望 
    本章节介绍如何创建通过消息传递来进行通信的节点,如何在(可能有的)复杂配置下一次性启动多个节点。

第 7 章 参数
    介绍参数服务器,向大家展现提供节点部分配置信息的集中式方法。通过调整参数配置节点。
 
7.1 通过命令行获取参数 
    查看参数列表:rosparam list 
        

    所有的参数都 属于参数服务器而不是任何特定的节点。这意味着参数— —即使是由节点创建的——在节点终止时仍将继续存在。 
    查询参数: 向参数服务器查询某个参数的值,可以使用 rosparam get 命令:
         rosparam get parameter_name 
    设置参数: 如下命令用于设置参数的值: 
        rosparam set parameter_name parameter_value 
    为了以YAML 件的形式存储命名空间中的所有参数,可以使用 rosparam dump 命令: rosparam dump filename namespace 
    与dump 相反的命令是 load,它从一个文件中读取参数,并将它们添加到参数服务器: rosparam load filename namespace 
7.2 例:turtlesim中的参数
     从参数服务器读取这些参数的值,调用这个服务可以使用以下命令: rosservice call /clear 

7.3 使用 C++获取参数 
使用ROS参数的C++接口是相当简单的: 
void ros::param::set(parameter_name, input_value); 
bool ros::param::get(parameter_name, output_value); 

7.4 在启动文件中设置参数
    另外一种常用的参数设置方法是在启动文件中设置。 
    设置参数: 可以使用param元素请求roslaunch设置参数值: 
        <param name="param-name" value="param-value" /> 
    在文件中读取参数:
    ——》可以一次性从文件中加载多个参数 :<rosparam command="load" file="path-to-param-file" /> 
第 8 章 服务
将讨论 ROS 的最后一种通信机制——即服务,它实现了一对一的双向信息流。讨论如何调用服务并对服务请求进行响应。
消息传递机制尽管是 ROS 系统中节点通信的主要方法,但确实受 到了一定的限制。本章引入另一种用于通信的方法,称之为服务 调用( service calls)。服务调用与消息的区别主要体现在两个方面:
(1)服务调用是双向的,一个节点给另一个节点发送信息并等待 响应,因此信息流是双向的。而消息是单向的。
(2)服务调用实现的是一对一通信。每一个服务由一个节点发起, 对这个服务的响应返回同一个节点。

8.1 服务的专用术语
(1)服务调用的基本信息流:

请求和响应数据携带的特定内容由服务数据类型(service data type)来决定。
8.2 从命令行查看和调用服务
列出所有服务 :rosservice list;输出的每一行都表示一个当前可以调用的服务名。服务名是计算图源名称,同其他资源名称一样,可以划分为全局的、相对的或者 私有的名称 命令的输出是所有服务的全局名称。 


ROS服务总的来讲可以划分为两个基本类型: 
    ——》一些服务,例如上表中 get_loggers 和 set_logger_level 服务, 是用来从特定的节点获取或者向其传递信息的。这类服务通 常将节点名用作命名空间来防止命名冲突,并且允许节点通 过 私有名称来提供服务,例如~get_loggers 。
    ——》其他服务表示更一般的不针对某些特定节点的服务。
查看某个节点提供了哪些服务类型:rosnode info /turtlesim
查找提供服务的节点 :rosservice node /turtle1/set_pen
查找服务的数据类型 :rosservice info service-name 

同消 息类型类似,服务数据类型有两个部分,其一声明拥有此数据类型的包,其二声明类型本身: 

查看服务数据类型 :当服务的数据类型已知时,我们可以使用 rossrv 指令来获得此服务数据类型的详情: rossrv show service-data-type-name
服务数据类型中的请求或响应字段可以为空,甚至两个字段可以同时为空。
用命令行调用服务 : rosservice call service-name request-content 

8.3 客户端程序
   (1)声明请求和响应的类型 就像消息类型一样(参照 3.3.1 节),每一种服务数据类型都对应一个我们必须包含的相关 C++头文件: 
        #include <package_name/type_name.h>
(2)创建客户端对象 

8.4 服务器程序 
(1)和订阅话题的代码非常相似。除了名称上的区别,必须创建一个 ros::ServiceServer 来代替 ros::Subscriber,
        唯一的区别在于服务器端可以通过一个响应对象和一个表明成功与否的布尔变量给客户端回传数据。 
编写服务的回调函数 :
        
8.5 展望 

第 9 章 消息录制与回放
通过 rosbag,我们能够将发布在一个或者多个话 题上的消息录制到一个包文件中,然后可以回放这些消息,重现相似的运行过程。
9.1 录制与回放包文件
(1)术语包文件(bag files)是指用于存储带时间戳的 ROS 消息的 特殊格式文件。rosbag 命令行工具可以用来录制和回放包文件。
录制包文件 : rosbag record -O filename.bag topic-names 
记录当前发布的所有话题的消息 : rosbag record -a 
当完成包文件录制时,使用 Ctrl-C 停止 rosbag
回放包文件 : rosbag play filename.bag
检查文件包 : rosbag info filename.bag 
明服务调用并没有被录制到包文件里面。
9.2 示例:正方形运动轨迹的包文件 
(1)
9.3 启动文件里面的包文件
(1)rosrun rosbag record -O filename.bag topic-names
       rosrun rosbag play filename.bag 
通过这两个可执行文件可以很容易地将包文件 作为启动文件的一部分,方法是包含适当的节点元素。
9.4 展望 
    对如何在 C ++程序使用包文件没有做任何讨论。事实上,确实存在一个用于读取和写入包文件的 API,只有一些非常特殊的应用程序才需要这个 API。
第 10 章 总结
    为了在某网络中的多台计算机上运行ROS,需要在网络层和 ROS层分别进行配置。其中,网络层的配置是确保计算机之间能够互相通信。而ROS层的配置是确保所有节点都能与节点管理器通信。
rviz:非常强大的图形界面工具。可以通过订阅用户选择的话题来显示机器人内部的各种信息,便于机器人的开发和调试。
tf:使用 tf 工具来管理多个坐标系。很多消息类型均 包含一个 frame_id域来标识消息中数据所在的坐标系。
tftf:是帮助节点来完成坐标转换 。某个坐标从一个坐标系到另一个坐标系的变换矩阵。
使用Gazebo仿真:它是一个高保真的机器人仿真器 ,Gazebo中用仿真机器人测试后的代码可以无缝移植到实体机器人。

猜你喜欢

转载自blog.csdn.net/qq_29230261/article/details/81081446
今日推荐