原创: 阿波君 Apollo开发者社区 1周前

ROS提供一些标准操作系统服务,例如硬件抽象、底层设备控制、常用功能实现、进程间消息以及数据包管理。ROS是基于一种图状架构,从而不同节点的进程能接受、发布、聚合各种信息(如传感、控制、状态、规划等)。

上周阿波君为大家详细介绍了「进阶课程Apollo ROS背景介绍」

主要引入ROS的背景介绍,讲述了自动驾驶系统的组成及发展,此外还详细地讲解了选择ROS的原因,其原因有三个方面:首先ROS是一个比较强大、灵活的机器人编程框架;其次ROS基于消息机制,开发者可以根据功能把软件拆分成独立的子模块;最后ROS是学术界广泛使用的一个框架,对实验各种新算法提供了一些支持。

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

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

目录

1.ROS的历史

2.ROS的特征

3.ROS的几个核心概念

4.ROS的实践

启动Roscore

启动一个简单的Talker程序

通过命令查看Talker node

启动一个Listen节点

再次通过命令查看Node

5.ROS的Catkin编译系统

6.ROS的仿真功能Gazebo


1.ROS的历史

ROS是2007年在斯坦福大学里面的一个实验室学生开发出来的一套机器人通用的一个框架,2013年被纳入OSRF机构统一管理,如今被很多公司和大学的研究所广泛地使用到一些科研项目中。


2.ROS的特征

ROS有5个比较明显的特征如下:

  1. 点对点:两个Node之间进行消息通讯是一个点对点的行为。

  2. 它支持分布式:在部署多机之间的消息通讯时,ROS提供了一个天然的支持。

  3. 它是跨语言,它并不关注每个节点之间是用什么语言来写的。你只需要按照ROS提供的一些接口完成消息的订阅和分发即可以完成一个消息之间的通信。

  4. 它是一个轻量级的ROS程序,用户只需要关注自己核心模块的算法逻辑,不需要关注底层是如何通信、如何断开通信、如何进行Service 和Param之间的一些交互的。

  5. 它是一个开源的框架,大家都可以往ROS里面贡献自己的一些想法和代码。


3.ROS的几个核心概念

  • 松耦合:ROS是一个松耦合的框架,松耦合就是各个节点之间的通信是一个解耦合的关系。
  • 节点:一个算法模块,比如自动驾驶系统里面的感知模块、定位模块、决策模块或者控制模块,这些模块就是一个简单的算法集合,在ROS里面被称为一个节点。
  • 节点管理器:在ROS里面被定义为Master,用来集中式管理各个独立的、松耦合、无序节点之间的逻辑关系,它是轻量级的介入,当各个节点启动完成以后,他们在通信连接完成之前起到中转也就是类似于交换机的作用。
  • Topic:两个节点之间的通信主题。Topic内部使用的数据格式是Message。Message是一系统简单的数据类型或者是一些自定义的复杂数据类型,所组装成的一个描述文件。

以上几个概念之间的相互关系,如下图所示:

感知模块Perception,感知车辆周围的一些障碍物信息,用CNN或者RNN算法将障碍物信息提取出来,即Obstacle。再将这些信息输出给下游Planning节点。这两个节点之间的通信连接就需要Roscore,即节点管理器。

Perception、Planning在启动的时候没有先后关系,这是松耦合的一个具体体现。Perception先启动并向Roscore发送一个注册信息,同时会订阅名为Obstacle的Topic;Planning节点启动后也向Roscore发送一个注册信息,同时会订阅名为Obstacle的Topic;在这种情况下,Roscore会发送一个通知信息给Planning,在它发送注册信息之前已经有一个节点启动了。此时Planning会向Perception发送消息请求通信连接,Planning收到消息之后会在Planning和Perception两个节点中间建立一个实时通信链路。当通信链路建立之后,Roscore的功能就暂时完成了。

所以,松耦合在此有两种体现:

  1. Perception和Planning两者之间的启动没有先后关系。

  2. 当通信链路建立之后,Roscore的功能就暂时完成了。

这些概念在ROS系统都有一整套的命令工具支持如下:

1. Roscore:启动一个节点管理器。

2. 节点常用命令:

Rosnode list:可以列出当前系统里面所存在的节点。

Rosnode info:查看某一节点的具体的一些信息。

3. Topic常用命令:

Rostopic list:可以查看所存在Topic的一些列表。

Rostopic info:可以查看到发送这个Topic的发送方,订阅这个Topic的订阅方。

Rostopic type:查看Topic内部所使用的MSG的数据结构。

Rostopic pub:调试计算节点模块的一些基本功能。


4.ROS的实践

下面是一个简单的实践:

启动Roscore

