查看原文
其他

进阶课程㉛丨Apollo ROS概述

阿波君 Apollo开发者社区 2022-07-29


知识点
敲黑板,本文需要学习的知识点有 


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




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


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



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


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


完整版视频学习  请戳『阅读原文



  以下,ENJOY  






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





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


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

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

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

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

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






ROS是一个松耦合的框架,松耦合就是各个节点之间的通信是一个解耦合的关系。



一个算法模块,比如自动驾驶系统里面的感知模块、定位模块、决策模块或者控制模块,这些模块就是一个简单的算法集合,在ROS里面被称为一个节点。



在ROS里面被定义为Master,用来集中式管理各个独立的、松耦合、无序节点之间的逻辑关系,它是轻量级的介入,当各个节点启动完成以后,他们在通信连接完成之前起到中转也就是类似于交换机的作用。



两个节点之间的通信主题。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:调试计算节点模块的一些基本功能。





下面是一个简单的实践:




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


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




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




当启动这个节点之后,用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节点在处理激光雷达顶层信息的时候中间出现了一些故障,此时我们就需要具体探测问题出现在哪个地方。




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




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





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文件。






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



更多话题讨论、技术交流

可以添加『Apollo小哥哥』为好友

进开发者交流群



  



阿波君说:


在学习过程中,开发者不仅可以在Apollo开发者社区小程序上对课程内容进行提问,还可以在开发者微信群中交流学习心得,共同学习自动驾驶技术。

开发者社区还将在公众号上定期推送课程相关的技术干货,全程陪伴大家共同进步。祝Apollo开发者们顺利完成《Apollo自动驾驶进阶课程》的学习,在自动驾驶道路上越走越远!

阿波君还欢迎大家在小程序内晒出学习笔记,也可以加入开发者交流社群与大家交流互动,有好礼相送!



观看/阅读完该节课程后

在开发者社群

及小程序「社区问答」版块内

上传你的课程笔记截图

手写笔记/电脑文档均可

即可联络社区小助手获取

百度周边纪念品1份

赶快来撩吧~比心~






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存