1、ROS简介1.1、ROS的主要特点1.2、ROS的整体架构1.2.1、计算图级1.2.2、文件系统级1.2.3、开源社区级1.3、通讯机制1.3.1、Topic1.3.2、Service1.3.3、Action1.4、常用组件1.5、发行版本
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)分布式架构(每一个工作进程都看作一个节点,使用节点管理器统一管理),
(2)多语言支持(如C++、Python等),
(3)良好的伸缩性(既可以写一个节点,也可以通过roslaunch将很多节点组织成一个更大的工程),
(4)源码开放(ROS遵循BSD协议,对个体和商业应用及修改完全免费)。
开源社区级 : 主要包括开发人员知识、代码、算法共享。
文件系统级 : 用于描述可以在硬盘上查到的代码及可执行程序,
计算图级 : 体现进程与进程、进程与系统之间的通讯。
roscore
rosrun turtlesim turtlesim_node
下列命令是整条,输入一部分后用【Tab】键补齐即可,然后修改内容
xxxxxxxxxx
rosservice call /spawn "x: 3.0
y: 3.0
theta: 90.0
name: 'my_turtle'"
节点是主要的计算执行进程。ROS是有很多节点组成的。
xxxxxxxxxx
rqt_graph
当我们在命令行里输入【rosnode 】,然后双击Tab
键,会发现命令行下方出现这样几个单词
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
键,会发现命令行下方出现这样几个单词
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
键,会发现命令行下方出现这样几个单词
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
键,会发现命令行下方出现这样几个单词
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
键,会发现命令行下方出现这样几个单词
ROS 命令行工具rosbag:
rosbag命令 | 作用 |
---|---|
check | 确定一个包是否可以在当前系统中进行,或者是否可以迁移。 |
decompress | 压缩一个或多个包文件。 |
filter | 解压一个或多个包文件。 |
fix | 在包文件中修复消息,以便在当前系统中播放。 |
help | 获取相关命令指引帮助信息。 |
info | 总结一个或多个包文件的内容。 |
play | 以一种时间同步的方式回放一个或多个包文件的内容。 |
record | 用指定话题的内容记录一个包文件。 |
reindex | 重新索引一个或多个包文件。 |
参数服务器是可通过网络访问的共享的多变量字典,通过关键字存储在节点管理器上。
当我们在命令行里输入【rosparam】,然后双击Tab
键,会发现命令行下方出现这样几个单词
ROS 命令行工具rosparam:
rosparam命令 | 作用 |
---|---|
rosparam delete parameter | 删除参数 |
rosparam dump file | 将参数服务器中的参数写入到文件 |
rosparam get parameter | 获得参数值 |
rosparam list | 列出参数服务器中的参数 |
rosparam load file | 从文件中加载参数到参数服务器 |
rosparam set parameter value | 设置参数 |
节点管理器用于主题、服务名称的注册和查找等。在整个ROS系统中如果没有节点管理器,就不会有节点之间的通讯。
功能包之间可以配置依赖关系。如果功能包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系统中由每个进程提供的关于服务请求和响应的数据结构。
ros中广为使用的是异步的 publish-subscribe 通讯模式。Topic 一般 用于单向,消息流通讯。Topic 一般拥有很强的类型定义:一种类型的topic只能接受/ 发送特定数据类型(message type)的message。Publisher 没有被要求类型一致性,但是接受时subscriber会检查类型 的md5,进而报错。
service 用于处理ros通讯中的同步通讯,采用server/client 语义。每个service type拥 有 request 与 response两部分,对于service中的 server,ros不会检查重名(name conflict),只有最后注册的server会生效,与client建立连接。
action使用多个topic组成,用于定义任务,任务定义包括目标(Goal)、任务执行过程状态反馈(Feedback)和结果(Result)等。编译action将会自动产生7个结构体分别为:Action、ActionGoal、ActionFeedback、ActionResult、Goal、Feedback、Result结构体。
Action的特点:
Action的接口:
通讯模式特点对比
特点 | Topic | Service | Action |
---|---|---|---|
响应机制 | 无 | 结果响应 | 进度响应,结果响应 |
同步性 | 异步 | 同步 | 异步 |
通讯模型 | Publisher ,Subscriber | Client ,Server | Client ,Server |
Node对应关系 | 多对多 | 多(Client)对一(Server) | 多(Client)对一(Server) |
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!配置助手用来配置一些在规划中需要用到的文件,非常关键。
参考链接:http://wiki.ros.org/Distributions
ROS的发行版本(ROS distribution)指ROS软件包的版本,其与Linux的发行版本(如Ubuntu)的概念类似。推出ROS发行版本的目的在于使开发人员可以使用相对稳定的代码库,直到其准备好将所有内容进行版本升级为止。因此,每个发行版本推出后,ROS开发者通常仅对这一版本的bug进行修复,同时提供少量针对核心软件包的改进。截至2019年10月,ROS的主要发行版本的版本名称、发布时间与版本生命周期如下表所示 :
版本名称 | 发布日期 | 版本生命周期 | 操作系统平台 |
---|---|---|---|
ROS Noetic Ninjemys | 2020年5月 | 2025年5月 | Ubuntu 20.04 |
ROS Melodic Morenia | 2018年5月23日 | 2023年5月 | Ubuntu 17.10, Ubuntu 18.04, Debian 9, Windows 10 |
ROS Lunar Loggerhead | 2017年5月23日 | 2019年5月 | Ubuntu 16.04, Ubuntu 16.10, Ubuntu 17.04,Debian 9 |
ROS Kinetic Kame | 2016年5月23日 | 2021年4月 | Ubuntu 15.10, Ubuntu 16.04, Debian 8 |
ROS Jade Turtle | 2015年5月23日 | 2017年5月 | Ubuntu 14.04, Ubuntu 14.10, Ubuntu 15.04 |
ROS Indigo Igloo | 2014年7月22日 | 2019年4月 | Ubuntu 13.04, Ubuntu 14.04 |
ROS Hydro Medusa | 2013年9月4日 | 2015年5月 | Ubuntu 12.04, Ubuntu 12.10, Ubuntu 13.04 |
ROS Groovy Galapagos | 2012年12月31日 | 2014年7月 | Ubuntu 11.10, Ubuntu 12.04, Ubuntu 12.10 |
ROS Fuerte Turtle | 2012年4月23日 | -- | Ubuntu 10.04, Ubuntu 11.10, Ubuntu 12.04 |
ROS Electric Emys | 2011年8月30日 | -- | Ubuntu 10.04, Ubuntu 10.10, Ubuntu 11.04, Ubuntu 11.10 |
ROS Diamondback | 2011年3月2日 | -- | Ubuntu 10.04, Ubuntu 10.10, Ubuntu 11.04 |
ROS C Turtle | 2010年8月2日 | -- | Ubuntu 9.04, Ubuntu 9.10, Ubuntu 10.04, Ubuntu 10.10 |
ROS Box Turtle | 2010年3月2日 | -- | Ubuntu 8.04, Ubuntu 9.04, Ubuntu 9.10, Ubuntu 10.04 |