ROS入门笔记一概述

ROS是机器人操作系统(Robot Operating System,ROS)是一个应用于机器人上的操作系统

已经广泛应用于机械臂、移动底盘、无人机、无人车等许多种类的机器人上。机器人是一个系

统工程,它涉及机械、电子、控制、通信、软件等诸多学科

ROS术语

主节点(master):负责节点到节点的连接和消息通信,类似于名称服务器(NameServer)。roscore是它的运行命令。主节点使用XML远程过程调用(XMLRPC,XML-Remote Procedure Call)与节点进行通信。当启动ROS时,主节点将获取用户设置的ROS_MASTER_URI变量中列出的URI地址和端口。除非另外设置,默认情况下,URI地址使用当前的本地IP,端口使用11311。

节点(node):是指在ROS中运行的最小处理器单元。在ROS中,建议为一个目的创建一个节点。节点在运行的同时,向主节点注册节点的名称,并且还注册发布者(publisher)、订阅者(subscriber)、服务服务器(service server)、服务客户端(service client)的名称,且注册消息形式、URI地址和端口。基于这些信息,每个节点可以使用话题和服务与其他节点交换消息。

节点使用XMLRPC与主站进行通信,并使用TCP/IP通信系列的XMLRPC或TCPROS5进行节点之间的通信。节点之间的连接请求和响应使用XMLRPC,而消息通信使用

TCPROS,因为它是节点和节点之间的直接通信,与主节点无关。URI地址和端口则使用存储于运行当前节点的计算机上的名为ROS_HOSTNAME的环境变量作为URI地址,并

将端口设置为任意的固有值。

功能包(package):是构成ROS的基本单元。ROS应用程序是以功能包为单位开发的。功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件。它还包含功能包所需的所有文件。

元功能包(metapackage):是一个具有共同目的的功能包的集合。例如,导航元功能包包含AMCL、DWA、EKF和map_server等10余个功能包。

消息:节点之间通过消息(message)8来发送和接收数据。消息是诸如integer、floatingpoint和boolean等类型的变量。用户还可以使用诸如消息里包括消息的简单数据结构或列举消息的消息数组的结构。使用消息的通信方法包括TCPROS,UDPROS等,根据情况使用单向消息发送/接收方式的话题(topic)和双向消息请求(request)/响应(response)方式的服务(service)。

话题(topic):话题(topic)9就是“故事”。在发布者(publisher)节点关于故事向主节点注册之后,它以消息形式发布关于该故事的广告。希望接收该故事的订阅者(subscriber)节点获得在主节点中以这个话题注册的那个发布者节点的信息。基于这个信息,订阅者节点直接连接到发布者节点,用话题发送和接收消息。

发布与发布者:发布(publish)是指以与话题的内容对应的消息的形式发送数据。为了执行发布,发布者(publisher)节点在主节点上注册自己的话题等多种信息,并向希望订阅的订阅

者节点发送消息。发布者在节点中声明自己是执行发布的个体。单个节点可以成为多个发布者。

订阅与订阅者:订阅是指以与话题内容对应的消息的形式接收数据。为了执行订阅,订阅者节点在主节点上注册自己的话题等多种信息,并从主节点接收那些发布此节点要订阅的话题的发布

者节点的信息。基于这个信息,订阅者节点直接联系发布者节点来接收消息。订阅者在节点中声明自己执行订阅的个体。单个节点可以成为多个订阅者。

服务(service):消息通信是服务客户端(service client)与服务服务器(serviceserver)之间的同步双向消息通信。其中服务客户端请求对应于特定目的任务的服务,而服务服务器则负责服务响应。

服务服务器(service server):是以请求作为输入,以响应作为输出的服务消息通信的服务器。请求和响应都是消息,服务器收到服务请求后,执行指定的服务,并将结果下发给服务客户端。服务服务器用于执行指定命令的节点。

服务客户端(service client):是以请求作为输出并以响应作为输入的服务消息通信的客户端。请求和响应都是消息,并发送服务请求到服务服务器后接收其结果。服务客户端用于传达给定命令并接收结果值的节点。

