一、背景介绍
为什么选择ROS
高效的开发支持
1、具有完整的包管理和工程结构
2、庞大的基础库
3、多语言接口支持
模块灵活配置
1、消息驱动的异步运行模型
2、抽象的P2P通信接口
3、自定义的消息格式
丰富的调试工具
1、具有可视化的调试工具
2、消息查看、存储、回放功能
二、 ROS概述
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的任务暂时完成。
松耦合概念体现
1、两个节点启动没有先后关系
2、通信链路建立起来后 ,ROScore所起作用微乎其微