Apollo进阶课程㊱丨Apollo ROS深入介绍

原文链接:进阶课程㊱丨Apollo ROS深入介绍 

ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。ROS本身是基于消息机制的,可以根据功能把软件拆分成为各个模块,每个模块只是负责读取和分发消息,模块间通过消息关联。

上周阿波君为大家详细介绍了「进阶课程㉟ | Apollo ROS原理—4」。

主要讲解五个比较基础的方面:第一是ROS Services;第二是ROS Actions;第三是ROS Time;第四是ROS Bags;第五是调试工具

本周阿波君将继续与大家分享Apollo ROS的相关课程。下面,我们一起进入进阶课程第36期。

目前ROS仅适用于Apollo 3.0之前的版本,最新代码及功能还请参照Apollo 3.5及5.0版本。

目录

1. ROS Packages

2. Eclipse下编译ROS基本工程

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

4. ROS提供的日志系统

5. ROS提供的subscriber和publisher功能

6. ROS除了message的另外两种通信方式

6.1 service

6.2 parameter

7.ROS的可视化工具RViz


本节内容主要介绍ROS中一些不是特别常见的属性。

1. 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.xmlCmakelists.txt

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

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

  1. 指定Cmake的版本;
  2. 工程Package name;
  3. 工程的头文件信息;
  4. 指定所依赖的库,与在Package.xml里面所指定的依赖库是一一对应的;
  5. install命令,将编译出来的临时文件放在指定的目录里。

下面是Cmakelists文件的一个例子。

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


2. Eclipse下编译ROS基本工程

工程建立好之后,catkin build可以直接对工程进行编译。直接用 catkin build去编译,会把整个工程目录里面的所有的package进行统一编译,如果是构建一个比较复杂的系统,可能一个文件夹包含了很多节点或者package包,编译时间会比较久,可以通过指定package名,编译某一个固定的package包,提升编译效率。

下面介绍在Eclipse下如何编译ROS基本工程

首先是设置工作ROS工作区,然后将ROS package导入到Eclipse设置的工作区。

通过Eclipse提供的build或者run等功能去调试ROS工程。同时Eclipse里面提供的快捷键在编译程序里面同样适用。


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

上图的hello world程序展现了ROS框架写Node所使用的核心要素:

Include 就是include ROS的一个基本环境;

Main函数里面有三行需要重点注意:

  • init:引入ROS的一个基本环境,指定节点使用的node名字和一些参数信息;
  • NodeHandle:node和整个ROS框架进行通信所使用的一个句柄指针;
  • 数据发送的频率:looprate(10)以10赫兹发送消息。

最底下的while循环以10赫兹的消息频率进行发送,同时进行计数。

Spinonce:有一帧消息就把这消息立马发送出去,同时进行下一轮的消息等待。


4. ROS提供的日志系统

在示例程序里面有一个ROS_INFO,它就是ROS提供的日志系统;

ROS的日志系统是分级的,即在编写节点程序的时候对打印的信息进行分级,对不同的分级,ROS会提供不同的颜色和格式进行展示。分级的作用是为了帮助开发者快速地定位到关键信息,不会对整个节点的逻辑产生实质性的影响。

日志系统提供了两种格式ROS_INFOROS_INFO_stream

  • ROS_INFO:默认把信息打印到当时运行的屏幕上。
  • ROS_INFO_stream:它是流式数据,默认输出到后台这个节点所对应的日志文件。

5. ROS提供的subscriber和publisher功能

Subscriber与Publisher有三点明显的区别:

1、回调函数subscriber作为信息的接收方有一个回调函数,回调函数定义了它接收到的每一帧信息如何使用;上图listener回调函数比较简单,它接收到信息后只是进行了打印处理。Publisher没有回调函数,它不需要对消息进行处理。

2、声明的时候subscriber把回调函数传入到对应的node初始化程序里面。publisher声明的时候只需要注册要往哪一个topic上去发信息,同时还设置队列长度。

