ROS学习-理解ROS话题

本文涉及的产品
资源编排,不限时长
简介: ROS学习-理解ROS话题

首先,与上一个博客类似的:ROS学习-理解ROS节点 使用roscore启动ROS

$ roscore

注意,当前只能运行一个roscore,如果上一个博客中没有关闭roscore,那么会提示类似于下述错误信息。

roscore cannot run as another roscore/master is already running. 
Please kill other roscore/master processes before relaunching

移动turtle

类似于上一博客中所介绍的,启动turtlesim包中的turtlesim_node节点。

$ rosrun turtlesim turtlesim_node

接着,打开一个新的Terminal窗口,使用下述命令:

rosrun turtlesim turtle_teleop_key

输出结果提示:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle. 'q' to quit.

能够使用键盘中的方向键箭头,来控制小乌龟的移动。

注意:保持最后一个Terminal保持最前,以能够记录输入的键盘值。

ROS Topics

使用rqt_graph

上述我们在使用turtlesim_node 和 turtle_teleop_key两个节点来控制小乌龟移动过程中,两个节点之间通过Topic进行了通信。

turtle_teleop_key节点通过一个话题发布键盘值,turtlesim_node节点接收相同的话题,获取其中的键盘值。

下面我们来使用rqt_graph来展示正在运行节点之间的关系。


(注意,如果ROS版本是electric或者更早,则不能使用rqt,而是使用rxgraph代替)


 
         

rqt_graph是 rqt_package的一部分,首先,使用apt-get来安装rqt package。

$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins

(和之前博客中的教程类似的, 使用对应的ros版本替换,比如kinetic或melodic之类的)

接着,使用下述命令查看节点之间的关系:

$ rosrun rqt_graph rqt_graph

但是,由于作者在使用过程中提示出现没有安装’rospkg’的错误。

Traceback (most recent call last):
  File "/opt/ros/melodic/lib/rqt_graph/rqt_graph", line 5, in <module>
    from rqt_gui.main import Main
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_gui/main.py", line 40, in <module>
    from rospkg.rospack import RosPack
ModuleNotFoundError: No module named 'rospkg'

解决方案:

在当前base环境下,使用pip进行安装’rospkg’:

pip install rospkg

安装之后再次使用rosrun rqt_graph rqt_graph查看节点之间的关系,但是还是出现错误,提示如下,没有这个模块’pydot’,需要安装:

Could not import "pyqt" bindings of qt_gui_cpp library - so C++ plugins will not be available:
Traceback (most recent call last):
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui_cpp/cpp_binding_helper.py", line 43, in <module>
    from . import libqt_gui_cpp_sip
