ROS 记录与回放

   今天学习了ROS系统中的数据记录与回放操作,下面以具体实例说明这个功能的实现过程,以下的文件路径为linux系统中的 ~/Documents/ROS/

1. 新建工作空间,在 ~/Documents/ROS/ 下打开新的终端,依次执行以下命令

    mkdir test

    cd test

    mkdir src

    cd src

    catkin_init_workspace

    cd ..

    catkin_make

无误执行以上命令后,看到在 test/ 目录下有3个子文件:src / devel / build ,这说明新建工作空间 test 成功

2. 新建功能包

    cd src

    catkin_create_pkg record std_msgs rospy roscpp

    cd ..

    catkin_make

无误执行以上命令后,看到在 test/src/ 目录下有一个文件 record ,打开record文件可以看到两个小文件: CMakeLists.txt 和 package.xml ,这说明新建功能包 record 成功

3. 创建收发节点

    cd src/record/src

    touch talk.py

    touch listen.py

    在目录 test/src/record/src/ 下出现两个 python 文件:talk.py 和 listen.py, 这是用来测试ROS 回放功能设计的发送节点和接收节点,下面是两个节点的具体实现:



    """ =============NODE talk.py ================"""


#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node("talk", anonymous=True)
    rate = rospy.Rate(5)
    i = 0    
    while not rospy.is_shutdown():
        word = ": Hello, it's publisher, ROS time is " + str(i)
        i = i + 1
        rospy.loginfo(word)
        pub.publish(word)
        rate.sleep()

if __name__=='__main__':
    try:
        print ("Start talking ~~~ ")
        talker()
    except rospy.ROSInterruptException:
        pass
       


    """ =============NODE listen.py ================"""


#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + " I heard %s", data.data)

def listen():
    rospy.init_node('listen', anonymous=True)
    rospy.Subscriber("chatter", String, callback)
    rospy.spin()

if __name__ == '__main__':
    listen()


4. 环境配置

    终端中执行: chmod +x talk.py

                         chmod +x listen.py

    然后在终端中执行: gedit ~/.bashrc ,会打开一个文件

    在bashrc 文件的最后空白行写入: source ~/Documents/ROS/test/devel/setup.sh

    保存修改后的bashrc文件并关闭,在终端中执行: source ~/.bashrc

5. 数据记录

    这一步需要用到4个终端,下面列出每个终端所在路径以及要执行的命令:

    Terminal 0: (Path: anywhere you want)  roscore

    Terminal 1: (Path: ~/Documents/ROS/test/src/record/src/)  ./talk.py

    Terminal 2: (Path: ~/Documents/ROS/test/src/record/src/)  ./listen.py

    Terminal 3: (Path: ~/Documents/ROS/test/src/record/)  mkdir bagfile

                                                                                            cd bagfile

                                                                                            rosbag record -a

    上面四个终端实现了对talk.py 向 listen.py 节点所发送信息的记录,被记录下来的信息存放于路径~/Documents/ROS/test/src/record/bagfile 中,在这个目录下会出现一个以时间命名的文件(Example:2017-06-13-16-49-51.bag)。

    当数据记录的足够多时,可以把第5步中的第1,2,3个终端关闭。

6. 数据回放

    实际上, bagfile 里面记录的数据是 talk.py 向 listen.py 发送的数据中被截取的一部分,下面对截取的这部分数据进行复现,需要打开3个终端:

    Terminal 0: (Path: anywhere you want)  roscore

    Terminal 2: (Path: ~/Documents/ROS/test/src/record/src/)  ./listen.py

    Terminal 3: (Path: ~/Documents/ROS/test/src/record/)  rosbag play2017-06-13-16-49-51.bag

    在第 2 个终端中可以看到回放的数据。

    这时 rosbag 相当于一个发送节点,用于重复 talk.py 节点在过去时间中发送的数据, listen.py 仍然是一个接收节点,有一点需要注意, rosbag 在复现数据的过程中可能会有微少的数据丢失,但整体影响不大。

7. 当回放完数据后,可以关闭所有终端,本次测试结束。


   

   

猜你喜欢

转载自blog.csdn.net/cutelily2014/article/details/73188415