Hello, i have a raspberry pi connected to my pixhawk 6x by ethernet for uxrce/client agent communication and by usb for mavlink.
I need a script on the raspberry to list , choise and download a log file.
It work perfectly manually:
mavproxy.py --master=/dev/ttyACM0,57600
log list
log download 3 (for exemple)
I need a scipt to do that , he connect the pixhawk , he list the log and ask me witch log i want to download and download it !!
Can someone help me please ?
I have tried an sh script
#!/bin/bash
# Variables
SERIAL_PORT='/dev/ttyACM0' # Port série USB du Pixhawk et vitesse ?
LOG_DIR='/home/zit/logs'
# Démarrer MAVProxy
mavproxy.py --master="serial:${SERIAL_PORT}" --console &
MAVPROXY_PID=$!
# Attendre que MAVProxy soit prêt
sleep 5 # Attendre quelques secondes pour que MAVProxy démarre
# Demander la liste des logs
echo "Demande de la liste des logs..."
echo "log list" > /tmp/mavproxy_command
# Attendre la réponse avec la liste des logs
sleep 5 # Attendre quelques secondes pour la réponse
LOG_LIST=$(cat /tmp/mavproxy_response | grep "log list" | tail -n +2)
# Afficher la liste des logs et demander à l'utilisateur de choisir
echo "Liste des logs disponibles :"
echo "${LOG_LIST}"
echo "Entrez le numéro du log à télécharger :"
read LOG_NUMBER
# Sélectionner le log choisi par l'utilisateur
SELECTED_LOG=$(echo "${LOG_LIST}" | sed -n "${LOG_NUMBER}p")
# Télécharger le log sélectionné
echo "log download ${SELECTED_LOG}" > /tmp/mavproxy_command
# Attendre que le téléchargement soit terminé (vous pouvez ajuster le délai)
sleep 10
# Déplacer le log téléchargé dans le répertoire spécifié
LOG_PATH="$(pwd)/${SELECTED_LOG}"
DESTINATION_PATH="${LOG_DIR}/${SELECTED_LOG}"
mv "${LOG_PATH}" "${DESTINATION_PATH}"
echo "Log téléchargé avec succès : ${SELECTED_LOG}"
echo "Log enregistré dans : ${DESTINATION_PATH}"
# Terminer MAVProxy
kill -9 ${MAVPROXY_PID}
i have tried python script with mavproxy :
import subprocess
import threading
import time
import os
def read_output(proc, logs_listed_event, download_complete_event):
""" Lit continuellement la sortie de MAVProxy. """
while True:
line = proc.stdout.readline()
if line:
print("MAVProxy output:", line, end='')
if "Log" in line and "numLogs" in line:
logs_listed_event.set()
if "Finished downloading log" in line:
download_complete_event.set()
break # Arrêter de lire après la fin du téléchargement
def send_command(proc, command):
""" Envoie une commande à MAVProxy. """
print(f"Envoi de la commande: {command}")
proc.stdin.write(command + '\n')
proc.stdin.flush()
def get_user_input():
""" Demande à l'utilisateur de choisir un numéro de log à télécharger. """
try:
return int(input("Entrez le numéro du log à télécharger : "))
except ValueError:
print("Veuillez entrer un nombre valide.")
return get_user_input()
def main():
logs_dir = "/chemin/vers/votre/dossier/de/logs" # Remplacez par votre chemin
os.makedirs(logs_dir, exist_ok=True)
mavproxy_cmd = "mavproxy.py --master=/dev/ttyACM0"
proc = subprocess.Popen(mavproxy_cmd.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, cwd=logs_dir)
logs_listed_event = threading.Event()
download_complete_event = threading.Event()
output_thread = threading.Thread(target=read_output, args=(proc, logs_listed_event, download_complete_event))
output_thread.start()
time.sleep(5) # Attendre que MAVProxy initialise
send_command(proc, 'log list')
time.sleep(1)
send_command(proc, 'log list')
logs_listed_event.wait()
log_num = get_user_input()
send_command(proc, f'log download {log_num}')
download_complete_event.wait()
# Fermer le processus MAVProxy proprement
send_command(proc, 'exit') # Ou 'quit', selon ce qui fonctionne avec votre MAVProxy
proc.terminate()
try:
proc.wait(timeout=5)
except subprocess.TimeoutExpired:
proc.kill()
output_thread.join()
# Transférer le fichier via SCP
log_filename = f'log{log_num}.bin' # Assurez-vous que le nom de fichier correspond au format réel
scp_command = f"scp {log_filename} dcas@192.168.1.100:/home/dcas/o.quirant/logscp/"
subprocess.run(scp_command.split())
if __name__ == '__main__':
main()
And i have trie witth pymavlink !
import os
from pymavlink import mavutil
# Fonction pour établir la connexion
def connect_pixhawk(port='/dev/ttyACM0', baud=57600):
print(f"Connexion au Pixhawk sur {port} avec un baud rate de {baud}")
master = mavutil.mavlink_connection(port, baud=baud)
master.wait_heartbeat()
print("Pixhawk connecté!")
return master
# Fonction pour lister les logs
def list_logs(master):
master.mav.log_request_list_send(master.target_system, master.target_component, 0, 0xFFFF)
logs = []
last_log_num = None
while True:
msg = master.recv_match(type='LOG_ENTRY', blocking=True)
if msg is None:
continue
print(f"Log ID: {msg.id}, Taille: {msg.size}")
logs.append(msg.id)
last_log_num = msg.last_log_num
if msg.id == last_log_num:
break
return logs
# Fonction pour télécharger un log
def download_log(master, log_id, directory):
print(f"Téléchargement du log {log_id}...")
master.mav.log_request_data_send(master.target_system, master.target_component, log_id, 0, 0xFFFFFFFF)
with open(os.path.join(directory, f"log_{log_id}.bin"), 'wb') as log_file:
while True:
msg = master.recv_match(type='LOG_DATA', blocking=True)
if msg is None or msg.id != log_id:
continue
if msg.ofs >= msg.size:
break
log_file.write(msg.data)
print(f"Log {log_id} téléchargé dans {directory}")
# Début du script
master = connect_pixhawk()
# Liste des logs disponibles
logs = list_logs(master)
# Attendre l'entrée de l'utilisateur
log_id = int(input("Entrez l'ID du log à télécharger: "))
if log_id in logs:
download_log(master, log_id, "/home/zit/logs")
else:
print("ID de log invalide.")
# Fermeture de la connexion
master.close()
print("Connexion fermée.")