动作(action):是在需要像服务那样的双向请求的情况下使用的消息通信方式,不同点是在处理请求之后需要很长的响应,并且需要中途反馈值。动作文件也非常类似于服务,目标(goal)和结果(result)对应于请求和响应。此外,还添加了对应于中途的反馈(feedback)。它由一个设置动作目标(goal)的动作客户端(action client)和一个动作服务器(action server),动作服务器根据目标执行动作,并发送反馈和结果。动作客户端和动作服务器之间进行异步双向消息通信。

动作服务器(action server)以从动作客户端接收的目标作为输入并且以结果和反馈值作为输出的消息通信的服务器。在接收到来自客户端的目标值后,负责执行实际的动作。

动作客户端(action client)是以目标作为输出并以从动作服务器接收待结果和反馈值作为输入的消息通信的客户端。它将目标交付给动作服务器,收到结果和反馈,并给出下一个指示或取消目标。

参数:ROS中的参数(parameter):是指节点中使用的参数。可以把它想象成一个Windows程序中的*.ini配置文件。这些参数是默认(default)设置的,可以根据需要从外部读取或写入

参数服务器(parameter server):是指在功能包中使用参数时,注册各参数的服务器。参数服务器也是主节点的一个功能。

catkin:是指ROS的构建系统。ROS的构建系统基本上使用CMake(Cross PlatformMake),并在功能包目录中的CMakeLists.txt文件中描述构建环境。在ROS中,我们将CMake修改成专为ROS定制的catkin构建系统

rosbuild:ROS构建(rosbuild)是在构建catkin构建系统之前使用的构建系统,虽然仍有一些用户可以使用,但这只是为ROS版本兼容性保留的

roscore:roscore是运行ROS主节点的命令。也可以在另一台位于同一个网络内的计算机上运行它。但是,除了支持多roscore的某些特殊情况,roscore在一个网络中只能运行一个。运行ROS时,将使用您在ROS_MASTER_URI变量中列出的URI地址和端口。如果用户没有设置,会使用当前本地IP作为URI地址并使用端口11311

rosrun:是ROS的基本运行命令。它用于在功能包中运行一个节点。节点使用的URI地址将存储在当前运行节点的计算机上的ROS_HOSTNAME环境变量作为URI地址,端口被设置为任意的固有值。

roslaunch:如果rosrun是执行一个节点的命令,那么roslaunch是运行多个节点的概念。该命令允许运行多个确定的节点。其他功能还包括一些专为执行具有诸多选项的节点的ROS命令,比如包括更改功能包参数或节点名称、配置节点命名空间、设置ROS_ROOT和ROS_PACKAGE_PATH以及更改环境变量等。roslaunch使用*.launch文件来设置可执行节点,它基于可扩展标记语言(XML),并提供XML标记形式的多种选项。

bag:用户可以保存ROS中发送和接收的消息的数据,这时用于保存的文件格式称为bag20,是以*.bag作为扩展名。在ROS中,这个功能包可以用来存储信息并在需要时可以回放以前的情况。例如,当使用传感器执行机器人实验时,使用bag将传感器值以消息形式保存。有了这些保存的信息,即使不重复执行之前的实验,也能通过回放保存的bag文件来反复利用当时的传感器值。特别的,如果利用rosbag的记录和回放功能,在开发那些需要反复修改程序的算法的时候会非常有用。

存储库:每一个公开的功能包在该功能包的wiki上指定一个存储库(repository)。存储库是存储功能包的网站的URL地址,并使用源代码管理系统(如svn、hg和git)来管理问题、开发、下载等。许多当前可用的ROS功能包将github用作存储库。如果您对每个功能包的源代码内容感兴趣,则可以在相应的存储库中进行查阅。

状态图:上面描述的节点、话题、发布者和订阅者之间关系可以通过状态图(graph)直观地表示。它是当前正在运行的消息通信的图形表示。但不能为一次性服务创建状态图。执行它是通过运行rqt_graph功能包的rqt_graph节点完成的。有两种执行命令:rqt_graph和rosrun rqt_graph rqt_graph。

名称:节点、参数、话题和服务都有名称(name)。当使用主节点的参数、话题和服务时,向主节点注册该名称并根据名称进行搜索,然后发送消息。此外,名称非常灵活,因为它们可以在运行时被更改。另外,对于一个节点、参数、话题和服务,也能给其设定多个不同的名称。这种取名规则使得ROS适用于大型项目和复杂系统。

