On réalise un panorama « sphérique » (c.a.d. couvrant 360° en horizontal et 180° en vertical) par assemblage de photos (beaucoup !) depuis le point de pilotage, à hauteur des yeux . C'est ce qui sera vu depuis CrrcSim. Nous le nommerons « panorama pilote ». On fait ensuite un deuxième panorama au même point mais depuis une hauteur différente. On le nommera « panorama mesure ». La comparaison de ces deux prises de vue permet, par stéréoscopie, de définir la distance et l'altitude de certains points du paysage (le plus possible !) L'ensemble des ces points renseignera le simulateur pour gérer les atterrissages (ou les crashs !), afficher les ombres et calculer et le flux de vent.
Initialement, CRRCSim ne comportait que deux scènes (CapeCod et Davis), toutes deux codées « en dur » à l'intérieur du logiciel.
Une grosse évolution apportée par les version 9.08, 9.09, 9.10 est l'apport d'un format de fichier permettant de créer des scènes sans toucher au code.
Une scène est décrite par un fichier xml qui fournit divers paramètres et indique deux types de fichier
6 images, faces d'un cube vue de l'intérieur. Elles sont initialement prévues pour donner l'image du ciel ou d'un paysage lointain, devant lequel se placeraient des objets.
Un ou plusieurs fichiers issus d'un logiciel de CAO 3D. Il décrivent le terrain et des objets comme des bâtiments. Le simulateur utilise ces informations pour la visualisation, pour les interactions avec l'avion (atterrissage) et pour calculer le flux du vent (ascendances dynamiques).
Un exemple est fourni avec le logiciel : « simple.html » pour montrer les possibilités de cette structure. A ma connaissance, personne n'a publié de scène construite ainsi.
Pour intégrer mes scènes photos, j'ai légèrement détourné cette structure. Les 6 faces du cube représentent la totalité de ce qui est vu, pas uniquement le ciel. Le terrain est tout de même présent devant, mais est transparent, donc pas vu quoique toujours utilisé pour l'atterrissage et le vent. Il est important de remarquer qu'il n'est alors plus possible de se déplacer dans la scène. Le point de pilotage devient fixe. (J'ai en projet la possibilité d'avoir plusieurs points possibles pour une même scène).
Remarque : la transparence de ce terrain n'empêche pas le planeur de disparaitre derrière une crête. Ce n'est pas facile à expliquer mais cela fonctionne comme souhaité.
Pour la réalisation d'un panorama par assemblage de plusieurs photos, il est important de prendre ces photos exactement du même point. Sinon, les objet proches se décalent devant les objets lointains et le raccord devient impossible. L'utilisation d'un pied est indispensable. De plus, pour que les raccords soient vraiment corrects, il faut utiliser une « tête panoramique ». Celle-ci est conçue pour faire pivoter l'appareil autour du centre de l'objectif. Et, pour la réalisation de panoramas complets (360°x180°) elle doit permettre une rotation verticale et horizontale.
On trouve dans la commerce des têtes panoramiques réglables bien chères et encombrantes. Il n'est pas très difficile d'en construire une spécifiquement pour son matériel. Une graduation fine, n'est pas nécessaire, il suffit de repères ou de crans pour définir l'écart angulaire entre les vues. La précision de ces angles n'est pas critique, le logiciel d'assemblage calculera les angles exacts.
J'en ai construit successivement deux. La première, entièrement manuelle, était vissée directement sur un pied photo, sans sa rotule. Ce pied possède un tube central permettant un réglage en hauteur. Le panorama pilote était pris avec ce réglage en position haute, le panorama mesure en position basse. Compte tenu de la focale de mon appareil, il faut 10 photos autour de l'axes vertical pour faire les 360°. Il serait possible de réduire de nombre pour les vues vers la haut ou vers le bas mais j'ai trouvé plus simple de toujours faire 10 photos par tours. Il faut aussi 5 photos autour de l'axes horizontal pour couvrir les 180° (En réalité, plus, puisque les photos sont rectangulaires. Il faudrait en plus une photo « sous les pieds » que je ne prends jamais, et une photo « au dessus » que je ne prenais pas avec cette tête). Donc 50 photos.
Première
tête panoramique. En profilé d'aluminium plat.
La méthode précédente présente deux inconvénients. L'écart entre les deux prises de vue est limité par la course du tube vertical de mon pied photo à 30 cm. La précision de la mesure stéréoscopique de distance s'est révélée un peu faible. De plus, la deuxième panorama, celui qui ne sert qu'à la mesure, étant pris de plus bas que celui qui est vu par le pilote, certaines parties du paysage vu par la pilote ne sont pas vues pas mesurables parce-que masquées dans le panorama de mesure.
J'ai, pour améliorer, entrepris d'augmenter l'écart entre les
deux prises de vues. J'ai utilisé des tubes en carbone pour placer
mon appareil plus haut. Je peux choisir 1, 2 ou même 3 mètres. En
pratique, je n'ai exploité que la hauteur de 1 mètre. Il me faut
encore améliorer le logiciel pour exploiter les autres.
Comme il m'est alors impossible d'atteindre l'appareil photo à cette hauteur, j'ai construit une petite nacelle semi-automatisée. L'action d'un bouton poussoir déclenche la prise de vue de 5 (ou 6 pour avoir la vue de dessus) photos de haut en bas. La rotation d'axe vertical est faite manuellement en tournant la base du tube.
Seconde tête
panoramique (photos Pierre Rondel)
La nacelle est animée par un servomoteur de modélisme. Le déclenchement est également effectué par un petit servomoteur. La commande est faite par un micro contrôleur Arduino. Ce dernier est très facile à mettre en œuvre pour ce type d'application car sa bibliothèque possède les fonctions de commande de servomoteurs de modélisme.
Remarque : je leste le pied photo avec un sac de cailloux (ou ma radio) pour le rendre plus stable.
Un mot sur l'appareil photo. J'ai commencé avec mon premier appareil numérique. Il possède un objectif de qualité mais il n'a même pas 3 Mpixels. Puis j'ai utilisé celui que j'avais acheté ensuite sur un critère de légèreté, pour pouvoir l'embarquer sur un planeur. En fait, la qualité de l'appareil photo n'est pas très critique. Les distorsions de l'objectif sont corrigées. Trop de pixels va ralentir ou rendre impossible l'assemblage. Je me limite actuellement à une résolution de 2048x1536.
Pour réussir, on est confronté à des exigences contradictoires.
Il faut choisir l'emplacement exact de prise de vue. Ce devrait être le meilleur endroit pour piloter mais cet endroit n'est peut-être pas le meilleur photographiquement parlant.
En général, on veut, le même jour, voler et faire la prise de vue. Si un peu de vent est bienvenu pour voler, il gène la prise de vue. Il fait bouger l'herbe et les branches, rendant ainsi plus difficile les raccords et la mise en correspondance des deux panoramas pour la mesure. Il fait aussi bouger l'appareil photo (surtout avec mon deuxième système et ses tubes carbone en hauteur), entrainant du flou rendant les mesures moins précises
Il faut trouver un jour où la visibilité est la meilleure. Peut-être faudra-t-il monter sur une pente sud par vent de nord, juste pour la pris de vue ! Éviter d'avoir le soleil trop de face. L'horaire de milieu de journée est préférable.
Les nuages sont plutôt bienvenus. Il donnent des repères pendant le pilotage sur le simulateur. Le fait qu'ils bougent pendant la prise de vue n'est pas bien gênant. Par contre, ils vont donner des ombres sur la pente qui rendront les couleurs moins vives.
Un mot sur le réglage de l'appareil. Il est souvent conseillé, pour réaliser un panorama, de choisir une exposition (vitesse, ouverture) identique pour toutes les vues afin d'avoir des raccords moins visibles. Je ne le fais jamais, parce que le choix de cette exposition unique n'est pas facile et que je ne suis pas sur d'y arriver avec mon appareil. Chaque vue est prise en mode auto. Le logiciel d'assemblage se débrouille plutôt bien.
Par contre, je supprime l'autofocus, je force le réglage sur « infini ». Cela évite des erreurs et accélère le déclenchement.
Il est fait par le logiciel Hugin. Ce logiciel est très puissant et disponible gratuitement
Principe simplifié du fonctionnement de Hugin :
Chacune des photos composant le panorama est caractérisée par sa position angulaire depuis le point de prise de vue : lacet, tangage, roulis (on retrouve ici des termes de navigation). Pour pouvoir assembler parfaitement ces photos, il faut connaître ces angles. Comme on ne les connait pas ou pas assez précisément, il faut les retrouver. Pour cela, on utilise des « points de contrôle » : pour chaque paire d'images se recouvrant partiellement, on indique les coordonnées d'un détail existant dans chacune des deux images. Hugin possède un interface assez pratique pour définir ces points de contrôle mais c'est une tâche longue si l'on assemble plusieurs dizaines d'images. Heureusement, il existe un outil, interfacé avec Hugin, pour trouver ces points de contrôle automatiquement.
A partir des coordonnées de ces points de contrôle, Hugin va savoir retrouver les positions angulaires. (Il sait en plus retrouver les distorsions de l'objectif). C'est la phase d'optimisation. Il y a ensuite une phase d'égalisation de l'exposition qui compense les différentes expositions des photos (et même des défauts de vignettage de l'objectif). Puis, connaissant les positions angulaires, Hugin pourra ensuite projeter chaque photo de façon à ce que les raccords ne soient pas visibles. Diverses projections sont possibles. Ce sont, comme en cartographie, les différentes façons de projeter une sphère sur un plan. Nous utiliserons comme intermédiaire la projection équirectangulaire et en finale la projection rectilinéaire (qui est celle réalisée par un appareil photo).
Dans beaucoup de cas, Hugin peut faire l'assemblage automatiquement.
Dans le cas de panoramas sphériques, il faut tout de même l'aider un peu. En effet, dans le ciel, il n'est pas bien possible de trouver des points de contrôle (sauf s'il y a des nuages mais comme les nuages se déplacent ce n'est pas vraiment bon).
J'aide donc Hugin en initialisant les positions des vues à leurs valeurs approximatives. Cela est fait par un petit script qui initialise un fichier au format de Hugin. Ensuite, l'assemblage du panorama pilote est presque automatique, sauf pour empêcher le déplacement les images ne contenant que du ciel.
Procédure d'assemblage du panorama pilote :
Mettre
des points de contrôle automatiquement sur les image ne contenant
pas de ciel.
Vérifier ces points de contrôle. Supprimer ceux du
ciel, Éventuellement en ajouter manuellement.
Dans l'aperçu,
supprimer l'affichage des images ne contenant que du ciel.
Optimiser
avec "N'utiliser que les images sélectionnées dans
l'aperçu".
Dans l'aperçu, afficher toutes les
images.
Assembler !
L'assemblage du panorama mesure est plus délicat car il faut l'aligner sur le premier. Un script initialise Hugin avec les photos du panorama mesure complétées pas la rangée du milieu (l'horizon) des photos du panorama pilote, en gardant les positions optimisées précédemment de celles-ci . L'optimisation est faite en deux temps. Des points de contrôles sont mis (manuellement) entre les photos des deux panoramas. Manuellement pour ne prendre en compte que des points très éloignés. Les positions des images de l'horizon du panorama mesure sont optimisées pour se caler sur celle du panorama pilote. Puis les autres sont ensuite optimisées.
Procédure
d'assemblage des panorama mesure
Initialisation par un script
d'un fichier Hugin combiné.
Mettre manuellement des points de
contrôles éloignés entre les images pilote et les images mesure(Il
peut être nécessaire d'ajouter des points de contrôle entre
certaines images mesure de l'horizon).
Optimiser les positions des
images de l'horizon.
Mettre automatiquement les point de contrôle
sur les images de mesure.
Optimiser les positions des autres images
de mesure.
Supprimer les vues pilote de l'aperçu.
Assembler !
En fin, les deux panoramas sont assemblés en projection équirectangulaire pour les étapes ultérieures. Cette projection a l'avantage d'une correspondance simple entre la position du pixel dans l'image est sa position angulaire dans l'espace.
Les deux panoramas en projection équirectangulaire: pilote, mesure.
Il manque, car inutile, le ciel du panorama mesure
Il faut fournir à Crrcsim la projection du panorama sur les 6 faces d'un cube. On part de la projections équirectangulaire du panorama pilote que l'on projette successivement dans les 6 directions en mode rectilinéaire (comme si on avais pris 6 photos avec un objectif grand angle). Cela est fait automatiquement par un script qui appelle le programme interne à Hugin « Nona ».
Vues très réduites des 6 faces : est, sud, ouest, nord, dessous, dessus.
Remarque : la vue du dessous présente un « trou » puisqu'il manque une image. Il est facile de le remplir avec l'outil « clonage » d'un logiciel de traitement d'image (j'utilise Gimp). Au début, je faisais de même pour du dessus mais il est plus difficile de remplir proprement ce ciel par clonage. C'est pourquoi maintenant je prend également la vue de dessus.
Ces faces sont également utilisées, après redimensionnement pour faire le fichier QVTR de prévisualisation (voir exemple de cette animation)
C'est l'étape la plus difficile et qui demande le plus de travail.
On pourrait penser que l'utilisation d'une carte ou de photos satellite puisse suffire mais la précision des cartes disponibles est loin d'être suffisante. C'est pourquoi j'ai mis en œuvre une technique de mesure locale par stéréoscopie. L'expérience montre que cette mesure est correcte jusqu'à quelques dizaines de mètres. Pour les plus grandes distances, elle sera complétée par une carte.
Un détail de la scène est vu depuis le point pilote P avec une angle ap (mesuré par rapport à l'horizontale). Ce même détail est vu depuis le point de mesure M avec une angle am. Connaissant les hauteurs hp et hm des points pilote et mesure, on obtient l'altitude H et la distance D du détail par un simple calcul géométrique.
Pour faire les mesures de distance par stéréoscopie, il faut mettre en correspondance des points de chacun des panoramas pilote et mesure.
Mes premières scènes ont été réalisées en utilisant pouf cela l'éditeur de points de contrôle de Hugin sur les projections équirectangulaire de chacun des panoramas. Les coordonnées angulaires de ces points de contrôles sont en suite lues depuis le fichier Hugin par un script qui en déduit les coordonnées dans l'espace (nord, est, altitude). Après triangulation, l'ensemble des ces points est écrit dans un fichier au format « ACD » qui pourra être lu par la bibliothèque graphique (plib) de CrrcSim.
Cette méthode est très longue : il faut créer plusieurs centaines de points un par un. Et il est souvent difficile trouver des détails communs entre deux images sans faire de confusion. D'autant plus que l'angle de vue de ces détails (caillou, fleur...) étant différents, leur apparence l'est aussi. Cela est encore plus critique avec mon deuxième système de prise de vue et c'est pour cela que, pour l'instant, je n'utilise pas un décalage supérieur à un mètre en les deux prises de vue. Notons que, pour cette même raison, le système de recherche automatique des points de contrôle de Hugin ne fonctionne pas.
Pour faciliter cette mise en correspondance des deux panoramas j'ai finalement écrit un logiciel spécial. Celui-ci affiche les images deux panoramas en distordant l'image du second pour le rendre les plus semblable au premier. C'est tout aussi long puisque, pour l'instant, tout est manuel, mais plus efficace. J'ai en projets des améliorations pour automatiser. Il reste tout de même des cas difficiles pour des paysages ne possédant pas assez de détails très distinctifs. Le cas des herbes hautes est particulièrement difficile. Il faudrait, dans ces cas, ajouter des éléments pendant la prise de vue (petits drapeaux...).
Mise en correspondance des panoramas (détail).
Image de gauche : en cours d'ajustement. Image de de droite : ajustement fini.
La partie gauche de chacune des images appartient au panorama pilote, la partie doite au panorama mesure.
La mesure par stéréoscopie n'est généralement pas suffisante. Elle n'est précise qu'à courte distance. Et le relief possède généralement des parties en creux qui ne sont pas vues, donc pas mesurables. L'utilisation d'une carte en complément est donc utile. La difficulté est dans le positionnement de cette carte avec la mesure locale faite par stéréoscopie.
J'utilise les cartes IGN 25/1000 disponible sur Internet (geoportail.fr). Je numérise les courbes de niveau à l'aide d'un logiciel de dessin (Inscape). J'ajoute quelques repères : point de prise de vue, point caractéristique éloigné pour définir l'orientation. Après récupération du fichier dessin par un script et triangulation, j'obtiens un modèle de terrain grossier.
J'ai ensuite expérimenté plusieurs stratégies plus ou moins automatisées pour mélanger la mesure locale et ce modèle grossier. On constate rapidement la nécessité de faire des ajustements. Parce-que rien n'est assez précis. Ni les mesure locales en « grande distance », ni la carte au niveau de détail souhaité, ni le positionnement sur cette carte. Pour faire ces ajustements, Il m'a semblé intéressant de privilégier les lignes de crêtes. En effet, c'est un endroit où les défauts se voient : le planeur doit pouvoir passer derrière la crête sans donner l'impression de passer au travers ni de disparaître avant de l'atteindre.
Finalement, j'ai ajouté dans mon logiciel de mise en correspondance des panoramas pilote et mesure une fonction qui permet de tracer ou d'ajuster manuellement les profils, tout en ayant le profil donné par la carte comme guide.
Pour mémoire : on pourrait imaginer utiliser des vues
aériennes faites par un avion radio-commandé. Ce n'est pas très
simple. On retrouve la difficulté de mise en correspondance a
laquelle s'ajoute l'imprécision des points de prise de vue. C'est
tout de même à explorer. Peut-être avec un hélicoptère
quadrimoteurs bien stabilisé.