启动Roscore,通过一个简单的命令行Roscore就可以启动一个节点管理器。不需要进行任何参数的传入,也不需要进行任何配置。

如果有很多个节点启动的时候,会使用Roslaunch。Roslaunch就是把所有启动节点的行为放到统一的描述文件里,在启动的时候会在描述文件里找到定义的各个节点的位置,然后启动节点。


启动一个简单的Talker程序

Talker就是一个发送节点的程序。单独启动一个节点,除了Roscore启动之外,其它的节点启动ROS提供了一个Rosrun命令。Rosrun,前面是Package包,后面是实际的可执行文件。通过这样简单的一个命令可以直接启动一个Talker。


通过命令查看Talker node

当启动这个节点之后,用Rosnode list,见上图Talker的Node文件,还有一个Rosout的程序节点。Roscore默认启动的时候启动了一个隐藏节点,它是一个记录日志相关的节点,所有节点发生的Log都会被Roscore启动的Rosout所订阅,订阅完之后会根据一些特定的规则把这些Log分级,然后分模块、分文件打印到对应的模块日志里。

Rosnode info查看Talker相关的一些节点,Talker发送的Topic以及它发送的Service。它有两个Service:Setlogger、Getlogger。这两个是每一个节点都会默认启动的两个Service,这两个Service的作用是设置这一个节点里面的日志层级,如果日志层级是INFO,那么它打印的Debug信息就不会记录在Roscore的Rosout节点里面。

Rostopic info,通过这个命令我们能看到Topic的发送方和接收方。

Rostopic type是查看Topic的一个Message的消息类型。

Rostopic echo是相当于起了一个Listener节点,去展示Talker发的Topic包含的具体信息。

Rostopic还提供了HZBW功能,HZ是统计Talker节点发送Obstacle topic的频率,根据此频率能简单的探测系统是否按照我们所预期的方向来执行,例如自动驾驶整个车系统里面每一个传感器有一定的频率,激光雷达是十赫兹,即一秒钟转十圈,会发十帧点云图像,我们可以通过Rostopic HZ去检测Topic是不是一秒钟发送十赫兹,如果低于十赫兹,说明当前系统肯定是有异常,要么是激光雷达扫描的过程受到影响,要么是顶层的Driver节点在处理激光雷达顶层信息的时候中间出现了一些故障,此时我们就需要具体探测问题出现在哪个地方。


启动一个Listen节点

现在启动一个Listener节点,启动Listener节点之后整个拓扑会有一个比较明显的变化,Listener启动向Roscore发送一个注册信息,同时会订阅Topic,Roscore会发送一个通知信息给Listener:在它发送注册信息之前已经有一个节点启动了。此时,Listener会向Talker发送消息请求通信连接,Listener收到消息之后会在Listener和Talker两个节点中间建立一个实时通信链路。这个通信链路是基于TCP的,TCP建立起来之后Talker就持续不断的发送信息,Listener接到信息之后去做回调处理供实际的决策和执行。


再次通过命令查看Node

在启动Talker节点之后,通过Rosnode list看到增加的一个节点就是Listener,它包含了一个完整的拓扑:包含发送节点和接收节点。


5.ROS的Catkin编译系统

ROS是基于Cmake编写的Catkin编译系统。建立一个工程包,在ROS里面写一个节点,通过Catkin create 可以简单创建一个文件夹,这个文件夹里面会预先设置一些文件目录,通过Catkin build编译建立软件包的过程。Catkin build执行之后,里面会多两个文件夹:DEVEL、BUILD 。BUILD是编译中间过程产生的文件。编译完成之后,通过Source devel下面的Setup bash就可以把自己编写的节点程序给Source到ROS的环境里面,然后去执行我们节点里面的一些基本功能。

以上是三个比较重要的文件夹,第一个是SRC用来放源文件的一些目录;第二个是BUILD,第三个是DEVEL,这两个是在Catkin build的过程当中产生的临时文件夹。想重编译的话可以直接Catkin build,如果环境里面有一些冲突,可以通过Catkin clean 简单的去把编译产生的临时文件和之前的一些产出文件直接清除掉。

Catkin config指定了命令行编译的一些方式,这些方式可以在Cmakelists里面进行编写。Cmakelists里面指定了这个文件编译过程当中所依赖的一些库、产出的一些可执行文件和这些可执行文件链接了一些什么库,Cmakelists里面都有一些很清晰的定义。

在启动节点的时候使用了Roslaunch,Roslaunch是一个Shell脚本文件,Shell脚本文件里面根据语言定义的一些Xml格式去找到运行的一系列节点所在的位置然后执行它。它的执行格式是前面加上Package Name,后面加上实际的Launch文件。


6.ROS的仿真功能Gazebo

这个是Gazebo的Simulator仿真工具。我们在实际进行开发,不管是机器人还是自动驾驶相关的一些具体功能的时候,我们不可能就是开发一个功能然后到实体的机器人或者是自动驾驶的汽车上去进行模拟实验。ROS提供了仿真功能Gazebo,我们定义的节点在里面是实体的存在,通过控制一些参数和变量去模拟他们之间的一些交互,去验证算法在实际的运行中是否按预期进行表现。

Apollo进阶课程㉛丨Apollo ROS概述相关推荐

  1. Apollo进阶课程㉜丨Apollo ROS原理—1

    原文链接:进阶课程㉜丨Apollo ROS原理-1 ROS在开发过程中,基于功能把整个自动驾驶系统分成多个模块,每个模块负责自己消息的接收.处理.发布.当模块需要联调时,通过框架可以把各个模块快速的集 ...

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

    原文链接:进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台,推荐的参考运行环境为:ThinkPAD X240.CPU:i5 .四核 .内存 8G. 硬盘容量40G以上. 上周阿波 ...

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

    原文链接:进阶课程㊱丨Apollo ROS深入介绍 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架.ROS本身是基于消息机制的,可以根据功能把软 ...

  4. Apollo进阶课程㉟丨Apollo ROS原理—4

    原文链接:进阶课程㉟丨Apollo ROS原理-4 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架. ROS本身是基于消息机制的,可以根据功能把 ...

  5. Apollo进阶课程㉝丨Apollo ROS原理—2

    原文链接:进阶课程㉝丨Apollo ROS原理-2 在ROS系统中,从数据的发布到订阅节点之间需要进行数据的拷贝.在数据量很大的情况下,很显然这会影响数据的传输效率.所以Apollo项目对于ROS第一 ...

  6. Apollo进阶课程㉚丨Apollo ROS背景介绍

    原文链接:进阶课程㉚丨Apollo ROS背景介绍 ROS是机器人学习和无人车学习最好Linux平台软件,资源丰厚.无人车的规划.控制算法通常运行在Linux系统上,各个模块通常使用ROS进行连接. ...

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

    原文链接:进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放.完整.安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系 ...

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

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

  9. Apollo进阶课程㉒丨Apollo规划技术详解——Motion Planning with Autonomous Driving

    原文链接:进阶课程㉒丨Apollo规划技术详解--Motion Planning with Autonomous Driving 自动驾驶车辆的规划决策模块负责生成车辆的行驶行为,是体现车辆智慧水平的 ...

  10. Apollo进阶课程㉑丨Apollo规划技术详解——Basic Motion Planning and Overview

    原文链接:进阶课程㉑丨Apollo规划技术详解--Basic Motion Planning and Overview 运动规划(Motion Planning)就是在给定的位置A与位置B之间为机器人 ...

最新文章

  1. 关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
  2. 第十六届全国大学生智能车竞赛竞速组-室内视觉组补充说明
  3. 1244. Gentlemen
  4. PAT甲级1103 Integer Factorization (30 分):[C++题解]背包问题,DP解法
  5. # Consumed parameters
  6. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
  7. 帆软按钮控件变查询_如何设置finereport按钮控件的可用时间
  8. ActiveMQ专题2: 持久化
  9. 为什么C语言输出结果总是1,c语言编程问题这个题我哪里错了输出结果总是0
  10. 广义动量定理之质量m的应用案例分析
  11. LeetCode58. 最后一个单词的长度
  12. Vue数据更新视图不更新的几种解决方案
  13. python 调用海康linux下psdatacall_demo,实现获取视频码流并返回到python,以及上传信息到人脸库的方法
  14. 国内各大高校开源镜像站
  15. mysql中工作表工作簿的查询_如何使用SQL语句实现对Excel工作表数据的查询?
  16. 汇编——从一道题目浅谈分支结构
  17. 30行,金额转人民币大写的代码
  18. Altium Designer简明教程2
  19. 数字电路中的基础电路结构
  20. cuda/cudnn/cuda 10.1安装教程

热门文章

  1. [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
  2. [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]
  3. [Leedcode][JAVA][第892题][图形题]
  4. 如何创建php文件,PHP如何生成.php程序文件
  5. oracle dblink 验证,Oracle DBLINK 简单使用
  6. 什么是ie浏览器_?IE 浏览器为什么不招人待见?
  7. python+mysql库+json_用python写爬虫-5.1json用pandas入mysql库
  8. java enum in class_Java 8需要一个转换,而Java 7没有 – enum.getClass/getDeclaringClass
  9. java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...
  10. 【转】github中origin和upstream的区别