#!/usr/bin/python3 import logging import signal import subprocess import sys import threading import time from queue import Queue import os import psutil import flask from flask import jsonify, request from dronekit_server_client import DroneKitComms from vision_cargo_approach import VisionCargoApproacher from pallet_hole_alignment_c import HoleAligner # def reinit_networking(): # logging.info('Resetting dhcpcd service, wait 5 seconds...') # subprocess.run(["sudo", "service", "dhcpcd", "restart"]) # time.sleep(5) # subprocess.run(["route", "-n"]) DO_ZERO = True DO_GPS_THERE = True DO_GOTO_TARGET_HEADING = False DO_VISION_APPROACH = True DO_FORK_ALIGN = True DO_PICKUP_CARGO = True DO_REVERSE_TURN = False DO_GPS_RETURN = False DO_DROPOFF_CARGO = True DO_RETURN_TO_NEUTRAL = False DO_LOOP = True JOB_QUEUE = Queue(maxsize=10) KILL_SIGNAL = False def exit_handler(*_): global KILL_SIGNAL print('\nROOT: CTRL-C pressed, killing everything') KILL_SIGNAL = True sys.exit(0) signal.signal(signal.SIGINT, exit_handler) logging.basicConfig() logging.root.setLevel(logging.NOTSET) logging.basicConfig(level=logging.NOTSET) executor_logger = logging.getLogger("LOGISTICS EXECUTOR") executor_logger.setLevel(logging.DEBUG) #--- 0: for ix, waypoint in enumerate(waypoints): target_lat = waypoint['lat'] target_lon = waypoint['lon'] executor_logger.info(f"Going to waypoint {ix} at lat: {target_lat}, lon: {target_lon}") success = __go_to_gps(vehicle_ctrl, lat=target_lat, lon=target_lon) if not success: executor_logger.error("Navigate to gps watpoint func returned error, chack logs, aborting") return False return True def __go_to_gps(vehicle_ctrl, lat: float, lon: float): executor_logger.info(f"Starting GPS navigation to lat: {lat}, lon: {lon}") timeout_time = 300 + time.time() # 5 minutes to get to target vehicle_in_target = False vehicle_ctrl.go_to_gps(lat=lat, lon=lon) while vehicle_in_target == False and time.time() < timeout_time: time.sleep(0.2) # Don't DDoS the Pi! vehicle_in_target, distance = vehicle_ctrl.check_gps_in_radius((lat, lon)) if vehicle_in_target: executor_logger.info(f'We are in radius ({distance})') return True else: executor_logger.critical(f"5 minuted have elapsed and we are not in the target area ({distance}), aborting") return False def __go_to_cargo_vision(vision_system): executor_logger.info(f"Starting vision to cargo navigation") success = vision_system.navigate_to_cargo_vision() return success def __align_forks_with_holes(hole_alignment_system): executor_logger.info(f"Starting pallet hole alignment") success = hole_alignment_system.align_fork() return success def reverse_turn(vehicle_ctrl): executor_logger.info(f"Picking up cargo") __reverse_turn(vehicle_ctrl) return True def __pick_up_cargo(vehicle_ctrl): vehicle_ctrl.approach_pallet() time.sleep(1) vehicle_ctrl.zero_fork_vert_movement() return True def __put_down_cargo(vehicle_ctrl): vehicle_ctrl.zero_fork_vert_pickup() time.sleep(1) vehicle_ctrl.reverse_from_pallet() return True def __reverse_turn(vehicle_ctrl): executor_logger.info(f"performing reverse turn") vehicle_ctrl.nudge_drive(False, 5, 2000) vehicle_ctrl.nudge_drive(False, 6, 2000) vehicle_ctrl.nudge_drive(True, 5, 1000) vehicle_ctrl.nudge_drive(True, 6, 1000) return True #--- Logistics executionner is running..." @app.route('/alive', methods=['POST']) def alive(): app.logger.info(f"Returning alive") return jsonify({'Success': True}) @app.route('/add_job', methods=['POST']) def add_job(): if request.is_json: job_request = request.get_json() if not verify_json_data(job_request): app.logger.error("Error processing job request: check logs...") return jsonify({'Error': 'Error processing job request: check logs...'}) app.logger.info(f"Got valid job request: {job_request}") JOB_QUEUE.put(job_request) return jsonify({'Success': True}) else: return jsonify({'Error': 'Not JSON'}) app.run(host='0.0.0.0', port=8080)