ROS总体设计---一个目标

提高机器人研发中的软件复用率

ROS总体设计---五个特点

(1)、点对点的设计

节点单元

分布式网络

RPC+TCP/UDP通信系统

适合多机协同

(2)、多语言支持

支持Python、C+、Java等编程语言

语言无关的接口

(3)、架构精简、集成度高

每个功能节点可以单独编译

集成众多开源项目 如OpenCV PCL OpenRAV OpenNI

接口统一、提高软件复用性

(4)、组件化工具包丰富

3D可视化工具---rviz

物理仿真环境---gazebo

数据记录工具---rosbag

Qt工具箱---rqt_*

(5)、免费并且开源

BSD许可,可修改、可复用、可商用

软件包数量指数级增加,良好的生态系统

ROS总体设计---四位一体

ROS系统实现---三个层次

开源社区:ROS资源是如何分布式管理的

文件系统:程序文件是如何组织和构建的

计算图:描述程序是如何运行的

ROS系统实现---计算图

(1)节点(Node)---软件模块

(2)节点管理器(ROS Master)---控制中心,提供参数管理

(3)话题(Topic)---异步通信机制,传输消息(Message)

(4)服务(Service)---同步通信机制,传输请求/应对数据

ROS系统实现---话题通信机制

(1)Talker注册

(2)Listener注册

(3)ROS Master进行信息匹配

(4)Listener发送连接请求

(5)Talker确认连接请求

(6)建立网络连接

(7)Talker向Listener发布数据

ROS系统实现---服务通信机制

(1)Talker注册

(2)Listener注册

(3)ROS Master进行信息匹配

(4)建立网络连接

(5)Talker向Listener发布服务应答数据

ROS系统实现---参数通信机制 通过RPC协议

(1)Talker设置变量

(2)Listener查询参数值

(3)ROS Master向Listener发送参数值

ROS系统实现---话题与服务的区别

ROS系统实现---文件系统

  • 1)功能包清单(Package mainfest):记录功能包的基本信息,包括作者信息、许可信息、依赖选项、编译标志等
  • 2)元功能包(Meta Packages):组织多个用于同一目的功能包
  • 3)元功能包清单(Meta Packages):类似于功能包清单,不同之处在于元功能包清单中可能会包含运行时需要依赖的功能包或者声明一些引用的标签。
  • 4)消息类型(Message):消息是ROS节点之间发布/订阅的通信信息,可以使用ROS系统提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义需要的消息类型。
  • 5)服务类型(Service):服务类型定义了ROS服务器/客户端通信模式下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。
  • 6)代码(Code):放置功能包节点源代码的文件夹


ROS初次实践---版本选择

ROS Kinetic Kame

ROS初次实践---安装方法

(1)添加ROS源:

sudo -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc)  main">/etc/apt/sources.list.d/ros-latest.list'

(2)添加秘钥:

sudo apt-get adv --keyserver hkp://ha.pool.sks-keyserver.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

(3)安装ROS:

sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full

(4)初始化rosdep:

sudo rosdep init
rosdep update

(5)设置环境变量:

echo "source /opt/ros/kinetic/setup.bash">>~/.bashrc
source ~/.bashrc

(6)安装rosinstall:

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential

安装目录,默认在/opt/ros路径下

使用roscore命令启动ROS Master

ROS初次实践---命令工具

ROS初次实践---第一个ROS例程

  • 1)启动ROS Master roscore
  • 2)启动小海龟仿真器 rosrun turtlesim turtlesim_node
  • 3)启动海龟控制节点 rosrun turtlesim turtle_teleop_key

ROS框架

ros框架

ROS通讯架构

roscore:当ROS程序启动时,第一步首先启动master,由节点管理器处理依次启动node

rosrun:rosrun pkg_name node_name 启动node节点

ROS通讯方式有以下四种:Topic主题、Service服务、Parameter Service参数服务器、Actionlib动作库

Topic主题

Service

rosservice uri 打印服务ROSRPC uri

rosservice find 按服务类型查找服务

rosservice call 使用所提供的args调用服务

rosservice args 打印服务参数

注意:远程过程调用(Remote Procedure Call,RPC)可以简单通俗的理解为在一个进程里调用另一个进程里的函数。