def __init__(self, mpstate): super(CUAVCompanionModule, self).__init__(mpstate, "CUAV", "CUAV companion") self.led_state = LED_OFF self.led_force = None self.led_send_time = 0 self.button_change_time = 0 self.last_attitude_ms = 0 self.last_mission_check_ms = 0 self.last_wp_move_ms = 0 self.add_command('cuavled', self.cmd_cuavled, "cuav led command", ['<red|green|flash|off|refresh>']) from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.cuav_settings = MPSettings([ MPSetting('wp_center', int, 2, 'center search USER number'), MPSetting('wp_start', int, 1, 'start search USER number'), MPSetting('wp_end', int, 3, 'end search USER number'), MPSetting('wp_land', int, 4, 'landing start USER number'), MPSetting('auto_mission', bool, True, 'enable auto mission code') ]) self.add_command('cuav', self.cmd_cuav, 'cuav companion control', ['set (CUAVSETTING)']) self.add_completion_function('(CUAVSETTING)', self.cuav_settings.completion) self.wp_move_count = 0 self.last_lz_latlon = None self.last_wp_list_ms = 0 self.started_landing = False self.updated_waypoints = False self.last_buzzer = time.time()
def __init__(self, mpstate): super(DGPSModule, self).__init__(mpstate, "DGPS", "DGPS injection support for SBP/RTCP/UBC") self.dgps_settings = mp_settings.MPSettings([ MPSetting('type', str, 'udp_host', 'DGPS connection type', choice=['udp_host', 'udp_client', 'tcp_client']), MPSetting('port', int, 13320, 'DGPS connection port', range=(0, 65535), increment=1), MPSetting('host', str, '127.0.0.1', 'DGPS connection host'), MPSetting('sendalllinks', bool, False, 'Send RTCM messages on all links'), ]) self.add_command( 'DGPS', self.cmd_dgps, 'DGPS control', ["<status>", "<start>", "<stop>", "set (DGPSSETTING)"]) self.add_completion_function('(DGPSSETTING)', self.dgps_settings.completion) self.dgps_settings.set_callback(self.settings_changed) self.port = None self.reset_stats() self.connect_dgps()
def __init__(self, mpstate): super(CUAVModule, self).__init__(mpstate, "CUAV", "CUAV checks") self.console.set_status('RPM', 'RPM: --', row=8, fg='black') self.console.set_status('RFind', 'RFind: --', row=8, fg='black') self.console.set_status('Button', 'Button: --', row=8, fg='black') self.console.set_status('ICE', 'ICE: --', row=8, fg='black') self.rate_period = mavutil.periodic_event(1.0/15) self.button_remaining = None self.button_change = None self.last_button_update = time.time() self.last_target_update = time.time() self.button_change_recv_time = 0 self.button_announce_time = 0 self.last_rpm_update = 0 self.last_rpm_value = None self.last_rpm_announce = 0 self.showLandingZone = 0 self.showJoeZone = True self.target = None from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.cuav_settings = MPSettings( [ MPSetting('rpm_threshold', int, 6000, 'RPM Threshold'), MPSetting('wind_speed', float, 0, 'wind speed (m/s)'), MPSetting('wind_direction', float, 0, 'wind direction (degrees)') ]) self.add_completion_function('(CUAVCHECKSETTING)', self.cuav_settings.completion) self.add_command('cuavcheck', self.cmd_cuavcheck, 'cuav check control', ['set (CUAVCHECKSETTING)']) #make the initial map menu if mp_util.has_wxpython: self.menu = MPMenuSubMenu('UAV Challenge', items=[MPMenuCheckbox('Show Landing Zone', 'Show Landing Zone', '# cuavcheck toggleLandingZone'), MPMenuCheckbox('Show Joe Zone', 'Show Joe Zone', '# cuavcheck toggleJoeZone')]) self.module('map').add_menu(self.menu)
def __init__(self, mpstate): super(BatteryModule, self).__init__(mpstate, "battery", "battery commands") self.add_command('bat', self.cmd_bat, "show battery information") self.last_battery_announce = 0 self.last_battery_announce_time = 0 self.last_battery_cell_announce_time = 0 self.battery_level = -1 self.voltage_level = -1 self.current_battery = -1 self.battery2_voltage = -1 self.per_cell = 0 self.servo_voltage = -1 self.high_servo_voltage = -1 self.last_servo_warn_time = 0 self.last_vcc_warn_time = 0 self.settings.append( MPSetting('battwarn', int, 1, 'Battery Warning Time', tab='Battery')) self.settings.append( MPSetting('batwarncell', float, 3.7, 'Battery cell Warning level')) self.settings.append( MPSetting('servowarn', float, 4.3, 'Servo voltage warning level')) self.settings.append( MPSetting('vccwarn', float, 4.3, 'Vcc voltage warning level')) self.settings.append( MPSetting('numcells', int, 0, range=(0, 10), increment=1)) self.battery_period = mavutil.periodic_event(5)
def __init__(self, mpstate): super(CMACModule, self).__init__(mpstate, "CMAC", "CMAC Checks", public=True) self.rate_period = mavutil.periodic_event(1.0 / 15) self.is_armed = False self.done_map_menu = False from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.cmac_settings = MPSettings([ MPSetting('fence_maxdist', float, 1000, 'Max FencePoint Distance from south-CMAC'), MPSetting('wp_maxdist', float, 500, 'Max WayPoint Distance from south-CMAC'), MPSetting('rally_maxdist', float, 200, 'Max Rally Distance from south-CMAC'), ]) self.add_completion_function('(CMACCHECKSETTING)', self.cmac_settings.completion) self.add_command('cmaccheck', self.cmd_cmaccheck, 'cmac check control', ['check', 'set (CMACCHECKSETTING)']) self.last_fence_fetch = 0 self.last_mission_fetch = 0 self.last_rally_fetch = 0 self.done_heartbeat_check = 0 self.check()
def __init__(self, mpstate): super(CameraGroundModule, self).__init__(mpstate, "camera_ground", "cuav camera control (ground)", public=True, multi_vehicle=True) self.unload_event = threading.Event() self.unload_event.clear() self.transmit_queue = Queue.Queue() self.decoder = video_play.VideoReader() self.is_armed = False self.capture_count = 0 self.image = None self.last_capture_count = None self.handled_timestamps = {} self.viewer = mp_image.MPImage(title='Image', width=200, height=200, auto_size=True) from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.camera_settings = MPSettings([ MPSetting('m_bandwidth', int, 500, 'max bandwidth on mavlink', increment=1, tab='GCS'), MPSetting('m_maxqueue', int, 5, 'Maximum images queue for mavlink', tab='GCS'), ], title='Camera Settings') self.msocket = None self.msend = None self.last_heartbeat = time.time() self.transmit_thread = self.start_thread(self.transmit_threadfunc) self.add_command('camera', self.cmd_camera, 'camera control', ['<status>', 'set (CAMERASETTING)']) self.add_completion_function('(CAMERASETTING)', self.camera_settings.completion) # prevent loopback of messages for mtype in ['DATA16', 'DATA32', 'DATA64', 'DATA96']: self.module('link').no_fwd_types.add(mtype) print("camera ground initialised")
def __init__(self): self.input_queue = multiproc.Queue() self.rl = None self.console = wxconsole.MessageConsole( title='MAVExplorer', ico=icon.SimpleIcon("EXPLORER")) self.exit = False self.status = MEStatus() self.settings = MPSettings([ MPSetting('marker', str, '+', 'data marker', tab='Graph'), MPSetting('condition', str, None, 'condition'), MPSetting('xaxis', str, None, 'xaxis'), MPSetting('linestyle', str, None, 'linestyle'), MPSetting('show_flightmode', bool, True, 'show flightmode'), MPSetting('sync_xzoom', bool, True, 'sync X-axis zoom'), MPSetting('sync_xmap', bool, True, 'sync X-axis zoom for map'), MPSetting('legend', str, 'upper left', 'legend position'), MPSetting('legend2', str, 'upper right', 'legend2 position'), MPSetting('title', str, None, 'Graph title'), ]) self.mlog = None self.filename = None self.command_map = command_map self.completions = { "set": ["(SETTING)"], "condition": ["(VARIABLE)"], "graph": [ '(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)' ], "map": ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'] } self.aliases = {} self.graphs = [] self.flightmode_selections = [] self.last_graph = GraphDefinition(self.settings.title, '', '', [], None) #pipe to the wxconsole for any child threads (such as the save dialog box) self.parent_pipe_recv_console, self.child_pipe_send_console = multiproc.Pipe( duplex=False) #pipe for creating graphs (such as from the save dialog box) self.parent_pipe_recv_graph, self.child_pipe_send_graph = multiproc.Pipe( duplex=False) tConsoleWrite = threading.Thread(target=self.pipeRecvConsole) tConsoleWrite.daemon = True tConsoleWrite.start() tGraphWrite = threading.Thread(target=self.pipeRecvGraph) tGraphWrite.daemon = True tGraphWrite.start()
def __init__(self, mpstate): super(SensorsModule, self).__init__(mpstate, "sensors", "monitor sensor consistancy") self.add_command('sensors', self.cmd_sensors, "show key sensors") self.add_command('speed', self.cmd_speed, "enable/disable speed report") self.last_report = 0 self.ok = True self.value = 0 self.ground_alt = 0 self.gps_alt = 0 self.max_speed = 0 self.last_watch = 0 self.reports = {} self.reports['heading'] = sensors_report() self.reports['altitude'] = sensors_report() self.reports['speed'] = sensors_report() from MAVProxy.modules.lib.mp_settings import MPSetting self.settings.append( MPSetting('speedreporting', bool, False, 'Speed Reporting', tab='Sensors')) if 'GPS_RAW_INT' in self.status.msgs: # cope with reload gps = mpstate.status.msgs['GPS_RAW_INT'] self.ground_alt = (gps.alt / 1.0e3) - self.status.altitude
def __init__(self): self.input_queue = Queue.Queue() self.rl = None self.console = wxconsole.MessageConsole(title='MAVExplorer') self.exit = False self.status = MEStatus() self.settings = MPSettings( [ MPSetting('marker', str, '+', 'data marker', tab='Graph'), MPSetting('condition', str, None, 'condition'), MPSetting('xaxis', str, None, 'xaxis'), MPSetting('linestyle', str, None, 'linestyle'), MPSetting('show_flightmode', bool, True, 'show flightmode'), MPSetting('legend', str, 'upper left', 'legend position'), MPSetting('legend2', str, 'upper right', 'legend2 position') ] ) self.mlog = None self.command_map = command_map self.completions = { "set" : ["(SETTING)"], "condition" : ["(VARIABLE)"], "graph" : ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'], "map" : ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'] } self.aliases = {} self.graphs = [] self.flightmode_selections = [] self.last_graph = GraphDefinition('Untitled', '', '', [], None)
def __init__(self): self.message_count = {} self.message_field_count = {} self.arrays = dict() self.plot_processes = [] self.send_queues = [] self.recv_queues = [] self.master_rect = None self.flightmode_list = [] self.input_queue = Queue.Queue() self.rl = None #self.console = wxconsole.MessageConsole(title='MAVHawkview') self.exit = False self.websocket_enabled = None self.log_max_timestamp = None self.log_min_timestamp = None self.status = MEStatus() self.settings = MPSettings( [ MPSetting('marker', str, '+', 'data marker', tab='Graph'), MPSetting('condition', str, None, 'condition'), MPSetting('xaxis', str, None, 'xaxis'), MPSetting('linestyle', str, None, 'linestyle'), MPSetting('flightmode', str, None, 'flightmode', choice=['apm','px4']), MPSetting('legend', str, 'upper left', 'legend position'), MPSetting('legend2', str, 'upper right', 'legend2 position'), MPSetting('grid', str, 'off', 'grid', choice=['on','off']) ] ) self.mlog = None # self.command_map = command_map self.completions = { "set" : ["(SETTING)"], "condition" : ["(VARIABLE)"], "graph" : ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'], "map" : ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'] } self.aliases = {} self.graphs = [] self.flightmode_selections = []
key_events=True, can_zoom=True, can_drag=True) menu = MPMenuTop([]) view_menu = MPMenuSubMenu('View', [ MPMenuItem('Next Image\tCtrl+N', 'Next Image', 'nextImage'), MPMenuItem('Previous Image\tCtrl+P', 'Previous Image', 'previousImage') ]) menu.add(view_menu) view_image.set_menu(menu) settings = MPSettings([ MPSetting('threshold', int, 6100, 'High Threshold', tab='Settings', range=(0, 65535)), MPSetting('blue_threshold', float, 0.75, 'Blue Threshold', range=(0, 1)), MPSetting('green_threshold', float, 0.4, 'Green Threshold', range=(0, 1)) ]) changed = True def settings_callback(setting): '''called on a changed setting''' global changed changed = True
def process(folderfile): '''process a file''' file_index = 0 files = [] if os.path.isdir(folderfile): files = file_list(folderfile, ['jpg', 'jpeg', 'png']) else: files.append(folderfile) fname = files[file_index] settings = MPSettings([ MPSetting('MetersPerPixel', float, 0.2, range=(0, 10), increment=0.01, digits=2, tab='Image Processing'), MPSetting('MinRegionArea', float, 0.15, range=(0, 100), increment=0.05, digits=2), MPSetting('MaxRegionArea', float, 2.0, range=(0, 100), increment=0.1, digits=1), MPSetting('MinRegionSize', float, 0.1, range=(0, 100), increment=0.05, digits=2), MPSetting( 'MaxRegionSize', float, 2, range=(0, 100), increment=0.1, digits=1), MPSetting('MaxRarityPct', float, 0.02, range=(0, 100), increment=0.01, digits=2), MPSetting('RegionMergeSize', float, 3.0, range=(0, 100), increment=0.1, digits=1), MPSetting('minscore', int, 0, 'Min Score', range=(0, 1000), increment=1, tab='Scoring'), MPSetting( 'filter_type', str, 'simple', 'Filter Type', choice=['simple']), MPSetting('brightness', float, 1.0, 'Display Brightness', range=(0.1, 10), increment=0.1, digits=2, tab='Display') ], title='Settings') menu = MPMenuSubMenu( 'View', items=[ MPMenuItem('Original Image', 'Original Image', '_1original.pnm'), MPMenuItem('Unquantised Image', 'Unquantised Image', '_1unquantised.pnm'), MPMenuItem('Thresholded Image', 'Thresholded Image', '_2thresholded.pnm'), MPMenuItem('Neighbours Image', 'Neighbours Image', '_3neighbours.pnm'), MPMenuItem('Regions Image', 'Regions Image', '_4regions.pnm'), MPMenuItem('Prune Large Image', 'Prune Large Image', '_5prunelarge.pnm'), MPMenuItem('Merged Image', 'Merged Large', '_6merged.pnm'), MPMenuItem('Pruned Image', 'Pruned Image', '_7pruned.pnm'), MPMenuItem('Fit Window', 'Fit Window', 'fitWindow'), MPMenuItem('Full Zoom', 'Full Zoom', 'fullSize'), MPMenuItem('Next Image', 'Next Image', 'nextImage'), MPMenuItem('Previous Image', 'Previous Image', 'previousImage') ]) im_orig = cv2.imread(fname, -1) im_numpy = numpy.ascontiguousarray(im_orig) # create the various views view = mp_image.MPImage(title='FullImage', can_zoom=True, can_drag=True) view.set_popup_menu(menu) dlg = wxsettings.WXSettings(settings) selected_image = "_1original.pnm" while dlg.is_alive() and view.is_alive(): last_change = settings.last_change() scan_parms = { 'MinRegionArea': settings.MinRegionArea, 'MaxRegionArea': settings.MaxRegionArea, 'MinRegionSize': settings.MinRegionSize, 'MaxRegionSize': settings.MaxRegionSize, 'MaxRarityPct': settings.MaxRarityPct, 'RegionMergeSize': settings.RegionMergeSize, 'SaveIntermediate': 1.0, 'MetersPerPixel': settings.MetersPerPixel } t0 = time.time() regions = scanner.scan(im_numpy, scan_parms) regions = cuav_region.RegionsConvert(regions, cuav_util.image_shape(im_orig), cuav_util.image_shape(im_orig), False) t1 = time.time() print("Processing %s took %.2f seconds" % (fname, t1 - t0)) show_image(view, str(file_index + 1) + selected_image, im_orig, fname) while last_change == settings.last_change() and dlg.is_alive(): new_index = file_index for event in view.events(): if isinstance(event, MPMenuItem): if event.returnkey == 'nextImage': new_index = (file_index + 1) % len(files) elif event.returnkey == 'previousImage': new_index = (file_index - 1) % len(files) elif event.returnkey.endswith("pnm"): selected_image = event.returnkey show_image(view, str(file_index + 1) + selected_image, im_orig, fname) if new_index != file_index: file_index = new_index fname = files[file_index] im_orig = cv2.imread(fname, -1) im_numpy = numpy.ascontiguousarray(im_orig) break time.sleep(0.1) #remove all the pnm's directory = os.getcwd() lst = os.listdir(directory) for item in lst: if item.endswith(".pnm"): os.remove(os.path.join(directory, item))
def process(args): '''process a set of files''' global slipmap, mosaic scan_count = 0 files = [] if os.path.isdir(args.directory): files.extend(file_list(args.directory, ['jpg', 'pgm', 'png'])) else: if args.directory.find('*') != -1: files.extend(glob.glob(args.directory)) else: files.append(args.directory) files.sort() num_files = len(files) print("num_files=%u" % num_files) region_count = 0 slipmap = mp_slipmap.MPSlipMap(service=args.service, elevation=True, title='Map') icon = slipmap.icon('redplane.png') slipmap.add_object( mp_slipmap.SlipIcon('plane', (0, 0), icon, layer=3, rotation=0, follow=True, trail=mp_slipmap.SlipTrail())) for flag in args.flag: a = flag.split(',') lat = a[0] lon = a[1] icon = 'flag.png' if len(a) > 2: icon = a[2] + '.png' icon = slipmap.icon(icon) slipmap.add_object( mp_slipmap.SlipIcon('icon - %s' % str(flag), (float(lat), float(lon)), icon, layer=3, rotation=0, follow=False)) if args.mission: from pymavlink import mavwp wp = mavwp.MAVWPLoader() wp.load(args.mission.name) plist = wp.polygon_list() if len(plist) > 0: for i in range(len(plist)): slipmap.add_object( mp_slipmap.SlipPolygon('Mission-%s-%u' % (args.mission.name, i), plist[i], layer='Mission', linewidth=2, colour=(255, 255, 255))) if args.mavlog: mpos = mav_position.MavInterpolator() mpos.set_logfile(args.mavlog.name) else: mpos = None if args.gammalog is not None: gamma = parse_gamma_log(args.gammalog) else: gamma = None if args.kmzlog: kmzpos = mav_position.KmlPosition(args.kmzlog.name) else: kmzpos = None if args.triggerlog: triggerpos = mav_position.TriggerPosition(args.triggerlog.name) else: triggerpos = None # create a simple lens model using the focal length if args.camera_params: C_params = cam_params.CameraParams.fromfile(args.camera_params.name) else: C_params = cam_params.CameraParams(lens=args.lens, sensorwidth=args.sensorwidth, xresolution=args.xresolution, yresolution=args.yresolution) if args.target: target = args.target.split(',') else: target = [0, 0, 0] camera_settings = MPSettings([ MPSetting('roll_stabilised', bool, args.roll_stabilised, 'Roll Stabilised'), MPSetting('altitude', int, args.altitude, 'Altitude', range=(0, 10000), increment=1), MPSetting( 'minalt', int, 30, 'MinAltitude', range=(0, 10000), increment=1), MPSetting('mpp100', float, 0.0977, 'MPPat100m', range=(0, 10000), increment=0.001), MPSetting('rotate180', bool, args.rotate_180, 'rotate180'), MPSetting('filter_type', str, 'compactness', 'Filter Type', choice=['simple', 'compactness']), MPSetting('target_lattitude', float, float(target[0]), 'target latitude', increment=1.0e-7), MPSetting('target_longitude', float, float(target[1]), 'target longitude', increment=1.0e-7), MPSetting('target_radius', float, float(target[2]), 'target radius', increment=1), MPSetting('quality', int, 75, 'Compression Quality', range=(1, 100), increment=1), MPSetting('thumbsize', int, args.thumbsize, 'Thumbnail Size', range=(10, 200), increment=1), MPSetting('minscore', int, args.minscore, 'Min Score', range=(0, 1000), increment=1, tab='Scoring'), MPSetting('brightness', float, 1.0, 'Display Brightness', range=(0.1, 10), increment=0.1, digits=2, tab='Display'), ], title='Camera Settings') image_settings = MPSettings([ MPSetting('MinRegionArea', float, 0.05, range=(0, 100), increment=0.05, digits=2, tab='Image Processing'), MPSetting('MaxRegionArea', float, 4.0, range=(0, 100), increment=0.1, digits=1), MPSetting('MinRegionSize', float, 0.02, range=(0, 100), increment=0.05, digits=2), MPSetting('MaxRegionSize', float, 3.0, range=(0, 100), increment=0.1, digits=1), MPSetting('MaxRarityPct', float, 0.02, range=(0, 100), increment=0.01, digits=2), MPSetting('RegionMergeSize', float, 1.0, range=(0, 100), increment=0.1, digits=1), MPSetting('BlueEmphasis', bool, args.blue_emphasis), MPSetting('SaveIntermediate', bool, args.debug) ], title='Image Settings') mosaic = cuav_mosaic.Mosaic(slipmap, C=C_params, camera_settings=camera_settings, image_settings=image_settings, start_menu=True, classify=args.categories, thumb_size=args.mosaic_thumbsize) joelog = cuav_joe.JoeLog(None) if args.view: viewer = mp_image.MPImage(title='Image', can_zoom=True, can_drag=True) start_time = time.time() for f in files: if not mosaic.started(): print("Waiting for startup") if args.start: mosaic.has_started = True while not mosaic.started(): mosaic.check_events() time.sleep(0.01) if mpos: # get the position by interpolating telemetry data from the MAVLink log file # this assumes that the filename contains the timestamp if gamma is not None: frame_time = parse_gamma_time(f, gamma) else: frame_time = cuav_util.parse_frame_time(f) frame_time += args.time_offset if camera_settings.roll_stabilised: roll = 0 else: roll = None try: pos = mpos.position(frame_time, roll=roll) except Exception: print("No position available for %s" % frame_time) # skip this frame continue elif kmzpos is not None: pos = kmzpos.position(f) elif triggerpos is not None: pos = triggerpos.position(f) else: # get the position using EXIF data pos = mav_position.exif_position(f) pos.time += args.time_offset # update the plane icon on the map if pos is not None: slipmap.set_position('plane', (pos.lat, pos.lon), rotation=pos.yaw) if camera_settings.altitude > 0: pos.altitude = camera_settings.altitude # check for any events from the map slipmap.check_events() mosaic.check_events() im_orig = cuav_util.LoadImage(f, rotate180=camera_settings.rotate180) if im_orig is None: continue (w, h) = cuav_util.image_shape(im_orig) if False: im_640 = cv.CreateImage((640, 480), 8, 3) cv.Resize(im_full, im_640, cv.CV_INTER_NN) im_640 = numpy.ascontiguousarray(cv.GetMat(im_640)) im_full = im_orig im_full = numpy.ascontiguousarray(cv.GetMat(im_full)) count = 0 total_time = 0 t0 = time.time() img_scan = im_full scan_parms = {} for name in image_settings.list(): scan_parms[name] = image_settings.get(name) scan_parms['SaveIntermediate'] = float(scan_parms['SaveIntermediate']) scan_parms['BlueEmphasis'] = float(scan_parms['BlueEmphasis']) if pos is not None: (sw, sh) = cuav_util.image_shape(img_scan) altitude = pos.altitude if altitude < camera_settings.minalt: altitude = camera_settings.minalt scan_parms[ 'MetersPerPixel'] = camera_settings.mpp100 * altitude / 100.0 regions = scanner.scan(img_scan, scan_parms) else: regions = scanner.scan(img_scan) regions = cuav_region.RegionsConvert(regions, cuav_util.image_shape(img_scan), cuav_util.image_shape(im_full)) count += 1 t1 = time.time() frame_time = pos.time if pos: for r in regions: r.latlon = cuav_util.gps_position_from_image_region( r, pos, w, h, altitude=altitude, C=C_params) if camera_settings.target_radius > 0 and pos is not None: regions = cuav_region.filter_radius( regions, (camera_settings.target_lattitude, camera_settings.target_longitude), camera_settings.target_radius) regions = cuav_region.filter_regions( im_full, regions, frame_time=frame_time, min_score=camera_settings.minscore, filter_type=camera_settings.filter_type) scan_count += 1 if pos and len(regions) > 0: altitude = camera_settings.altitude if altitude <= 0: altitude = None joelog.add_regions(frame_time, regions, pos, f, width=w, height=h, altitude=altitude) mosaic.add_image(pos.time, f, pos) region_count += len(regions) if len(regions) > 0: composite = cuav_mosaic.CompositeThumbnail( cv.GetImage(cv.fromarray(im_full)), regions) thumbs = cuav_mosaic.ExtractThumbs(composite, len(regions)) mosaic.add_regions(regions, thumbs, f, pos) if args.view: img_view = img_scan (wview, hview) = cuav_util.image_shape(img_view) mat = cv.fromarray(img_view) for r in regions: r.draw_rectangle(mat, (255, 0, 0)) cv.CvtColor(mat, mat, cv.CV_BGR2RGB) viewer.set_image(mat) viewer.set_title('Image: ' + os.path.basename(f)) if args.saveview: cv.CvtColor(mat, mat, cv.CV_RGB2BGR) cv.SaveImage('view-' + os.path.basename(f), mat) total_time += (t1 - t0) if t1 != t0: print('%s scan %.1f fps %u regions [%u/%u]' % (os.path.basename(f), count / total_time, region_count, scan_count, num_files)) #raw_input("hit ENTER when ready") print("All images processed (%u seconds)" % (time.time() - start_time)) while True: # check for any events from the map slipmap.check_events() mosaic.check_events() time.sleep(0.2)
def __init__(self, mpstate): super(CameraGroundModule, self).__init__(mpstate, "camera_ground", "cuav camera control (ground)", public=True) self.unload_event = threading.Event() self.unload_event.clear() self.view_thread = None self.handled_timestamps = {} self.camera_settings = MPSettings([ MPSetting('air_address', str, "", 'Air Addresses in RemIP:RemPort:LocalPort:Bandwidth\ format (127.0.0.1:1440:1234:45, ...)', tab='GCS'), MPSetting('brightness', float, 1.0, 'Display Brightness', range=(0.1, 10), increment=0.1, digits=2, tab='Display'), MPSetting('debug', bool, False, 'debug enable'), MPSetting('camparms', str, None, 'camera parameters file (json) in cuav package'), MPSetting('mosaic_thumbsize', int, 35, 'Mosaic Thumbnail Size', range=(10, 200), increment=1), MPSetting('maxqueue', int, 100, 'Maximum images queue'), MPSetting('target_latitude', float, 0, 'filter detected images to latitude', tab='Filter to Location'), MPSetting('target_longitude', float, 0, 'filter detected images to longitude', tab='Filter to Location'), MPSetting('target_radius', float, 0, 'filter detected images to radius', tab='Filter to Location'), ], title='Camera (ground) Settings') self.viewing = False self.boundary = None self.boundary_polygon = None #just make a temp dir for the downloaded images and thumbs #this folder is deleted when the module is unloaded #self.camera_dir = tempfile.mkdtemp() self.camera_dir = self.mpstate.status.logdir self.bsend = [] self.msend = None self.msocket = None self.mcount = [0, 0, 0] self.last_msg_stamp = [0, 0, 0] self.last_status_update = 0 #self.last_minscore = None self.mosaic = None self.last_heartbeat = time.time() self.joelog = None self.c_params = None self.preview_window = None self.add_command('camera', self.cmd_camera, 'camera control', ['<status|view|boundary>', 'set (CAMERASETTING)']) self.add_command('remote', self.cmd_remote, "remote command", ['(COMMAND)']) self.add_command('remotem', self.cmd_remotem, "remote command over mavlink", ['(COMMAND)']) self.add_completion_function('(CAMERASETTING)', self.settings.completion) self.add_completion_function('(CAMERASETTING)', self.camera_settings.completion) for mtype in ['DATA16', 'DATA32', 'DATA64', 'DATA96']: self.module('link').no_fwd_types.add(mtype) print("camera (ground) initialised")
def __init__(self, mpstate): super(CameraAirModule, self).__init__(mpstate, "camera_air", "cuav camera control (air)", public=True, multi_vehicle=True) self.running = False self.unload_event = threading.Event() self.unload_event.clear() self.capture_thread = None self.is_armed = True self.airstart_triggered = False self.transmit_queue = Queue.Queue() self.capture_count = 0 self.encoder = video_encode.VideoWriter() self.camera = picamera.PiCamera() self.start_time = None self.handled_timestamps = {} from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.camera_settings = MPSettings([ MPSetting('quality', int, 90, 'Compression Quality', range=(1, 100), increment=1, tab='GCS'), MPSetting('cropX', int, 0, 'crop X position', range=(0, 2000), increment=1, tab='GCS'), MPSetting('cropY', int, 0, 'crop X position', range=(0, 2000), increment=1, tab='GCS'), MPSetting('cropW', int, 0, 'crop width', range=(0, 2000), increment=1, tab='GCS'), MPSetting('cropH', int, 0, 'crop height', range=(0, 2000), increment=1, tab='GCS'), MPSetting('clock_sync', bool, False, 'GPS Clock Sync'), MPSetting('flipV', bool, False, 'flip vertically'), MPSetting('flipH', bool, False, 'flip horizontally'), MPSetting('save_images', bool, False, 'save images'), MPSetting('min_width', int, 32, 'min delta width'), MPSetting('m_bandwidth', int, 2000, 'max bandwidth on mavlink', increment=1, tab='GCS'), MPSetting('m_maxqueue', int, 20, 'Maximum images queue for mavlink', tab='GCS'), MPSetting('minspeed', int, 20, 'For airstart, minimum speed for capture to start'), MPSetting('minalt', int, 30, 'MinAltitude of images', range=(0, 10000), increment=1), ], title='Camera Settings') self.msocket = None self.msend = None self.last_heartbeat = time.time() self.add_command('camera', self.cmd_camera, 'camera control', ['<start|stop|status>', 'set (CAMERASETTING)']) self.add_completion_function('(CAMERASETTING)', self.camera_settings.completion) # prevent loopback of messages for mtype in ['DATA16', 'DATA32', 'DATA64', 'DATA96']: self.module('link').no_fwd_types.add(mtype) print("camera initialised")
def __init__(self): self.console = textconsole.SimpleConsole() self.map = None self.map_functions = {} self.vehicle_type = None self.vehicle_name = None from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.settings = MPSettings([ MPSetting('link', int, 1, 'Primary Link', tab='Link', range=(0, 4), increment=1), MPSetting('streamrate', int, 4, 'Stream rate link1', range=(-1, 20), increment=1), MPSetting('streamrate2', int, 4, 'Stream rate link2', range=(-1, 20), increment=1), MPSetting('heartbeat', int, 1, 'Heartbeat rate', range=(0, 5), increment=1), MPSetting('mavfwd', bool, True, 'Allow forwarded control'), MPSetting('mavfwd_rate', bool, False, 'Allow forwarded rate control'), MPSetting('shownoise', bool, True, 'Show non-MAVLink data'), MPSetting('baudrate', int, opts.baudrate, 'baudrate for new links', range=(0, 10000000), increment=1), MPSetting('rtscts', bool, opts.rtscts, 'enable flow control'), MPSetting('select_timeout', float, 0.5, 'select timeout'), MPSetting('altreadout', int, 10, 'Altitude Readout', range=(0, 100), increment=1, tab='Announcements'), MPSetting('distreadout', int, 200, 'Distance Readout', range=(0, 10000), increment=1), MPSetting('moddebug', int, 0, 'Module Debug Level', range=(0, 3), increment=1, tab='Debug'), MPSetting('compdebug', int, 0, 'Computation Debug Mask', range=(0, 3), tab='Debug'), MPSetting('flushlogs', bool, False, 'Flush logs on every packet'), MPSetting('requireexit', bool, False, 'Require exit command'), MPSetting('wpupdates', bool, True, 'Announce waypoint updates'), MPSetting('basealt', int, 0, 'Base Altitude', range=(0, 30000), increment=1, tab='Altitude'), MPSetting('wpalt', int, 100, 'Default WP Altitude', range=(0, 10000), increment=1), MPSetting('rallyalt', int, 90, 'Default Rally Altitude', range=(0, 10000), increment=1), MPSetting('terrainalt', str, 'Auto', 'Use terrain altitudes', choice=['Auto', 'True', 'False']), MPSetting('rally_breakalt', int, 40, 'Default Rally Break Altitude', range=(0, 10000), increment=1), MPSetting('rally_flags', int, 0, 'Default Rally Flags', range=(0, 10000), increment=1), MPSetting('source_system', int, 255, 'MAVLink Source system', range=(0, 255), increment=1, tab='MAVLink'), MPSetting('source_component', int, 0, 'MAVLink Source component', range=(0, 255), increment=1), MPSetting('target_system', int, 0, 'MAVLink target system', range=(0, 255), increment=1), MPSetting('target_component', int, 0, 'MAVLink target component', range=(0, 255), increment=1) ]) self.completions = { "script": ["(FILENAME)"], "set": ["(SETTING)"], "module": ["list", "load (AVAILMODULES)", "<unload|reload> (LOADEDMODULES)"] } self.status = MPStatus() # master mavlink device self.mav_master = None # mavlink outputs self.mav_outputs = [] # SITL output self.sitl_output = None self.mav_param = mavparm.MAVParmDict() self.modules = [] self.modules_idle = [] # modules with idle callbacks self.modules_packet = [] # modules that want to read packets self.public_modules = {} self.functions = MAVFunctions() self.select_extra = {} self.continue_mode = False self.aliases = {} self.max_rx_packets = None self.logqueue = None self.logqueue_raw = None self.rx_blacklist = set( ) # A set of message types which could never be delegated to packet handlers (for use by DroneAPI high speed processing)
def __init__(self, mpstate): super(CameraAirModule, self).__init__(mpstate, "camera_air", "cuav camera control (air)", public=True) self.running = False self.unload_event = threading.Event() self.unload_event.clear() self.capture_thread = None self.scan_thread = None self.transmit_thread = None self.airstart_triggered = False self.terrain_alt = None self.handled_timestamps = {} self.imagefilenamemapping = {} self.posmapping = {} self.is_armed = True self.lz = cuav_landingregion.LandingZone() from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.camera_settings = MPSettings([ MPSetting('roll_stabilised', bool, False, 'Roll Stabilised'), MPSetting('roll_limit', float, 0, 'Roll stabilisation limit'), MPSetting('minspeed', int, 20, 'For airstart, minimum speed for capture to start'), MPSetting('minalt', int, 30, 'MinAltitude of images', range=(0, 10000), increment=1), MPSetting('rotate180', bool, False, 'rotate images by 180', tab='Capture2'), MPSetting('ignoretimestamps', bool, False, 'Ignore image timestamps', tab='Capture2'), MPSetting('camparms', str, None, 'camera parameters file (json) in cuav package', tab='Imaging'), MPSetting( 'imagefile', str, None, 'latest captured image', tab='Imaging'), MPSetting('filter_type', str, 'simple', 'Filter Type', choice=['simple'], tab='Imaging'), MPSetting( 'blue_emphasis', bool, False, 'BlueEmphasis', tab='Imaging'), MPSetting('use_capture_time', bool, True, 'Use Capture Time (false for sim)', tab='Simulation'), MPSetting('target_latitude', float, 0, 'filter detected images to latitude', tab='Filter to Location'), MPSetting('target_longitude', float, 0, 'filter detected images to longitude', tab='Filter to Location'), MPSetting('target_radius', float, 0, 'filter detected images to radius', tab='Filter to Location'), MPSetting( 'gcs_address', str, "", 'GCS Addresses in RemIP:RemPort:LocalPort:Bandwidth format (127.0.0.1:1440:1234:45, ...)', tab='GCS'), MPSetting('qualitysend', int, 90, 'Compression Quality for send', range=(1, 100), increment=1, tab='GCS'), MPSetting('transmit', bool, True, 'Transmit Enable for thumbnails', tab='GCS'), MPSetting('maxqueue', int, 50, 'Maximum images queue', tab='GCS'), MPSetting('thumbsize', int, 60, 'Thumbnail Size', range=(10, 200), increment=1), MPSetting('minscore', int, 1000, 'Min Score to pass detection', range=(0, 100000), increment=1, tab='Imaging'), MPSetting('clock_sync', bool, False, 'GPS Clock Sync'), MPSetting('m_minscore', int, 20000, 'Min Score to pass detection on mavlink', range=(0, 100000), increment=1, tab='Imaging'), MPSetting('m_bandwidth', int, 500, 'max bandwidth on mavlink', increment=1, tab='GCS'), MPSetting('m_maxqueue', int, 5, 'Maximum images queue for mavlink', tab='GCS'), MPSetting('preview', bool, True, 'enable camera preview window', tab='Imaging'), MPSetting('previewquality', int, 40, 'Compression Quality for preview', range=(1, 100), increment=1, tab='Imaging'), MPSetting('previewscale', int, 5, 'preview downscaling', range=(1, 10), increment=1, tab='Imaging'), MPSetting('previewfreq', int, 4, 'preview image frequency', range=(1, 10), increment=1, tab='Imaging'), ], title='Camera Settings') self.image_settings = MPSettings([ MPSetting('MinRegionArea', float, 0.15, range=(0, 100), increment=0.05, digits=2, tab='Image Processing'), MPSetting('MaxRegionArea', float, 1.0, range=(0, 100), increment=0.1, digits=1, tab='Image Processing'), MPSetting('MinRegionSize', float, 0.2, range=(0, 100), increment=0.05, digits=2, tab='Image Processing'), MPSetting('MaxRegionSize', float, 1.0, range=(0, 100), increment=0.1, digits=1, tab='Image Processing'), MPSetting('MaxRarityPct', float, 0.02, range=(0, 100), increment=0.01, digits=2, tab='Image Processing'), MPSetting('RegionMergeSize', float, 1.0, range=(0, 100), increment=0.1, digits=1, tab='Image Processing'), ], title='Image Settings') self.capture_count = 0 self.scan_count = 0 self.error_count = 0 self.error_msg = None self.region_count = 0 self.scan_fps = 0 self.scan_queue = multiproc.Queue() self.transmit_queue = multiproc.Queue() self.have_set_gps_time = False self.c_params = None self.jpeg_size = 0 self.xmit_queue = [] self.efficiency = [] self.last_watch = 0 self.boundary = None self.boundary_polygon = None self.bandwidth_used = [] self.rtt_estimate = [] self.bsend = [] #note this is an array of bsends # msend is a BlockSender over MAVLink self.msocket = None self.msend = None self.last_heartbeat = time.time() self.mpos = mav_position.MavInterpolator(backlog=500, gps_lag=0.0) self.joelog = None #cuav_joe.JoeLog(os.path.join(self.settings.imagefile, '..', 'joe.log'), append=self.continue_mode) self.add_command( 'camera', self.cmd_camera, 'camera control', ['<start|stop|status|boundary|airstart>', 'set (CAMERASETTING)']) self.add_completion_function('(CAMERASETTING)', self.camera_settings.completion) # prevent loopback of messages for mtype in ['DATA16', 'DATA32', 'DATA64', 'DATA96']: self.module('link').no_fwd_types.add(mtype) print("camera initialised")
def process(args): '''process a file''' file_index = 0 if os.path.isdir(args[0]): files = file_list(args[0], ['jpg', 'pgm', 'png']) else: files = args fname = files[file_index] settings = MPSettings([ MPSetting('MetersPerPixel', float, 0.2, range=(0, 10), increment=0.01, digits=2, tab='Image Processing'), MPSetting('MinRegionArea', float, 0.15, range=(0, 100), increment=0.05, digits=2), MPSetting('MaxRegionArea', float, 2.0, range=(0, 100), increment=0.1, digits=1), MPSetting('MinRegionSize', float, 0.1, range=(0, 100), increment=0.05, digits=2), MPSetting( 'MaxRegionSize', float, 2, range=(0, 100), increment=0.1, digits=1), MPSetting('MaxRarityPct', float, 0.02, range=(0, 100), increment=0.01, digits=2), MPSetting('RegionMergeSize', float, 3.0, range=(0, 100), increment=0.1, digits=1), MPSetting('minscore', int, 0, 'Min Score', range=(0, 1000), increment=1, tab='Scoring'), MPSetting('filter_type', str, 'simple', 'Filter Type', choice=['simple', 'compactness']), MPSetting('brightness', float, 1.0, 'Display Brightness', range=(0.1, 10), increment=0.1, digits=2, tab='Display') ], title='Settings') menu = MPMenuSubMenu( 'View', items=[ MPMenuItem('Original Image', 'Original Image', 'originalImage'), MPMenuItem('Unquantised Image', 'Unquantised Image', 'unquantisedImage'), MPMenuItem('Thresholded Image', 'Thresholded Image', 'thresholdedImage'), MPMenuItem('Neighbours Image', 'Neighbours Image', 'neighboursImage'), MPMenuItem('Regions Image', 'Regions Image', 'regionsImage'), MPMenuItem('Prune Large Image', 'Prune Large Image', 'prunelargeImage'), MPMenuItem('Merged Image', 'Merged Large', 'mergedImage'), MPMenuItem('Pruned Image', 'Pruned Image', 'prunedImage'), MPMenuItem('Fit Window', 'Fit Window', 'fitWindow'), MPMenuItem('Full Zoom', 'Full Zoom', 'fullSize'), MPMenuItem('Next Image', 'Next Image', 'nextImage'), MPMenuItem('Previous Image', 'Previous Image', 'previousImage') ]) im_orig = cuav_util.LoadImage(fname) im_numpy = numpy.ascontiguousarray(cv.GetMat(im_orig)) im_rgb = cv.fromarray(im_numpy) cv.CvtColor(im_rgb, im_rgb, cv.CV_BGR2RGB) # create the various views view = mp_image.MPImage(title='FullImage', can_zoom=True, can_drag=True) view.set_popup_menu(menu) dlg = wxsettings.WXSettings(settings) selected_image = "original" while dlg.is_alive() and view.is_alive(): last_change = settings.last_change() scan_parms = { 'MinRegionArea': settings.MinRegionArea, 'MaxRegionArea': settings.MaxRegionArea, 'MinRegionSize': settings.MinRegionSize, 'MaxRegionSize': settings.MaxRegionSize, 'MaxRarityPct': settings.MaxRarityPct, 'RegionMergeSize': settings.RegionMergeSize, 'SaveIntermediate': 1.0, 'MetersPerPixel': settings.MetersPerPixel } t0 = time.time() regions = scanner.scan(im_numpy, scan_parms) regions = cuav_region.RegionsConvert(regions, cuav_util.image_shape(im_orig), cuav_util.image_shape(im_orig), False) t1 = time.time() print("Processing %s took %.2f seconds" % (fname, t1 - t0)) show_image(view, selected_image, im_rgb, fname) while last_change == settings.last_change() and dlg.is_alive(): new_index = file_index for event in view.events(): if isinstance(event, MPMenuItem): if event.returnkey == 'nextImage': new_index = (file_index + 1) % len(files) elif event.returnkey == 'previousImage': new_index = (file_index - 1) % len(files) elif event.returnkey.endswith("Image"): selected_image = event.returnkey[:-5] show_image(view, selected_image, im_rgb, fname) if new_index != file_index: file_index = new_index fname = files[file_index] im_orig = cuav_util.LoadImage(fname) im_numpy = numpy.ascontiguousarray(cv.GetMat(im_orig)) im_rgb = cv.fromarray(im_numpy) cv.CvtColor(im_rgb, im_rgb, cv.CV_BGR2RGB) break time.sleep(0.1)
def FC_MPSetting(self, name, atype, default, description): xname = "fc_%s_%s" % (self.lc_name, name) return MPSetting(name, atype, default, description)
def __init__(self, mpstate): super(CUAVModule, self).__init__(mpstate, "CUAV", "CUAV checks", public=True) self.console.set_status('RPM', 'RPM: --', row=8, fg='black') self.console.set_status('RFind', 'RFind: --', row=8, fg='black') self.console.set_status('Button', 'Button: --', row=8, fg='black') self.console.set_status('ICE', 'ICE: --', row=8, fg='black') self.console.set_status('FuelPump', 'FuelPump: --', row=8, fg='black') self.console.set_status('DNFZ', 'DNFZ -- --', row=6, fg='black') self.rate_period = mavutil.periodic_event(1.0 / 15) self.button_remaining = None self.button_change = None self.last_button_update = time.time() self.last_target_update = time.time() self.button_change_recv_time = 0 self.button_announce_time = 0 self.fuel_change = None self.last_fuel_update = time.time() self.fuel_change_recv_time = 0 self.last_rpm_update = 0 self.last_rpm_value = None self.last_rpm_announce = 0 self.showLandingZone = 0 self.showJoeZone = True self.target = None self.last_recall_check = 0 from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.cuav_settings = MPSettings([ MPSetting('rpm_threshold', int, 6000, 'RPM Threshold'), MPSetting('wind_speed', float, 0, 'wind speed (m/s)'), MPSetting('wind_direction', float, 0, 'wind direction (degrees)'), MPSetting('button_pin', float, 0, 'button pin'), MPSetting('fuel_pin', float, 1, 'fuel pin'), MPSetting('wp_center', int, 2, 'center search USER number'), MPSetting('wp_start', int, 1, 'start search USER number'), MPSetting('wp_end', int, 3, 'end search USER number'), MPSetting('wp_land', int, 4, 'landing start USER number'), MPSetting('wp_recall', int, 5, 'recall Kraken USER number'), MPSetting('wp_release', int, 6, 'release Kraken USER number') ]) self.add_completion_function('(CUAVCHECKSETTING)', self.cuav_settings.completion) self.add_command('cuavcheck', self.cmd_cuavcheck, 'cuav check control', [ 'checkparams', 'movetarget', 'resettarget', 'showJoeZone', 'set (CUAVCHECKSETTING)' ]) #make the initial map menu if mp_util.has_wxpython and self.module('map'): self.menu = MPMenuSubMenu( 'UAV Challenge', items=[ MPMenuCheckbox('Show Landing Zone', 'Show Landing Zone', '# cuavcheck toggleLandingZone'), MPMenuCheckbox('Show Joe Zone', 'Show Joe Zone', '# cuavcheck toggleJoeZone') ]) self.module('map').add_menu(self.menu)
def process(args): '''process a set of files''' global slipmap, mosaic scan_count = 0 files = [] for a in args: if os.path.isdir(a): files.extend(file_list(a, ['jpg', 'pgm', 'png'])) else: if a.find('*') != -1: files.extend(glob.glob(a)) else: files.append(a) files.sort() num_files = len(files) print("num_files=%u" % num_files) region_count = 0 slipmap = mp_slipmap.MPSlipMap(service=opts.service, elevation=True, title='Map') icon = slipmap.icon('redplane.png') slipmap.add_object( mp_slipmap.SlipIcon('plane', (0, 0), icon, layer=3, rotation=0, follow=True, trail=mp_slipmap.SlipTrail())) if opts.mission: from pymavlink import mavwp wp = mavwp.MAVWPLoader() wp.load(opts.mission) boundary = wp.polygon() slipmap.add_object( mp_slipmap.SlipPolygon('mission', boundary, layer=1, linewidth=1, colour=(255, 255, 255))) if opts.mavlog: mpos = mav_position.MavInterpolator() mpos.set_logfile(opts.mavlog) else: mpos = None if opts.kmzlog: kmzpos = mav_position.KmlPosition(opts.kmzlog) else: kmzpos = None if opts.triggerlog: triggerpos = mav_position.TriggerPosition(opts.triggerlog) else: triggerpos = None # create a simple lens model using the focal length C_params = cam_params.CameraParams(lens=opts.lens, sensorwidth=opts.sensorwidth) if opts.camera_params: C_params.load(opts.camera_params) camera_settings = MPSettings([ MPSetting('roll_stabilised', bool, True, 'Roll Stabilised'), MPSetting( 'altitude', int, 0, 'Altitude', range=(0, 10000), increment=1), MPSetting('filter_type', str, 'simple', 'Filter Type', choice=['simple', 'compactness']), MPSetting('fullres', bool, False, 'Full Resolution'), MPSetting('quality', int, 75, 'Compression Quality', range=(1, 100), increment=1), MPSetting('thumbsize', int, 60, 'Thumbnail Size', range=(10, 200), increment=1), MPSetting('minscore', int, 75, 'Min Score', range=(0, 1000), increment=1, tab='Scoring'), MPSetting('brightness', float, 1.0, 'Display Brightness', range=(0.1, 10), increment=0.1, digits=2, tab='Display') ], title='Camera Settings') image_settings = MPSettings([ MPSetting('MinRegionArea', float, 0.15, range=(0, 100), increment=0.05, digits=2, tab='Image Processing'), MPSetting('MaxRegionArea', float, 2.0, range=(0, 100), increment=0.1, digits=1), MPSetting('MinRegionSize', float, 0.1, range=(0, 100), increment=0.05, digits=2), MPSetting( 'MaxRegionSize', float, 2, range=(0, 100), increment=0.1, digits=1), MPSetting('MaxRarityPct', float, 0.02, range=(0, 100), increment=0.01, digits=2), MPSetting('RegionMergeSize', float, 3.0, range=(0, 100), increment=0.1, digits=1), MPSetting('SaveIntermediate', bool, False) ], title='Image Settings') mosaic = cuav_mosaic.Mosaic(slipmap, C=C_params, camera_settings=camera_settings, image_settings=image_settings, start_menu=True) joelog = cuav_joe.JoeLog(None) if opts.view: viewer = mp_image.MPImage(title='Image', can_zoom=True, can_drag=True) if camera_settings.filter_type == 'compactness': calculate_compactness = True print("Using compactness filter") else: calculate_compactness = False for f in files: if not mosaic.started(): print("Waiting for startup") while not mosaic.started(): mosaic.check_events() time.sleep(0.01) if mpos: # get the position by interpolating telemetry data from the MAVLink log file # this assumes that the filename contains the timestamp frame_time = cuav_util.parse_frame_time(f) + opts.time_offset if camera_settings.roll_stabilised: roll = 0 else: roll = None try: pos = mpos.position(frame_time, roll=roll) except Exception: print("No position available for %s" % frame_time) # skip this frame continue elif kmzpos is not None: pos = kmzpos.position(f) elif triggerpos is not None: pos = triggerpos.position(f) else: # get the position using EXIF data pos = mav_position.exif_position(f) pos.time += opts.time_offset # update the plane icon on the map if pos is not None: slipmap.set_position('plane', (pos.lat, pos.lon), rotation=pos.yaw) if camera_settings.altitude > 0: pos.altitude = camera_settings.altitude # check for any events from the map slipmap.check_events() mosaic.check_events() im_orig = cuav_util.LoadImage(f) (w, h) = cuav_util.image_shape(im_orig) if not opts.camera_params: C_params.set_resolution(w, h) im_full = im_orig im_640 = cv.CreateImage((640, 480), 8, 3) cv.Resize(im_full, im_640, cv.CV_INTER_NN) im_640 = numpy.ascontiguousarray(cv.GetMat(im_640)) im_full = numpy.ascontiguousarray(cv.GetMat(im_full)) count = 0 total_time = 0 t0 = time.time() if camera_settings.fullres: img_scan = im_full else: img_scan = im_640 scan_parms = {} for name in image_settings.list(): scan_parms[name] = image_settings.get(name) scan_parms['SaveIntermediate'] = float(scan_parms['SaveIntermediate']) if pos is not None: (sw, sh) = cuav_util.image_shape(img_scan) mpp = cuav_util.meters_per_pixel(pos, C=C_params) if mpp is not None: scan_parms['MetersPerPixel'] = mpp * (w / float(sw)) regions = scanner.scan(img_scan, scan_parms) else: regions = scanner.scan(img_scan) regions = cuav_region.RegionsConvert(regions, cuav_util.image_shape(img_scan), cuav_util.image_shape(im_full), calculate_compactness) count += 1 t1 = time.time() frame_time = pos.time regions = cuav_region.filter_regions( im_full, regions, frame_time=frame_time, min_score=camera_settings.minscore, filter_type=camera_settings.filter_type) scan_count += 1 mosaic.add_image(pos.time, f, pos) if pos and len(regions) > 0: altitude = camera_settings.altitude if altitude <= 0: altitude = None joelog.add_regions(frame_time, regions, pos, f, width=w, height=h, altitude=altitude) region_count += len(regions) if len(regions) > 0: composite = cuav_mosaic.CompositeThumbnail( cv.GetImage(cv.fromarray(im_full)), regions) thumbs = cuav_mosaic.ExtractThumbs(composite, len(regions)) mosaic.add_regions(regions, thumbs, f, pos) if opts.view: img_view = img_scan (wview, hview) = cuav_util.image_shape(img_view) mat = cv.fromarray(img_view) for r in regions: r.draw_rectangle(mat, (255, 0, 0)) cv.CvtColor(mat, mat, cv.CV_BGR2RGB) viewer.set_image(mat) viewer.set_title('Image: ' + os.path.basename(f)) total_time += (t1 - t0) if t1 != t0: print('%s scan %.1f fps %u regions [%u/%u]' % (os.path.basename(f), count / total_time, region_count, scan_count, num_files))
'''check if child is still going''' return self.child.is_alive() if __name__ == "__main__": multiproc.freeze_support() def test_callback(setting): '''callback on apply''' print("Changing %s to %s" % (setting.name, setting.value)) # test the settings from MAVProxy.modules.lib import mp_settings, time from MAVProxy.modules.lib.mp_settings import MPSetting settings = mp_settings.MPSettings([ MPSetting('link', int, 1, tab='TabOne'), MPSetting('altreadout', int, 10, range=(-30, 1017), increment=1), MPSetting('pvalue', float, 0.3, range=(-3.0, 1e6), increment=0.1, digits=2), MPSetting('enable', bool, True, tab='TabTwo'), MPSetting('colour', str, 'Blue', choice=['Red', 'Green', 'Blue']), MPSetting('foostr', str, 'blah', label='Foo String') ]) settings.set_callback(test_callback) dlg = WXSettings(settings) while dlg.is_alive(): time.sleep(0.1)
def __init__(self): self.console = textconsole.SimpleConsole() self.map = None self.map_functions = {} self.vehicle_type = None self.vehicle_name = None from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.settings = MPSettings( [ MPSetting('link', int, 1, 'Primary Link', tab='Link', range=(0,4), increment=1), MPSetting('streamrate', int, 4, 'Stream rate link1', range=(-1,100), increment=1), MPSetting('streamrate2', int, 4, 'Stream rate link2', range=(-1,100), increment=1), MPSetting('heartbeat', int, 1, 'Heartbeat rate', range=(0,5), increment=1), MPSetting('mavfwd', bool, True, 'Allow forwarded control'), MPSetting('mavfwd_rate', bool, False, 'Allow forwarded rate control'), MPSetting('shownoise', bool, True, 'Show non-MAVLink data'), MPSetting('baudrate', int, opts.baudrate, 'baudrate for new links', range=(0,10000000), increment=1), MPSetting('rtscts', bool, opts.rtscts, 'enable flow control'), MPSetting('select_timeout', float, 0.01, 'select timeout'), MPSetting('altreadout', int, 10, 'Altitude Readout', range=(0,100), increment=1, tab='Announcements'), MPSetting('distreadout', int, 200, 'Distance Readout', range=(0,10000), increment=1), MPSetting('moddebug', int, opts.moddebug, 'Module Debug Level', range=(0,3), increment=1, tab='Debug'), MPSetting('compdebug', int, 0, 'Computation Debug Mask', range=(0,3), tab='Debug'), MPSetting('flushlogs', bool, False, 'Flush logs on every packet'), MPSetting('requireexit', bool, False, 'Require exit command'), MPSetting('wpupdates', bool, True, 'Announce waypoint updates'), MPSetting('basealt', int, 0, 'Base Altitude', range=(0,30000), increment=1, tab='Altitude'), MPSetting('wpalt', int, 100, 'Default WP Altitude', range=(0,10000), increment=1), MPSetting('rallyalt', int, 90, 'Default Rally Altitude', range=(0,10000), increment=1), MPSetting('terrainalt', str, 'Auto', 'Use terrain altitudes', choice=['Auto','True','False']), MPSetting('rally_breakalt', int, 40, 'Default Rally Break Altitude', range=(0,10000), increment=1), MPSetting('rally_flags', int, 0, 'Default Rally Flags', range=(0,10000), increment=1), MPSetting('source_system', int, 255, 'MAVLink Source system', range=(0,255), increment=1, tab='MAVLink'), MPSetting('source_component', int, 0, 'MAVLink Source component', range=(0,255), increment=1), MPSetting('target_system', int, 0, 'MAVLink target system', range=(0,255), increment=1), MPSetting('target_component', int, 0, 'MAVLink target component', range=(0,255), increment=1), MPSetting('state_basedir', str, None, 'base directory for logs and aircraft directories'), MPSetting('allow_unsigned', bool, True, 'whether unsigned packets will be accepted'), MPSetting('dist_unit', str, 'm', 'distance unit', choice=['m', 'nm', 'miles'], tab='Units'), MPSetting('height_unit', str, 'm', 'height unit', choice=['m', 'feet']), MPSetting('speed_unit', str, 'm/s', 'height unit', choice=['m/s', 'knots', 'mph']), MPSetting('vehicle_name', str, '', 'Vehicle Name', tab='Vehicle'), ]) self.completions = { "script" : ["(FILENAME)"], "set" : ["(SETTING)"], "status" : ["(VARIABLE)"], "module" : ["list", "load (AVAILMODULES)", "<unload|reload> (LOADEDMODULES)"] } self.status = MPStatus() # master mavlink device self.mav_master = None # mavlink outputs self.mav_outputs = [] self.sysid_outputs = {} # SITL output self.sitl_output = None self.mav_param = mavparm.MAVParmDict() self.modules = [] self.public_modules = {} self.functions = MAVFunctions() self.select_extra = {} self.continue_mode = False self.aliases = {} import platform self.system = platform.system()
def __init__(self): self.console = textconsole.SimpleConsole() self.map = None self.map_functions = {} self.vehicle_type = None self.vehicle_name = None from MAVProxy.modules.lib.mp_settings import MPSettings, MPSetting self.settings = MPSettings([ MPSetting('link', int, 1, 'Primary Link', tab='Link', range=(0, 4), increment=1), MPSetting('streamrate', int, 4, 'Stream rate link1', range=(-1, 20), increment=1), MPSetting('streamrate2', int, 4, 'Stream rate link2', range=(-1, 20), increment=1), MPSetting('heartbeat', int, 1, 'Heartbeat rate', range=(0, 5), increment=1), MPSetting('mavfwd', bool, True, 'Allow forwarded control'), MPSetting('mavfwd_rate', bool, False, 'Allow forwarded rate control'), MPSetting('shownoise', bool, True, 'Show non-MAVLink data'), MPSetting('altreadout', int, 10, 'Altitude Readout', range=(0, 100), increment=1, tab='Announcements'), MPSetting('distreadout', int, 200, 'Distance Readout', range=(0, 10000), increment=1), MPSetting('moddebug', int, 0, 'Module Debug Level', range=(0, 3), increment=1, tab='Debug'), MPSetting('flushlogs', bool, False, 'Flush logs on every packet'), MPSetting('requireexit', bool, False, 'Require exit command'), MPSetting('basealt', int, 0, 'Base Altitude', range=(0, 30000), increment=1, tab='Altitude'), MPSetting('wpalt', int, 100, 'Default WP Altitude', range=(0, 10000), increment=1), MPSetting('rallyalt', int, 90, 'Default Rally Altitude', range=(0, 10000), increment=1), MPSetting('terrainalt', str, 'Auto', 'Use terrain altitudes', choice=['Auto', 'True', 'False']), MPSetting('wpupdates', bool, True, 'Show waypoint updates'), MPSetting('rally_breakalt', int, 40, 'Default Rally Break Altitude', range=(0, 10000), increment=1), MPSetting('rally_flags', int, 0, 'Default Rally Flags`', range=(0, 10000), increment=1), MPSetting('baudrate', int, opts.baudrate, 'baudrate for new links', range=(0, 10000000), increment=1), MPSetting('rtscts', bool, opts.rtscts, 'enable flow control'), MPSetting('select_timeout', float, 0.01, 'select timeout') ]) self.completions = {"script": ["(FILENAME)"], "set": ["(SETTING)"]} self.status = MPStatus() # master mavlink device self.mav_master = None # mavlink outputs self.mav_outputs = [] # SITL output self.sitl_output = None self.mav_param = mavparm.MAVParmDict() self.modules = [] self.public_modules = {} self.functions = MAVFunctions() self.select_extra = {} self.continue_mode = False self.aliases = {}