首先,与上一个博客类似的: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
注:上述解决方案参考: https://blog.csdn.net/Lynn_mg/article/details/91352139 https://blog.csdn.net/GungnirsPledge/article/details/107072380 https://blog.csdn.net/Cyril__Li/article/details/74017438
如果我们把鼠标放置在图上将会对节点和话题进行一个高亮显示,比如下图中两个节点为蓝色和绿色,然后中间的话题为红色。即/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命令进行查看:
$ rostopic echo /turtle1/cmd_vel
$ 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]
则小乌龟运动状态如下所示:
注意:小乌龟在持续绕圆做圆周运动。
|