parser.add_argument("-s","--subscribe", action="store_true", help="subscribe to the ivy bus") parser.add_argument("-v","--verbose", action="store_true", help="verbose mode") try: # --- Startup state initialization block args = parser.parse_args() static_init_configuration_data() static_init_client_configuration_data(args.file) if args.verbose: print_aircraft_data() if args.generate: template_configuration() sys.exit(0) if args.subscribe: ivy_interface.subscribe(callback_aircraft_messages) ivy_interface.start() # Handle misc. command line arguments if args.verbose: verbose=args.verbose if args.curl: curl=args.curl print_curl_header(args.ip, args.port) # --- Main loop # Supply flask the appropriate ip address and port for the server server_host = args.ip # Store for use in htlm template generation server_port = args.port # Store for use in htlm template generation app.run(host=args.ip,port=args.port,threaded=True) # --- Shutdown state block
class RtpViewer: frame = None mouse = dict() def __init__(self, src): # Create the video capture device self.cap = cv2.VideoCapture(src) # Start the ivy interface self.ivy = IvyMessagesInterface("RTPviewer", start_ivy=False) self.ivy.start() # Create a named window and add a mouse callback cv2.namedWindow('rtp') cv2.setMouseCallback('rtp', self.on_mouse) def run(self): # Start an 'infinite' loop while True: # Read a frame from the video capture ret, self.frame = self.cap.read() # Quit if frame could not be retrieved or 'q' is pressed if not ret or cv2.waitKey(1) & 0xFF == ord('q'): break # Run the computer vision function self.cv() def cv(self): # If a selection is happening if self.mouse.get('start'): # Draw a rectangle indicating the region of interest cv2.rectangle(self.frame, self.mouse['start'], self.mouse['now'], (0, 255, 0), 2) # Show the image in a window cv2.imshow('rtp', self.frame) def on_mouse(self, event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: self.mouse['start'] = (x, y) if event == cv2.EVENT_RBUTTONDOWN: self.mouse['start'] = None if event == cv2.EVENT_MOUSEMOVE: self.mouse['now'] = (x, y) if event == cv2.EVENT_LBUTTONUP: # If mouse start is defined, a region has been selected if not self.mouse.get('start'): return # Obtain mouse start coordinates sx, sy = self.mouse['start'] # Create a new message msg = PprzMessage("datalink", "VIDEO_ROI") msg['ac_id'] = None msg['startx'] = sx msg['starty'] = sy msg['width'] = abs(x - sx) msg['height'] = abs(y - sy) msg['downsized_width'] = self.frame.shape[1] # Send message via the ivy interface self.ivy.send_raw_datalink(msg) # Reset mouse start self.mouse['start'] = None def cleanup(self): # Shutdown ivy interface self.ivy.shutdown()
action="store_true", help="verbose mode") try: # --- Startup state initialization block args = parser.parse_args() static_init_configuration_data() static_init_client_configuration_data(args.file) if args.verbose: print_aircraft_data() if args.generate: template_configuration() sys.exit(0) if args.subscribe: ivy_interface.subscribe(callback_aircraft_messages) ivy_interface.start() # Handle misc. command line arguments if args.verbose: verbose = args.verbose if args.curl: curl = args.curl print_curl_header(args.ip, args.port) # --- Main loop # Supply flask the appropriate ip address and port for the server server_host = args.ip # Store for use in htlm template generation server_port = args.port # Store for use in htlm template generation app.run(host=args.ip, port=args.port, threaded=True) # --- Shutdown state block
class RtpViewer: running = False scale = 1 rotate = 0 frame = None mouse = dict() def __init__(self, src): # Create the video capture device self.cap = cv2.VideoCapture(src) # Start the ivy interface self.ivy = IvyMessagesInterface("RTPviewer", start_ivy=False) self.ivy.start() # Create a named window and add a mouse callback cv2.namedWindow('rtp') cv2.setMouseCallback('rtp', self.on_mouse) def run(self): self.running = True # Start an 'infinite' loop while self.running: # Read a frame from the video capture ret, self.frame = self.cap.read() # Quit if frame could not be retrieved if not ret: break # Run the computer vision function self.cv() # Process key input self.on_key(cv2.waitKey(1) & 0xFF) def cv(self): # Rotate the image by increments of 90 if self.rotate % 2: self.frame = cv2.transpose(self.frame) if self.rotate > 0: self.frame = cv2.flip(self.frame, [1, -1, 0][self.rotate - 1]) # If a selection is happening if self.mouse.get('start'): # Draw a rectangle indicating the region of interest cv2.rectangle(self.frame, self.mouse['start'], self.mouse['now'], (0, 255, 0), 2) if self.scale != 1: h, w = self.frame.shape[:2] self.frame = cv2.resize(self.frame, (int(self.scale * w), int(self.scale * h))) # Show the image in a window cv2.imshow('rtp', self.frame) def on_key(self, key): if key == ord('q'): self.running = False if key == ord('r'): self.rotate = (self.rotate + 1) % 4 self.mouse['start'] = None def on_mouse(self, event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN and self.rotate == 0: self.mouse['start'] = (x, y) if event == cv2.EVENT_RBUTTONDOWN: self.mouse['start'] = None if event == cv2.EVENT_MOUSEMOVE: self.mouse['now'] = (x, y) if event == cv2.EVENT_LBUTTONUP: # If mouse start is defined, a region has been selected if not self.mouse.get('start'): return # Obtain mouse start coordinates sx, sy = self.mouse['start'] # Create a new message msg = PprzMessage("datalink", "VIDEO_ROI") msg['ac_id'] = None msg['startx'] = sx msg['starty'] = sy msg['width'] = abs(x - sx) msg['height'] = abs(y - sy) msg['downsized_width'] = self.frame.shape[1] # Send message via the ivy interface self.ivy.send_raw_datalink(msg) # Reset mouse start self.mouse['start'] = None def cleanup(self): # Shutdown ivy interface self.ivy.shutdown()
class CommandSender(IvyMessagesInterface): def __init__(self, verbose=False, callback = None): self.verbose = verbose self.callback = callback self._interface = IvyMessagesInterface("Mission Commander", start_ivy=False) self._interface.subscribe(self.message_recv) self._interface.start() def message_recv(self, ac_id, msg): if (self.verbose and self.callback != None): self.callback(ac_id, msg) def shutdown(self): print("Shutting down ivy interface...") self._interface.shutdown() def __del__(self): self.shutdown() def add_mission_command_dict(self, ac_id, insert, msg_id, msgs): msg = PprzMessage("datalink", msg_id) msg['ac_id'] = ac_id msg['insert'] = insert msg['duration'] = msgs.get('duration') msg['index'] = msgs.get('index') if msg_id == 'MISSION_GOTO_WP_LLA': msg['wp_lat'] = msgs.get('wp_lat') msg['wp_lon'] = msgs.get('wp_lon') msg['wp_alt'] = msgs.get('wp_alt') elif msg_id == 'MISSION_CIRCLE_LLA': msg['center_lat'] = msgs.get('center_lat') msg['center_lon'] = msgs.get('center_lon') msg['center_alt'] = msgs.get('center_alt') msg['radius'] = msgs.get('radius') elif msg_id == 'MISSION_SEGMENT_LLA': msg['segment_lat_1'] = msgs.get('segment_lat_1') msg['segment_lon_1'] = msgs.get('segment_lon_1') msg['segment_lat_2'] = msgs.get('segment_lat_2') msg['segment_lon_2'] = msgs.get('segment_lon_2') elif msg_id == 'MISSION_PATH_LLA': msg['point_lat_1'] = msgs.get('point_lat_1') msg['point_lon_1'] = msgs.get('point_lon_1') msg['point_lat_2'] = msgs.get('point_lat_2') msg['point_lon_2'] = msgs.get('point_lon_2') msg['point_lat_3'] = msgs.get('point_lat_3') msg['point_lon_3'] = msgs.get('point_lon_3') msg['point_lat_4'] = msgs.get('point_lat_4') msg['point_lon_4'] = msgs.get('point_lon_4') msg['point_lat_5'] = msgs.get('point_lat_5') msg['point_lon_5'] = msgs.get('point_lon_5') msg['path_alt'] = msgs.get('path_alt') msg['nb'] = msgs.get('nb') elif msg_id == 'MISSION_SURVEY_LLA': msg['survey_lat_1'] = msgs.get('survey_lat_1') msg['survey_lon_1'] = msgs.get('survey_lon_1') msg['survey_lat_2'] = msgs.get('survey_lat_2') msg['survey_lon_2'] = msgs.get('survey_lon_2') msg['survey_alt'] = msgs.get('survey_alt') # print("Sending message: %s" % msg) self._interface.send(msg) def add_shape(self, status, obstacle_id, obmsg): msg = PprzMessage("ground", "SHAPE") msg['id'] = int(obstacle_id) msg['fillcolor'] = "red" if obstacle_id > 19 else "orange" msg['linecolor'] = "red" if obstacle_id > 19 else "orange" msg['status'] = 0 if status=="create" else 1 msg['shape'] = 0 msg['latarr'] = [int(obmsg.get("latitude")*10000000.),int(obmsg.get("latitude")*10000000.)] msg['lonarr'] = [int(obmsg.get("longitude")*10000000.),int(obmsg.get("longitude")*10000000.)] msg['radius'] = int(obmsg.get("sphere_radius") if "sphere_radius" in obmsg else obmsg.get("cylinder_radius")) msg['text'] = "NULL" msg['opacity'] = 2 self._interface.send(msg)