Analyser son plan de vol avec P4D_MissionAnalyser

Pix4Dcapture est une application Android/iOS qui permet de planifier un vol automatique en drone, dans le but de produire des orthophotos géo-référencées, très utiles en cartographie. En revanche, il n’est pas très bavard sur les caractéristiques propres au plan de vol qu’il met pourtant en œuvre.

[ exemple de plan de vol réalisé sous Pix4Dcapture ]

Pour remédier à cela, voici un script Bash nommé P4D_MissionAnalyser.sh. Il permet d’analyser les fichiers details.pix4dcapture-mission (format JSON) afin d’extraire des données telles que la date de la mission, la durée de vol, le nombre de photos, etc. Ce fichier JSON est généré par Pix4Dcapture au moment de l’exécution de la mission programmée en drone. À l’aide d’un simple script, nous allons voir comment analyser ce fichier.

Le lien vers le projet : gitlab.com/epysod12/P4D_MissionAnalyser

Genèse du projet

L’idée de départ est simple : utiliser un parser JSON (comme ‘ jq ‘) pour extraire les coordonnées des WayPoints (au passage récupérer quelques infos sur la mission) et créer une image PNG avec ‘ ImageMagick ‘ pour restituer un visuel, disons une géométrie approximative de l’ensemble.

On commence par :

jq -r '.flightPlan.waypoints[] | .location | @csv' $FILENAME

Nous venons ainsi de récupérer les coordonnées des WayPoints en EPSG:4326 (longitude / latitude), système compatible avec le WGS84, qui sert de référence au GPS utilisé par le drone (ici, un Anafi 4k).

Comme c’était facile, on continue avec :

jq -r '.actual.photos[] | [.pose.location[0,1], .mediaDescriptor.mediaId] | @csv' $FILENAME

Avec cette commande, nous obtenons la liste des photos prises pendant le vol avec leurs coordonnées relatives, ici encore au format CSV comme avec la précédente commande.

P4D_MissionAnalyser effectue plusieurs requêtes avec ‘ jq ‘ pour récupérer des données sur la mission, mais il met en avant également ‘ awk ‘ avec un usage intensif sur les données stockées dans les variables ou les fichiers. Il sert notamment à récupérer certaines valeurs dans un tableau, à calculer des moyennes ou encore des sommes, comme dans l’exemple suivant :

awk '{sum+=$2} ENDFILE {print "SUM_TOTAL", sum >> FILENAME}' sumDistWP.csv

Ici, awk va calculer la somme des valeurs de la colonne n°2 du fichier sumDistWP.csv et va ensuite insérer le résultat à la dernière ligne.

Et enfin, après avoir récupérer les coordonnées des points, on peut invoquer ‘ ImageMagick ‘ pour tracer une polyligne, comme ceci :

magick -size 640x360 canvas:MediumSeaGreen \
       -draw "fill white stroke black polyline $dataWP" \
       screenshot.png

La variable $dataWP contient toutes les coordonnées des WayPoints en X,Y adaptées ici pour être insérer sur l’image screenshot.png, l’unité des points corrigés étant le pixel (px).

Voilà ! Ce qui devait être un simple script de quelques lignes a évolué en outil d’analyse (presque) complet du fichier JSON, avec une partie qui gère la restitution graphique de la mission, et une autre partie qui s’occupe de calculer la vitesse moyenne, la distance parcourue, le GSD, etc.

Exemples d’utilisation

L’exécution du script nécessite 2 arguments :

  • le fichier JSON, habituellement nommé details.pix4dcapture-mission
  • le code EPSG de la localité géographique dans laquelle se situe la mission

Si aucun code EPSG n’est indiqué, c’est le code EPSG:3857 qui sera utilisé, moins fiable mais suffisant pour afficher un visuel de la mission.

Par exemple, pour une mission réalisée en France (RGF93), on invoque :

P4D_MissionAnalyser.sh /home/<...>/details.pix4dcapture-mission 2154

Et pour une mission réalisée au Luxembourg (LUREF), on aurait :

P4D_MissionAnalyser.sh /home/<...>/details.pix4dcapture-mission 2169

Nous obtenons alors 3 fichiers CSV + 1 image PNG :

/home/<...>/
├── details.pix4dcapture-mission
├── screenshot.png
├── sumDistWP.csv
├── uavPhotos.csv
└── wayPoints.csv

  • wayPoints.csv
    -> les coordonnées des points de repères (longitude / latitude) + la hauteur de vol
  • uavPhotos.csv
    -> la liste des photos + leurs coordonnées (longitude / latitude)
  • sumDistWP.csv
    -> les distances calculées entre les WayPoints + la distance totale
  • screenshot.png
    -> le visuel final (640px*360px) qui intègre plusieurs données extraites du fichier JSON

Résultat :
Voici une analyse de P4D_MissionAnalyser (sur un plan de vol Pix4Dcapture) pour une opération réalisée il y a quelques semaines en milieu urbain :

[ l’image générée par P4D_MissionAnalyser est nommée automatiquement screenshot.png ]

Pour aller plus loin

Qu’apprend-on avec les valeurs ci-dessus ? Nous avons à présent :

  • la distance parcourue par le drone
  • la durée du vol (du premier WP au dernier WP)
  • la vitesse moyenne
  • le GSD (résolution au sol)

Pour le GSD, voici la formule utilisée dans le script :
GSD = ((Sensor Width * Working Distance) / (Focal Length * Image Width))
Le Ground Sample Distance définit la distance entre les centres de pixels mesurée sur le terrain. Plus le drone photographie proche du sol, plus la résolution est élevée.

Pour la distance, la vitesse et la durée du vol, les formules utilisées se résument ainsi :

[ source : allaboutcircuits.com/tools/speed-distance-time-calculator ]

Et enfin, concernant le plan de vol original details.pix4dcapture-mission, il est possible de le convertir pour l’intégrer dans FreeFlight 6 (Android/iOS), grâce à cet outil : pix4d-flightplan-to-anafi
L’image screenshot.png obtenue auparavant peut ainsi servir d’aperçu quand on l’associe au plan de vol dans FreeFlight 6 !

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *