Réflexions sur la construction d'un ROV

ROV

Motivations

A l'été 2014, je me suis motivé pour réfléchir à la construction d'un ROV (Remotely Operated Vehicle) ou plus précisément d'un Remotely Operated Underwater Vehicle. On peut trouver plusieurs projets similaires sur Internet dont le plus (re)connu est OpenROV qui permet d'acheter un véhicule sous-marin téléguidé ou les pièces permettant d'en fabriquer un soi-même. Ce projet est très intéressant, mais j'aime bien comprendre ce qu'il y a sous le capot, et je me pose la question de savoir si on peut faire mieux ou pas (moins cher, ou avec moins de pièces ou avec de meilleures solutions logicielles ou techniques).

Ma deuxième motivation (qui est venue après le démarrage du projet) est de pouvoir utiliser un tel ROV pour faire de l'exploration de nouveaux sites sans forcément mettre la tête sous l'eau. Cela aurait deux avantages pour moi. Le premier est de pouvoir potentiellement rentabiliser la période hivernale où il est moins agréable de mettre la tête sous l'eau (il fait beau l'hiver au bord de la méditerranée, mais l'eau n'est pas forcément très chaude en hiver et au printemps). Le deuxième est d'éviter d'aller faire un tour au caisson hyperbare suite à une exploration hors d'un site connu, tous les paramètres de plongée ayant été respectés mais pour lequel on a palmé plus que de raison et donc embarqué trop de gaz que l'on n'a pas désaturé malgré le respect de la vitesse de remontée et des paliers (et oui, si ça donne l'impression que cela sent le vécu, c'est normal...). Bref, être en confort et en sécurité pour profiter au maximum de la plongée.

Ma troisième motivation est que ce projet me permet de mettre en pratique certains aspects sur lesquels je donne des cours à l'école d'ingénieur Polytech'Nice Sophia. Bref, tout bénef.

J'ai donc décidé de découper le problème en plusieurs sous-problèmes et de m'attaquer indépendamment à chacun d'eux au fil de mes possibilités et de mes envies, le tout visant à résoudre les problèmes que l'on rencontre dans la construction d'un tel système.

Problèmes à aborder et à résoudre

