今天学习了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. 当回放完数据后,可以关闭所有终端,本次测试结束。