Ask Your Question
0

Split ROSbag to two

asked 2018-05-01 15:19:27 -0600

ecidon gravatar image

Hi All,

I am using rosindigo on two computers. I am using a ROS bag which includes sensor data from a robot (it's the Cartographer Deutsches museum 2D dataset) used to build a map. I would like to split the bag such that I will be able to run it as if it's collected from two robots, so lets say if the bag is 2000sec long the I would like to split it to two 1000sec bags and treat it as if both halves where collected at the same time by two different robots. Would I be able to do this using rosbag filter? If so how? Would I need to fix time-stamping in the rosbag?

I am a relatively new user so would be happy for pointers...

Thanks

edit retag flag offensive close merge delete

Comments

Split it as in first half and second half w.r.t time?

robotchicken gravatar imagerobotchicken ( 2018-05-01 16:01:36 -0600 )edit

The first half time, so lets say the whole bag runs form 0-2000sec and we have a message each second I would like to have sec 1: message 1 from first half + message 1 from second half sec 2: message 2 from first half + message 2 from second half

ecidon gravatar imageecidon ( 2018-05-01 16:06:29 -0600 )edit
lucasw gravatar imagelucasw ( 2018-05-01 16:43:36 -0600 )edit

Since the messages have to be played simultaneously, the messages would have to be time stamped accordingly. So I am guessing #q99711 wouldn't apply.

Either way, please mark the question as resolved based on the answer that worked.

robotchicken gravatar imagerobotchicken ( 2018-05-02 14:27:55 -0600 )edit

Thanks, marked as resolved

ecidon gravatar imageecidon ( 2018-05-02 15:13:32 -0600 )edit

2 Answers

Sort by ยป oldest newest most voted
0

answered 2018-05-02 08:30:44 -0600

Clemens gravatar image

I think you should use this solution: How to split a recorded rosbag file ?

edit flag offensive delete link more

Comments

Sorry for the late reply, this worked for my situation

ecidon gravatar imageecidon ( 2018-05-02 15:13:08 -0600 )edit
0

answered 2018-05-01 16:34:23 -0600

robotchicken gravatar image

updated 2018-05-01 16:36:35 -0600

I think you can write the messages into different topics at the same time, in one bag. (Ref 1, Ref 2)

import rosbag
import rospy
from sensor_msgs.msg import LaserScan
from math import floor

# Bag Names
old_bag_name = 'old_bag.bag'        
new_bag_name = 'new_bag.bag'

# List of topic names in the bag(have one topic that is of type LaserScan)
topics = ['scan_topic']

# List of New Topic Names
new_topics = ['new_scan_topic_1', 'new_scan_topic_2']     

# Open Bags for writing and reading
old_bag = rosbag.Bag(old_bag_name)
new_bag = rosbag.Bag(new_bag_name, 'w')

# Array to store Messages in chronological order
scan_array = []

# Read Bag and append messages from topics accordingly
for topic, msg, t in old_bag.read_messages(topics=topics):
    # Based on the topic name, read into an array(has only one topic right now)
    if(topic == "scan_topic"):
        scan_array.append(msg)
bag.close()


# Write message into new bag for each topic, while updating the time stamp
t = 0
half_time = floor(len(scan_array/2))
while t < half_time:

    # Update Time for required messages
    current_time = rospy.Time.now()
    scan_array[t].header.stamp = current_time
    scan_array[time_offest+t].header.stamp = current_time

    # Write messages onto bag for the current_time
    new_bag.write(new_topics[0], scan_array[t], current_time)
    new_bag.write(new_topics[1], scan_array[time_offest+t], current_time)
    t = t + 1
edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

Stats

Asked: 2018-05-01 15:19:27 -0600

Seen: 516 times

Last updated: May 02 '18