美文网首页ROS
ROS学习笔记(十五)- 记录和回放数据

ROS学习笔记(十五)- 记录和回放数据

作者: Savior2016 | 来源:发表于2017-03-12 16:15 被阅读3401次

    这个教程要学习的是怎么从一个运行的ROS系统中记录一些数据存放在.bag文件中,之后再回放这些数据制造一个相似的行为

    1 记录数据(创建一个bag文件)

    这一节会讲怎么从一个运行的ROS系统中记录topic的数据。topic的数据会被累计存储在一个bag文件中。
    首先,执行以下三条命令:

    roscore
    rosrun turtlesim turtlesim_node 
    rosrun turtlesim turtle_teleop_key
    

    这就是之前的小海龟和键盘控制的两个node。

    1.1 记录所有发布的topic

    首先让我们列举出所有正在被发布消息的topic,打开一个新窗口,输入:
    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
    

    列表中,只有publish topic才能被记录下来,换句话说,只有推送的message才能被记录。topic /turtle1/cmd_vel 是teleop_turtle 推送的命令消息,作为turtlesim 进程的输入,messages /turtle1/color_sensor 和 /turtle1/pose 是输出。
    现在我们就要记录推送数据了,打开一个新窗口运行以下指令:

    mkdir ~/bagfiles
    cd ~/bagfiles
    rosbag record -a
    

    这里我们建立了一个临时文件夹去记录数据,然后运行rosbag record ,并加上a选项,指定将所有发布的topic数据都累加记录下来。
    回到 turtle_teleop 窗口并运行小海龟10秒左右。
    然后在运行rosbag的窗口Ctrl+C退出,接下来就要测试纪录的数据了。

    2 检查并播放bag文件

    我们可以通过rosbag info指令查看bag文件的内容,在bag文件所在的目录运行以下指令:
    rosbag info <your bagfile>
    bag文件的名称是由时间、后缀等内容组成的,如:
    2017-03-12-10-28-01.bag
    所以我应该执行:
    rosbag info 2017-03-12-10-28-01.bag
    然后会看到这个:

    path:        2017-03-12-10-28-01.bag
    version:     2.0
    duration:    12:30s (750s)
    start:       Mar 12 2017 10:28:01.76 (1489285681.76)
    end:         Mar 12 2017 10:40:32.22 (1489286432.22)
    size:        6.2 MB
    messages:    93626
    compression: none [7/7 chunks]
    types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
                 rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
                 turtlesim/Color     [353891e354491c51aabe32df673fb446]
                 turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
    topics:      /rosout                     4 msgs    : rosgraph_msgs/Log   (2 connections)
                 /turtle1/cmd_vel          122 msgs    : geometry_msgs/Twist
                 /turtle1/color_sensor   46750 msgs    : turtlesim/Color    
                 /turtle1/pose           46750 msgs    : turtlesim/Pose
    

    这个会告诉我们topic的名字,类型,以及存储在这里的每个message topic的数目。
    接下来我们就要回放记录了。首先关掉之前读取键盘的那个窗口,保留小海龟。
    在新窗口中运行:
    rosbag play <your bagfile>
    后面这个还是要填你的文件名,比如我的是这样的:

    qkingros@ubuntu:~/bagfiles$ rosbag play 2017-03-12-10-28-01.bag
    [ INFO] [1489299953.329543310]: Opening 2017-03-12-10-28-01.bag
    
    Waiting 0.2 seconds after advertising topics... done.
    
    Hit space to toggle paused, or 's' to step.
     [PAUSED]   Bag Time: 1489285990.443460   Duration: 308.684625 / 750.462410     
    ^C
    

    中间按了空格键,它显示了暂停,s表示一步一步运行。需要注意的是,可能你无法观察到小海龟的运动,因为在看前面的教程时,你输入了记录的命令之后,它就开始记录了,直到你按了键盘小乌龟才开始运动,前面这段时间小海龟是不动的,建议再重新做一次观察。
    其实如果一开始纪录的内容就包含了让小海龟运行的指令,而小海龟还没打开,那很可能就会错过一些。这个时候可以使用-d选项让重放延时一定时间。
    如果你不想再来一遍,可以使用-s让它从某个时间点开始。如果你不知道大概要多久,你可以试一下-r,就是rate,可以加快速度播放:
    rosbag play -r 2 <your bagfile>
    这样的话速度会变快两倍,速度太快可能会出现轨迹都发生了变化。

    3 记录一个数据的子集

    当我们运行一个很复杂的系统时,把所有topic的数据存下来是不切实际的,比如摄像头,可能会产生大量的数据。我们可以有选择的存储我们感兴趣的topic数据。
    首先如果小海龟和键盘检测都关掉了,重新打开他们:

    rosrun turtlesim turtlesim_node 
    rosrun turtlesim turtle_teleop_key
    

    在你的bag文件所在目录,运行下面的指令:
    rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
    这个-O高速rosbag record记录到subset.bag里面,后面的参数是让其值记录这些主题的数据。现在使用键盘让小海龟运动几秒钟,然后Ctrl+C停止记录。
    现在看一下刚刚记录的bag的内容:
    rosbag info subset.bag
    你会看到如下内容,只记录了两个topic的内容。

    path:        subset.bag
    version:     2.0
    duration:    22.8s
    start:       Mar 12 2017 15:48:31.14 (1489304911.14)
    end:         Mar 12 2017 15:48:53.97 (1489304933.97)
    size:        119.6 KB
    messages:    1470
    compression: none [1/1 chunks]
    types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
                 turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
    topics:      /turtle1/cmd_vel     42 msgs    : geometry_msgs/Twist
                 /turtle1/pose      1428 msgs    : turtlesim/Pose
    

    可以再播放一下:
    rosbag play subset.bag

    4 rosbag record/play的局限性

    在前面我们也看到了,如果加速播放,小海龟的路径都会出现问题。因为这个只是简单的对数据的记录和回放,如果节奏发生改变,很可能会引起接收端的一些错误,它并没有与接收方进行任何的交互。就像是你说话的录音,这个录音虽然可以向别人传递消息,但是至于那个人听到了什么它是不管的。所以有可能复现不出原来的行为。

    相关文章

      网友评论

      本文标题:ROS学习笔记(十五)- 记录和回放数据

      本文链接:https://www.haomeiwen.com/subject/ohjzgttx.html