1、ROS简介

ROS wiki : http://wiki.ros.org/

ROS教学:http://wiki.ros.org/ROS/Tutorials

ROS安装:http://wiki.ros.org/melodic/Installation/Ubuntu

ROS(Robot Operating System,简称“ROS”)是一个适用于机器人的开源的操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。

ROS 的主要目标是为机器人研究和开发提供代码复用的支持。ROS是一个分布式的进程(也就是“节点”)框架,这些进程被封装在易于被分享和发布的程序包和功能包中。ROS也支持一种类似于代码储存库的联合系统,这个系统也可以实现工程的协作及发布。这个设计可以使一个工程的开发和实现从文件系统到用户接口完全独立决策(不受ROS限制)。同时,所有的工程都可以被ROS的基础工具整合在一起。

1.1、ROS的主要特点

(1)分布式架构(每一个工作进程都看作一个节点,使用节点管理器统一管理),

(2)多语言支持(如C++、Python等),

(3)良好的伸缩性(既可以写一个节点,也可以通过roslaunch将很多节点组织成一个更大的工程),

(4)源码开放(ROS遵循BSD协议,对个体和商业应用及修改完全免费)。

1.2、ROS的整体架构

开源社区级 : 主要包括开发人员知识、代码、算法共享。

文件系统级 : 用于描述可以在硬盘上查到的代码及可执行程序,

计算图级 : 体现进程与进程、进程与系统之间的通讯。

1.2.1、计算图级

下列命令是整条,输入一部分后用【Tab】键补齐即可,然后修改内容

节点是主要的计算执行进程。ROS是有很多节点组成的。

 

image-20210827145606482

当我们在命令行里输入【rosnode 】,然后双击Tab键,会发现命令行下方出现这样几个单词

image-20210827153814591

ROS 命令行工具rosnode

rosnode命令作用
rosnode list查询当前运行的所有节点
rosnode info node_name显示该节点的详细信息
rosnode kill node_name结束某个节点
rosnode ping测试该节点是否存活
rosnode machine列出在特定机器或列表机器上运行的节点
rosnode cleanup清除不可运行节点的注册信息

在开发调试时经常会需要查看当前node以及node信息,所以请记住这些常用命令。如果想不起来,也可以通过rosnode help来查看rosnode命令的用法。

节点之间通过消息实现彼此的逻辑联系与数据交换。

当我们在命令行里输入【rosmsg】,然后双击Tab键,会发现命令行下方出现这样几个单词

image-20210827153837190

ROS 命令行工具rosmsg

rosmsg命令作用
rosmsg show显示一条消息字段
rosmsg list列出所有消息
rosmsg package列出所有功能包消息
rosmsg packages列出所有具有该消息的功能包
rosmsg md5显示一条消息的MD5检验值

话题是一种传递消息(发布/订阅)的方式。每一条消息都要发布到相应的主题上,每一个话题都是强类型的。

ROS的话题消息可以使用TCP/IP或UDP传输,ROS默认使用的传输方式是TCP/IP。基于TCP传输成为TCPROS,是一种长连接方式;基于UDP传输的成为UDPROS,是一种低延迟、高效率的传输方式,但容易丢失数据,适合于远程操作。

当我们在命令行里输入【rostopic】,然后双击Tab键,会发现命令行下方出现这样几个单词

image-20210827153902106

ROS 命令行工具rostopic

rostopic命令作用
rostopic bw /topic显示主题所使用的带宽
rostopic echo /topic将主题对应的消息输出到屏幕
rostopic find message_type按照类型查找主题
rostopic hz /topic显示主题的发布频率
rostopic info /topic输出关于该主题的信息
rostopic list输出活动主题列表
rostopic pub /topic type args将数据发布到主题
rostopic type /topic输出主题类型

服务用于请求应答模型,也必须有一个唯一的名称。当一个节点提供某个服务时,所有的节点都可以通过使用ROS客户端所编写的代码与之通讯。

当我们在命令行里输入【rosservice】,然后双击Tab键,会发现命令行下方出现这样几个单词

image-20210827154319766

ROS 命令行工具rosservice

