Fork me on GitHub

Apollo ROS原理(一)

一、背景介绍

为什么选择ROS

高效的开发支持

1、具有完整的包管理和工程结构

2、庞大的基础库

3、多语言接口支持

模块灵活配置

1、消息驱动的异步运行模型

2、抽象的P2P通信接口

3、自定义的消息格式

丰富的调试工具

1、具有可视化的调试工具

2、消息查看、存储、回放功能

二、 ROS概述

image

1、点对点

两个node进行消息通讯的时候是一个点对点的行为。

2、分布式

在部署多级通讯时,ROS提供了一个天然支持‘

3、跨语言

ROS不关注各个节点是用什么语言来写的,只需要按照ROS提供的一些接口完成消息的订阅和分发,就可以完成一个消息的通信

4、轻量级ROS程序

用户只需关注自己核心模块的算法逻辑,不需要关注底层的一些操作,如如何通信以及断开通信。

5、开源框架

大家可以往里面提供自己的想法。

ROS工作环境

ROS master(节点管理器)用于管理节点之间的通讯,打开节点管理器(在所有节点运行之前运行)roscore

node (节点):可以理解为一个算法模块,比如自动驾驶里的感知模块、或定位模块。节点相互之间是独立的,同时节点之间又要相互通信,节点之间如何发现对方,如何在发现对方后建立连接以及通信,都是通过节点管理器所起到的作用。

运行一个节点:rosrun packages_name node_name

列出正在运行的节点:rosnode list

查看某一个节点的具体信息(topic 名字,流向谁,类型):rosnode info node_name

topic(话题)两个节点通信的一个主题。内部所使用的消息格式为msg

列出所使用的topicrostopic list

查看topic内容rostopic info /topic

订阅并打印topic内容rostopic echo /topic(/表示该topic的作用域是全局作用域)

查看topic类型rostopic type /topic

发布一个topic的消息rostopic pub /topic type args

roslaunch 把所有启动节点放到一个描述文件里,启动这个描述文件时,这个描述文件会做两件事,一是找到你在这个描述文件里所定义的各个节点的位置,二是去启动这些节点。运行roslaunch时,会先检测系统里有没有ROScore,如果ROScore已经启动,就直接启动节点;否则先启动ROScore,再启动节点。

工作流程如下图: 两个节点perception和planning,话题obstacle

(1)perception节点要启动时,要向ROScore发送一个注册信息,告诉ROScore我现在启动一个节点并告诉ROScore我要发送的话题为obstacle;

(2)同时,planning节点在启动时,也会向ROScore发送一个注册信息,并说明自己要订阅一个名为obstacle的话题;

(3)当ROScore发现两者匹配的时候,会向planning 节点发送一个消息,告诉他你所订阅的话题是由已经存在的perception发布的;

(4)planning 节点接收到ROScore的信息后,就会向perception请求一个通信连接,perception在收到planning请求后会建立一个通信链路;

(5)当通信链路建立起来后ROScore的任务暂时完成。

image

松耦合概念体现

1、两个节点启动没有先后关系

2、通信链路建立起来后 ,ROScore所起作用微乎其微

posted @ 2021-09-25 17:26  yooooooo  阅读(302)  评论(0编辑  收藏  举报