zoukankan      html  css  js  c++  java
  • 熟悉ROS系统中的话题

    描述:这篇教程主要讲解ROS系统中的话题及rostopic和rqt_plot等命令工具;

    1. Setup安装
    1.1 roscore

    首先确保roscore已经启动运行,打开一个新的命令终端,输入如下指令:

    $ roscore

    如果此时你仍然运行着上一篇教程中的roscore,将会看到如下错误信息:
    •        roscore cannot run as another roscore/master is already running.
    •        Please kill other roscore/master processes before relaunching

    这是没有什么问题的,因为只能有一个roscore运行;

    1.2 turtlesim

    在这篇教程,我们仍然使用turtlesim功能包,打开一个新的命令终端,输入如下指令:

    $ rosrun turtlesim turtlesim_node

    1.3 键盘遥控乌龟

    我们需要采取一些措施来操纵乌龟,请在新的命令终端输入如下指令:

    $ rosrun turtlesim turtle_teleop_key

    •        [ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time
    •        Reading from keyboard
    •        ---------------------------
    •        Use arrow keys to move the turtle.

    这样就可以使用键盘上的方向键来操控乌龟运动了,如果乌龟不动弹,则需要选中turtle_teleop_key窗口,确保按下的键被窗口采集到;

    2. ROS系统中的话题

    Turtlesim_node节点和turtle_teleop_key节点之间通过ROS系统的话题进行通信,turtle_teleop_key节点发布键盘的动作到话题,同时turtlesim订阅同样的话题来接收键盘动作。我们可以通过rqt_graph查看当前运行的节点和话题。

    注意:如果采用electric或更早期的版本,是不支持rqt的,可以通过rxgraph来替代;

    2.1 rqt_graph的用法

    rqt_graph会产生一个关于系统正在运行的元素(注节点及话题等)的动态图表,它是rqt功能包的一部分,如果你还没有安装,可以通过如下方式安装:
    •        $ sudo apt-get install ros-<distro>-rqt

    替换指令中的<distro>为你的ROS的版本号,如fuerte,groovy等;
    新打开一个命令终端,输入如下指令:

    $ rosrun rqt_graph rqt_graph

    可以看到如下类似的图像:

    机器人操作系统ROS学习教程

    如果把鼠标放置到/turtle1/command_velocity上,ROS节点(蓝色和绿色显示的)及话题(红色显示的)会出现高亮, 如图所示,turtlesim_node和turtle_teleop_key节点通过名字为/turtle1/command_velocity的话题进行通信;

    机器人操作系统ROS学习教程

    2.2 rostopic介绍

    通过rostopic工具可以获取有关ROS话题的信息;

    可以通过help参数获取有关rostopic的次级命令选项用法;
    $ rostopic -h
    •        rostopic bw    display bandwidth used by topic
    •        rostopic echo  print messages to screen
    •        rostopic hz    display publishing rate of topic   
    •        rostopic list  print information about active topics
    •        rostopic pub    publish data to topic
    •        rostopic type  print topic type

    下面我们使用这些次级命令来检测一下turtlesim节点;

    2.3 rostopic echo的用法

    Rostopic echo 列示出发布给话题的数据信息;

    用法:
    rostopic echo [topic]

    我们在一个新的命令终端下查看节点turtle_teleop_key发布给/turtle1/command_velocity话题的数据:

    $ rostopic echo /turtle1/command_velocity

    你也许什么都看不到,因为节点没有正在发布数据给话题,还需要通过按方向键让turtle_teleop_key发布数据,需要注意的是,如果乌龟没有动弹,需要重新选中turtle_teleop_key的命令终端;

    如果你按下向上的方向键,你可以看到如下的相关信息:
    •        ---
    •        linear: 2.0
    •        angular: 0.0
    •        ---
    •        linear: 2.0
    •        angular: 0.0
    •        ---
    •        linear: 2.0
    •        angular: 0.0
    •        ---
    •        linear: 2.0
    •        angular: 0.0
    •        ---
    •        linear: 2.0
    •        angular: 0.0

    现在再次查看一下rqt_graph(需要刷新一下),可以看到rostopic echo节点(红颜色所示)也在订阅trutle1/command_velocity话题了;

    机器人操作系统ROS学习教程

    2.4 rostopic list的用法

    rostopic list 会列示出当前提供订阅和发布的所有话题信息;

    我们猜想一下list的次级命令是什么,在一个新的命令终端,输入如下指令:
    $ rostopic list -h
    •        Usage: rostopic list [/topic]
    •       
    •        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

    我们使用rostopic list的 verbose选项:

    [plain] view plaincopyprint?$ rostopic list -v 

    $ rostopic list -v

    这将会展示一个有关发布者及订阅者的详细列表及他们的类型。
    •        Published topics:
    •        * /turtle1/color_sensor [turtlesim/Color] 1 publisher
    •        * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
    •        * /rosout [roslib/Log] 2 publishers
    •        * /rosout_agg [roslib/Log] 1 publisher
    •        * /turtle1/pose [turtlesim/Pose] 1 publisher
    •       
    •        Subscribed topics:
    •        * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
    •        * /rosout [roslib/Log] 1 subscriber

    3. ROS消息

    节点通过话题通信时是采用ROS消息的方式进行的,对于发布者turtle_teleop_key和订阅者turtlesim_node之间的通信,发布者和订阅者必须采用类型一致的消息。亦即话题通信类型是由发布方发送的消息类型决定的。发送给话题的消息类型可以通过rostopic type检测到;

    3.1 rostopic type的用法

    rostopic type返回话题发布的任何一个消息的类型。

    用法:
    rostopic type [topic]

    试着输入:

    $ rostopic type /turtle1/command_velocity

    •        You should get:
    •        得到如下结果:
    turtlesim/Velocity

    可以通过rosmsg查看更详细的信息;

    $ rosmsg show turtlesim/Velocity

    •        float32 linear
    •        float32 angular

    现在我们知道了turtlesim需要什么类型的数据了,因此我们可以对小乌龟发布命令了;

    4. rostopic补充讲解

    我们知道了ROS消息,现在我们使用rostopic操作消息;

    4.1 pub rostopic pub的用法

    rostopic pub 发布数据给当前存在的话题;

    用法:
    rostopic pub [topic] [msg_type] [args]

    示例:

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

    在指令中,发送一条消息给turtlesim,通知他采用2.0的线性速度及1.8的角速度运行;
    •       

    机器人操作系统ROS学习教程

    这是一个比较奥复杂的指令,我们相信看一下每一个参数;
    •        rostopic pub

    表示发布消息到指定的话题;
    •        -1

    -1选项表示只发送一次消息,然后就停发;
    •        /turtle1/command_velocity

    指定要发送的话题;
    •        turtlesim/Velocity

    指定发送给话题的消息类型
    •        --

    “--”告诉解析器后面的参数不是选项了(而是消息的具体数值),当数值为负数时是非常有必要的;

    •        2.0 1.8

    如前面提到的,turtlesim/Velocity命令有两个浮点型的数据:线性速度和角速度,这是2.0表示线性速度,1.8表示角速度的数值,这些参数表示形式符合YAML语法,具体可以查看有关YAML的介绍;

    你会注意到小乌龟已经停止运动了,因为它需要靠1Hz的数据流不断驱动,我们可以使用rostopic pub –r指令不断发送数据流:

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

    这条指令以1Hz的频率不断发布速度数据到速度话题;
    •       

    机器人操作系统ROS学习教程

    我们可以通过rqt_graph查看什么正在运行,rostopic pub节点(红色所示)正和rostopic echo节点(绿色所示)不断通信;

    机器人操作系统ROS学习教程

    这样,小乌龟不断的做圆周运行。打开一个新的命令终端,我们使用rostopic echo可以查看由tertlesim发布的数据信息;

    4.1 rostopic hz的用法

    rostopic hz会报告出数据发布的频率;

    用法:
    rostopic hz [topic]

    我们查看一下turtlesim_node发布的/turtle1/pose有多快:

    $ rostopic hz /turtle1/pose

    可以看到如下执行结果:
    •        subscribed to [/turtle1/pose]
    •        average rate: 59.354
    •                min: 0.005s max: 0.027s std dev: 0.00284s window: 58
    •        average rate: 59.459
    •                min: 0.005s max: 0.027s std dev: 0.00271s window: 118
    •        average rate: 59.539
    •                min: 0.004s max: 0.030s std dev: 0.00339s window: 177
    •        average rate: 59.492
    •                min: 0.004s max: 0.030s std dev: 0.00380s window: 237
    •        average rate: 59.463
    •                min: 0.004s max: 0.030s std dev: 0.00380s window: 290

    现在我们可以看出turtlesim正以60Hz的频率发布数据给小乌龟,我们也可以通过rostopic type与rosmsg show 联合在一起的方式输出有关话题的更详细信息;

    $ rostopic type /turtle1/command_velocity | rosmsg show

    现在我们已经可以通过rostopit来检查话题了,我们还需要使用其他工具查看一下turtlesim发布的数据;

    5. rqt_plot用法

    注意:如果使用electric或者更早期的版本,rqt是不支持的,用rxplot替代;

    rqt_plot展示出了有关数据随着时间输出的曲线。这里我们使用rqt_plot画出发布给/turtle1/pose的数据:

    $ rosrun rqt_plot rqt_plot /turtle1/pose/x:y
    $ rosrun rqt_plot rqt_plot /turtle1/pose/theta

    下面第一副图展示了x-y的位置随时间的关系,第二幅图展示了海龟的theta(方向角?)数值随时间的关系;

    机器人操作系统ROS学习教程机器人操作系统ROS学习教程

  • 相关阅读:
    文件I/O(二)
    linux学习之文件I/O篇(一)
    静态库和共享库
    vim-ide
    CentOS6 vsftpd 安装及优化方法
    Redmine2.5+CentOS6+Apache2
    分享一个TP5实现Create()方法的心得
    Windows证书的生成导出以及使用证书验证文件是否被修改
    如何设置程序UAC控制
    关于C#的可变长参数
  • 原文地址:https://www.cnblogs.com/feifanrensheng/p/10081609.html
Copyright © 2011-2022 走看看