热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

理解ROS

理解ROS 介绍ROS的一些核心概念。首先运行roscore启动ROS节点管理器,然后才能启动rosrun的其他节点:$roscoreRoscore会启动一个ROS Mas

理解ROS

介绍ROS的一些核心概念。

  1. 首先运行roscore启动ROS节点管理器,然后才能启动rosrun的其他节点:

$roscore

Roscore会启动一个ROS Master,一个ROS参数服务器和一个名为rosout的日志节点。如果使用roslaunch启动ROS节点,那么roslaunch会检测roscore是否启动,并自动启动roscore。

整个ROS系统由一个节点管理器和多个相对独立的节点组成,能够提供运动规划,机械臂控制等诸多功能。

 

ROS的系统架构

ROS从架构视角上可以分为操作系统层、中间件层和应用层三个层级。ROS的系统架构如下图所示。

操作系统层,ROS基于Ubuntu进行构建。

中间件层,ROS基于TCPROS、UDPROS进行通信,TCPROS、UDPROS是基于TCP、UDP的ROS应用层数据协议,用于解析话题和服务的二进制数据流。

应用层,ROS基于节点管理器进行节点的发现、发布/订阅、请求/响应等,并记录其他节点的位置,然后将这些信息通知给需要建立连接的节点。ROS基于XML-RPC协议进行节点通信。

ROS源代码位于https://github.com/ros/rosdistro下。

 

ROS从设计视角上可以分为三个层级:开源社区级,文件系统级和计算图集。具体介绍可以看我的另一篇博文ROS学习笔记(一)ROS系统架构

 

·程序包package

工作空间的所有程序包均位于工作空间的src目录下,一个工作空间下可以包含多个程序包。

如果存在程序包集,那么程序包应与程序包集在同一级目录

 

 

理解节点管理器

节点管理器(通过roscore启动)可以理解为ROS的神经中枢,节点在启动时注册到节点管理器上,节点管理器对节点进行管理,并帮助节点找到彼此。节点管理器不参与节点之间的消息传递。

roscore启动过程主要完成:

  • 启动节点管理利器,节点管理器主要用于查询节点,实现消息服务在各个节点之间的连接;
  • 启动参数服务器,参数服务器用于设置和查询参数;
  • 启动日志节点rosout,记录所有消息的收发和stdout、stderr。

 

理解节点

ROS将程序包中可执行文件的运行实例称为节点(Node),节点本质上就是执行运算任务的进程

  1. 启动节点

ROS支持rosrun、roulaunch两种方式启动节点,两者的区别在于:

rosrun一次只能启动一个节点,若启动节点前节点管理器没有启动,则启动节点会失败。

利用rosrun可直接启动程序包中的节点,其中节点名为CMakeList.txt文件中的add_executable宏定义的可执行文件名,启动方法如下:

$roslaunch [程序包名] [节点名称]

 

roslaunch可以通过launch文件一次启动多个节点,如果启动节点时没有节点管理器正在运行,则roslaunch会自动启动节点管理器,如果已经有节点管理器在运行,则连接已启动的节点管理器。

任何包含两个及以上节点的程序包都可以利用launch文件来指定和配置需要使用的节点,launch文件本质上是一以launch为后缀的XML文件,应位于launch目录下。

利用roslaunch调用程序包的launch文件启动节点,方法如下:

$roslaunch [选项] [程序包名] [可变参数]

 

  1. 查看节点信息

通过rosnode可以查看节点的相关信息。

查看当前运行节点列表的方法如下:

$rosnode list

 

理解话题

       节点之间的通信可通过消息(Message)进行传递,而消息则封装在话题(Topic)中,话题本质上是对套接字(Socket)的一种封装。消息以发布(publish)/订阅(subscribe)的模式进行传递,一个节点可以向一个给定的话题发布消息,另一个节点可以订阅给定话题中特定消息类型的消息。发布者和订阅者可通过话题实现解耦。

       在ROS中话题必须是唯一的,否则消息路由就会产生错误。

       话题可以利用可视化工具rqt_graph进行查看。

       调试过程中,可通过命令行将消息发布到话题上。

理解消息

在ROS中,消息本质上是一种节点间传递信息的数据类型。

ROS利用了简单的、与开发语言无关的接口来描述模块间传递的消息。

利用消息机制可以很好地实现分布式节点之间的通信,也有利于开发者实现高内聚、低耦合的代码。

  1. 消息类型

每个消息都属于一个特定的程序包,消息类型的命名方式为:

程序包名/消息名

如:geometry_msgs/Twist

消息类型每行的声明必须包含两部分:域和变量;域定义的消息的数据类型,变量定义了域的名称。域可以是独立域或者符合域。

  1. 查看消息

利用rosmsg可以查看消息。

如:rosmsg show [消息类型]

  1. 手动发布消息(同手动发布话题)

 

理解服务

服务是ROS的另外一种通信机制,它与消息的区别在于消息是单向的,没有相应的概念,每一个消息都与一个话题相关,该话题可以有多个发布者和订阅者,消息既可以一对多,也可以多对多;服务是双向的,一个节点向另一个节点发送消息并等待响应,而且服务的响应也返回同一个节点。

  1. 服务类型

服务文件是一个后缀名为srv并描述服务类型的文本文件,存放在程序包的srv目录下。服务文件由请求、响应两部分构成,请求和响应之间通过“---”隔开。

服务的每行声明与消息类型格式一样。

  1. 查看服务

通过rosservice可以查看服务的信息,常见的用法如下:

查看服务列表

$rosservice list

理解动作

       如之前介绍,服务的响应是同步的,这在执行一些耗时较短的任务时没有问题,但在执行一些耗时较长的任务,如让机械臂从A点运动到B点时,服务就会造成线程的阻塞。

为了解决这一问题,ROS提供了动作(Action)执行耗时长的异步任务,动作除了请求是异步的之外,还能查看任务进度并取消任务等。

  1. 动作类型

ROS的动作由后缀为action的文本文件进行定义,动作文件包含goal、result、feedback三部分的内容。三者之间通过“---”隔开。如下所示:

#goal

int32 total

---

#result

int32 sum

---

#feedback

      

  1. 动作状态

ROS的动作采用Client/Server架构的设计,可通过ActionClient、ActionServer来完成动作的通信。

动作在机械臂、定位、及导航等场景中应用广泛。

 

理解参数

       ROS通过参数服务器来存储和操作数据,参数服务器可以存储整型、浮点型、布尔型、字典型、列表型等类型的数据,节点可以通过接口实时地存储和获取参数,但考虑到可读性,参数以静态非二进制的形式存在,性能并不算高,参数服务器是节点管理器的一部分。

       参数既可以用rosparam来进行管理,也可以在launch文件中配置,还可以通过代码进行动态配置。

 

 


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
author-avatar
罗帅飞1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有