apollo学习笔记十七:apollo ROS(下)

ROS深入介绍

ROS Packages

在这里插入图片描述

  • 创建一个ROS开发环境和写一个C++工程有点类似,通过catkin create可以创建一个简单的工程。其中的文件组织方式如上图所示,包括:

    • SRC:存放源文件;
    • MSG:存放节点之间进行通信的消息定义;
    • SRV:存放节点之间进行服务通信的时候的服务定义;
    • CONFIG:存放配置文件相关的信息;
    • INCLUDE:存放头文件相关的信息;
    • LAUNCH:存放节点启动和它相关的节点之间的启动文件。
  • 上面介绍的package组织方式只是官方推荐的一种组织方式,使用catkin build编译,当source完环境变量之后,通过Ros提供的命令比如ROS run或者ROS launch启动时,package name可以自动补全,package里面包含的节点或者launch文件也是可以自动寻找,所以官方推荐使用这种组织方式。

  • DEVEL和BUILD这两个目录是build时自动产生的两个临时目录。

  • 此外,开发环境还有描述ROS Package相关工作区的两个文件:Package.xml和Cmakelists.txt。
    在这里插入图片描述

    • Package.xml定义了可执行文件依赖的一些库,包括编译和运行时依赖库,同时定义了软件版本信息等常见的描述文件。
      在这里插入图片描述

    • Cmakelists.xml定义了怎么编译ROS工程的规则,主要定义了以下几个部分:

      • 指定Cmake的版本;

      • 工程Package name;

      • 工程的头文件信息;

      • 指定所依赖的库,与在Package.xml里面所指定的依赖库是一一对应的;

      • install命令,将编译出来的临时文件放在指定的目录里。

      • 如图为一个Cmakelists的例子:在这里插入图片描述

      • 从上到下依次指定了Cmake的版本、project的名字、ROS工程所依赖的c++的版本、另外是依赖的库文件,最后生成可执行文件以及这个文件所链接的依赖库。

Eclipse下编译ROS基本工程

  • Setup a Project in Eclipse
    (1)
    在这里插入图片描述
    (2)
    在这里插入图片描述
    (3)
    在这里插入图片描述
    (4)在这里插入图片描述
    (5)在这里插入图片描述
  • 工程建立好之后,catkin build可以直接对工程进行编译。直接用 catkin build去编译,会把整个工程目录里面的所有的package进行统一编译,如果是构建一个比较复杂的系统,可能一个文件夹包含了很多节点或者package包,编译时间会比较久,可以通过指定package名,编译某一个固定的package包,提升编译效率。

通过hello world了解ROS基本的运行逻辑

在这里插入图片描述

  • 上图的hello world程序展现了ROS框架写Node所使用的核心要素:
  • Include 就是include ROS的一个基本环境;
  • Main函数里面有三行需要重点注意:
  • init:引入ROS的一个基本环境,指定节点使用的node名字和一些参数信息;
  • NodeHandle:node和整个ROS框架进行通信所使用的一个句柄指针;
  • 数据发送的频率:looprate(10)以10赫兹发送消息;
  • 最底下的while循环以10赫兹的消息频率进行发送,同时进行计数;
  • Spin once:有一帧消息就把消息立马发送出去,同时进行下一轮的消息等待。

ROS提供的日志系统

在这里插入图片描述

  • 在示例程序里面有一个ROS_INFO,它就是ROS提供的日志系统;
  • ROS的日志系统是分级的,即在编写节点程序的时候对打印的信息进行分级,对不同的分级,ROS会提供不同的颜色和格式进行展示。分级的作用是为了帮助开发者快速地定位到关键信息,不会对整个节点的逻辑产生实质性的影响。
  • 日志系统提供了两种格式ROS_INFO与ROS_INFO_STREAM:
    • ROS_INFO:默认把信息打印到当时运行的屏幕上。
    • ROS_INFO_STREAM:它是流式数据,默认输出到后台这个节点所对应的日志文件。

ROS提供的Subscriber和Publisher功能

在这里插入图片描述
在这里插入图片描述

  • Subscriber与Publisher有三点明显的区别:
    • 回调函数:subscriber作为信息的接收方有一个回调函数,回调函数定义了它接收到的每一帧信息如何使用;上图listener回调函数比较简单,它接收到信息后只是进行了打印处理。Publisher没有回调函数,它不需要对消息进行处理。
    • 声明的时候:subscriber把回调函数传入到对应的node初始化程序里面。publisher声明的时候只需要注册要往哪一个topic上去发信息,同时还设置队列长度。
    • Ros spin:在ROS构架里所有的回调函数都不是主动触发的。Ros spin是阻塞性的,声明Ros spin之后,就阻塞在此,程序不会退出,它会一直监听自己对应的队列里面是否有新消息的到达,若有新消息到达就会触发回调函数处理。
  • 如果Subscriber的主程序里除了订阅消息之外还有其他的功能则可以采用ros spin once,对所有已达消息进行回调函数的处理。while循环 + ros spin once按照一定的频率去处理回调函数的消息。ROS提供Rosspin这两种方式,就是为了满足这两种场景。第一种是阻塞,只有一个回调函数进行处理,第二种是订阅回调函数消息以外,他还进行了一些封装和处置。
  • 看似很复杂的自动驾驶,节点整体写下来都是比较简单的,就是按照上图Subscriber与Publisher方式来写。但是在实际的自动驾驶系统里面,所有的模块都不是简单的一个角色,它可能既是消息的订阅者也是消息的发送者,是一个复杂交互的功能,甚至是用到很多数据融合或者是消息对齐。

ROS的可视化工具RViz

在这里插入图片描述

  • 自动驾驶节点比较多,网络拓扑也比较复杂,每个节点在进行消息通讯的时候有很多channel同时运行,如果只是通过命令行工具去查看节点的状态和节点之间的拓扑,会很麻烦。ROS提供了一些比较好用的可视化工具立体化展示某一个拓扑结构里面的拓扑网络,RViz就是其中之一。
  • RViz在整个ROS生态里可以看成是一个节点,它定义了整个拓扑结构里面所有的消息,然后按照固定的格式进行图形化展示,同时提供很多debug相关的功能。因为RViz也是一个普通的节点,所以在启动的时候可以通过rosrun命令的方式去启动RViz相关的功能。
  • RViz也提供了很多插件可以放到诸如eclipse这样的功能插件里面,在进行eclipse开发时可以通过eclipse的plugin去调取RViz的相关功能,进行可视化调试。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页