Quand on commence à réfléchir au problème global, différentes difficultés viennent à l'esprit: comment réaliser l'étanchéité, la propulsion, la diffusion de la vidéo (on a besoin d'un retour vidéo pour piloter le système immergé), l'envoi des commandes de pilotage, mais aussi l'éclairage si on descend un peu profond, ...

Je n'ai pas décidé ni d'un planning précis, ni d'un ordre particulier dans lequel je vais tenter de voir si chaque problème a une solution et a priori quelle est la meilleure. Cela est et doit rester un loisir qui se fera au gré des différentes possibilités techniques et technologiques (quand je dispose du matériel adéquate) et de mes envies. Donc ne cherchez pas forcément de lien logique entre toutes ces étapes.

Démarrage du projet et Choix technologiques

La première étape est de fixer quelques éléments techniques qui seront forcément un peu arbitraire. Mais l'objectif global étant de voir si on peut optimiser par rapport à ce qui est est fait dans le projet OpenROV, il ne sert à rien de faire des tests sur des configurations supérieures ou plus chères que celles utilisées dans ce projet.

La présentation ci-dessous a été organisée de manière thématique pour permettre aux personnes intéressées par un sujet de pouvoir consulter l'évolution de celui-ci. Il est aussi possible de consulter la présentation chronologique du projet.

Configuration et Optimisation de la Raspberry Pi

Un des premiers choix pour débuter le travail est donc de choisir une plate-forme sur laquelle vont devoir cohabiter les différents programmes: video-streaming, pilotage des moteurs, traitement des commandes, traitement des capteurs... Il est donc impératif, vu le nombre de traitements à réaliser de choisir un système avec OS (donc exit une solution à base uniquement d'un microcontrôleur). Jusque-là, rien de bien sorcier. La solution retenue par OpenROV est une architecture utilisant une plate-forme BeagleBone Black à laquelle est ajouté une extension (propriétaire) embarquant un microcontrôleur Arduino. Ce dernier prend en charge le pilotage des moteurs et gère les entrées sorties avec les capteurs et les actionneurs. Si cette architecture est bien pensée pour faciliter les extensions du système et ne pas tout faire reposer sur le système embarqué sur la BeagleBone, cela entraîne un surcoût. Et une recherche rapide sur Internet montre qu'une plate-forme Raspberry Pi supporte bien la gestion des signaux PWM logiciels nécessaires pour faire fonctionner les moteurs. D'autre part la Raspberry Pi possède l'avantage d'avoir une puce intégrée pour l'encodage du flux vidéo, déchargeant ainsi le microprocesseur. Donc nous allons essayer de partir sur une solution à base de Raspberry Pi et voir si cela tient ses promesses.

Donc pour cette première étape, nous allons installer une Raspberry Pi et tenter d'optimiser un peu la distribution Raspbian pour en tirer le meilleur parti. J'y ajoute aussi une page pour des informations et outils nécessaires quand on développe sur Raspberry Pi.

Camera et Video Streaming pour diffuser "ce que voit" le ROV

Une des choses qui peut être le plus gourmand en puissance de calcul est le vidéo streaming. Heureusement, la Raspberry Pi est pourvue d'un encodeur (et d'un décodeur, mais cela nous intéresse moins) matériel qui supporte le codec H264. Il sera donc intéressant de pouvoir bénéficier de ce support et éviter de surcharger le microprocesseur inutilement.

D'autre part, la solution choisie par OpenROV a un coût non négligeable pour le traitement de la vidéo. La BeagleBone Black a un prix indicatif (en 2014-2015) de 60 euros TTC à laquelle on ajoute une caméra USB externe Genius WideCam F100 à 45 euros, soit environ 1/6 du prix total. La puissance de cette plate-forme me semble un peu sur-dimensionnée (mais je peux me tromper); en tout cas, si on veut faire moins cher, on peut partir sur une Raspberry Pi (un peu moins de 40 euros) avec un module caméra (à moins de 30 euros), soit un total de moins de 70 euros à comparer à la solution Beagle Bone Black + Camera à plus de 100 euros. Cela ferait déjà une économie en matériel, mais il reste à s'assurer que la plate-forme sera suffisamment puissante pour y effectuer tous les traitements nécessaires.

Après une recherche sur Internet, j'ai trouvé de très nombreux tutoriaux expliquant un peu tous les mêmes solutions, mais aucun site pour vraiment faire une étude comparative pour définir "la meilleure" solution de vidéo-streaming sur Raspberry Pi. J'ai donc décidé que cela pouvait être la prochaine étape: trouver la solution de streaming la plus performante et la plus adaptée à nos besoins futurs.

Quelques mois après les deux étapes de tests ci-dessous, il s'avère qu'il y a eu beaucoup de progrès du côté logiciel par la communauté et l'utilisation de uv4l combinée à une version mjpeg-streamer optimisée pour la Raspberry Pi permet d'avoir d'utiliser le GPU et donc de tirer parti très facilement des performances matérielles. D'autre part, le logiciel OpenROV-cockpit utilisé étant fait pour mpeg-streamer, les adaptations sont beaucoup plus simples et demandent moins de travail. Donc c'est bien cette dernière solution qui a été retenue actuellement.

Contrôler des moteurs

Un robot sous-marin que l'on puisse diriger demande de pouvoir contrôler la puissance de plusieurs moteurs ainsi que le sens de rotation. Avant de pouvoir en contrôler plusieurs, nous allons déjà tenter d'en faire marcher un.

Chaque moteur devra entraîner une hélice et une bonne solution semble être de contrôler 2 moteurs pour les mouvements horizontaux et un troisième pour les mouvements verticaux. Nous étudierons peut-être plus tard si un système de ballaste dynamique est préférable au troisième moteur, ou bien de pouvoir orienter les deux premiers.

Mais avant cela, il faut de toute façon envisager la manière dont le système, quel qu'il soit, sera étanche. Deux grandes solutions semblent possibles: avoir un arbre de transmission étanche et les moteurs au sec (comme sur un sous-marin ou de nombreux bateaux modèles réduits) ou bien des moteurs qui puissent fonctionner dans l'eau. La deuxième solution est celle qui est utilisée sur OpenROV et là, je dois avouer que j'ai été bluffé. Faire tourner des moteurs électriques dans l'eau... Chapeau. En fait ce sont des moteurs dits brushless qui fonctionnent par courant magnétique (engendré par des bobines au passage de courant). Que cela puisse fonctionner dans l'eau sans faire de court-circuit m'a laissé perplexe avant de comprendre le principe. En tout cas, pour les sceptiques, on trouve plusieurs vidéos sur Internet qui démontrent que cela fonctionne bien. Donc en route pour tenter de faire fonctionner cette solution à l'air libre tout d'abord.

Adaptations logicielles d'OpenROV-Cockpit

Avec les deux étapes précédentes, nous avons étudié et fait marcher les deux principales fonctionnalités: transmettre la vidéo pour visualiser depuis la console de pilotage ce que voit le Rov (consultable par un simple navigateur) et commander un (des) moteur(s) pour faire avancer le futur Rov.

Il reste à mon sens deux points essentiels pour aller vers un premier prototype fonctionnel mais sans options (éclairage, visée laser, profondimètre, gyroscope, magnétomètre, température, ...). Tout d'abord disposer d'un serveur sur la plate-forme pour permettre la commande à distance et bien entendu, faire un caisson étanche pour mettre le tout.

Avant de fabriquer un caisson avec un coût sûrement non négligeable (la solution OpenROV est tout de même vendue 289$ en ligne), il serait bien de mette en oeuvre un logiciel pour commander les moteurs et visualiser le flux vidéo pour voir l'environnement du Rov. Avant de me lancer dans des développements longs et réinventer la roue, j'ai décidé de donner une chance au logiciel openrov-cockpit. Celui-ci est Open Source bien sûr et il est donc aisé de le récupérer pour l'étudier.

Le but de cette étape est donc de voir s'il est possible de modifier le logiciel openrov-cockpit pour l'adapter à minima à nos spécificités. Il y a deux différences majeures: nous utilisons un autre logiciel pour récupérer le flux vidéo et nous n'avons pas de module Arduino pour la commande des moteurs et des capteurs. De nombreuses adaptations sont donc sûrement nécessaires, mais tout dépendra de la manière donc openrov-cockpit a été conçu. Nous voilà donc parti pour une étude de portabilité de openrov-cockpit sur Raspberry Pi et une adaptation à nos choix technologiques.

Le matériel n'étant pas identique au projet OepnROV, des adaptations logicielles vont être nécessaires. Celles-ci seront réalisées en plusieurs étapes. Cette section retraces les différentes évolutions logicielles et les différents tests effectués.

Les différents développements logiciels se poursuivent donc sur le repository github maintenant. Donc pour suivre l'avancement, vous pouvez vous rendre à l'adresse suivante:

Lecture de données issues de capteurs

Une autre étape importante est d'avoir accès aux différents capteurs nécessaires sur la plate-forme. Un des éléments important est d'avoir une centrale inertielle pour recueillir des informations sur les mouvements du ROV sous l'eau.

Une solution simple pour adresser des capteurs et actionneurs sur la Raspberry Pi est d'avoir recours à la solution GrovePi. Cette solution permet d'adresse très facilement une gamme très large de capteurs et actionneurs. Cette solution "Plug'n Play" devrait permettre une intégration rapide des données logiciellement.

Choix matériels

De nombreuses questions se posent dès que l'on quitte la plate-forme électronique de base: comment l'alimenter, quel moyen de communication mettre en place entre le ROV et la surface, ... Malheureusement, aucune solution n'est évidente et tout n'est que question de compromis: encombrement, poids, flottabilité, prix, ... Un choix a souvent des répercussions importantes sur un des paramètres et s'il est impossible de concilier tous les critères, les choix sont parfois cruciaux. J'ai donc regroupé dans cette rubrique les questions que je me suis posées quand j'ai commencé à sortir de la partie que je maîtrisais le mieux à savoir la partie informatique. Toutes les réponses ne sont pas forcément optimum suivant les critères, mais j'ai tenté de regrouper les différentes possibilités qui ont permis de faire ces choix de manière un peu plus éclairée et moins arbitraire.

Assemblage des éléments

Pour pouvoir continuer à travailler confortablement avec les différents éléments qui constituent maintenant le projet, j'ai réalisé un premier montage des composants sur des supports. Ceci me permet de plus rapidement déployer le projet. Cette partie du travail a nécessité de modéliser les composants du projet, ce qui pourra être réutilisé pour la construction de l'enveloppe pour la mise à l'eau.

To be continued...

La prochaine étape est d'incrémenter ce prototype avec l'intégration des fonctionnalités manquantes au fur et à mesure des disponibilités et en particulier le problème du profondimètre qui est actuellement manquant dans le projet. Mais un point majeur qu'il va falloir aussi maintenant aborder en parallèle est la construction d'une enveloppe qui permettra (enfin) d'envoyer le ROV sous l'eau!

Voici la liste des tâches à réaliser prochainement:

  • Rendre les fonctions de calibrage de la centrale inertielle disponible depuis l'interface
  • Ajouter le paramètre de déclinaison pour le boussole (à partir des infos GPS directement ?)
  • Eclairage avec des LEDs pour y voir plus clair par grande profondeur
  • Eclairage en infrarouge pour faire ressortir certaines couleurs
  • Mesure des distances (par pointage laser ?)
  • Plan pour l'enveloppe du sous-marin

Résumé du système actuel

Pour faciliter les interventions des personnes désireuses de contribuer (ce qui permettrait au projet d'avancer plus vite), voici la liste des composants que j'ai utilisé et une image intégrant tous ces développements pour faciliter la reprise du projet

Liste des achats matériels

Voici la liste des composants que j'ai acquis pour réaliser ce prototype. Cette liste est susceptible d'évolutions, mais c'est un bon point de départ pour ceux qui voudrais reproduire le projet actuel.

Image compressée du système

Afin de faciliter le démarrage et ainsi éviter de devoir suivre les différentes étapes d'installation et de configuration, voici une image à graver sur la carte SD à insérer dans votre Raspberry Pi. J'essayerai de maintenir à jour cette image au fur et à mesure de l'avancée du projet.

L'image compressée ci-dessous n'intègre pas obligatoirement les dernières mises à jour logicielles disponibles sur git. Pour la mise à jour vers la toute dernière version, il vous suffit de réaliser les opérations suivantes:

cd ~/openrov-cockpit/src
git pull
npm install

2017-06-14: Image de l'installation complète Raspberry ROV Image du système complet pour RaspiROV

2019-02-02: Suite aux mises à jour de Chrome depuis 1 an et demi, le code de openrov-cockpit n'est plus compatbible avec les versions courantes de Chrome. Pour visualiser l'interface graphique web, il est nécessaire d'utiliser une version plus ancienne de Chrome comme la version 64 bits, Chrome 59.0.3071.86. Des développements importants sont nécessaires pour rendre openrov-cockpit compatible avec les nouvelles de Chrome. Dans la mesure du possible, ces développements seront réalisés ultérieurement.

Amusez-vous bien, vous aussi!