rosservice 命令作用
rosservice args /service显示服务参数
rosservice call /service用输入的参数请求服务
rosservice find /service按照类型查找主题
rosservice info /service显示指定服务的信息
rosservice list显示活动的服务信息
rosservice uri /service显示ROSRPC URI服务
rosservice type /service显示服务类型

消息记录包是一种用于保存和回放ROS消息数据的文件格式,保存在.bag文件中。是一种用于存储数据的重要机制。

当我们在命令行里输入【rosbag】,然后双击Tab键,会发现命令行下方出现这样几个单词

image-20210827155233100

ROS 命令行工具rosbag

rosbag命令作用
check确定一个包是否可以在当前系统中进行,或者是否可以迁移。
decompress压缩一个或多个包文件。
filter解压一个或多个包文件。
fix在包文件中修复消息,以便在当前系统中播放。
help获取相关命令指引帮助信息。
info总结一个或多个包文件的内容。
play以一种时间同步的方式回放一个或多个包文件的内容。
record用指定话题的内容记录一个包文件。
reindex重新索引一个或多个包文件。

参数服务器是可通过网络访问的共享的多变量字典,通过关键字存储在节点管理器上。

当我们在命令行里输入【rosparam】,然后双击Tab键,会发现命令行下方出现这样几个单词

image-20210827160453459

ROS 命令行工具rosparam

rosparam命令作用
rosparam delete parameter删除参数
rosparam dump file将参数服务器中的参数写入到文件
rosparam get parameter获得参数值
rosparam list列出参数服务器中的参数
rosparam load file从文件中加载参数到参数服务器
rosparam set parameter value设置参数

节点管理器用于主题、服务名称的注册和查找等。在整个ROS系统中如果没有节点管理器,就不会有节点之间的通讯。

1.2.2、文件系统级

文件系统级
综合功能包
功能包
功能包清单
消息
服务
代码
其他

功能包之间可以配置依赖关系。如果功能包A依赖功能包B,那么在ROS构建系统时,B一定要早于A的构建,并且A可以使用B中的头文件和库文件。

文件系统级的概念如下:

这个清单是指明功能包的依赖关系、源文件编译标志信息等。功能包中的package.xml文件就是一个功能包清单。

功能包是ROS系统中软件组织的基本形式,包含运行的节点以及配置文件等。

ROS package 相关命令

rospack 命令作用
rospack help显示rospack的用法
rospack list列出本机所有package
rospack depends [package]显示package的依赖包
rospack find [package]定位某个package
rospack profile刷新所有package的位置记录

将几个功能包组织在一起,即可形成综合功能包。

ROS中节点之间发送消息时需要事先进行消息说明。ROS中提供了标准类型消息,也可以自行定义。消息类型的说明存储在功能包下的msg文件内。

定义了在ROS系统中由每个进程提供的关于服务请求和响应的数据结构。

1.2.3、开源社区级

1.3、通讯机制

1.3.1、Topic

ros中广为使用的是异步的 publish-subscribe 通讯模式。Topic 一般 用于单向,消息流通讯。Topic 一般拥有很强的类型定义:一种类型的topic只能接受/ 发送特定数据类型(message type)的message。Publisher 没有被要求类型一致性,但是接受时subscriber会检查类型 的md5,进而报错。

image-20210831162509791

1.3.2、Service

service 用于处理ros通讯中的同步通讯,采用server/client 语义。每个service type拥 有 request 与 response两部分,对于service中的 server,ros不会检查重名(name conflict),只有最后注册的server会生效,与client建立连接。

image-20210831163032489

1.3.3、Action

action使用多个topic组成,用于定义任务,任务定义包括目标(Goal)、任务执行过程状态反馈(Feedback)和结果(Result)等。编译action将会自动产生7个结构体分别为:Action、ActionGoal、ActionFeedback、ActionResult、Goal、Feedback、Result结构体。

image-20210830102834443

Action的特点:

Action的接口:

通讯模式特点对比

特点TopicServiceAction
响应机制结果响应进度响应,结果响应
同步性异步同步异步
通讯模型PublisherSubscriberClientServerClientServer
Node对应关系多对多多(Client)对一(Server)多(Client)对一(Server)

1.4、常用组件

