ros操作系统入门

很长时间没有用ros了,刚好这几天手头有一台闲置的\(turtlebot\),于是就想用它验证一些导航算法。重新看ros的官网教程,写的很好,但是每一节讲的东西很少,而我这里网速不快,每次打开新的网页都要等一会,超级费时间,所以写篇博客将ros的常用操作概括归纳一些,以后忘记了方便查阅。

ros

ROS是一个用于开发机器人应用程序的、类似操作系统的机器人软件平台。ROS提供开发机器人应用程序时所需的硬件抽象、子设备控制,以及机器人工程中广泛使用的传感、识别、绘图、运动规划等功能。此外ROS还提供进程之间的消息解析、功能包管理、库和丰富的开发及调试工具。

ros是一种分布式机器人操作系统,依赖于\(linux\)(一般支持的linux系统有\(ubuntu\)系列与\(debian\)系列),由斯坦福发布,目前,很多机器人的研究都是基于它。其基本框架如下:

上图是一个在机器人上跑起来的ros的整体框架图,下面我的介绍会依次从 安装、环境配置、文件系统、通信机制、基础实践 来展开。

在Ubuntu16.04上安装ros

\(ros\)有很多的版本,一般都是和\(linux\)系统的版本绑定的,在\(Ubuntu16.04\)上,我们可以安装的是\(kinetic\)版本。安装过程可以按照官网教程进行,建议直接安装\(desktop-full\)版。

安装完毕记得照着教程初始化\(rosdep\)、设置环境、安装一些用于构建包的依赖。

ros的环境管理

\(ros\)安装完毕后,我们会将source /opt/ros/kinetic/etc/ros写入到~/.bashrc中,这样每次打开终端,会自动设置\(ros\)相关的环境变量。

同时,通常除了系统的环境变量外,我们基于\(ros\)的开发通常是以工作空间为单位的,不同的工作空间的运行环境可能是有区别的,因此此时我们需要导入这个工作空间的环境变量,使用source ws/devel/setup.bash。在这个工作空间中我们也可以新建开发一些功能包。

可以理解为ros的每个工作空间为一个项目,工作空间中存在的每一个包代表着该项目需要的一个功能模块。

ros文件系统

ros文件系统主要指的是在硬盘上ROS源代码的组织形式。主要有包(package)、元包(meta package)、工作空间(workspace)等概念。 ### 工作空间

通常工作空间是我们开发某个项目的地方,在这里我们会新开发出一些专用的包来共我们当前的这个项目或应用(node)使用。如下,每个工作空间可以就是一个文件夹,该文件夹中必须存在一个src文件夹,然后使用catkin_make即可对工作空间进行初始化,或者编译。

  • 创建一个名叫catkin_ws的工作空间
    1
    2
    3
    4
    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws
    catkin_make
    source /devel/setup.bash
    ---

功能包(package)是构成一个ROS项目的基本单元。ROS应用程序是以功能包为单位开发的。功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件。它还包含功能包所需的所有文件,如用于运行各种进程的ROS依赖库、数据集和配置文件等。

  • 在工作空间中创建包new_package,依赖于包depend_p1depend_p2

    1
    2
    cd ~/catkin_ws/src
    catkin_create_pkg new_package depend_p1 depend_p2
    ---

  • 查看一个包的直接依赖rospack depends1 new_packsge

  • 查看一个包的所有依赖(包括直接与间接)rospack depends new_package

  • 编译包,直接编译整个工作空间就可以了

    1
    2
    cd ~/catkin_ws
    catkin_make
    ---

元功能包(metapackage)是一个具有共同目的的功能包的集合。例如,导航元功能包包含AMCL、DWA、EKF和map_server等10余个功能包。其实元功能包在功能上已经是一个应用了,但是我们还是需要将其放入工作空间的src文件夹下,这样才构成一个可以编译的项目。

常用命令

  • 查找ros包roscpp:rospack find roscpp

  • 进入ros文件系统的某个目录下:roscd 包名称/子目录

  • 查看ros包的保存路径:echo $ROS_PACKAGE_PATH,结果应该为ros系统目录下的包路径与你当前的工作空间的ros包路径,比如:/home/xhy/catkin_ws/src:/opt/ros/kinetic/share

  • 罗列ros文件系统某个目录:rosls 包名称/子目录

  • ros命令行工具支持tab自动补全功能

  • 使用rosed快速编辑指定文件(默认编辑器是vim):rosed [package_name] [filename],例如rosed roscpp Logger.msg

ros节点

主节点

主节点(master)负责节点到节点的连接和消息通信,类似于名称服务器(Name Server)。roscore是它的运行命令,当您运行主节点时,可以注册每个节点的名字,并根据需要获取信息。没有主节点,就不能在节点之间建立访问和消息交流(如话题和服务)。

主节点使用XML远程过程调用(XMLRPC,XML-Remote Procedure Call)3与节点进行通信。XMLRPC是一种基于HTTP的协议,主节点不与连接到主节点的节点保持连接。换句话说,节点只有在需要注册自己的信息或向其他节点发送请求信息时才能访问主节点并获取信息。通常情况下,不检查彼此的连接状态。由于这些特点,ROS可用于非常大而复杂的环境。XMLRPC也非常轻便,支持多种编程语言,使其非常适合支持各种硬件和语言的ROS。

