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源代码的组织形式。主要有包(package)元包(meta package)工作空间(workspace)等概念。

工作空间

通常工作空间是我们开发某个应用的地方,在这里我们会新开发出一些专用的包来共我们的应用(node)使用。

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

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

  • 在工作空间中创建new_package,依赖于depend_p1depend_p2
    cd ~/catkin_ws/src
    catkin_create_pkg new_package depend_p1 depend_p2 
    

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

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

  • 编译包,直接编译整个工作空间就可以了
    cd ~/catkin_ws
    catkin_make
    

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

常用命令

  • 查找ros包  roscpp:rospack find roscpp

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

  • 查看ros包的保存路径echo $ROS_PACKAGE_PATH,结果应该为ros系统目录下的包路径与你当前的工作空间的ros包路径,比如:/home/sky/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)与节点进行通信。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文件会启动两个节点

<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文件存放在epackage的msg目录下

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

ros话题(topic)

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

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

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客户端、服务器框架提供的服务。

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

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

动作

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

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

发布与发布者

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

订阅与订阅者

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

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

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

ros中的参数

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

rosparam set            设置参数
rosparam get            获取参数
rosparam load           从文件读取参数
rosparam dump           向文件中写入参数
rosparam delete         删除参数
rosparam list           列出参数名

ros基础案例

