Batch rosbag record from python
I'm trying to batch process bagfiles using rosbag from within python.
My process is - use multiprocess to open two processes - one that calls the roslaunch I want to record output from, and one that calls rosbag record multiple times to capture different sections of the output.
However, this does not work because I can't seem to kill rosbag record nicely from python.
Here's the minimal code to show an example of what I'm trying to do:
#!/usr/bin/env python from rosbag import rosbag_main from multiprocessing import Process import time import sys import os import signal import rospy if __name__ == "__main__": #if no roscore is initialized, start one if not rospy.core.is_initialized(): print "No rosmaster found, " roscore = Process(target = os.system, args = ["roscore"]) roscore.start() time.sleep(1) num_run = 0 roslaunch = Process(target = os.system, args = ["roslaunch testing_scripts elapsed_time.launch"]) roslaunch.start() while num_run<3: start_bag_time = time.time() print "Starting on "+str(num_run) write = Process(target = rosbag_main.record_cmd, args = [['-a']]) #start the rosbag record process write.start() while time.time()-start_bag_time<5: time.sleep(0.01) while write.is_alive(): time.sleep(5) os.kill(int(write.pid),signal.SIGKILL) print("waiting for write to die") print("killed write") rospy.logwarn("done with "+str(num_run)) num_run += 1 #kill the roslaunch process if roslaunch.is_alive(): roslaunch.terminate() print "killing publisher" #kill the roscore process, if you started it if roscore.is_alive(): roscore.terminate() print "killing roscore"
elapsed_launch.launch just publishes a string message containing the elapsed time since the node was initiated once every 100 ms.
I would expect that this script would create three bag files, one for each 5 second chunk in the total operation time of the script.
However, I can't seem to kill the rosbag record process nicely. I've tried SIGINT, it doesn't kill the node. SIGKILL allows the script to continue, however, this does not actually kill the node. At the end of the script, if I look at my processes, I have:
cholloway@nb-cholloway:~/workspace/blackwidow$ ps aux | grep record chollow+ 4931 0.4 0.0 1306408 11576 pts/3 Sl 17:04 0:00 /opt/ros/indigo/lib/rosbag/record --buffsize 256 --chunksize 768 --all chollow+ 5026 0.3 0.0 1306408 11332 pts/3 Sl 17:04 0:00 /opt/ros/indigo/lib/rosbag/record --buffsize 256 --chunksize 768 --all chollow+ 5188 0.3 0.0 1306408 11428 pts/3 Sl 17:05 0:00 /opt/ros/indigo/lib/rosbag/record --buffsize 256 --chunksize 768 --all
How can I nicely kill rosbag record? Is there an easier way to achieve this batch processing of rosbags?