热门标签 | 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文件中配置,还可以通过代码进行动态配置。

 

 


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 华为鸿蒙系统官网2.0报名方法及适用设备
    本文介绍了华为鸿蒙系统官网2.0报名的适用设备、报名方法以及三种方式,包括在应用商店下载开发者联盟app、在官网中进行报名、在微信公众号中申请体验HarmonyOS 2.0 手机开发者Beta版本。同时提醒错过测试机会的用户可以等待后续的正式版发布。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • 分布式系统一致性专题:3PC协议的优化和问题
    本文介绍了分布式系统一致性专题中的3PC协议,该协议是对2PC协议的优化和改进。文章详细解释了3PC协议的三个阶段:CanCommit、PreCommit和DoCommit,并分析了每个阶段可能出现的情况和处理方式。同时,文章也指出了3PC协议存在的问题,如参与者超时机制可能导致数据不一致等。总体来说,3PC协议在优化和改进方面取得了一定效果,但仍需继续努力解决数据不一致问题。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
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社区 版权所有