当启动ROS时,主节点将获取用户设置的ROS_MASTER_URI变量中列出的URI地址和端口。除非另外设置,默认情况下,URI地址使用当前的本地IP,端口使用11311。

普通节点

节点(node)是指在ROS中运行的最小处理器单元。可以把它看作一个可执行程序。在ROS中,建议为一个目的创建一个节点,建议设计时注重可重用性。例如,在移动机器人的情况下,为了驱动机器人,将每个程序细分化。也就是说,使用传感器驱动、传感器数据转换、障碍物判断、电机驱动、编码器输入和导航等多个细分节点。

节点在运行的同时,向主节点注册节点的名称,并且还注册发布者(publisher)、订阅者(subscriber)、服务服务器(service server)、服务客户端(service client)的名称,且注册消息形式、URI地址和端口。基于这些信息,每个节点可以使用话题和服务与其他节点交换消息。

节点使用XMLRPC与主站进行通信,并使用TCP/IP通信系列的XMLRPC或TCPROS进行节点之间的通信。节点之间的连接请求和响应使用XMLRPC,而消息通信使用TCPROS,因为它是节点和节点之间的直接通信,与主节点无关。URI地址和端口则使用存储于运行当前节点的计算机上的名为ROS_HOSTNAME的环境变量作为URI地址,并将端口设置为任意的固有值。

ros节点是整个机器人控制系统的一个功能单元,运行起来一个ros节点,即运行一个ros程序包中的一个可执行文件。例如rosrun turtlesim turtle_teleop_key

ros系统在启动之前,首先需要运行rosore,我们可以将node看做ros操作系统上的应用软件。

roslaunch

使用rosrun每次只能启动一个节点,我们可以使用roslaunch来启动定义在\(launch\)文件中的多个节点。

用法:roslaunch [package] [filename.launch]

launch文件语法解析,运行如下launch文件会启动两个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<launch>

<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>

</launch>
---

ros通信(计算图级网络形式)

了解ros的通信主要需要了解以下四个概念:节点(node)、消息(messages)、话题(topic)、服务(service)、动作(action)

ros消息(msg)

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

\(msg\)文件就是一个描述\(ROS\)中所使用消息类型的简单文本。通常\(msg\)文件存放在\(package\)\(msg\)目录下

ros中在一个包里消息\(msg\)与服务\(srv\)的创建教程详细可以查看官网教程

ros话题(topic)

ros话题是ros中不同节点之间的一种通信方式,一个节点在一个话题上发布消息,另一个节点订阅该话题以接收该消息。

我们通常使用rostopic来进行话题的相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
rostopic bw display bandwidth used by topic
rostopic delay display delay of topic from timestamp in header
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic or field type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

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

ros的服务

服务(service)是ros提供的一种同步双向消息通信。其中服务客户端请求对应于特定目的任务的服务,而服务服务器则负责服务响应。

使用rosservice可以轻松使用ros客户端、服务器框架提供的服务。

1
2
3
4
5
rosservice list         输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
---

一个\(srv\)文件描述一项服务。它包含两个部分:请求与响应。一般\(srv\)文件存放在\(package\)\(srv\)目录下。

动作

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

动作客户端与动作服务器之间进行异步双向消息通信。

发布与发布者

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

订阅与订阅者

订阅是指以与话题内容对应的消息的形式接收数据。为了执行订阅,订阅者节点在主节点上注册自己的话题等多种信息,并从主节点接收那些发布此节点要订阅的话题的发布者节点的信息。基于这个信息,订阅者节点直接联系发布者节点来接收消息。订阅者在节点中声明自己执行订阅的个体。单个节点可以成为多个订阅者。

发布和订阅概念中的话题是异步的,这是一种根据需要发送和接收数据的好方法。另外,由于它通过一次的连接,发送和接收连续的消息,所以它经常被用于必须连续发送消息的传感器数据。然而,在某些情况下,需要一种共同使用请求和响应的同步消息交换方案。因此,ROS提供叫做服务(service)的消息同步方法。服务分为响应请求的服务服务器和请求后接收响应的服务客户端。与话题不同,服务是一次性的消息通信。当服务的请求和响应完成时,两个节点的连接被断开。

发布者、订阅者、服务服务器、服务客户端、动作服务器和动作客户端都存在于不同的节点中,这些节点需要连接才能进行消息通信。这时候,主节点是帮助节点之间的连接。主节点就像节点名称、话题和服务、动作名称、URI地址和端口以及参数们的名称服务器。换句话说,节点同时向主节点注册自己的信息,并从主节点获取其他节点希望通过主节点访问的节点的信息。然后,节点和节点直接连接进行消息通信。

ros中的参数

ros中还存在参数服务器(由主节点维护),上面存储一些服务的参数设置,参数可以看作是节点中使用的全局变量。可以使用rosparam进行如下操作

1
2
3
4
5
6
rosparam set            设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名
---

ros基础案例

我的教程工作空间

总结

这篇博客主要是对ros的整体概念进行介绍,并且介绍了ros官网基础教程中我个人认为最值得介绍的点。至此,ros的入门算是基本完成了,接下来就是需要使用仿真或者实战对ros进行进一步的操作与体验了。

参考文献

  • [1]. http://wiki.ros.org/cn/ROS/Tutorials

ros操作系统入门
http://line.com/2019/05/25/2019-05-25-ros/
作者
Line
发布于
2019年5月25日
许可协议