[ROS]ROS Node的学习

本贴最后更新于 3158 天前,其中的信息可能已经物是人非

##1.准备:

执行:

sudo apt-get install ros-<distro>-ros-tutorials

安装教程,把替换成相应的版本号。(e.g. indigo, jade, kinetic)

##2.图的概念快速预览
Nodes:节点就是使用 ROS 与其他节点进行通信 的可执行的(程序?);

Messages: 向一个主题订阅和发布的 ROS 消息类型;

Topics: 节点能够发布消息或者接受来自订阅的主题的消息;

Master: ROS 的名称服务器(i.e. 为节点之间的相互发现提供服务);

rosout: ROS 中等同于 stdout/stderr;

roscore: Master + rosout + 参数服务 (之后再介绍)

##3.节点
节点不仅仅是在 ROS 包中的一个可执行文件。节点可以使用 ROS 的客户库与其他节点交流。节点能够向一个主题发布和订阅(消息)。节点能够提供或者使用服务。

##4.客户库
ROS 客户库允许使用不同编程语言编写的节点之间交流:

rospy = python client library roscpp = c++ client library

##5.roscore

使用 ROS 的第一件事就是运行 roscore.
执行:

$ roscore

可以看到类似的信息:

... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 SUMMARY PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout]

如果 roscore 没有初始化, 可能是遇到了网络问题. 查看 Network Setup - Single Machine Configuration
如果 roscore 没有初始化并提示缺少权限, 有可能是~/.ros 目录是 root 用户拥有的, 改变这个目录的拥有者:

$ sudo chown -R <your_username> ~/.ros

##6.使用 rosnode
新开一个命令窗口, 然后我们可以运行 rosnode 命令来看下运行 roscore 命令做了什么...
注意:当打开一个新的命令窗口,你的环境变量就被重置了并且新的环境变量来自~/.bashrc 文件. 如果你在运行 rosnode 之类的命令的时候遇到问题,可能需要在~/.bashrc 文件中添加环境变量或者手动定位命令地址.
rosnode 显示目前正在运行的节点的信息:

$ rosnode list

可以看到:

/rosout

可以看到只有一个正在运行的节点: rosout. 这个节点一直运行,它会收集和记录节点输出的调式信息.
Rosnode info 命令返回一个具体节点的信息.

$ rosnode info /rosout

这个命令给出了更多关于 rosout 的信息, 比如说它发布/rosout_agg.

Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://machine_name:54614/ ... Pid: 5092

现在,让我们来看看更多的节点. 通过使用 rosrun 命令启动另一个节点.

##7.使用 rosrun
rosrun 允许使用包名直接启动包内的节点(不需要知道包的具体路径)。
用法:

$ rosrun [package_name] [node_name]

所以我们可以启动 turtlesim 包中的 turtlesim_node 节点.
然后启动一个新的命令窗口:

$ rosrun turtlesim turtlesim_node

可以看见 turtlesim 窗口 :
img
注意:这只龟在你的 turtlesim 窗口看起来有可能不一样. 别担心这个 - 因为本来就有很多不同的龟,更多的龟查看 many types of turtle!
打开新的命令窗口:

$ rosnode list

可以看到类似的信息:

/rosout /turtlesim

一个强大的 ROS 特性就是可以在命令行重新分配名字。
关闭 turtlesim 窗口停止节点 (或者返回 turtlesim 命令窗口按 ctrl+C). 现在让我们重新运行它, 但是这次我们使用 Remapping Argument 改变节点的名字:

$ rosrun turtlesim turtlesim_node __name:=my_turtle

现在,重新运行 rosnode list:

$ rosnode list

可以看到类似的信息:

/rosout /my_turtle

注意: 如果依然可以在列表中看到 /turtlesim, 这意味着你在命令窗口使用 ctrl-C 而不是直接关闭 turtlesion 窗口, 或者没有配置$ROS_HOSTNAME 在 Network Setup - Single Machine Configuration 中定义的环境变量。可以尝试清除节点列表: 

\\$ rosnode cleanup

可以看到新的/my_turtle 节点. 让我们来使用另一个 rosnode 命令 ping 来测试:

$ rosnode ping my_turtle 可以看到输出: rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://aqy:42235/ time=1.152992ms xmlrpc reply from http://aqy:42235/ time=1.120090ms xmlrpc reply from http://aqy:42235/ time=1.700878ms xmlrpc reply from http://aqy:42235/ time=1.127958ms

总结
上文我们学到了:
roscore = ros+core : master (ROS 中提供名字服务) + rosout (stdout/stderr) + parameter server (parameter server 将在以后介绍)
rosnode = ros+node : ROS 工具用于获取节点的信息.
rosrun = ros+run :从一个给定的包中运行节点.
现在你应该理解了节点使如何工作的, 下面我们看看 how ROS topics work. 同时,使用 Ctrl-C 来停止 turtlesim_node 节点.

  • ROS
    23 引用 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 117 关注
  • OneDrive
    2 引用
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    28 引用 • 197 回帖 • 32 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • V2Ray
    1 引用 • 15 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 545 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 23 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 79 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 636 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 595 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 666 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 554 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 158 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 104 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 724 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 176 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 295 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