总结

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

 

 

 

 

  • 14
    点赞
  • 183
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器人操作系统 ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。 ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步RPC(远程过程调用)通讯、基于Topic的异步数据流通讯,还有参数服务器上的数据存储。 1 发展目标 2 ROS的概念 2.1 ROS 的 Filesystem Level 2.2 ROS 的 Computation Graph Level 3 参考文献 4 外部链接 发展目标 ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。 为了实现“共享与协作”这一首要目标,人们制订了ROS架构中的其他支援性目标: “轻便”:ROS是设计得尽可能方便简易。您不必替换主框架与系统,因为ROS编写的代码可以用于其他机器人软件框架中。毫无疑问的,ROS更易于集成与其他机器人软件框架。事实上ROS已完成与OpenRAVE、Orocos和Player的整合。 ROS-agnostic库:【agnostic:不可知论】建议的开发模型是使用clear的函数接口书写ROS-agnostic库。 语言独立性:ROS框架很容易在任何编程语言中执行。我们已经能在Python和C++中顺利运行,同时添加有Lisp、Octave和Java语言库。 测试简单:ROS有一个内建的单元/组合集测试框架,称为“rostest”。这使得集成调试和分解调试很容易。 扩展性:ROS适合于大型实时系统与大型的系统开发项目。 ROS的概念 ROS有三个层次的概念:分别为Filesystem level,Computation graph level, 以及Communication level。 以下内容具体的总结了这些层次及概念。除了这三个层次的概念, ROS也定义了两种名称-- Package资源名称和Graph资源名称。同样会在以下内容中提及。 ROS 的 Filesystem Level 文件系统层概念就是你在碟片里面遇到的资源,例如: Packages:ROS的基本组织,可以包含任意格式文件。一个Package 可以包含ROS执行时处理的文件(nodes),一个ROS的依赖库,一个数据集合,配置文件或一些有用的文件在一起。 Manifests:Manifests (manifest.xml) 提供关于Package元数据,包括它的许可信息和Package之间依赖关系,以及语言特性信息像编译旗帜(编译优化参数)。 Stacks: Stacks 是Packages的集合,它提供一个完整的功能,像“navigation stack” Stack与版本号关联,同时也是如何发行ROS软件方式的关键。 Manifest Stack Manifests: Stack manifests (stack.xml) 提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。 Message (msg) types: 信息描述, 位置在路径:my_package/msg/MyMessageType.msg, 定义数据类型在ROS的 messages ROS里面。 Service (srv) types: 服务描述,位置在路径:my_package/srv/MyServiceType.srv, 定义这个请求和相应的数据结构 在ROS services 里面。 ROS 的 Computation Graph Level Computation Graph Level(计算图)就是用ROS的P2P(peer-to-peer网络传输协议)网络集中处理所有的数据。基本的Computation Graph的概念包括Node, Master, Parameter Sever,messages, services, topics, 和bags, 以上所有的这些都以不同的方式给Graph传输数据。 Nodes: Nodes(节点)是一系列运行中的程序。ROS被设计成在一定颗粒度下的模块化系统。一个机器人控制系统通常包含许多Nodes。比如一个Node控制激光雷达,一个Node控制车轮马达,一个Node处理定位,一个Node执行路径规划,另外一个提供图形化界面等等。一个ROS节点是由Libraries ROS client library写成的, 例如 roscpp 和 rospy. Master: ROS Master 提供了登记列表和对其他计算图的查找。没有Master,节点将无法找到其他节点,交换消息或调用服务。 Server Parameter Server: 参数服务器使数据按照钥匙的方式存储。目前,参数服务器是主持的组成部分。 Messages:节点之间通过messages来传递消息。一个message是一个简单的数据结构,包含一些归类定义的区。支持标准的原始数据类型(整数、浮点数、布尔数,等)和原始数组类型。message可以包含任意的嵌套结构和数组(很类似于C语言的结构structs) Topics: Messages以一种发布/订阅的方式传递。一个node可以在一个给定的topic中发布消息。Topic是一个name被用于描述消息内容。一个node针对某个topic关注与订阅特定类型的数据。可能同时有多个node发布或者订阅同一个topic的消息;也可能有一个topic同时发布或订阅多个topic。总体上,发布者和订阅者不了解彼此的存在。主要的概念在于将信息的发布者和需求者解耦、分离。逻辑上,topic可以看作是一个严格规范化的消息bus。每个bus有一个名字,每个node都可以连接到bus发送和接受符合标准类型的消息。 Services:发布/订阅模型是很灵活的通讯模式,但是多对多,单向传输对于分布式系统中经常需要的“请求/回应”式的交互来说并不合适。因此,“请求/回应” 是通过services来实现的。这种通讯的定义是一种成对的消息:一个用于请求,一个用于回应。假设一个节点提供了一个服务提供下一个name和客户使用服务发送请求消息并等待答复。ROS的客户库通常以一种远程调用的方式提供这样的交互。 Bags: Bags是一种格式,用于存储和播放ROS消息。对于储存数据来说Bags是一种很重要的机制。例如传感器数据很难收集但却是开发与测试中必须的。 在ROS的计算图中,ROS的Master以一个name service的方式工作。它给ROS的节点存储了topics和service的注册信息。Nodes 与Master通信从而报告它们的注册信息。当这些节点与master通信的时候,它们可以接收关于其他以注册节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时Master也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。 节点之间的连接是直接的; Master仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个topic将会要求建立一个与发布该topics的节点的连接,并且将会在同意连接协议的基础上建立该连接。ROS里面使用最广的连接协议是TCPROS,这个协议使用标准的TCP/IP 接口。 这样的架构允许脱钩工作(decoupled operation),通过这种方式大型或是更为复杂的系统得以建立,其中names方式是一种行之有效的手段。names方式在ROS系统中扮演极为重要的角色: topics, services, and parameters 都有各自的names。每一个ROS客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行。 例如,为了控制一个北阳激光测距仪(Hokuyo laser range-finder),我们可以启动这个hokuyo_node 驱动,这个驱动可以给与激光仪进行对话并且在"扫描"topic下可以发布sensor_msgs/LaserScan 的信息。为了处理数据,我们也许会写一个使用laser_filters的node来订阅"扫描"topic的信息。订阅之后,我们的过滤器将会自动开始接收激光仪的信息。 注意两边是如何脱钩工作的。 所有的hokuyo_node的节点都会完成发布"扫描",不需要知道是否有节点被订阅了。所有的过滤器都会完成"扫描"的订阅,不论知道还是不知道是否有节点在发布"扫描"。 在不引发任何错误的情况下,这两个nodes可以任何的顺序启动,终止,或者重启。 以后我们也许会给我们的机器人加入另外一个激光器,这会导致我们重新设置我们的系统。我们所需要做的就是重新映射已经使用过的names。当我们开始我们的第一个hokuyo_node时,我们可以说它用base_scan代替了映射扫描,并且和我们的过滤器节点做相同的事。现在,这些节点将会用base_scan的topic来通信从而代替,并且将不再监听"扫描"topic的信息。然后我们就可以为我们的新激光测距仪启动另外一个hokuyo_node。 参考文献 http://www.ros.org/wiki/ros http://bbs.axnzero.com/index.php http://blog.sina.com.cn/digital2image2processing
要下载ROS(机器人操作系统入门,首先需要访问ROS官方网站,并确保你的计算机满足系统要求。ROS当前支持Ubuntu操作系统,所以你需要确保你的计算机上安装了Ubuntu。 在官方网站上,你可以找到ROS的最新版本。在发布页面上,你可以找到ROS的各个版本和对应的教程。选择适合你的版本,并按照页面上的说明进行下载。 ROS有两个主要分发版本:ROS 1及ROS 2。如果你是新手,建议下载ROS 1,因为它有更广泛的社区支持和更多的教程资源。 下载完ROS的安装包后,你可以按照网站上的指导来安装ROS。通常,安装过程涉及一些命令行操作,需要在终端中输入一些指令。 安装完成后,你可以使用命令行工具验证ROS是否正确安装。输入`roscore`命令并按Enter键,如果ROS成功启动,你将看到一些输出信息。 一旦你成功安装并验证了ROS,你可以开始学习ROS的基础知识。ROS提供了很多教程和示例代码,可以帮助你入门。你可以在ROS的官方教程页面上找到详细的学习内容。 此外,你还可以参加一些ROS相关的在线课程或培训班,通过与其他人的交流和实践,更深入地了解ROS的应用和开发。 总之,下载ROS入门版很简单,只需访问ROS官方网站、选择合适的版本、按照指示进行下载和安装即可。正式入门ROS后,你将有机会学习和掌握构建复杂机器人系统所需的基本概念和技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值