def look_at(log, output, anti_instagram, line_detector, image_prep, lane_filter, all_details): filename = get_local_bag_file(log) bag = rosbag.Bag(filename) vehicle_name = dtu.which_robot(bag) dtu.logger.info('Vehicle name: %s' % vehicle_name) gp = GroundProjection(vehicle_name) topic = dtu.get_image_topic(bag) res = dtu.d8n_read_all_images_from_bag(bag, topic, max_images=1) image_cv = res[0]['rgb'] # dtu.logger.debug(dtu.describe_value(image_cv)) image_cv_bgr = dtu.bgr_from_rgb(image_cv) dtu.DuckietownConstants.show_timeit_benchmarks = True res, _stats = run_pipeline(image_cv_bgr, gp=gp, anti_instagram_name=anti_instagram, line_detector_name=line_detector, image_prep_name=image_prep, lane_filter_name=lane_filter, all_details=all_details) res = dtu.resize_small_images(res) dtu.write_bgr_images_as_jpgs(res, output)
def show_info(self, logs): for id_log, log in list(logs.items()): try: filename = get_local_bag_file(log) print(filename) except NotAvailableLocally: dtu.logger.error(f"No local file for {id_log}")
def process_one_processor(processor_name_or_spec, prefix_in, prefix_out, bag_filename, next_bag_filename, t0_absolute, t1_absolute, log): dtu.DuckietownConstants.show_timeit_benchmarks = True easy_algo_db = get_easy_algo_db() processor = easy_algo_db.create_instance(ProcessorInterface.FAMILY, processor_name_or_spec) dtu.logger.info('in: bag_filename: %s' % bag_filename) if not os.path.exists(bag_filename): msg = 'File does not exist: %s' % bag_filename raise ValueError(msg) dtu.logger.info('out: next_bag_filename: %s' % next_bag_filename) dtu.logger.info('t0_absolute: %s' % t0_absolute) dtu.logger.info('t1_absolute: %s' % t1_absolute) log = download_if_necessary(log) filename = get_local_bag_file(log) original_bag = rosbag.Bag(filename) bag_absolute_t0_ref = original_bag.get_start_time() original_bag.close() dtu.d8n_make_sure_dir_exists(next_bag_filename) out_bag = rosbag.Bag(next_bag_filename, 'w') bag0 = rosbag.Bag(bag_filename) t0_rel = t0_absolute - bag0.get_start_time() t1_rel = t1_absolute - bag0.get_start_time() in_bag = dtu.BagReadProxy(bag0, t0_rel, t1_rel, bag_absolute_t0_ref=bag_absolute_t0_ref) utils = ProcessorUtils(bag_out=out_bag, log=log) processor.process_log(in_bag, prefix_in, out_bag, prefix_out, utils) in_bag.close() # also copy the other messages in_bag1 = rosbag.Bag(bag_filename) for topic, msg, t in in_bag1.read_messages(raw=True): out_bag.write(topic, msg, t, raw=True) in_bag1.close() out_bag.close() # r = rosbag.Bag(next_bag_filename) # for topic, msg, t in r.read_messages(raw=True): # pass # r.close() # cmd = ['rosbag', 'fix', next_bag_filename, next_bag_filename] # dtu.system_cmd_result(cwd='.', cmd=cmd, raise_on_error=True, display_stdout=True, # display_stderr=True) # cmd = ['rosbag', 'reindex', next_bag_filename] # dtu.system_cmd_result(cwd='.', cmd=cmd, raise_on_error=True, display_stdout=True, # display_stderr=True) return next_bag_filename
def get_logs_description_table(logs, color=True): table = [] table.append([ "#", "Log name", "rc", "description", "bag size", "hash bag", "date", "length", "vehicle name", "filename", "valid", "topics", ]) for i, (_, log) in enumerate(logs.items()): row = [] row.append(i) row.append(log.log_name) row.append(len(log.resources)) # row.append(log.map_name) row.append(log.description) dtr = DTR.from_yaml(log.resources["bag"]) bag_size_mb = f"{dtr.size / (1024.0 * 1024):8.1f} MB" row.append(bag_size_mb) row.append(f"{dtr.name} {bag_size_mb} \n{dtr.hash['sha1']}") row.append(log.date) if log.length is not None: l = f"{log.length:5.1f} s" else: l = "(none)" row.append(l) row.append(log.vehicle) try: filename = get_local_bag_file(log) row.append(dtu.friendly_path(filename)) except NotAvailableLocally: row.append("not local") if log.valid: sr = "Yes." else: sr = log.error_if_invalid row.append(sr) if log.bag_info is not None: info = yaml.dump(log.bag_info["topics"]) else: info = "(none)" if color and not log.valid: row = dtu.make_row_red(row) row.append(info) table.append(row) return table
def jobs_videos(context, log, name, outd, only_camera): filename = get_local_bag_file(log) bag = rosbag.Bag(filename) main_camera_topic = dbu.get_image_topic(bag) min_messages = 5 # need at least 5 frames to make a video topics = [ _ for _, __ in dbu.d8n_get_all_images_topic_bag( bag, min_messages=min_messages) ] bag.close() only_camera_fn = outd + "-video.mp4" for topic in topics: stop_at = min_messages + 2 actual_count, count, _stopped_early = dbu.count_messages_in_slice( filename, topic, log.t0, log.t1, stop_at=stop_at) assert count >= min_messages if actual_count < min_messages: msg = f"There are only {actual_count} (out of {count}) in the slice [{log.t0}, {log.t1}]" msg += f"\n topic: {topic}" continue d = topic.replace("/", "_") if d.startswith("_"): d = d[1:] if only_camera: if topic != main_camera_topic: continue out = only_camera_fn j = context.comp( dbu.d8n_make_video_from_bag, filename, topic, out, t0=log.t0, t1=log.t1, job_id=f"{name}-{topic}", ) else: out = os.path.join(outd, name + "-" + d + ".mp4") j = context.comp(dbu.d8n_make_video_from_bag, filename, topic, out, job_id=f"{name}-{topic}") # create link if topic == main_camera_topic: context.comp(link, j, out, only_camera_fn)
def jobs_videos(context, log, name, outd, only_camera): filename = get_local_bag_file(log) bag = rosbag.Bag(filename) main_camera_topic = dtu.get_image_topic(bag) min_messages = 5 # need at least 5 frames to make a video topics = [ _ for _, __ in dtu.d8n_get_all_images_topic_bag( bag, min_messages=min_messages) ] bag.close() only_camera_fn = outd + '-video.mp4' for topic in topics: stop_at = min_messages + 2 actual_count, count, _stopped_early = \ count_messages_in_slice(filename, topic, log.t0, log.t1, stop_at=stop_at) assert count >= min_messages if actual_count < min_messages: msg = 'There are only %d (out of %d) in the slice [%s, %s]' % ( actual_count, count, log.t0, log.t1) msg += '\n topic: %s' % topic continue d = topic.replace('/', '_') if d.startswith('_'): d = d[1:] if only_camera: if topic != main_camera_topic: continue out = only_camera_fn j = context.comp(dtu.d8n_make_video_from_bag, filename, topic, out, t0=log.t0, t1=log.t1, job_id='%s-%s' % (name, topic)) else: out = os.path.join(outd, name + '-' + d + '.mp4') j = context.comp(dtu.d8n_make_video_from_bag, filename, topic, out, job_id='%s-%s' % (name, topic)) # create link if topic == main_camera_topic: context.comp(link, j, out, only_camera_fn)
def get_logs_description_table(logs, color=True): table = [] table.append([ '#', 'Log name', 'rc', 'description', 'bag size', 'hash bag', 'date', 'length', 'vehicle name', 'filename', 'valid', 'topics' ]) for i, (_, log) in enumerate(logs.items()): row = [] row.append(i) row.append(log.log_name) row.append(len(log.resources)) # row.append(log.map_name) row.append(log.description) dtr = DTR.from_yaml(log.resources['bag']) bag_size_mb = '%8.1f MB' % (dtr.size / (1024.0 * 1024)) row.append(bag_size_mb) row.append('%s %s \n%s' % (dtr.name, bag_size_mb, dtr.hash['sha1'])) row.append(log.date) if log.length is not None: l = '%5.1f s' % log.length else: l = '(none)' row.append(l) row.append(log.vehicle) try: filename = get_local_bag_file(log) row.append(dtu.friendly_path(filename)) except NotAvailableLocally: row.append('not local') if log.valid: sr = 'Yes.' else: sr = log.error_if_invalid row.append(sr) if log.bag_info is not None: info = yaml.dump(log.bag_info['topics']) else: info = '(none)' if color and not log.valid: row = dtu.make_row_red(row) row.append(info) table.append(row) return table
def look_at( log, output: str, anti_instagram: str, line_detector: str, image_prep: str, lane_filter: str, all_details: bool, ) -> None: filename = get_local_bag_file(log) bag = rosbag.Bag(filename) vehicle_name = dbu.which_robot(bag) dtu.logger.info(f"Vehicle name: {vehicle_name}") brp = dbu.BagReadProxy(bag) rcg = get_robot_camera_geometry_from_log(brp) topic = dbu.get_image_topic(bag) res = dbu.d8n_read_all_images_from_bag(bag, topic, max_images=1) image_cv = res[0]["rgb"] # dtu.logger.debug(dtu.describe_value(image_cv)) image_cv_bgr = dtu.bgr_from_rgb(image_cv) dtu.DuckietownConstants.show_timeit_benchmarks = True res, _stats = run_pipeline( image_cv_bgr, gpg=rcg.gpg, rectifier=rcg.rectifier, anti_instagram_name=anti_instagram, line_detector_name=line_detector, image_prep_name=image_prep, lane_filter_name=lane_filter, all_details=all_details, ) res = dtu.resize_small_images(res) dtu.write_bgr_images_as_jpgs(res, output)
def go(self): extra = self.options.get_extra() if not extra: query = "*" else: if len(extra) > 1: msg = "Expected only one extra argument." raise dtu.DTUserError(msg) query = extra[0] db = self.get_easy_logs_db() logs = db.query(query) self.info(f"Found {len(logs)} logs.") outdir = self.options["outdir"] if outdir is None: outdir = "." msg = 'Option "--outdir" not passed. Will copy to current directory.' self.warn(msg) if not os.path.exists(outdir): dtu.mkdirs_thread_safe(outdir) for id_log, log in list(logs.items()): log = download_if_necessary(log) out = os.path.join(outdir, id_log + ".bag") if os.path.exists(out): print(out) continue try: filename = get_local_bag_file(log) shutil.copy(filename, out) print(out) except NotAvailableLocally: dtu.logger.error(f"No local file for {id_log}")
def work(log, outd, max_images, only_camera, write_frames): filename = get_local_bag_file(log) t0 = log.t0 t1 = log.t1 MIN_HEIGHT = 480 # noinspection PyUnboundLocalVariable bag = rosbag.Bag(filename) main = dtu.get_image_topic(bag) topics = [_ for _, __ in dtu.d8n_get_all_images_topic_bag(bag)] bag.close() dtu.logger.debug('%s - topics: %s' % (filename, topics)) for topic in topics: if only_camera and topic != main: continue try: bag = rosbag.Bag(filename) except: msg = 'Cannot read Bag file %s' % filename dtu.logger.error(msg) raise bag_proxy = dtu.BagReadProxy(bag, t0, t1) res = dtu.d8n_read_all_images_from_bag(bag_proxy, topic, max_images=max_images, use_relative_time=True) bag.close() d = topic.replace('/', '_') if d.startswith('_'): d = d[1:] d0 = os.path.join(outd, d) images_with_label = [] for i in range(len(res)): rgb = res[i]['rgb'] H, _W = rgb.shape[:2] if H < MIN_HEIGHT: zoom = int(np.ceil(MIN_HEIGHT / H)) rgb = dtu.zoom_image(rgb, zoom) timestamp = res[i]['timestamp'] s = 't = %.2f' % (timestamp - t0) with_label = dtu.add_header_to_rgb(rgb, s) images_with_label.append(with_label) if write_frames: for i, rgb in enumerate(images_with_label): rgb = res[i]['rgb'] fn = os.path.join(d0, ('image-%05d' % i) + '.jpg') dtu.write_bgr_as_jpg(dtu.bgr_from_rgb(rgb), fn) grid = dtu.make_images_grid( images_with_label, pad=4, bgcolor=dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW) s = log.log_name grid = dtu.add_header_to_rgb(grid, s, max_height=32) if (topic != main) or len(topics) > 1: fn = d0 + '.jpg' dtu.write_rgb_as_jpg(grid, fn) if topic == main: fn = outd + '.thumbnails.jpg' dtu.write_rgb_as_jpg(grid, fn)