00001 #!/usr/bin/env python 00002 # Software License Agreement (BSD License) 00003 # 00004 # Copyright (c) 2009, Willow Garage, Inc. 00005 # All rights reserved. 00006 # 00007 # Redistribution and use in source and binary forms, with or without 00008 # modification, are permitted provided that the following conditions 00009 # are met: 00010 # 00011 # * Redistributions of source code must retain the above copyright 00012 # notice, this list of conditions and the following disclaimer. 00013 # * Redistributions in binary form must reproduce the above 00014 # copyright notice, this list of conditions and the following 00015 # disclaimer in the documentation and/or other materials provided 00016 # with the distribution. 00017 # * Neither the name of Willow Garage, Inc. nor the names of its 00018 # contributors may be used to endorse or promote products derived 00019 # from this software without specific prior written permission. 00020 # 00021 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00024 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00025 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00026 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00027 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00031 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 # POSSIBILITY OF SUCH DAMAGE. 00033 00034 from __future__ import print_function 00035 00036 import rospy 00037 import rosbag 00038 import fileinput 00039 00040 def fixbags(md5file, inbag, outbag): 00041 d = {} 00042 for line in fileinput.input(md5file): 00043 sp = line.split() 00044 d[sp[1]] = [sp[0], sp[2], sp[3]] 00045 00046 rebag = rosbag.Bag(outbag, 'w') 00047 00048 for topic, msg, t in rosbag.Bag(inbag).read_messages(raw=True): 00049 type, bytes, md5 = msg[0], msg[1], msg[2] 00050 00051 if md5 in d: 00052 if type != d[md5][0]: 00053 print('WARNING: found matching md5, but non-matching name') 00054 continue 00055 msg = (d[md5][1], msg[1], d[md5][2]) 00056 00057 rebag.write(topic, msg, t, raw=True) 00058 00059 rebag.close() 00060 00061 if __name__ == '__main__': 00062 import sys 00063 if len(sys.argv) == 4: 00064 fixbags(sys.argv[1], sys.argv[2], sys.argv[3]) 00065 else: 00066 print('usage: fix_moved_messages.py <name_md5_file> <inbag> <outbag>') 00067 exit(2)