3、Rosspin在ROS构架里所有的回调函数都不是主动触发的。Rosspin是阻塞性的,声明Rosspin之后,就阻塞在此,程序不会退出,它会一直监听自己对应的队列里面是否有新消息的到达,若有新消息到达就会触发回调函数处理。

如果Subscriber的主程序里除了订阅消息之外还有其他的功能则可以采用rosspin once,对所有已达消息进行回调函数的处理。同时可以写一个while循环,rosspin once按照一定的频率去处理回调函数的消息。ROS提供Rosspin这两种方式,就是为了满足这两种场景。第一种是阻塞,只有一个回调函数进行处理,第二种是订阅回调函数消息以外,他还进行了一些封装和处置。

看似很复杂的自动驾驶,节点整体写下来都是比较简单的,就是按照上图Subscriber与Publisher方式来写。但是在实际的自动驾驶系统里面,所有的模块都不是简单的一个角色,它可能既是消息的订阅者也是消息的发送者,是一个复杂交互的功能,甚至是用到很多数据融合或者是消息对齐。


6. ROS除了message的另外两种通信方式

ROS节点之间的通信除了基于message消息订阅和发布模型之外还有另外两种方式,虽然另外两种方式使用的比较少,但是在某些特定的场合是比较有用的。

6.1 service

节点可以启动service去注册一项服务,另外一个节点在使用这项服务的时候可以直接call service完成一些实时的数据通讯交互。Message是一个被动的消息行为,发送者发送消息的时候并不知道消息会被谁去消费,接收者在接收消息的时候也不知道目前有几个发送节点在发送,发送和接收之间是一个什么状态也是不知道的,他们是一个松耦合和透明的关系。Service弥补了这种通信方式的不足,它需要及时回应。Client向server去发送service请求的时候,需要实时等待一个response,根据响应做出下一步的行为指示。

6.2 parameter

Parameter通信方式借鉴了service的原理。它启动了Parameter service,Parameter service是一个全局的服务器,各个节点在进行参数设置和获取的时候可以通过Parameter service的方式轻易完成。因为Parameter不像基于message消息通讯方式那么频繁,一个参数在设置完成之后,在整个网络拓扑运行期间所有的节点只需要在一个地方取此参数就行或者某个节点根据自己的运行状态去改变这个参数。

Parameter对应有一套ROS所使用的基本命令行工具—rosparam。

rosparam其它工具相比,有两个不同的地方:get和set。get是get某一个全局参数的值;set是设置某一个全局参数的值。

上图展示的例子是通过node所提供的nodeHandler指针去调用它的getparam,得到某个参数的数值。当它进行一些运算之后,也可以通过setparam去设置参数的值。设置之后,整个系统参数服务器里面对应的这个参数就会被设置成对应的值,其他节点在得到这个值之后再作出相应的处理。


7.ROS的可视化工具RViz

自动驾驶节点比较多,网络拓扑也比较复杂,每个节点在进行消息通讯的时候有很多channel同时运行,如果只是通过命令行工具去查看节点的状态和节点之间的拓扑,会很麻烦。ROS提供了一些比较好用的可视化工具立体化展示某一个拓扑结构里面的拓扑网络,RViz就是其中之一。

RViz在整个ROS生态里可以看成是一个节点,它定义了整个拓扑结构里面所有的消息,然后按照固定的格式进行图形化展示,同时提供很多debug相关的功能。因为RViz也是一个普通的节点,所以在启动的时候可以通过rosrun命令的方式去启动RViz相关的功能。

RViz也提供了很多插件可以放到诸如eclipse这样的功能插件里面,在进行eclipse开发时可以通过eclipse的plugin去调取RViz的相关功能,进行可视化调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步编写操作系统 31 cpu的分支预测 下

让我们说说预测的算法吧。 对于无条件跳转,没啥可犹豫的,直接跳过去就是了。所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立。最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一次也预…

Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

