├── config ├── run_autopilot.sh └── run_autopilot.service ├── assets ├── IMG_5190.jpg ├── architecture.png ├── bf_4_6_0_cli.png ├── bf_4_6_0_modes.png ├── bf_4_6_0_ports.png ├── bf_4_6_0_servos.png ├── wiring_diagram.png └── msp_override_mask.png ├── definitions.py ├── autopilot.py ├── LICENSE ├── main.py ├── logger.py ├── empty_pilot.py ├── telemetry.py ├── msp_helper.py ├── commands.py ├── messages.py ├── router.py ├── README_DEV.md ├── README.md └── logs └── log_2025-01-15_02-12-52.log /config/run_autopilot.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sudo python /home/pi/bee-ept/main.py -------------------------------------------------------------------------------- /assets/IMG_5190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/IMG_5190.jpg -------------------------------------------------------------------------------- /assets/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/architecture.png -------------------------------------------------------------------------------- /assets/bf_4_6_0_cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/bf_4_6_0_cli.png -------------------------------------------------------------------------------- /assets/bf_4_6_0_modes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/bf_4_6_0_modes.png -------------------------------------------------------------------------------- /assets/bf_4_6_0_ports.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/bf_4_6_0_ports.png -------------------------------------------------------------------------------- /assets/bf_4_6_0_servos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/bf_4_6_0_servos.png -------------------------------------------------------------------------------- /assets/wiring_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/wiring_diagram.png -------------------------------------------------------------------------------- /assets/msp_override_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/under0tech/autopilot_bee_ept/HEAD/assets/msp_override_mask.png -------------------------------------------------------------------------------- /config/run_autopilot.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=BEE-EPT-UA913 Autopilot 3 | 4 | [Service] 5 | Type=oneshot 6 | ExecStart=/etc/systemd/system/run_autopilot.sh 7 | 8 | [Install] 9 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /definitions.py: -------------------------------------------------------------------------------- 1 | companion_computer = '/dev/ttyACM0' # COM3 (for Windows) 2 | companion_baud_rate = 115200 3 | logger_name = 'BEE-EPT-UA913' 4 | logger_directory = '/home/pi/bee_ept/logs' # logs (for Windows) 5 | 6 | default_roll = 1500 7 | default_pitch = 1500 8 | default_yaw = 1500 9 | default_throttle = 1000 10 | default_servo_aux2 = 1000 -------------------------------------------------------------------------------- /autopilot.py: -------------------------------------------------------------------------------- 1 | state = { 2 | 'connection' : False, 3 | 'bee_state' : 'OFF', # OFF, READY 4 | 'roll': 1500, 5 | 'pitch': 1500, 6 | 'yaw': 1500, 7 | 'throttle': 1100, 8 | 'aux1': 1000, 9 | 'aux2': 1000, 10 | 'aux3': 1000, 11 | 'aux4': 1000, 12 | 'battery': 0, 13 | 'rssi':0, 14 | 'rssi_msg':'No signal', 15 | 'speed': 0, 16 | 'altitude': 0, 17 | 'delivered': False 18 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 under0tech 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import threading 3 | import messages 4 | import router 5 | import telemetry 6 | import empty_pilot 7 | 8 | # INIT 9 | bee_commands = router.command_queue 10 | stop_command = threading.Event() 11 | 12 | # BEE-EPT (Empty pilot) 13 | os.system('clear') 14 | messages.display(messages.main_autopilot_started) 15 | 16 | executor_thread = threading.Thread(target=router.command_executor, 17 | args=[stop_command]) 18 | telemetry_thread = threading.Thread(target=telemetry.telemetry_requestor, 19 | args=[stop_command]) 20 | empty_pilot_thread = threading.Thread(target=empty_pilot.empty_pilot_process, 21 | args=[stop_command]) 22 | executor_thread.start() 23 | telemetry_thread.start() 24 | empty_pilot_thread.start() 25 | 26 | router.put_command(router.Command(0,'INIT',{})) 27 | 28 | input('Press enter to stop process...\n') 29 | messages.display(messages.main_stopping_threads) 30 | 31 | stop_command.set() 32 | 33 | executor_thread.join() 34 | telemetry_thread.join() 35 | empty_pilot_thread.join() 36 | 37 | messages.display(messages.main_autopilot_finished) -------------------------------------------------------------------------------- /logger.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import definitions as vars 3 | from datetime import datetime 4 | 5 | def init_logger(): 6 | logger = logging.getLogger(vars.logger_name) 7 | logs_directory = vars.logger_directory 8 | logger.setLevel(logging.DEBUG) 9 | log_file_handler = logging.FileHandler( 10 | f'{logs_directory}/log_{datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.log') 11 | formatter = logging.Formatter( 12 | '%(asctime)s - %(name)s - %(levelname)s - %(message)s') 13 | log_file_handler.setFormatter(formatter) 14 | logger.addHandler(log_file_handler) 15 | return logger 16 | 17 | bee_logger = init_logger() 18 | 19 | def log_message(logger, message, level='debug'): 20 | if level == 'debug': 21 | bee_logger.debug(message) 22 | elif level == 'info': 23 | bee_logger.info(message) 24 | elif level == 'warning': 25 | bee_logger.warning(message) 26 | elif level == 'error': 27 | bee_logger.error(message) 28 | elif level == 'fatal': 29 | bee_logger.fatal(message) 30 | else: 31 | raise ValueError( 32 | "Invalid logging level. Choose from 'debug', \ 33 | 'info', 'warning', 'error', or 'fatal'.") -------------------------------------------------------------------------------- /empty_pilot.py: -------------------------------------------------------------------------------- 1 | import time 2 | import autopilot 3 | import messages 4 | import router 5 | import definitions as vars 6 | 7 | def empty_pilot_process(stop_command): 8 | while autopilot.state['connection'] == False and not stop_command.is_set(): 9 | try: 10 | time.sleep(7) 11 | messages.display(messages.empty_pilot_process_connecting, [vars.companion_computer]) 12 | except Exception as e: 13 | messages.display(messages.fatal_error, [e]) 14 | pass 15 | 16 | if not stop_command.is_set(): 17 | messages.display(messages.empty_pilot_process_connected, [vars.companion_computer]) 18 | 19 | while not stop_command.is_set(): 20 | try: 21 | if autopilot.state['bee_state'] in ['READY']: 22 | if autopilot.state['delivered'] == False: 23 | if float(autopilot.state['altitude']) != 0.0: 24 | router.put_command(router.Command(1,'DELIVER',{})) 25 | time.sleep(2) 26 | except: 27 | pass 28 | 29 | stopped_time = time.strftime("%H:%M:%S, %Y, %d %B", time.localtime()) 30 | messages.display(messages.empty_pilot_process_done, [stopped_time]) -------------------------------------------------------------------------------- /telemetry.py: -------------------------------------------------------------------------------- 1 | import time 2 | import autopilot 3 | import messages 4 | import router 5 | import definitions as vars 6 | 7 | def telemetry_requestor(stop_command): 8 | while autopilot.state['connection'] == False and not stop_command.is_set(): 9 | try: 10 | time.sleep(5) 11 | messages.display(messages.telemetry_process_connecting, [vars.companion_computer]) 12 | except Exception as e: 13 | messages.display(messages.fatal_error, [e]) 14 | pass 15 | 16 | if not stop_command.is_set(): 17 | messages.display(messages.telemetry_process_connected, [vars.companion_computer]) 18 | 19 | while not stop_command.is_set(): 20 | try: 21 | # if int(autopilot.state['altitude']) > 1: 22 | router.put_command(router.Command(2,'MONITOR',{'target':'MSP_ANALOG'})) 23 | 24 | router.put_command(router.Command(2,'TELEMETRY',{'target':'MSP_ALTITUDE'})) 25 | router.put_command(router.Command(1,'TELEMETRY',{'target':'MSP_RC'})) 26 | time.sleep(4) 27 | except: 28 | pass 29 | 30 | stopped_time = time.strftime("%H:%M:%S, %Y, %d %B", time.localtime()) 31 | messages.display(messages.telemetry_requestor_done, [stopped_time]) -------------------------------------------------------------------------------- /msp_helper.py: -------------------------------------------------------------------------------- 1 | import struct 2 | 3 | # MSP command IDs 4 | MSP_ANALOG = 110 5 | MSP_ALTITUDE = 109 6 | 7 | MSP_RC = 105 8 | MSP_SET_RAW_RC = 200 9 | 10 | def get_checksum(msp_command_id, payload): 11 | checksum = 0 12 | length = len(payload) 13 | 14 | for byte in bytes([length, msp_command_id]) + payload: 15 | checksum ^= byte 16 | 17 | checksum &= 0xFF 18 | return checksum 19 | 20 | def send_msp_command(serial_port, msp_command_id, data): 21 | payload = bytearray() 22 | for value in data: 23 | payload += struct.pack('<1H', value) 24 | 25 | header = b'$M<' 26 | length = len(payload) 27 | checksum = get_checksum(msp_command_id, payload) 28 | 29 | msp_package = header + bytes([length, msp_command_id]) + payload + bytes([checksum]) 30 | serial_port.write(msp_package) 31 | 32 | def send_msp_request(serial_port, msp_command_id): 33 | header = b'$M<' 34 | length = 0 35 | checksum = get_checksum(msp_command_id, bytes([])) 36 | 37 | msp_package = header + struct.pack(''): 44 | length = response[3] 45 | msp_command_id = response[4] 46 | payload = response[5:5 + length] 47 | return msp_command_id, payload 48 | else: 49 | raise ValueError("Invalid MSP response") -------------------------------------------------------------------------------- /commands.py: -------------------------------------------------------------------------------- 1 | import serial 2 | import time 3 | import autopilot 4 | import definitions as vars 5 | import msp_helper as msp 6 | 7 | command_delays = { 8 | 'go_forward': 2, 9 | 'deliver': 1 10 | } 11 | 12 | command_target_ids = { 13 | 'MSP_ANALOG': msp.MSP_ANALOG, 14 | 'MSP_ALTITUDE': msp.MSP_ALTITUDE, 15 | 'MSP_RC': msp.MSP_RC 16 | } 17 | 18 | serial_port = {} 19 | 20 | def wait_for_execution(target, delay=0): 21 | if delay == 0: 22 | delay = command_delays.get(target) 23 | time.sleep(delay) 24 | 25 | def get_target_id(target): 26 | return int(command_target_ids.get(target)) 27 | 28 | def connect(): 29 | global serial_port 30 | serial_port = serial.Serial( 31 | vars.companion_computer, 32 | vars.companion_baud_rate, 33 | timeout=1) 34 | 35 | def disconnect(): 36 | serial_port.close() 37 | 38 | def reboot(): 39 | disconnect() 40 | time.sleep(1) 41 | connect() 42 | 43 | def set_row_rc(roll, pitch, yaw, throttle, servo_aux): 44 | # ROLL/PITCH/THROTTLE/YAW/AUX1/AUX2/AUX3/AUX4 45 | data = [roll, 46 | pitch, 47 | throttle, 48 | yaw, 0, 49 | servo_aux, 0, 0] 50 | msp.send_msp_command(serial_port, msp.MSP_SET_RAW_RC, data) 51 | 52 | msp_command_id, payload = msp.read_msp_response(serial_port) 53 | if msp_command_id != msp.MSP_SET_RAW_RC: 54 | return False 55 | return True 56 | 57 | def copter_init(): 58 | # connect() 59 | 60 | return set_row_rc( 61 | vars.default_roll, 62 | vars.default_pitch, 63 | vars.default_yaw, 64 | vars.default_throttle, 65 | vars.default_servo_aux2) 66 | 67 | def telemetry(target): 68 | msp_target_command_id = get_target_id(target) 69 | msp.send_msp_request(serial_port, msp_target_command_id) 70 | time.sleep(0.1) 71 | msp_command_id, payload = msp.read_msp_response(serial_port) 72 | if msp_command_id == msp_target_command_id: 73 | return payload 74 | 75 | return {} 76 | 77 | def prepare_go_forward(throttle): 78 | set_row_rc( 79 | vars.default_roll, 80 | vars.default_pitch, 81 | vars.default_yaw, 82 | int(throttle), 83 | vars.default_servo_aux2) 84 | 85 | def go_forward(): 86 | set_row_rc( 87 | vars.default_roll, 88 | vars.default_pitch + 20, 89 | vars.default_yaw, 90 | int(autopilot.state['throttle']), 91 | vars.default_servo_aux2) 92 | 93 | wait_for_execution('go_forward') 94 | 95 | set_row_rc( 96 | vars.default_roll, 97 | vars.default_pitch, 98 | vars.default_yaw, 99 | int(autopilot.state['throttle']), 100 | vars.default_servo_aux2) 101 | 102 | wait_for_execution('go_forward') 103 | 104 | return True 105 | 106 | def deliver(): 107 | set_row_rc( 108 | vars.default_roll, 109 | vars.default_pitch, 110 | vars.default_yaw, 111 | int(autopilot.state['throttle']), 112 | 2000) # 2000 to open the servo-device (to deliver the bomb) 113 | 114 | wait_for_execution('deliver') 115 | return True -------------------------------------------------------------------------------- /messages.py: -------------------------------------------------------------------------------- 1 | import logger 2 | 3 | main_autopilot_started = { 4 | "log_info": "[AUTOPILOT STARTED]", 5 | "console": "\033[93m[AUTOPILOT STARTED]\033[0m" 6 | } 7 | 8 | main_stopping_threads = { 9 | "log_info": "[STOPPING THREADS]", 10 | "console": "\033[93m[STOPPING THREADS]\033[0m" 11 | } 12 | 13 | command_executor_done = { 14 | "log_info": "thread \'Command executor\', DONE.", 15 | "console": "thread \033[93mCommand executor\033[0m, DONE at {0}." 16 | } 17 | 18 | command_executor_connected = { 19 | "log_info": "MSP connection is established: '{0}'", 20 | "console": "MSP connection is established: \033[92m{0}\033[0m" 21 | } 22 | 23 | command_executor_executing_command = { 24 | "log_debug": "Executing command: {0}, Priority: {1}, Body: {2}", 25 | "console": "Executing command: {0}, Priority: {1}, Body: {2}" 26 | } 27 | 28 | command_monitor_log = { 29 | "log_debug": "Monitoring: {0}", 30 | "console": "Monitoring: {0}" 31 | } 32 | 33 | command_telemetry_log = { 34 | "log_debug": "Telemetry: {0}", 35 | "console": "Telemetry: {0}" 36 | } 37 | 38 | command_monitor_current_rssi_and_battery = { 39 | "log_info": "RSSI: {0}, signal: {1}, battery voltage: {2}V", 40 | "console": "\033[93m[RSSI: {0}, signal: {1}, battery voltage: {2}V]\033[0m" 41 | } 42 | 43 | command_telemetry_current_speed = { 44 | "log_info": "Current speed [{0} m/s]", 45 | "console": "current speed: - \033[93m[{0} m/s]\033[0m" 46 | } 47 | 48 | command_telemetry_current_altitude = { 49 | "log_info": "Current altitude [{0} m]", 50 | "console": "current altitude: - \033[93m[{0} m]\033[0m" 51 | } 52 | 53 | command_telemetry_autopilot_state = { 54 | "log_info": "Autopilot state: {0}", 55 | "console": "AUTOPILOT STATE: \033[95m{0}\033[0m" 56 | } 57 | 58 | bee_state_changed_to = { 59 | "log_info": "Bee state changed to [{0}]", 60 | "console": "Bee state changed to [{0}]" 61 | } 62 | 63 | initializing_autopilot = { 64 | "log_info": "Initializing autopilot", 65 | "console": "Initializing autopilot" 66 | } 67 | 68 | command_deliver_we_are_going_forward = { 69 | "log_info": "[We are going forward for 2 sec]", 70 | "console": "[We are going forward for 2 sec]" 71 | } 72 | 73 | command_deliver_we_are_delivering = { 74 | "log_info": "[We are delivering package]", 75 | "console": "[We are delivering package]" 76 | } 77 | 78 | command_deliver_mission_completed = { 79 | "log_info": "[MISSION COMPLETED]", 80 | "console": "\033[93mMISSION COMPLETED\033[0m" 81 | } 82 | 83 | telemetry_requestor_done = { 84 | "log_info": "thread \'Telemetry requestor\', DONE.", 85 | "console": "thread \033[93mTelemetry requestor\033[0m, DONE at {0}." 86 | } 87 | 88 | empty_pilot_process_done = { 89 | "log_info": "thread \'Empty pilot process\', DONE.", 90 | "console": "thread \033[93mEmpty pilot process\033[0m, DONE at {0}." 91 | } 92 | 93 | empty_pilot_process_connecting = { 94 | "log_info": "Empty pilot: attempting to connect with '{0}'", 95 | "console": "Empty pilot: attempting to connect with \033[91m{0}\033[0m" 96 | } 97 | 98 | empty_pilot_process_connected = { 99 | "log_info": "Empty pilot: connected with '{0}'", 100 | "console": "Empty pilot: connected with \033[92m{0}\033[0m" 101 | } 102 | 103 | telemetry_process_connecting = { 104 | "log_info": "Telemetry: attempting to connect with '{0}'", 105 | "console": "Telemetry: attempting to connect with \033[91m{0}\033[0m" 106 | } 107 | 108 | telemetry_reconnection = { 109 | "log_info": "Telemetry: attempting to reconnect because of exception: '{0}'", 110 | "console": "Telemetry: attempting to reconnect because of exception: \033[91m{0}\033[0m" 111 | } 112 | 113 | telemetry_process_connected = { 114 | "log_info": "Telemetry: connected with '{0}'", 115 | "console": "Telemetry: connected with \033[92m{0}\033[0m" 116 | } 117 | 118 | fatal_error = { 119 | "log_fatal": "{0}" 120 | } 121 | 122 | main_autopilot_finished = { 123 | "log_info": "[AUTOPILOT FINISHED]", 124 | "console": "\033[93m[AUTOPILOT FINISHED]\033[0m" 125 | } 126 | 127 | def display(msg, params=[]): 128 | if msg.get('log_info'): 129 | logger.log_message(None, msg['log_info'].format(*params), 'info') 130 | if msg.get('log_debug'): 131 | logger.log_message(None, msg['log_debug'].format(*params), 'debug') 132 | if msg.get('log_fatal'): 133 | logger.log_message(None, msg['log_fatal'].format(*params), 'fatal') 134 | if msg.get('console'): 135 | print(msg['console'].format(*params)) -------------------------------------------------------------------------------- /router.py: -------------------------------------------------------------------------------- 1 | import time 2 | import struct 3 | import queue 4 | import messages 5 | import autopilot 6 | 7 | import commands as mavs 8 | import definitions as vars 9 | 10 | command_queue = queue.PriorityQueue() 11 | 12 | class Command: 13 | def __init__(self, priority, name, body): 14 | self.priority = priority 15 | self.name = name 16 | self.body = body 17 | 18 | def __lt__(self, other): 19 | return self.priority < other.priority 20 | 21 | def put_command(command): 22 | command_queue.put(command) 23 | 24 | def command_executor(stop_command): 25 | connection = False 26 | while not connection and not stop_command.is_set(): 27 | try: 28 | time.sleep(2) 29 | mavs.connect() 30 | messages.display(messages.command_executor_connected, [vars.companion_computer]) 31 | connection = True 32 | autopilot.state['connection'] = True 33 | except Exception as e: 34 | messages.display(messages.fatal_error, [e]) 35 | pass 36 | 37 | while not stop_command.is_set(): 38 | try: 39 | command = command_queue.get(timeout=1) 40 | execute_command(command) 41 | command_queue.task_done() 42 | time.sleep(1) 43 | except: 44 | pass 45 | 46 | stopped_time = time.strftime("%H:%M:%S, %Y, %d %B", time.localtime()) 47 | messages.display(messages.command_executor_done, [stopped_time]) 48 | 49 | def execute_command(command): 50 | messages.display(messages.command_executor_executing_command, 51 | [command.name, command.priority, command.body]) 52 | 53 | if command.name in commands: 54 | commands[command.name](command.body) 55 | 56 | def command_monitor(params): 57 | monitor = mavs.telemetry(params['target']) 58 | messages.display(messages.command_monitor_log, [monitor]) 59 | 60 | rssi_bytes = monitor[3:5] 61 | rssi = struct.unpack(' 100: 68 | autopilot.state['rssi_msg'] = 'Strong signal' 69 | else: 70 | autopilot.state['rssi_msg'] = 'No signal' 71 | 72 | messages.display( 73 | messages.command_monitor_current_rssi_and_battery, 74 | [rssi, autopilot.state['rssi_msg'], battery_voltage]) 75 | 76 | def command_telemetry_viable_status(telemetry): 77 | altitude = struct.unpack(' 1: 82 | messages.display( 83 | messages.command_telemetry_current_speed, 84 | [speed]) 85 | if altitude > 1: 86 | messages.display( 87 | messages.command_telemetry_current_altitude, 88 | [altitude]) 89 | 90 | def command_telemetry_mode_change(telemetry): 91 | previous_throttle = autopilot.state['throttle'] 92 | rc_chs = struct.unpack('<' + 'H' * (len(telemetry) // 2), telemetry) 93 | 94 | autopilot.state['roll'] = rc_chs[0] 95 | autopilot.state['pitch'] = rc_chs[1] 96 | autopilot.state['yaw'] = rc_chs[2] 97 | autopilot.state['throttle'] = rc_chs[3] 98 | autopilot.state['aux1'] = rc_chs[4] 99 | autopilot.state['aux2'] = rc_chs[5] 100 | autopilot.state['aux3'] = rc_chs[6] 101 | autopilot.state['aux4'] = rc_chs[7] 102 | 103 | aux3_raw = int(autopilot.state['aux3']) 104 | autopilot_mode = autopilot.state['bee_state'] 105 | if aux3_raw == 1000: 106 | autopilot_mode = 'OFF' 107 | elif aux3_raw == 1503: 108 | mavs.prepare_go_forward(previous_throttle) 109 | time.sleep(0.1) 110 | elif aux3_raw == 2000: 111 | autopilot_mode = 'READY' 112 | 113 | if autopilot_mode != autopilot.state['bee_state']: 114 | autopilot.state['bee_state'] = autopilot_mode 115 | messages.display( 116 | messages.bee_state_changed_to, [autopilot_mode]) 117 | command_queue.queue.clear() 118 | 119 | def command_telemetry(params): 120 | try: 121 | telemetry = mavs.telemetry(params['target']) 122 | messages.display(messages.command_telemetry_log, [telemetry]) 123 | 124 | if telemetry != {}: 125 | if params['target'] == 'MSP_ALTITUDE': 126 | command_telemetry_viable_status(telemetry) 127 | if params['target'] == 'MSP_RC': 128 | command_telemetry_mode_change(telemetry) 129 | 130 | messages.display( 131 | messages.command_telemetry_autopilot_state, 132 | [autopilot.state]) 133 | except Exception as ex: 134 | messages.display( 135 | messages.telemetry_reconnection, [ex]) 136 | # In case of any error we will reboot connection 137 | mavs.reboot() 138 | 139 | 140 | def command_init(params): 141 | messages.display(messages.initializing_autopilot) 142 | mavs.copter_init() 143 | 144 | def command_deliver(params): 145 | delivered = autopilot.state['delivered'] 146 | altitude = autopilot.state['altitude'] 147 | speed = autopilot.state['speed'] 148 | 149 | if delivered == False: 150 | # Don't go forward if drone is landed 151 | if altitude == 0: 152 | return 153 | 154 | if mavs.go_forward(): 155 | messages.display( 156 | messages.command_deliver_we_are_going_forward) 157 | if mavs.deliver(): 158 | messages.display( 159 | messages.command_deliver_we_are_delivering) 160 | autopilot.state['delivered'] = True 161 | messages.display( 162 | messages.command_deliver_mission_completed) 163 | command_queue.queue.clear() 164 | 165 | commands = { 166 | 'INIT': command_init, 167 | 'MONITOR': command_monitor, 168 | 'TELEMETRY': command_telemetry, 169 | 'DELIVER':command_deliver, 170 | } -------------------------------------------------------------------------------- /README_DEV.md: -------------------------------------------------------------------------------- 1 | # Empty Autopilot for FPV Combat Drone on Betaflight (Guide for Developers) 2 | 3 | ## Architecture 4 | The Autopilot "BEE EMPTY" has a multi-threaded architecture. At its core, it has a command queue and a command router which is responsible for processing all queued commands. The router operates within its own thread, called the `Router thread`, while two other processes — the `Telemetry thread` and the `Empty pilot thread` — simply append commands to the queue. 5 | 6 | ![image](assets/architecture.png) 7 | 8 | The `Telemetry thread` is responsible for queuing commands for system monitoring and telemetry requests. It supplies the Autopilot with essential data, including current altitude, aircraft speed, and the real-time values of RC channels. Telemetry requests are added to the queue every 2 seconds. 9 | 10 | The `Empty pilot thread` is responsible for queuing commands related to payload delivery (e.g., bomb deployment). These commands are added to the queue every second. 11 | 12 | During operation, the Autopilot utilizes the `MSP helper`, a set of functions designed to `request MSP data` and `execute MSP commands`. These [MSP commands](http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol) are used to control the FPV drone and its peripheral devices by leveraging the `MSP OVERRIDE` feature in Betaflight. 13 | 14 | ## main.py and threads 15 | The `main.py` file is the primary entry point for launching the Autopilot. To ensure proper execution, follow the `RPi Configuration` guidelines provided in [README.md](README.md). Upon startup, it sets up the command queue, initializes the sub-processes (threads) described above, and enqueues the `INIT` command to begin the Autopilot initialization process. 16 | 17 | ## Autopilot state and settings 18 | Autopilot has a few files which describes it initial state [autopilot.py](autopilot.py) and settings [definitions.py](definitions.py). 19 | ```python 20 | state = { 21 | 'connection' : False, 22 | 'bee_state' : 'OFF', # OFF, READY 23 | 'roll': 1500, 24 | 'pitch': 1500, 25 | 'yaw': 1500, 26 | 'throttle': 1100, 27 | 'aux1': 1000, 28 | 'aux2': 1000, 29 | 'aux3': 1000, 30 | 'aux4': 1000, 31 | 'battery': 0, 32 | 'rssi':0, 33 | 'rssi_msg':'No signal', 34 | 'speed': 0, 35 | 'altitude': 0, 36 | 'delivered': False 37 | } 38 | ``` 39 | The `Autopilot state`, as listed above, is utilized for Autopilot operations and encompasses vital parameters that can be changed during program execution. 40 | 41 | - **`connection`**: Indicates the connection status with the FPV Drone. Initially set to `False` upon establishment of the connection. 42 | - **`bee_state`**: Represents the current mode of operation, which can be set to one of the following states: `OFF` or `READY`. For more details, refer to the introduction section of [README.md](README.md). 43 | - **`roll`**, **`pitch`**, **`yaw`**, **`throttle`**, **`aux1`**, **`aux2`**, **`aux3`**, **`aux4`**: Represent the current values of the basic RC channels. 44 | - **`battery`**: Displays the current battery voltage. 45 | - **`rssi`** and **`rssi_msg`**: Show the current RC signal strength and its corresponding text caption. 46 | - **`speed`** and **`altitude`**: Reflect the current speed and altitude of the drone, respectively. 47 | - **`delivered`**: Indicates whether the bomb (payload) has been released. Initially set to `False` until the payload is delivered. 48 | 49 | ```python 50 | companion_computer = '/dev/ttyACM0' # COM3 (for Windows) 51 | companion_baud_rate = 115200 52 | logger_name = 'BEE-EPT-UA913' 53 | logger_directory = '/home/pi/bee_ept/logs' # logs (for Windows) 54 | 55 | default_roll = 1500 56 | default_pitch = 1500 57 | default_yaw = 1500 58 | default_throttle = 1000 59 | default_servo_aux2 = 1000 60 | ``` 61 | 62 | The `Autopilot settings` outlined above are used for Autopilot operations. They include configurations for default RC values in `MSP OVERRIDE` mode, log file path, connection parameters, and more. 63 | 64 | - **`companion_computer`**: Defines the communication port on the Raspberry Pi used to connect with the Flight Controller (FC). 65 | - **`companion_baud_rate`**: Specifies the baud rate of the COM port used for communication. 66 | - **`logger_name`**: Sets the name of the logger associated with the Autopilot, such as `'BEE-EPT-UA913'`. 67 | - **`logger_directory`**: Specifies the directory path where log files are stored. 68 | - **`default_roll`**, **`default_pitch`**, **`default_yaw`**, **`default_throttle`**, and **`default_servo_aux2`**: Define the initial values for RC channels utilized by the `MSP OVERRIDE` feature when the Autopilot gains control on flight operations. 69 | 70 | ## Messages and logger 71 | The application includes predefined messages for various situations and a list of designated targets to receive notifications. Messages can be directed to the application console, the log file, or both simultaneously. This functionality is implemented in [messages.py](messages.py). Additionally, [logger.py](logger.py) handles logging messages into a log file, which is useful for analyzing Autopilot flight operations. 72 | 73 | Logs (**LOG files**) are saved in the `Logs` directory. 74 | 75 | ## MSP commands 76 | Communication between the companion computer (Autopilot) and the FPV Combat Drone is managed through `MSP commands`, which are defined in the [commands.py](commands.py) file. These commands handle various functions, including telemetry requests, system monitoring, as well as controlling the drone's movement and delivering the payload (bomb). 77 | 78 | Each command typically has an associated delay period, indicating the time the system router must wait before executing the next command. These delays are specified within the `command_delays` object. 79 | 80 | ## Router 81 | As described in the `Architecture` section, the [router](router.py) (also known as the `Command Executor`) is the central component of the application, responsible for managing all commands added to the command queue. Currently, it recognizes the following list of commands: 82 | ```python 83 | commands = { 84 | 'INIT': command_init, 85 | 'MONITOR': command_monitor, 86 | 'TELEMETRY': command_telemetry, 87 | 'DELIVER':command_deliver, 88 | } 89 | ``` 90 | 91 | - **INIT**: Initializes the FPV Drone. 92 | - **MONITOR**: Retrieves system status from the FPV Drone, including battery voltage. 93 | - **TELEMETRY**: Fetches the current speed and altitude, as well as the current values of `RC channels`. 94 | - **DELIVER**: Initiates the delivery scenario for the **Empty Autopilot** (2 seconds forward and payload delivery). 95 | 96 | Each command method contains embedded logic, sends messages to designated targets, and executes the appropriate MSP commands. 97 | 98 | ## MSP Helper 99 | The Autopilot utilizes the `MSP OVERRIDE` feature in Betaflight, which is based on the MSP protocol described in the [MSP Protocol documentation](http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol). The [MSP helper](msp_helper.py) provides a convenient interface for sending MSP requests and commands, retrieving MSP responses, and handling the checksum for each message. 100 | 101 | ## What you can do with this Autopilot? 102 | This `Empty version` is designed as an initial template to kickstart your own R&D program for **autonomous FPV Combat drones**. By contributing to #SupportUkraine, you can enhance this FPV autopilot with computer vision and target-following capabilities. Here's what you can do to achieve that: 103 | - Explore the initial autopilot template to understand its structure and approaches. 104 | - Create your own `computer vision model` to recognize targets such as **tanks, soldiers, and more**. For details, check out the article [DIY for a Spy: Utilizing YOLOv8 Object Detection in Military Operations](https://medium.com/@dmytrosazonov/diy-for-a-spy-utilizing-yolov8-object-detection-in-military-operations-053d787b6f62). 105 | - Build `FPV goggles overlay` grabbing AV output from the FPV camera, analyze the video on a Raspberry Pi, and transmit the altered video feed to the Flight Controller (FC). This will allow you to get imagery for object detection and overlay operational messages. Check the [Video-overlay feature for RPi](https://gist.github.com/under0tech/6360ffea697f2f2f9f8d0d5b70148ef0) and its related article [How to build the Eyes of an Autopilot for FPV Combat Drone](https://medium.com/@dmytrosazonov/how-to-build-the-eyes-of-an-autopilot-for-fpv-combat-drone-bbf13d605a9f). 106 | - Develop your `target-following feature` and integrate it into your autopilot. For an example, refer to the article [How to Build an Autopilot with Computer Vision and Target Following for FPV Combat Drone](https://medium.com/@dmytrosazonov/how-to-build-an-autopilot-with-computer-vision-and-target-following-for-fpv-combat-drone-3544f482baae). 107 | - Test the final device, document its usage, and send it to the **Ukrainian army** for use in combat operations. 108 | 109 | ## Get in touch 110 | Text me on Twitter if you have any related questions. 111 | https://twitter.com/dmytro_sazonov 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Autopilot for FPV Combat Drone on Betaflight (Empty version) 2 | 3 | ## Autopilot "BEE EMPTY" 4 | The "BEE EMPTY" autopilot, designed for installation on a companion computer connected to an FPV combat drone, provides basic autonomous functionality. It `enables the drone to fly forward for 2 seconds and then release its payload (bomb)`. This **`"empty system"`** serves as a development template and is ideal for autopilot developers looking to kickstart their own projects, particularly those aimed at implementing target-following capabilities based on computer vision or developing features to avoid interferences during FPV drone flight. This is not a final solution but a good start for devs. 5 | 6 | This code is largely adapted from another repository, [Autopilot with Target Following for FPV Combat Drone (Simulator version)](https://github.com/under0tech/autopilot_bee_sim), but is designed to work on real hardware, specifically a Raspberry Pi mounted on an FPV drone with [Betaflight firmware](https://app.betaflight.com) pre-installed. 7 | 8 | This **`"empty version"`** has certain limitations, as features like computer vision, target following, and anti-drone system detection are not implemented. 9 | 10 | ### MODES: 11 | `OFF`  -  autopilot remains inactive, awaiting operator input to switch to another mode. During this state, only telemetry monitoring and logging are active. 12 | 13 | `READY`  -  Activates basic functionality, where the drone flies forward for 2 seconds and releases its payload (e.g., a bomb). 14 | 15 | ## FPV Drone Configuration 16 | For the purposes of this template, I am using the **Aocoda F460 Stack**, a top-tier flight control system that includes the `Aocoda F405 v2 Flight Controller (FC)` and the `3060S (60A) Electronic Speed Controller (ESC)`. The wiring diagram in the image below shows the components, such as a servo module, video camera, VTX, ELRS receiver, and Raspberry Pi, which are connected to the FC. 17 | 18 | ![image](assets/wiring_diagram.png) 19 | 20 | The flight controller connects to its ESC via an 8-pin wire, which requires no further explanation. 21 | 22 | The diagram above shows the connections between various components and the Aocoda F405 flight controller. These components include a video camera, drop system, VTX (video transmitter), ELRS (ExpressLRS) receiver, and a Raspberry Pi (acting as a companion computer). Below are the specific wiring details for each component: 23 | - **Video Camera**: yellow (CAM), red (5V), and black (GND) 24 | - **Drop System**: red (5V), black (GND), and pink (S5). S5 is associated with SERVO1 on the FC. 25 | - **VTX**: red (9V), black (GND), green (VTX), and blue (T4). Pin T4 (TX on UART 4) connects to appropriate RX on the Video transmitter. 26 | - **ELRS Receiver**: red (4.5V), black (GND), blue (T2), and blue (R2). T2 and R2 on the FC associates with UART2 and connects to opposite pins on the ELRS receiver. T2 to RX and R2 to TX. 27 | - **Raspberry Pi (RPi)**: Type-C to USB cable connects FC with Raspberry Pi (for MSP protocol). 28 | 29 | More details on soldering components and building FPV drone from scratch you can find in the article ["How to Build an FPV Combat Drone to Defend Your Country"](https://medium.com/@dmytrosazonov/how-to-build-an-fpv-combat-drone-for-military-purposes-ce549f24efca). 30 | 31 | ## Betaflight Configuration 32 | [Betaflight Configurator](https://app.betaflight.com) is an essential tool for configuring your FPV drone. While I won't be providing all the specific settings required for your FPV drone — those are detailed in the article mentioned above. In this section, I am covering the essential settings you need to adjust in `Betaflight Configurator` to ensure compatibility with the source code provided in this repository. 33 | 34 | 1. Make sure to properly configure your ports. Pay special attention to the `Rx port` corresponding to the receiver, the `VTX` in the peripherals section, and ensure the standard USB port is reserved for `'Configuration/MSP'`, as shown in the image below. 35 | 36 | ![image](assets/bf_4_6_0_ports.png) 37 | 2. Ensure you have configured all the necessary modes listed below: `ARM`, `ANGLE`, `ALTHOLD`, `BEEPER`, and `MSP OVERRIDE`, assigning each to the appropriate AUX channel on your radio controller. 38 | 39 | `ARM` - Used for arming and disarming the motors. 40 | 41 | `ANGLE` - Enables ANGLE mode, allowing the autopilot control drone in stabilized mode. 42 | 43 | `ALTHOLD` - Maintains the current altitude, preventing altitude loss during flight. 44 | 45 | `BEEPER` - Activates a beeper on the drone, helpful for locating drone in case of an emergency, such as losing it in a wooded area. 46 | 47 | `MSP OVERRIDE` - The most important mode, used to grant autopilot control through toggles set in the **`msp_override_channels_mask`** variable. See below the details. 48 | 49 | ![image](assets/bf_4_6_0_modes.png) 50 | 3. Ensure you have the servo module properly set up. As shown in the image below, I have configured SERVO1 to respond to AUX2 toggling. You should do the same in your setup. For detailed instructions on how to configure the servo, refer to the article I mentioned earlier: ["How to Build an FPV Combat Drone to Defend Your Country"](https://medium.com/@dmytrosazonov/how-to-build-an-fpv-combat-drone-for-military-purposes-ce549f24efca). 51 | 52 | ![image](assets/bf_4_6_0_servos.png) 53 | 4. To enable the ability to add and configure the `MSP OVERRIDE` mode, you need to set the **`msp_override_channels_mask`** variable in the CLI. For purposis of this code, the mask value has been calculated as **`47`**, which corresponds to the bitmask **`00101111`**. 54 | 55 | To set it up, use the following commands: 56 | ```cli 57 | set msp_override_channels_mask = 47 58 | 59 | save 60 | 61 | get msp_override_channels_mask 62 | ``` 63 | 64 | ![image](assets/bf_4_6_0_cli.png) 65 | 66 | Remember to save the configuration after each change by using the `save` command. 67 | 68 | ### MSP OVERRIDE 69 | `MSP OVERRIDE` mode is a feature in Betaflight that allows the autopilot (RPi) to overwrite certain AUX values. When activated, this mode gives the autopilot control over the drone, allowing it to adjust parameters such as ROLL, PITCH, YAW, THROTTLE, and AUX values. We will use this mode to control the drone's direction, speed, overall flight, and to trigger the appropriate servo module associated with SERVO1 (AUX2) in our setup to release the bomb when necessary. 70 | 71 | In Betaflight, the `msp_override_channels_mask` variable defines which channels on your transmitter (radio controller) will be overwritten by the autopilot. For the purposes of this repository, I have reserved the channels for overwriting ROLL, PITCH, YAW, THROTTLE for flight control, and `AUX2` (associated with the `SERVO1` module) to release the bomb. Note that the mask follows a reversed direction logic. See the image below for a better understanding of how this works and why I set the mask value to **`47 (0x00101111)`**. 72 | 73 | ![image](assets/msp_override_mask.png) 74 | 75 | `1` means the override is enabled, and `0` means it is disabled. As shown, we enable control for the first four channels intended for flight control (ROLL, PITCH, YAW, THROTTLE), as well as AUX2, which is responsible for releasing the bomb. 76 | 77 | ## Raspberry Pi Configuration 78 | The Raspberry Pi (RPi) acts as a companion computer in our setup, communicating with the Betaflight firmware on the flight controller (FC) via the [MSP port/protocol](http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol). Although Betaflight is not originally designed for autonomous flights, recent releases introduced a powerful feature that enables the creation autopilots. This feature is called `MSP OVERRIDE` mode. This autopilot program leverages that mode to enable autonomous operation. 79 | 80 | Follow the instructions below to install the autopilot code on the RPi, which will allow you to run basic scenario of Autonomous Flight. 81 | 82 | 1. Download and extract this repository, including the `logs` folder, to the destination `/home/pi/bee-ept` on your Raspberry Pi device. 83 | 2. Copy the files `config/run_autopilot.service` and `config/run_autopilot.sh` to their destination `/etc/systemd/system`, and give them the necessary permissions by running the `sudo chmod +x run_autopilot.sh` command in the bash console. 84 | 3. Enable the Autopilot service to run automatically on RPi startup 85 | 86 | ```bash 87 | sudo systemctl enable run_autopilot.service 88 | reboot 89 | ``` 90 | 4. Go to the `logs` folder, after its restart, and ensure that new files are being generated, indicating everything is working correctly. If not, check the `definitions.py` and adjust the settings as needed. 91 | 92 | ## How to Use 93 | Once all the necessary settings and configurations are complete, it's time to test how everything behaves in real life. I recommend starting the test at home, without propellers, to verify that the scenario works—at the very least, ensure the motors attempt to change their rotation. When you are ready, move to a safe environment, attach the propellers, and proceed to test the next scenario. 94 | 95 | - Check that toggling `AUX2` operates the closing mechanism in the servo module. 96 | - Set up your payload and switch `AUX2` to the closed position. 97 | - Arm the motors using `AUX1` and take off to a safe, observable altitude. 98 | - When the altitude reaches 2m, press `AUX4` to hold the current altitude and switch to `ANGLE` mode. This will help the autopilot fly more safely. 99 | - Move `AUX3` to the middle position and hold it there for a few seconds to allow the autopilot to initialize and prepare for autonomous flight. 100 | - Move `AUX3` to the maximum position to enable `MSP OVERRIDE` mode. The autopilot will then fly forward for 2 seconds. Afterward, it will stop and automatically release the payload on SERVO1. 101 | - At this point, you can take control of the FPV drone by toggling `AUX3` back to the minimal position (switched off) and prepare for landing. 102 | 103 | ![image](assets/IMG_5190.jpg) 104 | 105 | ## Customize this Autopilot 106 | The primary objective of sharing this source code is to extend R&D programs related to automated combat drones within the developer community in Ukraine. This initiative aims to establish a strategic advantage on the frontline by implementing automated flight systems equipped with computer vision on widely-spread FPV drones to increase support for the Ukrainian army. 107 | 108 | If you are a developer or possess programming skills, this code serves as a template for building your own autopilot compatible with [Betaflight firmware](https://app.betaflight.com). Start with this template and expand it by adding features such as computer vision, target tracking, cruise control, and more. For comprehensive developer instructions, look to [README_DEV.md](README_DEV.md) or to the [guide on Medium](https://medium.com/@dmytrosazonov/fpv-autonomous-operation-with-betaflight-and-raspberry-pi-0caeb4b3ca69). 109 | 110 | By creating autopilots, initiating production, and supplying FPV drones to the Ukrainian army, you will actively #SupportUkraine. 111 | 112 | ## Troubleshooting 113 | Be patient while soldering, building an FPV drone, and setting up the configuration in Betaflight and then in the Raspberry Pi (Rpi). There are plenty of pitfalls and possible issues that may require your attention and time to resolve. This is okay. It took me months to set up and test everything that you have now. 114 | 115 | ## Get in touch 116 | Message me on Twitter if you have questions or need some clarifications. 117 | https://twitter.com/dmytro_sazonov 118 | -------------------------------------------------------------------------------- /logs/log_2025-01-15_02-12-52.log: -------------------------------------------------------------------------------- 1 | 2025-01-15 02:12:52,589 - BEE-EPT-UA913 - INFO - [AUTOPILOT STARTED] 2 | 2025-01-15 02:12:54,600 - BEE-EPT-UA913 - INFO - MSP connection is established: '/dev/ttyACM0' 3 | 2025-01-15 02:12:54,601 - BEE-EPT-UA913 - DEBUG - Executing command: INIT, Priority: 0, Body: {} 4 | 2025-01-15 02:12:54,601 - BEE-EPT-UA913 - INFO - Initializing autopilot 5 | 2025-01-15 02:12:57,600 - BEE-EPT-UA913 - INFO - Telemetry: attempting to connect with '/dev/ttyACM0' 6 | 2025-01-15 02:12:57,600 - BEE-EPT-UA913 - INFO - Telemetry: connected with '/dev/ttyACM0' 7 | 2025-01-15 02:12:57,601 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 8 | 2025-01-15 02:12:58,705 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xb0\x04r\x06\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05' 9 | 2025-01-15 02:12:58,706 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 1200, 'aux1': 1650, 'aux2': 1500, 'aux3': 1500, 'aux4': 1500, 'battery': 0, 'rssi': 0, 'rssi_msg': 'No signal', 'speed': 0, 'altitude': 0, 'delivered': False} 10 | 2025-01-15 02:12:59,604 - BEE-EPT-UA913 - INFO - Empty pilot: attempting to connect with '/dev/ttyACM0' 11 | 2025-01-15 02:12:59,604 - BEE-EPT-UA913 - INFO - Empty pilot: connected with '/dev/ttyACM0' 12 | 2025-01-15 02:12:59,706 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 13 | 2025-01-15 02:13:00,809 - BEE-EPT-UA913 - DEBUG - Telemetry: b'4\x00\x00\x00\x00\x00' 14 | 2025-01-15 02:13:00,810 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 1200, 'aux1': 1650, 'aux2': 1500, 'aux3': 1500, 'aux4': 1500, 'battery': 0, 'rssi': 0, 'rssi_msg': 'No signal', 'speed': 0.0, 'altitude': 0.52, 'delivered': False} 15 | 2025-01-15 02:13:01,813 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 16 | 2025-01-15 02:13:02,918 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xb0\x04r\x06\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05' 17 | 2025-01-15 02:13:02,919 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 1200, 'aux1': 1650, 'aux2': 1500, 'aux3': 1500, 'aux4': 1500, 'battery': 0, 'rssi': 0, 'rssi_msg': 'No signal', 'speed': 0.0, 'altitude': 0.52, 'delivered': False} 18 | 2025-01-15 02:13:03,919 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 19 | 2025-01-15 02:13:05,027 - BEE-EPT-UA913 - DEBUG - Telemetry: b',\x00\x00\x00\x00\x00' 20 | 2025-01-15 02:13:05,028 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 1200, 'aux1': 1650, 'aux2': 1500, 'aux3': 1500, 'aux4': 1500, 'battery': 0, 'rssi': 0, 'rssi_msg': 'No signal', 'speed': 0.0, 'altitude': 0.44, 'delivered': False} 21 | 2025-01-15 02:13:06,028 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 22 | 2025-01-15 02:13:07,132 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xb0\x04r\x06\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05\xdc\x05' 23 | 2025-01-15 02:13:07,133 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 1200, 'aux1': 1650, 'aux2': 1500, 'aux3': 1500, 'aux4': 1500, 'battery': 0, 'rssi': 0, 'rssi_msg': 'No signal', 'speed': 0.0, 'altitude': 0.44, 'delivered': False} 24 | 2025-01-15 02:13:08,134 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 25 | 2025-01-15 02:13:09,237 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc8\x01\x00\x00\x00\x0e\x00\xcd\x07' 26 | 2025-01-15 02:13:09,237 - BEE-EPT-UA913 - INFO - RSSI: 0, signal: No signal, battery voltage: 20.0V 27 | 2025-01-15 02:13:10,238 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 28 | 2025-01-15 02:13:11,342 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 29 | 2025-01-15 02:13:11,342 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 0, 'rssi_msg': 'No signal', 'speed': 0.0, 'altitude': 0.44, 'delivered': False} 30 | 2025-01-15 02:13:12,343 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 31 | 2025-01-15 02:13:13,447 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc8\x01\x00\xba\x03\x0e\x00\xcd\x07' 32 | 2025-01-15 02:13:13,448 - BEE-EPT-UA913 - INFO - RSSI: 954, signal: Strong signal, battery voltage: 20.0V 33 | 2025-01-15 02:13:14,448 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 34 | 2025-01-15 02:13:15,552 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 35 | 2025-01-15 02:13:15,553 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 954, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.44, 'delivered': False} 36 | 2025-01-15 02:13:16,553 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 37 | 2025-01-15 02:13:17,656 - BEE-EPT-UA913 - DEBUG - Telemetry: b',\x00\x00\x00\x00\x00' 38 | 2025-01-15 02:13:17,657 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 954, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.44, 'delivered': False} 39 | 2025-01-15 02:13:18,658 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 40 | 2025-01-15 02:39:06,339 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 41 | 2025-01-15 02:39:06,344 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 954, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.44, 'delivered': False} 42 | 2025-01-15 02:39:07,345 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 43 | 2025-01-15 02:39:08,448 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xe9\xff\xff\xff\x00\x00' 44 | 2025-01-15 02:39:08,449 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 954, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 45 | 2025-01-15 02:39:09,450 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 46 | 2025-01-15 02:39:10,554 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 47 | 2025-01-15 02:39:10,554 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 2000, 'battery': 20.0, 'rssi': 954, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 48 | 2025-01-15 02:39:11,558 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 49 | 2025-01-15 02:39:14,879 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc8\x01\x00\xb9\x03\x0c\x00\xcb\x07' 50 | 2025-01-15 02:39:14,958 - BEE-EPT-UA913 - INFO - RSSI: 953, signal: Strong signal, battery voltage: 20.0V 51 | 2025-01-15 02:39:15,959 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 52 | 2025-01-15 02:39:17,063 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 53 | 2025-01-15 02:39:17,063 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 2000, 'battery': 20.0, 'rssi': 953, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 54 | 2025-01-15 02:39:18,064 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 55 | 2025-01-15 02:39:19,167 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 56 | 2025-01-15 02:39:19,168 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 953, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 57 | 2025-01-15 02:39:20,168 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 58 | 2025-01-15 02:39:21,271 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc8\x02\x00\x92\x03\x12\x00\xcb\x07' 59 | 2025-01-15 02:39:21,271 - BEE-EPT-UA913 - INFO - RSSI: 914, signal: Strong signal, battery voltage: 20.0V 60 | 2025-01-15 02:39:22,272 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 61 | 2025-01-15 02:39:23,377 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 62 | 2025-01-15 02:39:23,378 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 914, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 63 | 2025-01-15 02:39:24,379 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 64 | 2025-01-15 02:39:25,485 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 65 | 2025-01-15 02:39:25,485 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 20.0, 'rssi': 914, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 66 | 2025-01-15 02:39:26,486 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 67 | 2025-01-15 02:39:27,590 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc7\x02\x00\xb2\x03 \x00\xc9\x07' 68 | 2025-01-15 02:39:27,591 - BEE-EPT-UA913 - INFO - RSSI: 946, signal: Strong signal, battery voltage: 19.9V 69 | 2025-01-15 02:39:28,592 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 70 | 2025-01-15 02:39:29,697 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 71 | 2025-01-15 02:39:29,698 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 946, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': -0.23, 'delivered': False} 72 | 2025-01-15 02:39:30,699 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 73 | 2025-01-15 02:39:31,803 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\x01\x00\x00\x00\x00\x00' 74 | 2025-01-15 02:39:31,803 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 946, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.01, 'delivered': False} 75 | 2025-01-15 02:39:32,804 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 76 | 2025-01-15 02:39:33,910 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 77 | 2025-01-15 02:39:33,911 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 946, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.01, 'delivered': False} 78 | 2025-01-15 02:39:34,911 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 79 | 2025-01-15 02:39:36,015 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\x03\x00\x00\x00\x02\x00' 80 | 2025-01-15 02:39:36,016 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 946, 'rssi_msg': 'Strong signal', 'speed': 0.02, 'altitude': 0.03, 'delivered': False} 81 | 2025-01-15 02:39:37,016 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 82 | 2025-01-15 02:39:38,122 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 83 | 2025-01-15 02:39:38,123 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 2000, 'battery': 19.9, 'rssi': 946, 'rssi_msg': 'Strong signal', 'speed': 0.02, 'altitude': 0.03, 'delivered': False} 84 | 2025-01-15 02:39:39,123 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 85 | 2025-01-15 02:39:40,227 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc7\x04\x00\xb1\x03 \x00\xc4\x07' 86 | 2025-01-15 02:39:40,228 - BEE-EPT-UA913 - INFO - RSSI: 945, signal: Strong signal, battery voltage: 19.9V 87 | 2025-01-15 02:39:41,229 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 88 | 2025-01-15 02:39:42,334 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 89 | 2025-01-15 02:39:42,335 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 0.02, 'altitude': 0.03, 'delivered': False} 90 | 2025-01-15 02:39:43,336 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 91 | 2025-01-15 02:39:44,439 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\x19\x00\x00\x00\x00\x00' 92 | 2025-01-15 02:39:44,440 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.25, 'delivered': False} 93 | 2025-01-15 02:39:45,441 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 94 | 2025-01-15 02:39:46,547 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xdf\x05\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 95 | 2025-01-15 02:39:47,675 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1503, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.25, 'delivered': False} 96 | 2025-01-15 02:39:48,676 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 97 | 2025-01-15 02:39:49,781 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xdf\x05\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 98 | 2025-01-15 02:39:50,906 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1503, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.25, 'delivered': False} 99 | 2025-01-15 02:39:51,907 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 100 | 2025-01-15 02:39:53,011 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xf0\xff\xff\xff\xf9\xff' 101 | 2025-01-15 02:39:53,011 - BEE-EPT-UA913 - INFO - Current speed [655.29 m/s] 102 | 2025-01-15 02:39:53,012 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1503, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 655.29, 'altitude': -0.16, 'delivered': False} 103 | 2025-01-15 02:39:54,013 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 104 | 2025-01-15 02:39:55,118 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xd0\x07\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 105 | 2025-01-15 02:39:55,119 - BEE-EPT-UA913 - INFO - Bee state changed to [READY] 106 | 2025-01-15 02:39:55,119 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 2000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 655.29, 'altitude': -0.16, 'delivered': False} 107 | 2025-01-15 02:39:56,182 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 108 | 2025-01-15 02:39:57,288 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xd0\x07\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 109 | 2025-01-15 02:39:57,288 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 2000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 655.29, 'altitude': -0.16, 'delivered': False} 110 | 2025-01-15 02:39:58,289 - BEE-EPT-UA913 - DEBUG - Executing command: DELIVER, Priority: 1, Body: {} 111 | 2025-01-15 02:40:04,311 - BEE-EPT-UA913 - INFO - [We are going forward for 2 sec] 112 | 2025-01-15 02:40:06,318 - BEE-EPT-UA913 - INFO - [We are delivering package] 113 | 2025-01-15 02:40:06,319 - BEE-EPT-UA913 - INFO - [MISSION COMPLETED] 114 | 2025-01-15 02:40:08,183 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 115 | 2025-01-15 02:40:09,289 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xd0\x07\xd0\x07\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 116 | 2025-01-15 02:40:09,289 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 2000, 'aux3': 2000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 655.29, 'altitude': -0.16, 'delivered': True} 117 | 2025-01-15 02:40:10,290 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 118 | 2025-01-15 02:40:11,394 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xfb\xff\xff\xff\xce\xff' 119 | 2025-01-15 02:40:11,395 - BEE-EPT-UA913 - INFO - Current speed [654.86 m/s] 120 | 2025-01-15 02:40:11,395 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 2000, 'aux3': 2000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 654.86, 'altitude': -0.05, 'delivered': True} 121 | 2025-01-15 02:40:12,396 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 122 | 2025-01-15 02:40:13,501 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xd0\x07\xd0\x07\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 123 | 2025-01-15 02:40:13,502 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 2000, 'aux3': 2000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 654.86, 'altitude': -0.05, 'delivered': True} 124 | 2025-01-15 02:40:14,503 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 125 | 2025-01-15 02:40:15,606 - BEE-EPT-UA913 - DEBUG - Telemetry: b'-\x00\x00\x00\xf6\xff' 126 | 2025-01-15 02:40:15,607 - BEE-EPT-UA913 - INFO - Current speed [655.26 m/s] 127 | 2025-01-15 02:40:15,608 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 2000, 'aux3': 2000, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 655.26, 'altitude': 0.45, 'delivered': True} 128 | 2025-01-15 02:40:16,608 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 129 | 2025-01-15 02:40:17,714 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xdf\x05\xd0\x07\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 130 | 2025-01-15 02:40:18,827 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'READY', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1503, 'aux4': 2000, 'battery': 19.9, 'rssi': 945, 'rssi_msg': 'Strong signal', 'speed': 655.26, 'altitude': 0.45, 'delivered': True} 131 | 2025-01-15 02:40:19,828 - BEE-EPT-UA913 - DEBUG - Executing command: MONITOR, Priority: 2, Body: {'target': 'MSP_ANALOG'} 132 | 2025-01-15 02:40:20,932 - BEE-EPT-UA913 - DEBUG - Monitoring: b'\xc7\x08\x00\xb6\x03(\x00\xc2\x07' 133 | 2025-01-15 02:40:20,932 - BEE-EPT-UA913 - INFO - RSSI: 950, signal: Strong signal, battery voltage: 19.9V 134 | 2025-01-15 02:40:21,933 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 135 | 2025-01-15 02:40:23,039 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 136 | 2025-01-15 02:40:23,039 - BEE-EPT-UA913 - INFO - Bee state changed to [OFF] 137 | 2025-01-15 02:40:23,040 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 950, 'rssi_msg': 'Strong signal', 'speed': 655.26, 'altitude': 0.45, 'delivered': True} 138 | 2025-01-15 02:40:24,184 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 139 | 2025-01-15 02:40:25,290 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xd0\x07\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 140 | 2025-01-15 02:40:25,291 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 950, 'rssi_msg': 'Strong signal', 'speed': 655.26, 'altitude': 0.45, 'delivered': True} 141 | 2025-01-15 02:40:26,291 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 142 | 2025-01-15 02:40:27,395 - BEE-EPT-UA913 - DEBUG - Telemetry: b'I\x00\x00\x00\x00\x00' 143 | 2025-01-15 02:40:27,396 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 2000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 950, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.73, 'delivered': True} 144 | 2025-01-15 02:40:28,397 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 1, Body: {'target': 'MSP_RC'} 145 | 2025-01-15 02:40:29,502 - BEE-EPT-UA913 - DEBUG - Telemetry: b'\xdc\x05\xdc\x05\xdc\x05\xdd\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xe8\x03\xdf\x05\xdf\x05\xdc\x05\xdc\x05\xdc\x07\xdc\x07' 146 | 2025-01-15 02:40:29,503 - BEE-EPT-UA913 - INFO - Autopilot state: {'connection': True, 'bee_state': 'OFF', 'roll': 1500, 'pitch': 1500, 'yaw': 1500, 'throttle': 989, 'aux1': 1000, 'aux2': 1000, 'aux3': 1000, 'aux4': 1000, 'battery': 19.9, 'rssi': 950, 'rssi_msg': 'Strong signal', 'speed': 0.0, 'altitude': 0.73, 'delivered': True} 147 | 2025-01-15 02:40:30,504 - BEE-EPT-UA913 - DEBUG - Executing command: TELEMETRY, Priority: 2, Body: {'target': 'MSP_ALTITUDE'} 148 | --------------------------------------------------------------------------------