data_saver.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import sys
3 import os
4 import argparse
5 import datetime
6 from pathlib import Path
7 import time
8 
9 import rospy
10 from sensor_msgs.msg import Image
11 from geometry_msgs.msg import Twist
12 import cv2
13 import cv_bridge
14 
15 class DataSaver:
16  def __init__(self, duration, camera_topic, vel_topic, output_dir):
17  self.duration = duration
18 
19  self.bridge = cv_bridge.CvBridge()
20 
21  self.ready = False
22  self.end_time = 0
23 
24  rospy.loginfo("Making directory for saved images (if it doesn't exist).")
25 
26  if output_dir[0] != "/":
27  self.path = os.path.join(Path.home(), output_dir)
28  else:
29  self.path = output_dir
30 
31  Path(self.path).mkdir(parents=True, exist_ok=True)
32 
33  date = datetime.datetime.now()
34  #self.img_dir = output_dir + "/"
35  self.img_base_name = "%s%s%s%s%s-img" % (
36  date.day,
37  date.month,
38  date.year,
39  date.hour,
40  date.minute,
41  )
42 
43  rospy.loginfo("Opening label file (creating if doesn't exist).")
44  self.label_file = open(os.path.join(self.path, "labels.txt"), "a+")
45 
46  self.counter = 0
47 
48  self.video_sub = rospy.Subscriber(camera_topic, Image, self.data_callback)
49  self.vel_sub = rospy.Subscriber(vel_topic, Twist, self.vel_callback)
50 
51  def data_callback(self, data: Image):
52  if not self.ready:
53  rospy.loginfo("Wating for twist msg.")
54  return
55 
56  if self.end_time <= time.monotonic():
57  rospy.loginfo("Saved enough data. Finishing node.")
58  self.label_file.close()
59  rospy.signal_shutdown("Saved enough data. Finishing node.")
60 
61  if self.label != (0.0, 0.0):
62  cv_img = self.bridge.imgmsg_to_cv2(data, desired_encoding="bgr8")
63  img_name = self.img_base_name + str(self.counter) + ".jpg"
64 
65  cv2.imwrite(
66  filename=os.path.join(self.path, img_name),
67  img=cv_img,
68  params=[cv2.IMWRITE_JPEG_QUALITY, 100],
69  )
70  self.label_file.write("{}:{}\n".format(img_name, self.label))
71  self.counter += 1
72 
73  def vel_callback(self, data: Twist):
74  if not self.ready:
75  self.ready = True
76  self.end_time = time.monotonic() + self.duration
77  self.label = (round(data.linear.x, 2), round(data.angular.z, 2))
78 
79 
80 def add_arguments(parser: argparse.ArgumentParser):
81  parser.add_argument(
82  "duration",
83  default=20.0,
84  type=float,
85  nargs="?",
86  metavar="N",
87  help="duration of recording the data",
88  )
89  parser.add_argument(
90  "-c",
91  "--cam",
92  default="camera/image_raw",
93  type=str,
94  required=False,
95  dest="camera_topic",
96  help="name of the topic with view from robot",
97  )
98  parser.add_argument(
99  "-V",
100  "--vel",
101  default="cmd_vel",
102  type=str,
103  required=False,
104  nargs="?",
105  dest="vel_topic",
106  help="name of the velocity topic",
107  )
108  parser.add_argument(
109  "-o",
110  "--output",
111  default="data",
112  type=str,
113  required=False,
114  nargs="?",
115  dest="output_dir",
116  help="name of an output directory for saved images",
117  )
118 
119 
120 if __name__ == "__main__":
121  rospy.init_node("data_saver")
122 
123  parser = argparse.ArgumentParser(description="Record video from rover as images.")
124  add_arguments(parser)
125 
126  rosargv = rospy.myargv(argv=sys.argv)
127  args = parser.parse_args(rosargv[1:])
128 
129  saver = DataSaver(args.duration, args.camera_topic, args.vel_topic, args.output_dir)
130  rospy.spin()
data_saver.DataSaver.end_time
end_time
Definition: data_saver.py:22
data_saver.DataSaver.vel_sub
vel_sub
Definition: data_saver.py:49
data_saver.DataSaver.duration
duration
Definition: data_saver.py:17
data_saver.DataSaver.__init__
def __init__(self, duration, camera_topic, vel_topic, output_dir)
Definition: data_saver.py:16
data_saver.DataSaver.label
label
Definition: data_saver.py:77
data_saver.add_arguments
def add_arguments(argparse.ArgumentParser parser)
Definition: data_saver.py:80
data_saver.DataSaver.label_file
label_file
Definition: data_saver.py:44
data_saver.DataSaver.counter
counter
Definition: data_saver.py:46
data_saver.DataSaver.ready
ready
Definition: data_saver.py:21
data_saver.DataSaver
Definition: data_saver.py:15
data_saver.DataSaver.data_callback
def data_callback(self, Image data)
Definition: data_saver.py:51
data_saver.DataSaver.img_base_name
img_base_name
Definition: data_saver.py:35
data_saver.DataSaver.path
path
Definition: data_saver.py:27
data_saver.DataSaver.vel_callback
def vel_callback(self, Twist data)
Definition: data_saver.py:73
data_saver.DataSaver.bridge
bridge
Definition: data_saver.py:19
data_saver.DataSaver.video_sub
video_sub
Definition: data_saver.py:48


leo_example_line_follower
Author(s): Aleksander SzymaƄski
autogenerated on Fri Nov 25 2022 03:11:50