ImportError: dynamic module does not define module export function (PyInit_libqt_gui_cpp_sip)
RosPluginProvider.load(rqt_graph/RosGraph) exception raised in __builtin__.__import__(rqt_graph.ros_graph, [RosGraph]):
Traceback (most recent call last):
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_gui/ros_plugin_provider.py", line 79, in load
    module = __builtin__.__import__(
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_graph/ros_graph.py", line 45, in <module>
    from qt_dotgraph.dot_to_qt import DotToQtGenerator
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_dotgraph/dot_to_qt.py", line 35, in <module>
    import pydot
ModuleNotFoundError: No module named 'pydot'
PluginManager._load_plugin() could not load plugin "rqt_graph/RosGraph":
Traceback (most recent call last):
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/plugin_handler.py", line 102, in load
    self._load()
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/plugin_handler_direct.py", line 55, in _load
    self._plugin = self._plugin_provider.load(self._instance_id.plugin_id, self._context)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/composite_plugin_provider.py", line 72, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/composite_plugin_provider.py", line 72, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_gui_py/ros_py_plugin_provider.py", line 61, in load
    return super(RosPyPluginProvider, self).load(plugin_id, plugin_context)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/composite_plugin_provider.py", line 72, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_gui/ros_plugin_provider.py", line 90, in load
    raise e
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_gui/ros_plugin_provider.py", line 79, in load
    module = __builtin__.__import__(
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_graph/ros_graph.py", line 45, in <module>
    from qt_dotgraph.dot_to_qt import DotToQtGenerator
  File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_dotgraph/dot_to_qt.py", line 35, in <module>
    import pydot
ModuleNotFoundError: No module named 'pydot'

接着使用pip进行安装’pydot’:

pip install pydot

然后使用下述命令能够正常显示turtlesim_node 和 turtle_teleop_key两个节点之间的联系。

$ rosrun rqt_graph rqt_graph

如果我们把鼠标放置在图上将会对节点和话题进行一个高亮显示,比如下图中两个节点为蓝色和绿色,然后中间的话题为红色。即/teleop_turtle和turtlesim节点之间通过一个/turtle1/cmd_vel的话题进行联系。

介绍rostopic命令

我们可以通过rostopic工具可以了解ROS中topic话题的信息。

首先使用下述命令调用帮助,了解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'

或者输入rostopic之后使用tap键查看可能的二级子命令。

$ rostopic 
bw    echo  find  hz    info  list  pub   type

接着对上述中的子命令进行一些简要的介绍。

rostopic echo 的用法

rostopic echo会展现一个topic发布的数据。用法如下所示:

rostopic echo [topic]

我们在上面介绍说/teleop_turtle节点和turtlesim节点之间通过一个/turtle1/cmd_vel的话题进行联系。我们使用rostopic echo命令进行查看:

# Hydro及之后的版本使用下述命令,我们是melodic版本,所以是这个命令
$ rostopic echo /turtle1/cmd_vel
# 如果是Groovy或者之前更早的版本,则通过下述命令查看
$ rostopic echo /turtle1/command_velocity

当我们执行之后,可能在界面中看不到任何输出,这是因为/teleop_turtle节点还没有通过这个话题发布数据。我们把之前的ros run turtlesim turtle_teleop_key界面保持在最前面,并使用键盘上的方向键控制小乌龟的移动,可以在界面中看到类似于下述信息。

linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---
linear: 
  x: -2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

接着,使用前述的rosrun rqt_graph rqt_graph命令查看当前的节点如下所示:

可以看到除了turtlesim节点接收到话题/turtle1/cmd_vel之外,还有一个rostopic echo(绿色高亮)也接收到了这个消息。


rostopic list 的用法

rostopic list可以返回当前接收和发布的的topic列表。我们可以通过 “-h” 命令查看rostopic list 的用法:

Usage: rostopic list [/namespace]
Options:
  -h, --help            show this help message and exit
  -b BAGFILE, --bag=BAGFILE
                        list topics in .bag file
  -v, --verbose         list full details about each topic
  -p                    list only publishers
  -s                    list only subscribers
  --host                group by host name

可以看到,使用:

  • “-v”可以查看所有的topic
  • “-p”仅查看发布的topic
  • “-s”仅查看接收的topic
    我们使用"-v"进行查看:
$ rostopic list -v

可以看到类似于下述形式的信息:

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 3 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber
 * /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber

ROS Messages

前面介绍过程中,我们已经了解到/teleop_turtle节点和turtlesim节点之间通过一个/turtle1/cmd_vel的话题进行联系,那么这个话题是怎么让两个节点之间进行交流的呢?答案是通过话题topics来传送ROS中的消息messages。两个节点发布和接收的消息类型必须相同。这意味着ROS话题类型由其发布的消息类型定义。也即是ROS话题类型 确定了其要发送的消息的类型。

使用rostopic type命令

rostopic type命令可以返回任意话题所发布的消息message类型。用法为:

rostopic type [topic]

例如我们针对/turtle1/cmd_vel话题。

$ rostopic type /turtle1/cmd_vel

返回的值为:

geometry_msgs/Twist

接着使用rosmsg show 命令查看geometry_msgs/Twist消息的细节。

$ rosmsg show geometry_msgs/Twist

返回的消息细节为:

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

现在我们知道了turtlesim所期望的消息类型,我们就可以向turtlesim发布命令了。

rostopic 的高级用法

我们在上述学习了ROS message,现在我们来继续学习rostopic关于message的相关知识。

使用rostopic pub

rostopic pub将数据发布到当前激活的话题中。用法如下:

rostopic pub [topic] [msg_type] [args]

对于ROS Hydro及以后的版本,使用类似于下述的命令:

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

对于ROS Groovy之前的版本,则使用类似于下述的命令。

$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8

执行结果如下:

即我们通过上述命令告诉了小乌龟通过线速度2.0,角速度1.8的方式进行移动。

上述命令有些复杂,我们对其进行逐步分析:

首先是使用下述命令rostopic pub,发布消息到指定的topic。

rostopic pub

接着是一个选择"-1",注意是数字 1 而不是字母 l。设置为"-1"代表仅发布一个message消息就退出。

-1

接着是要发布到topic的名称。

/turtle1/cmd_vel

接着是topic中消息的类型:

geometry_msgs/Twist

接着是选项两个-,’–’,告诉解析器后续的参数是可选的。如果只有一个 ‘-’ 则代表是必须的。

--

类似于上述介绍过程中提到的,一个geometry_msgs/Twist消息有两个向量,类似于下述形式:

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

则我们通过YAML语法格式来对linear和angular进行赋值。

'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

则linear的值为:x=2.0, y=0.0, z=0.0。

angular的值为: x=0.0, y=0.0, z=1.8。


可能能够注意到,我们执行了命令之后小乌龟移动一次就停止了,这是因为我们只设置了移动一次。如果我们想要让小乌龟持续移动,可以通过 ‘-r 1’ 设置以 1Hz的频率持续稳定的发布消息数据到话题topic中。

命令如下:

rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]

则小乌龟运动状态如下所示:

注意:小乌龟在持续绕圆做圆周运动。

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
1月前
|
传感器 算法 数据可视化
ROS2教程04 ROS2话题
这篇文章是关于ROS2(Robot Operating System 2)的教程,主要介绍了ROS2中话题的概念、特性、使用方式,以及如何编写发布者和订阅者的代码。
43 3
ROS2教程04 ROS2话题
|
1月前
|
机器人
ROS2教程 04 话题Topic
本文是关于ROS2(机器人操作系统2)中话题(Topic)机制的教程,详细介绍了ROS2中话题的命令使用,包括列出、回显、发布、信息查询、类型查询等功能,并通过示例代码展示了如何创建发布者(Publisher)和订阅者(Subscriber)节点,以及如何测试发布-话题-订阅通信。
105 0
ROS2教程 04 话题Topic
|
2月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
消息中间件 算法 机器人
【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信
比较常用的目前就这一些,之后的命令现用现学就好了
235 1
[ROS通信机制] ---话题通信
[ROS通信机制] ---话题通信
138 0
[ROS通信机制] ---话题通信
|
XML 机器人 C++
【4. ROS的主要通讯方式:Topic话题与Message消息】(2)
【4. ROS的主要通讯方式:Topic话题与Message消息】(2)
217 0
|
传感器 机器人 C++
【4. ROS的主要通讯方式:Topic话题与Message消息】(1)
【4. ROS的主要通讯方式:Topic话题与Message消息】(1)
321 0
|
算法 C语言 C++
【ROS】服务通信、话题通信的应用
现在可以直接使用键盘来控制乌龟运动了
110 0
[ROS通信机制] ---话题通信之自定义msg类型
[ROS通信机制] ---话题通信之自定义msg类型
126 0
|
C++
ROS学习-写一个tf broadcaster(C++)
ROS学习-写一个tf broadcaster(C++)
168 0
ROS学习-写一个tf broadcaster(C++)

推荐镜像

更多