launch启动文件;TF坐标变换;Rviz;Gazebo;QT工具箱;Navigation;MoveIt!

launch:启动文件(Launch File)是ROS中一种同时启动多个节点的途径,它还可以自动启动ROS Master节点管理器,并且可以实现每个节点的各种配置,为多个节点的操作提供很大便利。

TF坐标变换:机器人本体和机器人的工作环境中往往存在大量的组件元素,在机器人设计和机器人应用中都会涉及不同组件的位置和姿态,TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树形数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间、在坐标系间完成点、向量等坐标的变换。

QT工具箱:为了方便可视化调试和显示,ROS提供了一个Qt架构的后台图形工具套件——rqt_common_plugins,其中包含不少实用工具:日志输出工具(rqt_console)、计算图可视化工具(rqt_graph)、数据绘图工具(rqt_plot)、参数动态配置工具(rqt_reconfigure)

Rviz:rviz是一款三维可视化工具,很好地兼容了各种基于ROS软件框架的机器人平台。在rviz中,可以使用XML对机器人、周围物体等任何实物进行尺寸、质量、位置、材质、关节等属性的描述,并且在界面中呈现出来。同时,rviz还可以通过图形化方式,实时显示机器人传感器的信息、机器人的运动状态、周围环境的变化等。

Gazebo:Gazebo是一个功能强大的三维物理仿真平台,具备强大的物理引擎、高质量的图形渲染、方便的编程与图形接口,最重要的还有其具备开源免费的特性。虽然Gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境、以可视化的方式显示。

Navigation:navigation是ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。

Moveit:Moveit!功能包是最常用的工具包,主要用来进行轨迹规划。Moveit!配置助手用来配置一些在规划中需要用到的文件,非常关键。

1.5、发行版本

参考链接:http://wiki.ros.org/Distributions

ROS 1 Distribution

ROS的发行版本(ROS distribution)指ROS软件包的版本,其与Linux的发行版本(如Ubuntu)的概念类似。推出ROS发行版本的目的在于使开发人员可以使用相对稳定的代码库,直到其准备好将所有内容进行版本升级为止。因此,每个发行版本推出后,ROS开发者通常仅对这一版本的bug进行修复,同时提供少量针对核心软件包的改进。截至2019年10月,ROS的主要发行版本的版本名称、发布时间与版本生命周期如下表所示 :

版本名称发布日期版本生命周期操作系统平台
ROS Noetic Ninjemys2020年5月2025年5月Ubuntu 20.04
ROS Melodic Morenia2018年5月23日2023年5月Ubuntu 17.10, Ubuntu 18.04, Debian 9, Windows 10
ROS Lunar Loggerhead2017年5月23日2019年5月Ubuntu 16.04, Ubuntu 16.10, Ubuntu 17.04,Debian 9
ROS Kinetic Kame2016年5月23日2021年4月Ubuntu 15.10, Ubuntu 16.04, Debian 8
ROS Jade Turtle2015年5月23日2017年5月Ubuntu 14.04, Ubuntu 14.10, Ubuntu 15.04
ROS Indigo Igloo2014年7月22日2019年4月Ubuntu 13.04, Ubuntu 14.04
ROS Hydro Medusa2013年9月4日2015年5月Ubuntu 12.04, Ubuntu 12.10, Ubuntu 13.04
ROS Groovy Galapagos2012年12月31日2014年7月Ubuntu 11.10, Ubuntu 12.04, Ubuntu 12.10
ROS Fuerte Turtle2012年4月23日--Ubuntu 10.04, Ubuntu 11.10, Ubuntu 12.04
ROS Electric Emys2011年8月30日--Ubuntu 10.04, Ubuntu 10.10, Ubuntu 11.04, Ubuntu 11.10
ROS Diamondback2011年3月2日--Ubuntu 10.04, Ubuntu 10.10, Ubuntu 11.04
ROS C Turtle2010年8月2日--Ubuntu 9.04, Ubuntu 9.10, Ubuntu 10.04, Ubuntu 10.10
ROS Box Turtle2010年3月2日--Ubuntu 8.04, Ubuntu 9.04, Ubuntu 9.10, Ubuntu 10.04