原文链接:进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构:一般采用激光雷达作为主要感知传感器,同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等,以NVIDIA Drive PX2 或 Xavier作为主要计算平台,在工业PC机…

Apollo进阶课程㊳丨Apollo平台的快速入门

原文链接:进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课…

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

咱们先介绍0xE820子功能,这是最灵活的内存获取方式。 bios中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,bios就按照类型属性来划分这片系统内存,所以这种查询则呈迭代式,每次bio…

16.深度学习练习:Building your Recurrent Neural Network - Step by Step

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。课程链接:https://www.deeplearning.ai/deep-learning-specialization/Building your Recurrent Neural Network - Step by Step1 - Forward propagation for the basic Recurrent Neur…

【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)

题干: Recently Kumiko learns to use containers in C standard template library. She likes to use the std::vector very much. It is very convenient for her to do operations like an ordinary array. However, she is concerned about the random-access…

一步步编写操作系统 34 内核利用bios中断获取物理内存大小

接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。 此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了。稍微有点不便的是,此方法检测到的内存是分别存放到两组寄存器…

17.深度学习练习:Character level language model - Dinosaurus land

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 文章目录1 - Problem Statement1.1 - Dataset and Preprocessing1.2 - Overview of the model2 - Building blo…

Apollo进阶课程㊴丨Apollo安装过程概述

原文链接:进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台,推荐的参考运行环境为:ThinkPAD X240、CPU:i5 、四核 、内存 8G、 硬盘容量40G以上。 上周阿波君为大家详细介绍了「进阶课程㊳丨Apollo平台的快速入门」。 …

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继…

CS231n(1):图片分类笔记与KNN编程作业

声明:本博客笔记部分为CS231n官网笔记,这里对其进行引用,在此表示感谢。 课程官网地址为:http://vision.stanford.edu/teaching/cs231n/syllabus.html 本次课程对应B站教学视频为: https://www.bilibili.com/video/av5…

【HDU - 6557】Justice(思维,模拟,套路,SETset)

题干: On the table there are n weights. On the body of the i-th weight carved a positive integer kiki , indicating that its weight is 12ki12ki gram. Is it possible to divide the n weights into two groups and make sure that the sum of the weight…

Apollo进阶课程㊵丨Azure仿真平台使用

原文链接:进阶课程㊵丨Azure仿真平台使用 Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用。它开放式的架构给开发者提供了Web应用、互联设备的应用、个人电脑、服务器、或者提供最优在线复杂解决…

java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式…

动手学无人驾驶(3):基于激光雷达3D多目标追踪

上一篇博客介绍了无人驾驶中的车辆检测算法(YOLO模型),该检测是基于图像进行的2D目标检测。在无人驾驶环境感知传感器中还有另一种重要的传感器:激光雷达。今天就介绍一篇无人驾驶中基于激光雷达目标检测的3D多目标追踪论文&#…

换种方法学操作系统,轻松入门Linux内核

计算机已成为现代人日常工作、学习和生活中必不可少的工具。操作系统是计算机之魂,作为用户使用计算机的接口,它负责调度执行各个用户程序,使计算机完成特定的任务;作为计算机硬件资源的管理者,它负责协调计算机中各类…

Apollo进阶课程㊶丨Apollo实战——本机演示实战

原文链接:进阶课程㊶丨Apollo实战——本机演示实战 Apollo是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课程㊵丨A…

java常见异常类图(分类了Error/RuntimeExecption、check Exception)

Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。Exception:表…

Apollo进阶课程㊷丨Apollo实战——车辆与循迹驾驶能力实战

原文链接:进阶课程㊷丨Apollo实战——车辆与循迹驾驶能力实战 循迹自动驾驶是指让车辆按照录制好的轨迹线进行自动驾驶,其涉及到自动驾驶中最基本的底盘线控能力、定位能力、控制能力,是自动驾驶系统的一个最小子集。 上周阿波君为大家详细介…

【HDU - 5961】传递(图,思维,暴力,枚举点)

题干: 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。 我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图。换句 话说,将完全图每…