Projet réalisé dans le cadre de la 2ᵉ année à l’ENSTA Bretagne.
Les données GPS sont automatiquement sauvegardées à la suite d'un fichier .txt avec mesure_gps(), il faut donc penser à le supprimer avant de vouloir faire une mesure propre.

Ce dossier est prêt à être envoyé sur n'importe quel bateau à condition d'avoir son fichier calib_xx.txt, le fichier à executer est consensus.py.
Attend qu'une accélération supérieure à 8 m/s² soit détectée sur l'axe x pour déclencher un départ.
- Input: Aucun
- Output: Aucun
Attend jusqu'à atteindre une heure précise (heure et minute) et affiche un compte à rebours.
- Input:
heure(int): Heure souhaitéeminute(int): Minute souhaitée
- Output:
Truelorsque l'heure est atteinte
Permet de limiter la valeur de x entre -pi et pi.
- Input:
x(float)
- Output:
x(float)
Récupère les données du magnétomètre et les corrige à l'aide de matrices de calibration.
- Input: Aucun
- Output:
y(np.array) - Champ magnétique corrigé [x, y, z]
Calcule la valeur corrigée de l'accélération brute en utilisant les matrices de correction.
- Input: Aucun
- Output:
y(np.array) - Accélération corrigée [x, y, z]
Lit les données brutes du gyroscope.
- Input: Aucune
- Output: Retourne un tableau NumPy contenant les valeurs brutes du gyroscope dans les directions x, y et z.
Calcule les angles d'Euler (Tangage, Roulis, Cap) à partir des données d'accélération et de magnétomètre.
- Input:
acc(np.array): Vecteur d'accélération corrigé [x, y, z]mag(np.array): Vecteur de champ magnétique corrigé [x, y, z]
- Output:
angles(np.array): Angles d'Euler [Tangage, Roulis, Cap]
Retourne la rotation avec l'angle minimal tel que ( v = R \cdot u ).
- Input:
u: Vecteur 3D d'entréev: Vecteur 3D cible
- Output: Matrice de rotation ( R \in \mathbb{R}^{3 \times 3} )
Fait un produit scalaire entre u et v
- Input:
u: Vecteur 3Dv: Vecteur 3D
- Output: Scalaire
Retourne l'Adjoint de w
- Input:
w: Scalaire ou matrice
- Output:
- retourne une matrice (2,2) ou (3,3)
Calcule les angles d'Euler (tangage, roulis, cap) à partir des données d'accélération, de magnétomètre et de gyroscope.
- Input:
a1: Vecteur accélérationy1: Vecteur magnétomètrew1: Vecteur gyroscopeg1_hat: Estimation précédente de ( g_1 )
- Output: Angles d'Euler ( \varphi ) (tangage), ( \theta ) (roulis), et ( \psi ) (cap)
Convertit les coordonnées en degrés décimaux (DD) vers le format degrés, minutes, secondes (DMS).
- Input:
dd(float): Coordonnée en degrés décimauxdirection(str): Direction ('N', 'S', 'E', 'W') pour appliquer le signe correct
- Output:
dms(str) - Coordonnée au format degrés, minutes, secondes (DMS)
Convertit les coordonnées en degrés-minutes (DM) vers le format degrés décimaux (DD).
- Input:
dm(float): Coordonnée en degrés-minutesdirection(str): Direction ('N', 'S', 'E', 'W') pour appliquer le signe correct
- Output:
dd(float) - Coordonnée en degrés décimaux (DD)
Convertit les coordonnées au format degrés, minutes, secondes (DMS) vers le format degrés décimaux (DD).
- Input:
dms(str): Coordonnée au format degrés, minutes, secondes (DMS) sous forme de chaînedirection(str): Direction ('N', 'S', 'E', 'W') pour appliquer le signe correct
- Output:
dd(float) - Coordonnée en degrés décimaux (DD)
Récupère les données GPS (GLL) et les écrit dans un fichier.
- Input:
fichier(str): Chemin du fichier où les données GPS doivent être enregistrées
- Output:
gll_data(tuple) - Données GPS sous forme de tuple
Récupère les données GPS en degrés décimaux
- Input:
- None
- Output:
lat,long(float)
Convertit un fichier de données GPS (.txt) en un fichier CSV avec latitude et longitude.
- Input:
input_file(str): Chemin du fichier .txt contenant les données GPSoutput_csv_path(str): Chemin du fichier CSV de sortie
- Output: Aucun
Crée un fichier GeoJSON à partir des données GPS contenues dans un fichier CSV.
- Input:
csv_file(str): Chemin du fichier CSV contenant les données GPSoutput_geojson_file(str): Chemin du fichier GeoJSON de sortie
- Output: Aucun
Convertit les coordonnées GPS (latitude, longitude) en coordonnées cartésiennes locales par rapport à un point de référence.
- Input:
lat(float): Latitude en degrés décimauxlong(float): Longitude en degrés décimauxlat_m(float): Latitude du point de référence en degrés décimaux (optionnel)long_m(float): Longitude du point de référence en degrés décimaux (optionnel)
- Output:
p(np.array) - Coordonnées cartésiennes relatives [x, y]
Calcule le cap à suivre pour atteindre un waypoint depuis un point de départ.
- Input:
a(np.array): Coordonnée du point de départ [latitude, longitude]p(np.array): Coordonnée du waypoint [latitude, longitude]
- Output:
cap(float) - Cap à suivre en radians
Vérifie si la distance entre le point actuel et le waypoint est inférieure à une distance minimale spécifiée, pour déclencher l'arrêt.
-
Input:
a(np.array): Coordonnées actuelles [x, y]p(np.array): Coordonnées du waypoint [x, y]distance_min(float): Distance minimale pour considérer l'arrêt (par défaut 2)
-
Output:
Truesi la distance est inférieure àdistance_min, sinonFalse
Régule la vitesse en fonction de la distance à un point de référence. La vitesse est calculée à l'aide d'une fonction sigmoïde pour assurer une transition fluide.
-
Input:
distance(float): Distance actuelle à un point de référencevmax(int): Vitesse maximale (par défaut 200)vmin(int): Vitesse minimale (par défaut 45)coef(float): Coefficient de régulation (par défaut 1)middle(float): Distance centrale pour la régulation (par défaut 4)
-
Output:
vitesse(float): Vitesse régulée entrevminetvmax
Rejoindre un point GPS donné par le point A en format degrés décimaux.
-
Input:
lat_a(float): Latitude du point A.long_a(float): Longitude du point A.debug(bool, optionnel): Affiche les messages de débogage siTrue. Par défautTrue.
-
Output:
None
Calcule le cap pour suivre une droite définie par un point A et un vecteur directeur n, depuis un point P.
-
Input:
m(np.array): Point A.n(np.array): Vecteur directeur de la droite.p(np.array): Point P.debug(bool, optionnel): Affiche les messages de débogage siTrue. Par défautFalse.
-
Output:
cap_d(float): Cap calculé en radians.
Permet de suivre une droite définie par un point M et un point A, exprimés en format degrés décimaux.
-
Input:
M(list): Coordonnées GPS du point de départ[lat, long].A(list): Coordonnées GPS du point d’arrivée[lat, long].debug(bool, optionnel): Affiche les messages de débogage siTrue. Par défautTrue.
-
Output:
None
Calcule la distance entre un point P et une droite définie par un point A et un vecteur normal n.
-
Input:
a(np.array): Point A sur la droite.n(np.array): Vecteur normal à la droite.p(np.array): Point P.
-
Output:
distance(float): Distance entre le point P et la droite. La distance est positive si P est à gauche de la droite dans le sens du vecteur n.
Maintient le cap en ajustant la vitesse des moteurs gauche et droite pour compenser l'erreur angulaire.
- Input:
acc(np.array): Vecteur d'accélération corrigé [x, y, z]mag(np.array): Vecteur de champ magnétique corrigé [x, y, z]cap(float): Cap désiré en radiansspd_base(int): Vitesse de base des moteursdebug(bool): Affichage des informations de débogage (facultatif)
- Output: Aucun
Cette fonction fonctionne moins bien que la suivante: maintien_cap provenant du premier Guerlédan. Nous avons alors décidé de ne pas nous servir de cette seconde fonction par la suite.
Calcule les consignes de vitesse et de cap pour faire évoluer un bateau sur une trajectoire définie.
Notre bateau suit une cible dont la position est p_tilde. La cible suit ici une trajectoire circulaire.
- Input:
n: Indice du bateaut: Tempslat_boue,long_boue: Position ciblek1,k2: Coefficients de régulationr: Rayon de la trajectoire circulaireT: Périodedebug: Affiche des informations supplémentaires si activé
- Output:
speed: Vitesse du bateaucap_d: Cap désirép_tilde: Position cible intermédiairep: Position actuelle
Cette fonction fait suivre au bateau un vecteur de direction calculé par cercle() grâce à la fonction maintien_cap durant une durée définie, ici 3min.
- Input:
n: Indice du bateaut0: Temps initiallat_m,long_m: Position cibleboucle: Exécution continue (True) ou unique (False)
- Output:
p_tilde: Position cible intermédiairep: Position actuelle
Connecte le client au serveur pour recevoir une position GPS unique et la convertir en latitude et longitude.
- Input:
server_ip: Adresse IP du serveur
- Output:
lat: Latitude en degrés décimauxlong: Longitude en degrés décimaux
Calcule le biais magnétique b et la matrice de calibration A à partir des données d’un fichier .txt.
- Input:
filename: Nom du fichier.txtcontenant les données de mesure
- Output:
b: Vecteur de biais 3x1A: Matrice de calibration 3x3
Permet de faire une calibration de l'accéléromètre et de la boussole et on enregistre les coefs A et b en format .npy.
Les mesures pour la calibration de la boussole sont enregistrées dans calib_16.txt.
Permet à partir du fichier gps_data.txt de récupérer un fichier .geojson.
Exemple:
Permet à partir du fichier gps_data.txt de récupérer un fichier .gpx (fait une trace gps avec un trait et non des points).
Exemple:
Le but de la première journée était de faire suivre un cap à notre bateau.
Nous avons donc créé ce code permet de suivre un cap Ouest pendant 30s puis ensuite de suivre le cap Nord à nouveau pendant 30s.
Ce code utilise et teste les fonctions maintien_cap et maintien_cap_2 évoquées ultérieurement.
La mission du jour 2 était de tourner autour d'une bouée.
Nous avons alors créé ce code qui utilise la fonction suivre_vecteur évoquées ultérieurement afin de réaliser des cercles autour de la bouée dont nous avions les coordonnées.
On a mission_jour_3, qui consiste à réaliser des cercles autour d'un bateau. Dans cette partie le bateau cible était immobile. Cette mission nous a permis de prendre en main la communication entre les bateaux. En effet le bateau cible émettait sa position ce qui nous permettait de la recevoir.
Nous avons également mission2_jour_3, qui consiste à cette fois ci suivre un bateau cible en mouvement via la fonction maintien_cap.
Permet de lancer la mission du jour 2 sur n'importe quel bateau.
Exemple:
Arrete le bateau
Permet de tester la correction de cap de la fonction maintien_cap
Permet de tester le gps et les conversions de coordonnées.
Test de la fonction attendre_exact_heure()
Test les mesures de l'accéléromètre et de la boussole. On peut vérifier la calibration avec ce code
Permet de tester la projection et enregistre un fichier points_projection.csv. Ce fichier peut être tracé avec tracer_csv.py pour vérifier l'orientation de nos axes. Notre axe x était orienté vers le Sud.
Exemple: Déplacement vers le nord puis vers l’est (petit tour sur 1m), déplacment vers l’ouest puis vers le sud.
Ce fichier nous permet de rapidement choisir la régulation en vitesse de notre bateau et de la tester en affichant la tanh.



