Laboratoire d`Optimisation Globale SDER/ENAC

Transcription

Laboratoire d`Optimisation Globale SDER/ENAC
École Doctorale Informatique et
Télécommunications (EDIT)
Master Recherche – Sûreté du Logiciel et Calcul à haute Performance (SLCP)
Année : 2005
Laboratoire d’Optimisation Globale
SDER/ENAC
Certification du code embarqué
d’un micro-drone
par
Nicolas Albert
[email protected]
Directeur de recherche : Jean-Marc Alliot
Responsable du stage : Pascal Brisset
Nom du projet : Paparazzi
Dirigé par : Pascal Brisset
Février à Juillet 2005
École Nationale de l’Aviation Civile
7, avenue Édouard Belin
31055 Toulouse
Abstract
Unmanned Air Vehicles (UAV) are more and more sollicted for military porpuses and many
applications can now be found in the civil context. To be able to use this kind of aircrafts
in civil conditions, we have to ensure a minimum level of safety, particularly concerning
flying commands. This work aims at improving the safety of critical portions of onboard
source code. The study is made over UAVs from the Paparazzi project, initiated in 2003
by Pascal Brisset and Antoine Drouin.
Résumé
Les drones sont des appareils n’embarquant pas de pilote. Ils peuvent être autonomes et/ou
contrôlés depuis le sol. Leur usage est aujourd’hui de plus en plus en vogue, notamment
dans le milieu militaire où la sécurité des pilotes est parfois difficile à assurer. L’utilisation
de tels aéronefs a été largement médiatisée lors des derniers conflits armés. Les applications
civiles possibles sont tout aussi nombreuses.
Le problème posé est principalement la sécurité de tels appareils, notamment du point de
vue de l’intégration dans le trafic traditionnel. Une telle intégration n’est envisageable que
si l’on est sûr de pouvoir à tout moment contrôler et superviser le drone et le rattraper
en pilotage manuel en cas de problème. La première fonctionnalité à étudier et à sécuriser
est donc la reprise de commande en mode manuel et c’est cette partie de code embarqué
critique que l’on certifiera. Ce document présente les travaux réalisés pour ce travail de
Master, en exposant tout d’abord les limitations introduites par les mini-drones. Nous
détaillons ensuite la réalisation de la certification elle-même, qui passe par la réécriture du
code critique en Lustre. L’étude et les tests opérationnels sont réalisés sur les drones du
projet Paparazzi1 , initié en 2003 par Pascal Brisset et Antoine Drouin.
1
Projet Paparazzi : http://savannah.nongnu.org/projects/paparazzi/
Remerciements
Je remercie tous les personnels du Laboratoire d’Optimisation Globale pour la chaleur
de leur accueil lors de ce stage.
Je remercie Jean-Marc Alliot et Nicolas Durand pour l’attention dont ils ont fait
preuve tout au long de ce stage.
Je remercie Pascal Brisset pour son encadrement attentif et directif dans le déroulement
de ce stage.
Je remercie Antoine Drouin pour ses conseils et ses explications précises sur le fonctionnement de la partie aéromodélisme du projet.
Je remercie Judicaël Bedouet, Thibaut Feydy, Fabien Perrot et Olivier Revelin
également stagiaires de Master Recherche pour l’intérêt permanent qu’ils ont montré.
Je remercie Nicolas Barnier, Charles-Edmond Bichot, Christian Bontemps, David
Gianazza, Kévin Guittet, Jean-Baptiste Gotteland Estelle Malavolti-Grimal et
Thomas Rivière pour l’ambiance chaleureuse qui a régné tout au long de mon stage.
Introduction
Le terme “drone” désigne un engin volant sans pilote, sans considération pour ses caractéristiques (fonction, taille, performances). La particularité des drones consiste donc à
ne pas avoir d’intervention humaine à bord. Ainsi, les aéromodèles sont considérés comme
des drones. Les drones sont conçus pour évoluer dans des environnements où la présence
humaine est impossible ou non envisageable. C’est par exemple le cas d’appareils utilisés
pour diagnostiquer des feux de forêt (impossibilité de respiration) ou concernant les applications militaires (le risque de perte peut être trop important et pousser à ne pas embarquer
un pilote humain).
La dénomination anglaise UAV (Umanned Air Vehicule) suppose de plus que le drone
est autonome. Les aéromodèles ne rentrent plus dans cette définition. L’ambition du projet
Paparazzi est de créer un drone autonome. Des prototypes basés sur des aéromodèles
grand public ont été réalisés et se sont même montrés plus performants que des modèles
développés par des industriels (par exemple EADS Dornier) lors des premières compétitions
de vol autonome à l’automne 2003 et en juillet 2004.
Usages des drones : Comme toute activité nouvelle, les développements dans ce domaine sont très variés. Certaines techniques commencent à être fiables et la question de la
réglementation des vols de drones se pose désormais. Les drones militaires sont déjà utilisés
(lors de la guerre du Golfe et des conflits au Kosovo ou en Afghanistan par exemple) mais
ne requièrent pas de réglementation particulière. En revanche, les vols de drones civils sont
encore marginaux et cantonés aux limitations imposées aux aéromodélistes (vol à vue, en
dessous de 150m et à distance des servitudes aéronautiques).
Problèmes réglementaires : Qu’en est-il de l’intégration des drones civils dans la
circulation aérienne ? En effet, un drone ne peut pas répondre à la règle de base de la
navigation aérienne “voir et éviter”. Les fondements même de la réglementation de la
circulation aérienne sont inapplicables.
Afin de rendre plus facile l’intégration des drones dans l’espace aérien civil actuel, il est
nécessaire de sécuriser et de fiabiliser leur fonctionnement. En effet, il faudrait définir par
exemple si le drone doit déposer une mission (ou plan de vol) et la suivre à la lettre, auquel
cas le contrôle aérien adapterait sa gestion en fonction des drones. Une autre solution moins
contraignante pour le contrôle consisterait à donner des consignes de navigation aux drones
au même titre qu’aux pilotes. Dans ce cas, le respect des consignes de la part du drone est
i
ii
primordial. Les évitements quant à eux peuvent être réalisés par des systèmes embarqués
tels que le TCAS2 , actuellement utilisé pour les avions traditionnels.
Pour permettre l’intégration des drones dans le trafic traditionnel et assurer la cohabitation entre les drones et les avions pilotés, il est indispensable de s’assurer que l’avion
demeure contrôlable quoi qu’il arrive. Dans cette optique, nous nous attachons dans cette
étude à certifier la partie du code source consacrée à la commande et à la gestion des
modes de vol (manuel, automatique, etc.) du drone Paparazzi, le drone devant toujours
être “rattrapable” par un opérateur humain au sol par exemple.
Organisation de ce document : Ce document présente tout d’abord le monde des
drones, leurs spécificités et leurs usages et les contraintes aux quelles ils sont soumis.
La seconde partie sera consacrée au projet Paparazzi, objet de ce stage. Nous y verrons
comment le projet est structuré et quelles sont les fonctionnalités critiques que nous devons
améliorer.
La troisième partie détaille le choix et l’utilisation d’un langage de programmation
synchrone : Lustre. La dernière partie sera consacrée à la vérification des propriétés de
sûreté en exposant le principe et les méthodes utilisées.
2
TCAS : Traffic Collision Avoidance System
Table des matières
Introduction
i
1 Le monde des drones
1.1 Les drones, avant tout militaires . . . . . .
1.2 Applications civiles . . . . . . . . . . . . .
1.2.1 Application selon masse et altitude
1.2.2 Quelques applications concrètes . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
7
8
9
2 Étude technique préliminaire
2.1 Les mini-drones . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Conception d’un mini-drone . . . . . . . . . . . . .
2.1.2 Un mini-drone autonome . . . . . . . . . . . . . . .
2.2 Le projet Paparazzi . . . . . . . . . . . . . . . . . . . . . .
2.2.1 L’aéromodèle utilisé . . . . . . . . . . . . . . . . .
2.2.2 Architecture matérielle de l’électronique embarquée
2.2.3 Spécificités des aéromodèles . . . . . . . . . . . . .
2.3 Principes de la chaı̂ne de commande . . . . . . . . . . . . .
2.3.1 Les servo-moteurs . . . . . . . . . . . . . . . . . . .
2.3.2 Décodage PPM . . . . . . . . . . . . . . . . . . . .
2.3.3 Synthèse des commandes de servo-moteur . . . . .
2.4 Méthode de certification utilisée . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
12
12
13
14
14
15
16
18
19
21
21
22
3 Utilisation d’un langage synchrone
3.1 Les langages synchrones . . . . . . . . . . . . . . . .
3.1.1 Systèmes temps-réel . . . . . . . . . . . . . .
3.1.2 L’hypothèse du synchronisme . . . . . . . . .
3.1.3 Synchronisme fort . . . . . . . . . . . . . . . .
3.2 Le langage LUSTRE . . . . . . . . . . . . . . . . . .
3.2.1 Exemple booléen : détecteur de front montant
3.2.2 Exemple numérique : compteur . . . . . . . .
3.3 Lustre dans le projet Paparazzi . . . . . . . . . . . .
3.3.1 Entrées / Sorties . . . . . . . . . . . . . . . .
3.3.2 La communication inter-micro-contrôleur . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
24
24
24
25
26
27
27
28
29
29
30
iii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
TABLE DES MATIÈRES
3.4
3.5
iv
Détail du traitement de SIG INPUT CAPTURE1 . . . .
3.4.1 Le code C existant . . . . . . . . . . . . . .
3.4.2 Périphériques utilisés sur le micro-contrôleur
3.4.3 Conséquence sur le code Lustre . . . . . . .
3.4.4 Première spécification du décodage PPM . .
3.4.5 Détail de la détection d’erreur dans la trame
3.4.6 Exemples d’erreurs à la réception . . . . . .
Mise en œuvre opérationnelle . . . . . . . . . . . .
4 Vérification des propriétés de sûreté
4.1 Limitations du langage Lustre . . . . . . . . .
4.1.1 Première approche . . . . . . . . . . .
4.1.2 Seconde approche . . . . . . . . . . . .
4.2 Vérification de propriétés . . . . . . . . . . . .
4.2.1 Principe . . . . . . . . . . . . . . . . .
4.2.2 Exemple . . . . . . . . . . . . . . . . .
4.2.3 La vérification dans le projet Paparazzi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . .
. . . .
. . . .
. . . .
PPM .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
30
30
31
31
33
34
36
38
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
39
39
40
40
40
41
43
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Conclusion
46
A Interruption SIG INPUT CAPTURE1 en C
49
B Code source Lustre pour la vérification de propriétés
51
Bibliographie
52
Table des figures
1.1
1.5
1.6
1.7
Drones militaires de surveillance : Global Hawk (Northrop Grumman, 1000kg
de charge utile) et Sperwer (Sagem). . . . . . . . . . . . . . . . . . . . . .
Le Predator, drone MAE multi-missions, utilisé par l’US Air Force depuis
1995. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Drones portables : Evolution (BAI Aerosystem) et DO-MAV (EADS-Dornier).
Micro drones : Black Widow (Aerovironment, 42g) et Micromechanical Flying
Insect (UC Berkeley, 25mm) . . . . . . . . . . . . . . . . . . . . . . . . . .
Drone solaire Helios (www.aerovironment.com) . . . . . . . . . . . . . . .
RMAX Yamaha et quadrirotor Braunmod . . . . . . . . . . . . . . . . . .
Analyse du marché du drone civil selon l’USICO . . . . . . . . . . . . . . .
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Twinstar . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Microjet . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Positionnement des composants sur un Microjet . . . . . . .
Architecture matérielle de l’électronique embarquée . . . . .
Compteur décimal et servo-moteur . . . . . . . . . . . . . .
Impulsion de commande d’un servo-moteur . . . . . . . . . .
Trame PPM à 7 canaux et détail de répartition sur les servos
3.1
3.2
Principe d’interaction d’un système temps-réel (ou réactif) . . . . . .
Principe du synchronisme fort : les temps d’exécution sont supposés
face à la dynamique de l’environnement . . . . . . . . . . . . . . . . .
Découpage modulaire du décodage des trames PPM en Lustre . . . .
Machine à état décodant un signal PPM à 6 canaux . . . . . . . . . .
Machine à état générique décodant un signal PPM à N canaux . . . .
1.2
1.3
1.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
6
9
15
16
17
18
19
19
20
. . .
nuls
. . .
. . .
. . .
. . .
25
27
32
34
35
4.1 Principe du programme de vérification . . . . . . . . . . . . . . . . . . . .
4.2 Automate du nœud SWITCH . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Automate du programme de vérification . . . . . . . . . . . . . . . . . . .
41
42
42
v
.
.
.
.
.
.
.
4
4
.
.
.
.
.
.
.
3.3
3.4
3.5
.
.
.
.
.
.
.
3
Liste des tableaux
2.1
Changements de mode de fonctionnement en cas de défaillance . . . . . . .
22
3.1
3.2
3.3
3.4
Problème de déterminisme lié à la concurrence . . . .
Traitement d’une séquence PPM valide . . . . . . . .
Traitement d’une séquence PPM erronée . . . . . . .
Traitement d’une séquence PPM valide avec mauvaise
.
.
.
.
26
35
37
38
4.1 Code d’exécution pour SIG INPUT CAPTURE 1 . . . . . . . . . . . . . . . . .
4.2 Code de vérification pour SIG INPUT CAPTURE 1 . . . . . . . . . . . . . . .
43
43
vi
. . . . . . . .
. . . . . . . .
. . . . . . . .
configuration
.
.
.
.
.
.
.
.
.
.
.
.
Chapitre 1
Le monde des drones
Les drones sont des aéronefs sans pilote humain à bord. Cette définition simpliste
englobe de nombreux types d’appareils classés dans 3 grandes catégories :
Mini-drones Ce sont des drones plutôt légers et de taille réduite (jusqu’à quelques kilogrammes et d’une envergure jusqu’à 1 à 2 mètre) facilitant la mise en œuvre et
généralement utilisés pour l’observation de zones difficiles d’accès.
MALE (Moyenne Altitude Longue Endurance) Ce sont des drones de taille comparable aux avions traditionnels. Ils sont généralement voués à l’observation, mais
certains peuvent embarquer des armes.
HALE (Haute Altitude Logue Endurance) Il s’agit de drones de grande envergure
volant à très haute altitude. Ils sont majoritairement utilisés pour des communications, comme alternative aux satellites.
Nous présentons ici un court état de l’art concernant les drones[Bri04], puis nous nous
intéressons aux applications civiles réalisables par les drones et en particulier les minidrones.
1.1
Les drones, avant tout militaires
Gros drones Depuis plus d’un demi-siècle, des drones ont été développés dans le domaine
militaire. Après quelques expériences anecdotiques, ils ont été utilisés systématiquement
lors des conflits « modernes », depuis les années 80, principalement par les israéliens,
les américains et par les forces alliées lors des deux guerres du Golfe. Ces engins ont
notamment été utilisés pour des missions de reconnaissance et de surveillance (c.f. figure
1.1). Néanmoins certains (par exemple le Predator, figure 1.2) peuvent être armés, de
missiles ou de mini-drones. Ces avions de plusieurs tonnes possèdent une charge utile
importante (jusqu’à une tonne pour le Global Hawk) et sont équipés de caméras (visible
et infrarouge) et de radars divers. Il sont reliés au sol via des communications haut-débit,
habituellement via des satellites.
Le Global Hawk peut voler au-dessus du trafic civil (FL600) et son intégration à la
circulation aérienne est délicate uniquement pendant les phases de montée et descente.
2
CHAPITRE 1. LE MONDE DES DRONES
3
Fig. 1.1 – Drones militaires de surveillance : Global Hawk (Northrop Grumman, 1000kg
de charge utile) et Sperwer (Sagem).
Avec un rayon d’action pouvant atteindre 12 000 NM (environ 22 000 km), il peut remplir
des missions transcontinentales. À l’automne 2003, un Global Hawk a traversé l’atlantique
pour une mission en Allemagne.
Drones portables La deuxième grande catégorie de drones ne se distingue pas par leur
mission principale, l’observation, mais par leur taille. Ces drones portables (figure 1.3)
de quelques kilogrammes sont conçus pour être transportés dans un sac à dos et mis en
œuvre à l’aide d’une « station-sol » réduite à un ordinateur portable et un émetteurrécepteur permettant la communication avec le drone (les plus gros de ces mini-drones
peuvent nécessiter l’usage d’une rampe de lancement pour le décollage). La charge utile
essentielle d’un tel mini-drone est une caméra vidéo dont l’image est retransmise en continu
à la station-sol. Avec un rayon d’action de quelques kilomètres, l’objectif d’un mini-drone
est d’aller voir « de l’autre côté de la colline » soit en étant piloté comme un modèleréduit standard soit de manière autonome en suivant une mission préprogrammée (une
suite de waypoints), la navigation étant effectuée grâce à un positionnement GPS. Dans
cette catégorie, le DO-MAV d’EADS-Dornier mesure 42cm d’envergure pour un poids de
500g. Il peut être mis en œuvre par un opérateur unique.
Micro-drones Toujours avec des objectifs au départ militaires, la miniaturisation des
UAVs a été poursuivie. Pionnière dans le domaine dès les années 80 avec son Pointer, un
avion de 4kg avec 1kg de charge utile, la société AeroVironment a construit un drone de
42g, le Black Widow (figure 1.4) équipé d’une caméra et capable de naviguer de manière
autonome (GPS) avec une autonomie de 30mn. Mis à part la performance technologique,
on peut douter de l’intérêt d’une telle miniaturisation qui d’une part réduit la charge utile
à quelques grammes et dont les performances de vol sont forcément très dégradées en
présence de vent.
CHAPITRE 1. LE MONDE DES DRONES
4
Fig. 1.2 – Le Predator, drone MAE multi-missions, utilisé par l’US Air Force depuis 1995.
Fig. 1.3 – Drones portables : Evolution (BAI Aerosystem) et DO-MAV (EADS-Dornier).
La course à la miniaturisation est cependant loin d’être terminée et les études actuelles concernent des engins de quelques grammes (figure 1.4) ; dans ce cadre les recherches s’orientent vers des solutions s’inspirant du monde biologique en particulier pour
l’aérodynamique en privilégiant le vol à ailes battantes. Le vol à ailes battantes ou vibrantes est étudié au sein du projet REMANTA de l’ONERA : les problèmes à résoudre
sont mécaniques et aérodynamiques. Les écoulements induits par les mouvements complexes doivent être analysés finement afin de pouvoir optimiser le rendement du vol. Les
autres problèmes à résoudre à ces échelles concernent la propulsion et l’énergie.
L’intérêt militaire des micro-drones a été identifié depuis plusieurs années et la lecture
du rapport [Hub01] est aussi enrichissante qu’inquiétante.
Drones stratosphériques Il existe également des drones d’une autre envergure, des
grands drones, stratosphériques, prévus pour des vols à très haute altitude pour des durées
a priori illimitées (plusieurs mois). L’objectif dans ce cas est de remplir une mission analogue à celle d’un satellite géostationnaire : observation et communication. Le leader pour
CHAPITRE 1. LE MONDE DES DRONES
5
Fig. 1.4 – Micro drones : Black Widow (Aerovironment, 42g) et Micromechanical Flying
Insect (UC Berkeley, 25mm)
Fig. 1.5 – Drone solaire Helios (www.aerovironment.com)
cette technologie, en coopération avec la NASA, est encore la société AeroVironment avec
son drone Helios (anciennement Pathfinder). Il s’agit d’un grand avion électrique (figure
1.5) d’une soixantaine de mètres d’envergure, muni de panneaux solaires et d’une pile à
combustible. L’énergie solaire est utilisée pendant la période diurne pour alimenter les moteurs et recharger la pile à combustible. Cette dernière est utilisée la nuit pour éviter à
l’avion de perdre trop d’altitude. En 2001, Helios a atteint une altitude record de 96 863
pieds. Des expérimentations ont été effectuées en 2002 avec ce drone pour la première
application commerciale (de la télévision) utilisant un relais à 60 000 pieds1 .
Drones hélicoptères De même qu’avec les aéronefs pilotés, certaines applications nécessitent la possibilité de pouvoir effectuer du vol stationnaire. Plusieurs solutions sont envisagées, la moins originale est l’hélicoptère classique. Les hélicoptères R-50 et RMAX de
Yamaha sont commercialisés depuis plus d’une douzaine d’années. Il s’agit d’engins d’une
1
Un exemplaire d’Helios s’est écrasé en juin 2003 au large d’Hawaı̈ pendant un vol d’essai.
CHAPITRE 1. LE MONDE DES DRONES
6
Fig. 1.6 – RMAX Yamaha et quadrirotor Braunmod
cinquantaine de kilos avec une charge utile de 20 et 30kg. Munis d’un système de navigation, ils sont capables d’effectuer des missions en autonomie complète. Aujourd’hui, plus
de 1500 exemplaires sont utilisés au Japon pour des traitements agricoles [Sat]. Le RMAX
a aussi été capable de réaliser des prises de vues aériennes en environnement hostile lors
d’une éruption volcanique. Un exemplaire d’un RMAX capable de voler de façon autonome
jusqu’à 100m au dessus du sol est commercialisé à $200 000. Au Japon, son utilisation agricole doit être certifiée par le Japan Agriculture Aviation Association qui assure également
la formation des opérateurs.
L’autre solution technique classique pour effectuer du vol stationnaire avec un engin
de petite taille est le quadrirotor (figure 1.6) : l’aéronef est sustenté par quatre rotors
indépendants disposés en croix. Le contrôle est assuré simplement par la variation de la
vitesse de rotation de chacun des rotors. Cette solution est mécaniquement plus simple
qu’un hélicoptère classique (rotor à pas variable), naturellement plus stable mais moins
dynamique (réaction lente aux perturbations extérieures). Le quadrirotor est par exemple
étudié par le CEA pour un engin d’exploration intérieure pour les centrales nucléaires. Dans
cette application, le drone doit « apprendre » son itinéraire à l’aide d’« indice vidéo »,
pour savoir ressortir du bâtiment de manière autonome.
Drones européens Bien qu’en retrait dans le domaine militaire (derrière Israël et les
USA), l’Europe est active tant du côté académique qu’industriel sans oublier le domaine
réglementaire. L’université technique de Braunschweig, Allemagne constitue un pôle de recherche important. L’université de Bristol, UK, a organisé en 2004 la 18ème conférence internationale sur les UAV (anciennement Remotely Piloted Vehicles). L’ENSICA et Supaéro
organisent depuis 2001 les Journées Micro-drones, regroupant une conférence et des démonstrations en vol.
Ces journées sont en relation avec le concours de drones miniatures supervisé par la
DGA. Ce concours dont l’épreuve finale aura lieu en 2005 est ouvert aux écoles d’ingénieurs
CHAPITRE 1. LE MONDE DES DRONES
7
et aux universités. Selon le règlement, « ce concours a pour objet de démontrer la faisabilité
technique et l’intérêt opérationnel des drones miniatures utilisés comme aide au fantassin
dans sa progression en milieu hostile ». L’objectif ultime est la circulation autonome dans
un milieu urbain d’un engin muni d’une caméra, avec pour mission de repérer des snipers.
Les critères d’évaluations comprennent la simplicité de mise en œuvre, l’endurance, la
miniaturisation, la discrétion, ...
Toujours dans le domaine de la défense, c’est EADS, en partenariat avec Dassault,
Thalès et Sagem, qui ont été retenus pour le développement d’un drone MALE pour l’état
français. Cet EuroMALE est en particulier conçu pour coopérer avec le Sperwer (Sagem)
déjà choisi par cinq autres pays européens.
Références La description de l’ensemble des drones existant est disponible sur le web.
On peut citer www.uavforum.com qui répertorie les constructeurs et les aéronefs. La revue
Armada Internationale a publié en juillet 2004 un « guide complet des UAV » disponible à www.aramada.ch. Le site www.livingroom.org.au/uavblog relate régulièrement
les nouvelles du domaine.
Les industriels se sont regroupés au sein d’un consortium UVS International (initialement EURO UVS) afin de promouvoir l’utilisation des drones. Les objectifs du consortium
sont
– d’avoir un impact international ;
– d’être un canal de communication privilégié pour les différents acteurs du secteur :
industries, gouvernements, autorités de l’aviation civile, universitaires, militaires,
opérateurs, ... ;
– de constituer une aide à l’étude du marché du drone ;
– de montrer aux utilisateurs potentiels l’intérêt des drones ;
– de promouvoir la coopération industrielle internationale ;
– d’améliorer la visibilité de la technologie vis à vis du grand public.
Le site du consortium www.uvs-international.org (libre d’accès après inscription), contient une base de donnée importante de documents concernant les constructeurs, les aéronefs
et les événements internationaux dans le domaine. Le consortium organise aussi régulièrement des conférences internationales.
1.2
Applications civiles
Nous présentons ici dans un premier temps les applications par catégories et nous en
détaillons ensuite quelques unes. Certaines d’entre elles ne sont pas compatibles avec la
régulation actuelle de la circulation aérienne ; nous nous intéressons à ce point uniquement
dans la section suivante.
CHAPITRE 1. LE MONDE DES DRONES
1.2.1
8
Application selon masse et altitude
Tous les avantages reconnus des drones pour les applications militaires sont transposables aux applications civiles : comme mentionné dans l’introduction, les environnements
« Dull, Dirty and Dangerous » peuvent se rencontrer dans le domaine civil. Des missions
civiles très similaires aux missions de défense comme la surveillance des frontières2 et la surveillances des personnes (lors de manifestations publiques par exemple ou lors de simples
missions de police) sont facilement envisageables. D’autres applications, plus originales,
sont étudiées à plus ou moins long terme : observation de la terre, télécommunications,
transport, ...
Le projet européen USICO3 a identifié trois grandes catégories de drones candidats à
des applications civiles [USI04] et analysé le marché comme représenté figure 1.7 :
1. Mini et micro-drones à basse altitude :
– Photos aériennes, inspection
– Publicité
– Épandage agricole, surveillance des cultures, garde de troupeaux
– Expériences scientifiques, mesures atmosphériques
– Déminage
L’évolution de cette branche sera fortement liée à l’évolution de la technologie correspondante. Envisagée uniquement dans le cadre des règles actuelles de l’aéromodélisme, l’utilisation des mini-drones est cependant assez limitée, notamment à
cause de l’obligation de pilotage « à vue ».
2. MALE :
– Activités gouvernementales (police, douanes, environnement, ...)
– Missions scientifiques
– Surveillance d’infrastructures (réseau routier, lignes électriques, pipe-lines, ...)
– Géodésie
– Transport de fret
– Transport de passagers
Les drones de cette catégories sont sur le marché (militaire) mais ne peuvent pas être
intégrés au trafic civil. Notons que l’usage de ce genre de plate-forme est limité par
le traité de non prolifération4
3. HALE géostationnaire :
– Radiodiffusion (télévision, ...)
– Télécommunications mobiles
– Environnement (incendies, pollution maritime, ...)
2
Des drones de l’armée suisse ont par exemple été utilisés pour surveiller les frontières dans le Tessin
pendant l’été 2004. Des drones Hermes surveillent la frontière entre le Mexique et les USA depuis fin juin
2004.
3
Unmanned aerial vehicle Safety Issues for Civil Operations : www.usico.org
4
Régime de Contrôle de la Technologie des Missiles : ce traité régule l’exportation de matériel et logiciel
permettant le développement de missiles d’une charge utile supérieure à 500kg et d’un rayon d’action de
plus de 300km.
CHAPITRE 1. LE MONDE DES DRONES
9
Mis à part le prototype Helios (figure 1.5), il n’existe actuellement pas de plate-forme
pouvant assurer ces missions (les autres projets envisagent des gros dirigeables). Cependant, ces services correspondent à un marché important, ce qui pourrait entraı̂ner
une évolution rapide du domaine.
Fig. 1.7 – Analyse du marché du drone civil selon l’USICO
1.2.2
Quelques applications concrètes
Publicité et photo aérienne L’une des rares applications actuelles civiles d’un aéronef
non habité concerne l’usage d’un ballon captif simplement comme support publicitaire ou
pour réaliser de la photo aérienne : le ballon est muni d’un appareil photo orientable,
télécommandé depuis le sol ; une caméra vidéo dont l’image est retransmise au sol sert
de viseur. Le ballon peut évoluer jusqu’à 150m, dans le cadre de la réglementation des
aéro-modèles. De nombreuses sociétés, en particulier françaises (Photociel, Phodia, ...),
proposent des services basés sur cette technique. La société Mediazepp commercialise un
ballon équipé pour moins de 5000e, prix à comparer avec une solution classique hélicoptère
et pilote ... Pour cette même application, le drone paramoteur5 Pixy a également été
développé. L’avantage par rapport au ballon captif, tout en restant dans le même cadre
de réglementation, est sa mobilité. De plus, son pilotage, grâce à une vitesse d’évolution
faible, ne nécessite pas les talents d’un pilote chevronné.
Déminage Les mines antipersonnel peuvent être repérées dans certaines conditions depuis le ciel : enfouies à très faible profondeur, à l’aube, elles ne se réchauffent pas de manière
identique au terrain environnant et il est possible de les repérer avec une image infrarouge.
5
Un paramoteur est un aéronef motorisé sustenté par une voilure souple, de type parachute.
CHAPITRE 1. LE MONDE DES DRONES
10
Une cartographie de terrains minés a déjà été réalisée avec un mini-drone hélicoptère de
quelques dizaines de kilogrammes6 .
La technologie hélicoptère est assez coûteuse mais il est possible d’utiliser un mini-drone
avion pour réaliser cette cartographie. La société Fondmetal Technologie envisage d’utiliser
le système Paparazzi pour équiper un avion de quelques kilogrammes dans ce but. L’objectif est de fabriquer un engin d’environ 15 000e qui serait accessible aux organisations
humanitaires et aux pays en voie de développement. Des expérimentations sont en cours.
Feux de forêt La lutte contre les feux de forêt est d’autant plus aisée que la détection
de départ de feu est précoce. Une surveillance permanente nécessite des moyens humains
importants. La solution drone s’impose naturellement7 . Pour ne pas interférer avec la circulation aérienne, c’est un drone HALE qui est prévu. À 20 000m d’altitude, avec une
autonomie de 24h, le drone sera muni de capteurs optiques et électromagnétiques pour
détecter non seulement les feux mais également les véhicules dans les zones réglementées.
Le programme de recherche piloté par l’ONERA doit donner ses conclusions fin 2004.
Inspection d’infrastructure Les mini-drones sont étudiés sérieusement pour inspecter des infrastructures, en particulier des lignes haute tension et des ouvrages d’art. Le
projet RIPL (Robotic Inspection of Power Lines) développe un mini-hélicoptère de 35kg à
deux rotors coaxiaux contra-rotatifs. L’étude du marché potentiel [AE04] devrait être motivante pour la recherche dans le domaine. Le Laboratoire Central des Ponts et Chaussées
conduit un projet pour l’utilisation de drones dont la mission est la surveillance automatisée d’ouvrages d’art[JLSD02]. Des expérimentations ont été conduites dès 2001 sur un
viaduc, en zone urbaine, avec un hélicoptère de 10kg radio-commandé (non autonome).
Ce même laboratoire étudie également l’utilisation de drones pour la surveillance du trafic routier[JLSL03]. L’objectif vise à mesurer précisément les phénomènes de congestion
chronique (sur les périphériques des grandes agglomérations) ou exceptionnelle (sur les
autoroutes suite à un incident bloquant la circulation par exemple). Dans le second cas
de figure, l’idée est d’avoir un système portable dont la mise en œuvre serait très simple
(quelques minutes) afin d’obtenir rapidement des observations sur site à moindre coût ; c’est
donc encore la catégorie des mini-drones qui est candidate à cet usage. Une expérimentation
a été envisagée au dessus du périphérique de Nantes mais aucune autorisation de vol n’a
pue être obtenue (la réglementation pour l’aéro-modélisme ne s’appliquant pas dans ce
cas).
Mesures atmosphériques Les ballons sondes, utilisés depuis longtemps par la météorologie, ne sont pas à proprement parler des drones puisqu’ils ne sont pas pilotés (ni récupérés
en général). Il est assez tentant de remplacer ces ballons par des aéronefs contrôlés. Il est
cependant délicat d’envisager d’autres engins car les mesures doivent pouvoir être effectuées
6
7
maic.jmu.edu/journal/3.2/focus/schiebel mad/schiebel.htm
www.onera.fr/coupdezoom/07-drone-feux-forets.html
CHAPITRE 1. LE MONDE DES DRONES
11
dans des conditions délicates (nuage, givrage, très haute altitude, ...) et surtout suivant un
profil vertical. Un drone pourrait être intéressant dans trois contextes :
1. Récupération d’un ballon sonde traditionnel : le ballon est largué à haute altitude et
l’équipement de mesure redescend en planant de manière autonome vers un site de
réception. Le principal problème reste alors l’intégration de la trajectoire descendante
à la circulation aérienne.
2. Campagne de mesures intensives[Pas03] : la campagne Thorpex (The Hemisperifc
Observing System Research and Predictability Experiment) envisage de lancer des
ballons dirigeables à haute altitude (20 000m) emportant une charge utile de dropsondes larguées par télécommande. Prévu pour une durée de vie d’un an, un tel
ballon peut être qualifié de drone ... Est prévu également l’utilisation d’aerosondes8 ,
un drone d’une quinzaine de kilogrammes qui a déjà fait ses preuves, notamment en
traversant l’atlantique.
3. Mesure en basses couches : un mini-drone est particulièrement bien adapté pour
effectuer des mesures à basse altitude. Ainsi, un Carolo T1409 , renommé M2 AV,
Meteorological MAV pour l’occasion, va être utilisé pour effectuer des mesures de
température, humidité et vent[MBV04].
8
www.aerosonde.com
Il s’agit du Twinstar Multiplex de 1.40m, la cellule choisie au sein du projet Paparazzi depuis début
2003.
9
Chapitre 2
Étude technique préliminaire
Nous présentons ici le fonctionnement général des aéromodèles, fournissant un support
à la création de mini-drones. Nous étudierons ensuite la conception structurelle et fonctionnelle du mini-drone Paparazzi. Une fois les fonctionnalités critiques explicitées, nous
nous intéresserons plus particulièrement à l’une d’entre elles : la chaı̂ne de commande de
l’aéronef. Les méthodes de certification envisageables seront ensuite rapidement discutées
afin de choisir la plus adaptée au projet Paparazzi.
2.1
Les mini-drones
Un drone n’embarquant pas de pilote humain, il est tentant de réduire sa taille (c.f. 1.1
et photos 1.3 et 1.4). L’intérêt est double : financier et sécuritaire. En effet, un mini-drone
peut être réalisé avec du matériel “amateur” peu coûteux et largement diffusé. De plus, par
leur légéreté et leur faible vitesse, les mini-drones ont une énergie cinétique bien moindre
que les drones “taille réelle”. L’impact en cas de crash est donc très mesuré, voire minime.
2.1.1
Conception d’un mini-drone
Un drone n’étant pas obligatoirement autonome, les avions modèles réduits (ou aéromodèles) sont des mini-drones. Certains existent en kits prêts à voler, d’autres sont à
monter. Les passionnés les créent de toute pièce. Le point commun est que ce sont tous des
mini-drones, de prêt ou de loin. Nous prendrons ici comme support d’étude les aéromodèles
de type avion, par opposition aux hélicoptères et autres modèles à sustentation.
Un mini-drone est avant tout un avion : En effet, comme les avions traditionnels,
il comporte un fuselage, des ailes, des ailerons (en bout d’ailes), une ou des gouvernes
verticales ou horizontales, un ou des moteurs.
Les ailes permettent à l’avion de se maintenir en l’air, par la portance qu’elles génèrent
en avançant dans l’air. Le mouvement vers l’avant est produit par les moteurs. Les ailerons
12
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
13
permettent d’incliner l’avion pour effectuer des virages tandis que les gouvernes de profondeur permettent de jouer sur le cabrage de l’avion. Tous les ailerons, dérives et gouvernes
participent à la stabilité de l’appareil et sont donc constamment liés.
Le pilotage d’un aéromodèle : Le pilotage d’un aéromodèle s’effectue à partir du sol,
au moyen d’une radio-commande. Le pilote dispose d’un émetteur qui envoie des ordres
au récepteur placé dans l’avion. La radio-commande permet de contrôler la position des
ailerons, des gouvernes de profondeur, le régime des moteurs etc. Chacune de ces informations est indépendante. Comme la radio-commande n’utilise qu’une seule fréquence radio,
les différentes commandes envoyées sont multiplexées pour former un signal unique. Toutes
les commandes sont envoyées en même temps et en continu. Chaque commande constitue
une voie (ou canal ) de la radio-commande. Le nombre de voies possibles sur une radiocommande est une de ses caractéristiques intrinsèques. Le pilote doit coordonner ses ordres
sur chacune des voies pour obtenir un vol fluide.
À bord de l’avion, le récepteur reçoit les ordres par ondes radio. Après démultiplexage,
il est chargé de répartir les ordres reçus pour chaque voie à l’organe correspondant. Par
exemple, pour orienter un aileron, il est nécessaire de le faire pivoter. Pour cela, on utilise un servomoteur qui permet de transformer un ordre transmis électriquement en un
déplacement de quelques millimètres ou centimètres. Ces composants peuvent être très
petits et sont couramment utilisés en modélisme.
Un mini-drone peut donc facilement être réalisé à partir de kits et composants préexistants que l’on commande depuis le sol via une radio-commande. À bord, un récepteur
est chargé de décoder les ondes radio transmises et d’envoyer les ordres correspondants aux
servomoteurs qui agissent sur les éléments aérodynamiques et les moteurs.
2.1.2
Un mini-drone autonome
Le concept de drone présenté précédemment est un simple aéromodèle, piloté par un
humain au sol. Un mini-drone autonome est identique dans sa façon de fonctionner avec
toutefois quelques particularités.
Tout comme l’aéromodèle piloté, le drone autonome peut utiliser les ondes radio pour
recevoir des ordres provenant du sol. Il utilise aussi les servomoteurs pour déplacer les
éléments aérodynamiques et régler le régime moteur.
La différence se situe au niveau de l’interprétation des ordres reçus. Un drone autonome
doit être capable de voler sans intervention humaine du sol. Il a donc un pilote automatique,
pouvant effectuer différents types de missions. Pour cela, il doit tout d’abord être capable
de voler de façon stable, c’est à dire “piloter” l’avion pour le maintenir globalement à plat.
On dit qu’on contrôle l’attitude (ou l’assiette) de l’avion. Ensuite, le pilote automatique
doit naviguer, c’est à dire se déplacer dans son environnement de façon réfléchie. Pour cela,
on doit pouvoir le programmer à l’avance en lui fournissant un plan de vol détaillant tous
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
14
les objectifs de la mission : point de passage, hauteur par rapport au sol, montée, descente,
trajectoires etc.
Un mini-drone autonome peut donc être un aéromodèle classique auquel on a ajouté
un “cerveau” capable de stabiliser l’avion et d’effectuer de la navigation.
2.2
Le projet Paparazzi
Le projet Paparazzi vise à développer un système de navigation autonome pour avions
modèles réduits. Les domaines d’application de ce type de technologie sont aussi variés
que nombreux, allant du loisir photographique (prises de vue aériennes) à la détection de
mines antipersonnel, afin de faciliter le déminage. Les besoins en terme de sécurité et de
sûreté sont donc différents.
Afin d’assurer un meilleur niveau fiabilité et donc de sécurité, il est nécessaire de certifier
les fonctions critiques face aux risques de défaillances du matériel ou de parasitages (notamment au niveau de la réception radio). Dans le projet Paparazzi, l’architecture matérielle
a été pensée de façon à isoler les tâches critiques.
Le pilote automatique (ou autopilote) du projet Paparazzi a été développé progressivement, en reproduisant au maximum la façon de piloter d’un pilote humain. Ainsi, la
fonction de stabilisation a été créée en premier lieu. Ce mode de fonctionnement du pilote
automatique est un mode de pilotage assisté, permettant de piloter l’attitude de l’avion
sans se soucier de sa stabilisation. Les mouvements autorisés sont limités afin d’éviter que
l’avion ne tombe (décrochage, piqué, retournement...). Ce mode de fonctionnement est très
facile à appréhender et permet de piloter l’avion sans aucun pré-requis.
La fonction de navigation a été développée ensuite, permettant ainsi de donner à l’avion
sa véritable mission. Dans ce mode, l’avion est totalement autonome. La radio-commande
ne sert que pour contrôler le pilote automatique et/ou lui indiquer un événement dans
sa mission. Une mission est un ensemble d’étapes (ou blocs fonctionnels) que l’avion doit
suivre. Un bloc peut consister à faire des cercles autour d’un point donné (jusqu’à réception
d’un événement de la radio-commande par exemple), à rejoindre un autre point, etc. La
mission est enregistrée dans l’avion avant le décollage, contrôlée par la radio-commande
(changements de bloc) et supervisée depuis le sol grâce à un ordinateur affichant en permanence l’état de l’avion. La navigation en mode autonome n’est possible que si on est capable
de se positionner. Pour cela, on utilise un récepteur GPS1 , fournissant une indication de
position mais aussi d’altitude et de vitesse par rapport au sol.
2.2.1
L’aéromodèle utilisé
Pour maintenir le coût de revient des drones créés, il a été choisi d’utiliser des bases
volantes disponibles dans le commerce. Ainsi, les premiers tests ont été réalisés avec un
bimoteur à ailes hautes, le Twinstar (fig 2.1). Ce modèle a l’avantage d’être robuste et
surtout très stable, une qualité appréciable lors des réglages.
1
Global Positionning System
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
15
Fig. 2.1 – Twinstar
Le second modèle utilisé est un Microjet (fig 2.2). Il s’agit d’une avion à aile delta
plus petit et plus léger que le Twinstar. L’intégration et la mise au point des éléments
développés lors de ce stage seront effectuées sur ce modèle.
Les aéromodèles utilisés comportent tous les équipements classiques d’un avion modèle
réduit (récepteur radio, batterie, moteur(s), hélice(s), servo-moteurs) ainsi que les matériels
spécifiques au pilotage autonome :
– récepteur GPS pour le positionnement et la vitesse sol ;
– capteur à infra-rouge pour l’attitude ;
– carte contrôleur constituant le “cerveau” pour le vol autonome.
Tous ces composants sont représentés sur la figure 2.3.
2.2.2
Architecture matérielle de l’électronique embarquée
L’électronique embarquée comporte deux microcontrôleurs AVR. Ces microcontrôleurs
seront par la suite désignés par leurs noms génériques MCU0 et MCU1 (fig 2.4).
MCU0 est le pilote automatique proprement dit. Il est chargé des tâches suivantes :
– communication avec le récepteur GPS, afin d’obtenir les informations de positionnement et de vitesse sol ;
– interprétation des données des capteurs infra-rouge afin d’en déduire l’attitude de
l’appareil ;
– calcul des commandes de pilotage (fonction de stabilisation) ;
– calcul des commandes de navigation (respect du plan de vol) ;
– communication avec le microcontrôleur MCU1. MCU0 est dit maı̂tre et MCU1 est
esclave. Ainsi, MCU0 donne à MCU1 les ordres de pilotage des servo-moteurs.
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
16
Fig. 2.2 – Microjet
– génération des messages de télémétrie à destination de la station de supervision au
sol.
MCU1 est chargé des fonctions de réalisation des commandes. Ces tâches sont :
– la réception des événements provenant de la radio-commande ;
– l’envoi des ordres aux servo-moteurs, permettant le pilotage de l’appareil ;
– la réception des commandes de pilotage calculées par le pilote automatique ;
– la gestion des modes de fonctionnement.
Chacune de ces tâches joue un rôle primordial dans le fonctionnement même du drone.
La tâche de commande des servo-moteurs est naturellemnt indispensable. La gestion des
modes de fonctionnement permet de choisir entre les modes automatiques et le mode
manuel. Au moins une des deux tâches de réception des commandes de vol doit fonctionner
pour permettre de contrôler l’avion. Si on perd à la fois la réception radio et le pilotage
automatique alors une ultime mode de fonctionnement dit failsafe prend le relais. Il consiste
à couper les moteurs et placer les gouvernes en position neutre.
Les quatre tâches de MCU1 sont donc critiques et c’est sur ces fonctionnalités que le
stage est focalisé.
2.2.3
Spécificités des aéromodèles
Le système décrit précédemment doit être embarqué à bord d’un aéromodèle. Les
aéromodèles présentent des particularités qui leur sont propres. Si on compare un pilote
automatique embarqué à bord d’un avion de ligne, on constate que les ordres sont donnés
au système par le commandant de bord et son copilote, ceux-ci connaissant parfaitement la
situation de vol. Dans tous les cas, la reprise des commandes en cas de défaillance du pilote
automatique est instinctive pour l’équipage. Dans le cas d’un aéromodèle, la détection des
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
Fig. 2.3 – Positionnement des composants sur un Microjet
17
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
18
Fig. 2.4 – Architecture matérielle de l’électronique embarquée
défaillances et le basculement en mode automatique est à la charge du pilote qui se trouve
au sol. Dans le cas du drone Paparazzi le basculement en mode manuel est automatique
si le pilote automatique est défaillant. Si on ne peut pas recevoir la radio-commande, le
mode failsafe est activé.
Non seulement la distance et la taille réduite de l’aéromodèle rendent son contrôle
plus ardu mais aussi un nouvel intermédiaire intervient : les commandes sont transmises à
l’aéromodèle par une liaison radio. Ces commandes sont ensuite interprétées par le microcontrôleur de commande MCU1, qui les communique au pilote automatique MCU0. MCU1
recompose un signal de commande (d’après le pilote automatique ou les commandes manuelles suivant le mode de pilotage sélectionné) qui est envoyé aux servo-moteurs pour
actionner les gouvernes et les moteurs. L’étape de transmission radio rajoute donc de nouvelles sources de défaillance : perte de fréquence (problèmes de portée), brouillage radio
(plusieurs utilisateurs sur la même fréquence).
En cas de perte de données radio, le micro-contrôleur devra s’en remettre aux commandes calculées par le pilote automatique ou, à défaut, tenter de limiter les dégats en
adoptant une attitude la plus neutre possible.
2.3
Principes de la chaı̂ne de commande
Afin de pouvoir interpréter les informations reçues par la radio-commande et ainsi agir
sur les servo-moteurs, il est nécessaire de comprendre le fonctionnement d’un servo-moteur
et de la liaison radio elle-même. Cette section détaille le principe de fonctionnement d’un
servo moteur puis celui de la réception radio qui utilise le codage Pulse Position Modulation
(PPM). Le codage et le décodage de PPM sont duaux et sont utilisés à la fois par les servomoteurs et le récepteur radio.
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
19
Fig. 2.5 – Compteur décimal et servo-moteur
Fig. 2.6 – Impulsion de commande d’un servo-moteur
2.3.1
Les servo-moteurs
Un servo-moteur est l’association d’un moteur électrique miniature muni d’un petit
circuit électronique assurant sa commande et d’un réducteur, le tout actionnant un axe de
sortie (voir figure 2.5). Le servo-moteur est commandé par des impulsions qui caractérisent
la position de l’axe de sortie. C’est la durée de l’impulsion qui détermine cette position.
La durée du niveau haut logique varie entre 1 et 2 ms. La fréquence de mise à jour de la
position du servo-moteur doit être de 50 Hz, soit une période de 20 ms (voir figure 2.6).
Le micro-contrôleur n’a pas suffisamment de ports de sortie pour être connecté directement aux servo-moteurs. On utilise pour cela un compteur décimal (fig. 2.5) permettant
de compter les impulsions et de le répartir sur chaque servo-moteur. La figure 2.7 illustre
le découpage du signal vers les différents servo-moteurs. Sur cette figure, le signal d’entrée
est représenté sur le permier chronogramme. On constate qu’à chaque impulsion du signal
d’entrée, on démarre une impulsion sur l’une des voies du compteur, les unes après les
autres. Chaque impulsion du signal d’entrée correspond à la fin d’une voie et au début
de la suivante. Le signal d’une voie est donc un créneau de largeur variable exprimant
la valeur de la voie. Ici, nous avons 7 voies. On décode les voies successivement, jusqu’à
arriver à un silence anormalement long. L’impulsion qui y met fin est dite impulsion de
synchronisation. Elle permet de réinitialiser le comptage des voies et indique le début de
la première voie (ici 0).
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
Fig. 2.7 – Trame PPM à 7 canaux et détail de répartition sur les servos
20
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
2.3.2
21
Décodage PPM
Dans un modèle radio-commandé classique, les informations renvoyées par le récepteur
radio sont envoyées directement vers le compteur. Ici, nous souhaitons intercepter les commandes reçues par radio afin de pourvoir les traiter et les utiliser pour contrôler le pilotage
automatique. Nous voulons par exemple :
– mixer plusieurs voies (pour faire des virages coordonnés par exemple) ;
– uniformiser les canaux (pour pouvoir utiliser des radio-commandes différentes) ;
– substituer les commandes reçues par les commandes fournies par le pilote automatique.
Le récepteur fournit des trames PPM. C’est donc la position des impulsions qui va
déterminer la valeur de chaque canal. Contrairement au signal de commande des servomoteurs, la longueur du niveau haut importe peu. L’information est contenue dans la
séquence de fronts montants (ou de fronts descendants mais cela revient finalement au
même). L’intervalle entre 2 fronts identiques donne la valeur du canal.
La durée d’une trame est de 20 ms environ (période de 50 Hz). La radio-commande utilisée pour les tests comporte 7 canaux. Chaque canal pouvant prendre une valeur comprise
entre 0.9 et 2.1 ms, la durée de transmission des informations effectives est de 6 à 15 ms
environ. La pause de synchronisation permettant de réinitialiser le numéro du servo reçu
est donc comprise entre 5 et 14 ms (intervalle majorant). Chaque impulsion correspond à
la fin de l’information d’un canal et au début du suivant.
Un exemple de correspondance entre une trame PPM et les commandes des servomoteurs est donné sur la figure 2.7. Le fonctionnement du codage et du décodage étant
complètement réversible, la lecture d’un tel signal revient à effectuer le même travail que
le compteur décimal dont le fonctionnement à été détaillé précédemment (c.f. 2.3.1).
2.3.3
Synthèse des commandes de servo-moteur
Une fois la valeur de chaque canal lue, il s’agit de faire générer des ordres pour les
gouvernes et le(s) moteur(s). Ces commandes peuvent provenir :
– de la radio-commande directement dans le cas d’un pilotage en mode manuel ;
– du pilote automatique dans le cas d’un pilotage assisté ou entièrement autonome
(appelés respectivement auto1 et auto2 par la suite).
Dans tous les cas, les commandes sont normalisées en fonction de la radio-commande
car toutes les radio-commandes n’émettent pas de la même façon (les plages de valeur
peuvent différer par exemple). Les commandes uniformisées sont ensuite envoyées au pilote automatique qui calcule en permanence des lois de pilotage. On utilise ici l’avantage
d’avoir deux micro-contrôleurs pour faire des tâches différentes parallèlement. Le microcontrôleur MCU1 choisit donc sa source de commande. Si le micro-contrôleur de navigation
n’envoie plus de données, on tente de passer en mode manuel. Si la radio-commande est
hors de portée (pas de réception radio) alors on passe en mode dagradé (failsafe). Les
règles de changement de mode de fonctionnement sont détaillées dans le tableau 2.1. ê Les
trames envoyées sur le compteur sont exactement du même type que celles que transmet le
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
22
récepteur radio. On recompose donc un signal à partir de la source de données sélectionnée.
Perte RC Perte PA
Mode manuel
→ failsafe
–
Mode automatique
–
→ manuel
Mode failsafe
–
–
Tab. 2.1 – Changements de mode de fonctionnement en cas de défaillance (RC : radiocommande, PA : pilote automatique
-
2.4
Méthode de certification utilisée
Nous avons identifié les fonctionnalités critiques et détaillé le fonctionnement de l’une
d’entre elles. Il convient maintenant de choisir une méthode de certification afin d’améliorer
la fiabilité du code source et la sécurité générale de l’appareil.
La certification en soi n’est pas une assurance qualité. On ne certifie pas que le logiciel
ne contient aucun défaut. On s’assure qu’il valide des spécifications concordant avec le
cahier des charges. Ainsi, on accroı̂t la confiance que l’on a dans le logiciel. Cependant, la
qualité des spécifications est à prendre en compte. Pour valider des spécifications, il existe
plusieurs approches :
les tests permettent de vérifier a posteriori des propriétés du programme. La pertinence
de cette méthode dépend du choix du jeu de test. Cependant, cette méthode est
difficile à mettre en œuvre dans le cas d’un micro-contrôleur et quasiment impossible
lorsque le micro-contrôleur est embarqué à bord d’un aéromodèle.
l’interprétation abstraite permet de travailler directement sur le code source du programme, et de réaliser une analyse statique. On peut en tirer les propriétés fondamentales du code. L’étude du code d’un projet réel devient toutefois titanesque, de
part la lourdeur de la méthode.
la vérification en amont consiste à écrire du code dans un langage permettant de faire
des vérifications directement, puis de générer du code opérationnel à partir de ce
code sûr. La fiabilité de la méthode repose sur la correction du générateur de code
et du compilateur utilisés. C’est cette méthode, plus facile à mettre en œuvre, que
nous utilisons ici.
Cependant, il ne faut pas perdre de vue qu’une méthode de certification ou de vérification
n’est jamais une preuve absolue. Chaque méthode a ses défauts et ses qualités [CC01] et
dans tous les cas, la validité d’une certification repose sur la validité de tous les éléments
de l’environnement, aussi bien de développement que d’utilisation réelle. Ainsi, du code
vérifié et testé sur une machine peut ne pas se comporter de la même façon sur le microcontrôleur cible, tout simplement car les compilateurs utilisés n’implémentent pas le code
CHAPITRE 2. ÉTUDE TECHNIQUE PRÉLIMINAIRE
23
source de la même façon (par exemple lorsque la sémantique du langage n’est pas spécifiée
assez rigoureusement). Une vérification en amont peut donc être correcte mais s’avérer
désatreuse sur le produit fini à cause de tels problèmes de compilateur ou de normalisation
des langages (lors de changements réguliers de version en particulier).
Chapitre 3
Utilisation d’un langage synchrone
Les systèmes embarqués sont réellement particulier du fait de leur immersion totale
dans l’environnement. Contrairement à un programme traditionnel qui lit des informations
pour calculer un ou des résultats, un programme embarqué se doit avant tout d’interagir
avec son environnement, quitte à effectuer des calculs de qualité moindre. Pour répondre à
un tel besoin, on utilise des langages de programmation dits synchrones, présentés ici. Nous
introduirons ensuite le langage sélectionné pour ce projet et enfin l’utilisation qui en a été
faite durant ce stage au travers de l’exemple du décodage des PPM dont le fonctionnement
général a été expliqué au chapitre 2.3.2.
3.1
3.1.1
Les langages synchrones
Systèmes temps-réel
Le groupe CNRS sur la problématique temps-réel a défini en 1988 les systèmes tempsréel comme ceci :
Le comportement d’un système informatique est qualifié de temps réel lorsqu’il
est assujetti à l’évolution d’un procédé qui lui est connecté et qu’il doit piloter
ou suivre en réagissant à tous ses changements d’états.
Les systèmes temps-réel s’opposent donc aux systèmes transformationnels, qui effectuent un calcul à partir de données et d’entrées lues au démarrage, puis fournissent des
sorties et meurent. Les systèmes qui suivent l’évolution de l’environnement sont de deux
types :
système interactif :
– système en interaction quasi permanente avec son environnement, y compris après
initialisation ;
– la réaction du système est déterminée par les événements reçus et par l’état courant
(qui est donc fonction des événements et des réactions passées) ;
– le rythme de l’interaction est déterminé par le système et non par l’environnement.
système réactif ou temps-réel
24
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
25
Fig. 3.1 – Principe d’interaction d’un système temps-réel (ou réactif)
– système en interaction permanente avec son environnement, y compris après initialisation ;
– la réaction du système est déterminée par les événements reçus et par l’état courant
(qui est donc fonction des événements et des réactions passées) ;
– le rythme de l’interaction est déterminé par l’environnement et non par le système.
La figure 3.1 illustre le principe des systèmes temps-réel.
Un système temps réel peut être représenté par une machine à état, un automate dont
l’avancement serait provoqué par les événements de l’environnement. Le calcul de chaque
nouvel état doit être plus rapide que l’intervalle entre deux événements.
3.1.2
L’hypothèse du synchronisme
En règle générale, un programme lit des entrées et calcule une ou plusieurs sorties. La
particularité des systèmes embarqués est que l’interaction avec l’environnement importe
plus que le calcul lui même [Lee01]. En effet, durant le calcul, l’environnement évolue
toujours et les sorties peuvent ne plus être pertinentes. Pour remédier à cela, on fait l’hypothèse que les données ne sont pas modifiées pendant le calcul. En pratique, les données
sont lues avant le calcul et sont considérées fixes pour toute la durée du calcul.
Les valeurs des variables internes ou de sorties sont figées au fur et à mesure de leur
élaboration. Cela revient à n’utiliser que des assignations uniques, gelant ainsi le temps du
point de vue de chaque variable. On assure ainsi un comportement déterministe.
Les premiers problèmes arrivent lorsqu’on veut programmer en utilisant cette hypothèse. En effet, le programmation séquentielle traditionnelle assure le déterminisme
recherché. Cependant, dans le contexte d’un système réactif, on travaille avec des soussystèmes temporellement indépendants et qui s’exécutent parallèlement. Les temps d’exécution interviennent donc dans le résultat calculé. Il n’est donc pas possible de prévoir le
comportement dans un environnement réel, peuplé de retards, délais, etc.
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
26
C’est donc le caractère asynchrone du monde concret qui pose problème. Pour faire
face à cet asynchronisme, il est nécessaire de synchroniser manuellement les exécutions
des différentes parties d’un système, par le biais de rendez-vous, sémaphores, etc. C’est le
principe de fonctionnement des programmes informatiques en général.
Cependant, la notion de temps d’exécution n’étant pas maı̂trisée, il est difficile de
prévoir les comportements lorsqu’il y a concurrence de deux blocs d’instructions (voir
table 3.1).
var X : integer;
X <- 0
[
X <X <||
Y <]
;
1;
2;
X+1;
Après exécution de ces lignes de
pseudo-code, X vaut 2.
Dans l’hypothèse d’un comportement
asynchrone, plusieurs entrelacements sont
envisageables et Y peut prendre plusieurs
valeurs possibles : 1, 2 ou 3.
Le comportement est donc non
déterministe.
Tab. 3.1 – Problème de déterminisme lié à la concurrence
3.1.3
Synchronisme fort
Pour faire face au problème de l’ordre d’exécution de différentes séquences de code, on
fait l’hypothèse dite du synchronisme fort :
Toutes les opérations sont supposées s’exécuter en un temps nul.
Concrètement, toutes les instructions s’exécutent en même temps, sans ordre particulier. On considère ici que le temps d’exécution est négligeable devant la dynamique de
l’environnement. L’idée consiste donc à ne pas considérer ces temps d’exécution, à les
supposer nuls (voir figure 3.2).
Cette hypothèse a l’avantage de simplifier le comportement interne du système, rendant ainsi déterministe son comportement. Sur l’exemple de la table 3.1, les multiples
affectations de X ne permettent pas d’assurer le déterminisme. Les langages synchrones,
qui mettent en pratique l’hypothèse du synchronisme fort, interdisent les affectations multiples.
Le code écrit sous l’hypothèse du synchronisme fort étant déterministe, il est toujours
possible de le compiler sous forme d’un automate fini minimal. On repasse dans le monde
réel en compilant l’automate sous forme de code séquentiel (en C par exemple). On obtient
ainsi un code utilisable en exploitation. La validité du code généré dépend de l’automate
dont il découle. Il est possible d’effectuer des preuves automatiques de propriétés sur les
automates (Model Checking).
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
27
Fig. 3.2 – Principe du synchronisme fort : les temps d’exécution sont supposés nuls face à
la dynamique de l’environnement
3.2
Le langage LUSTRE
Le langage LUSTRE [HCRP91] est un langage de programmation synchrone. Son principe repose sur la manipulation de flots (ou flux) de données infinis. Ce langage est destiné
à écrire des systèmes de contrôle de façon la plus « naturelle » possible, afin d’obtenir
une programmation sûre. La programmation consiste donc à décrire le comportement du
système en fonction des flots de données qu’il consomme et produit.
Ainsi, un programme Lustre est constitué de blocs fonctionnels travaillant sur des variables d’entrée-sortie. Ces variables sont des flots de données infinis. Une opération Lustre
est considérée comme agissant sur l’ensemble d’un flot de données et non sur la valeur instantanée de cette variable. Cela permet d’écrire des relations générales qui devront toujours
être vérifiées. Cette particularité se retrouve par exemple en programmation logique.
L’exécution d’un programme Lustre calcule la nouvelle valeur de chaque flot de données
en fonction des valeurs des autres flots et de ses propres valeurs précédentes. Le langage
Lustre est donc adapté aux systèmes échantillonnés. Le rythme d’exécution est déterminé
par l’environnement. Ce n’est pas le flot qui impose son rythme au programme. Une fonction
(ou bloc fonctionnel) Lustre est appelée un nœud. Un programme est un ensemble de nœuds.
3.2.1
Exemple booléen : détecteur de front montant
Le langage Lustre est particulièrement adapté aux problèmes manipulant majoritairement des booléens, comme la gestion des systèmes de commande.
Ce court exemple illustre comment Lustre permet de contrôler des variables d’état
booléennes. Ici, on dispose d’un flux booléen en entrée et on souhaite détecter les fronts
montants [HR02].
node EDGE(X: bool) returns (Y: bool);
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
28
let
Y = X and not pre(X);
tel
La première ligne spécifie l’interface du nœud. Le nœud EDGE produira donc un flux
booléen Y à partir de X.
La ligne suivante définit l’équation vérifiée par Y :
Y = X and not pre(X);
Il s’agit d’une expression booléenne sur des flux infinis. Les opérateurs “and” et “not”
sont les opérateurs booléens usuels étendus à l’ensemble du flux. C’est à dire que que si
A = (a1 , a2 , ..., an , ...) et B = (b1 , b2 , ..., bn , ...), alors l’expression A and B correspond au
flux booléen (a1 ∧ b1 , a2 ∧ b2 , ..., an ∧ bn , ...).
L’opérateur “pre” désigne l’élément précédent dans un flux. Par exemple si A =
(a1 , a2 , ..., an , ...), alors pre(A) est le flux (nil, a1 , a2 , ..., an−1 , ...). C’est à dire la première
valeur est la valeur indéfinie nil, et pour tout n > 1, la n ème valeur est la n − 1ème valeur
de A.
Pour s’affranchir de la valeur indéfinie nil, il est possible d’initialiser un flux avec
l’opérateur “->” (suivi de). Si A = (a1 , a2 , ..., an , ...) et B = (b1 , b2 , ..., bn , ...), alors “C =
A -> B” est le flux C = (a1 , b2 , ..., bn , ...). Ici, la première valeur de C est a1 et pour tout
n > 1 on a cn = bn .
Ainsi, dans le code de notre exemple, si X = (x1 , x2 , ..., xn , ...), alors l’expression “Y =
X and not pre(X)” donne le flux suivant :
Y = (nil, x2 ∧ ¬ x1 , ..., xn ∧ ¬ xn−1 , ...)
Ici, la première valeur de Y est nil. En effet, Y est calculé en fonction de X et pre(X).
On connaı̂t x1 mais x0 est indéfini. y1 = x1 ∧ ¬ x0 est donc indéfini aussi et vaut nil.
Pour éviter d’obtenir nil, utilisons l’opérateur -> et la constante false1 . L’écriture du
nœud EDGE devient donc :
node EDGE(X: bool) returns (Y: bool);
let
Y = false -> X and not pre(X);
tel
3.2.2
Exemple numérique : compteur
Des types numériques (int et float) sont également définis, permettant par exemple
décrire un compteur numérique. L’expression C = 0 -> pre(C) + 1 ; définit par exemple
la liste des entiers naturels.
1
En Lustre, une constante n est un flux infini ayant toujours la valeur n. Les contantes prédéfinies sont
true, false et les valeurs numériques. Par exemple, 12.34 signifie (12.34, 12.34, 12.34, ...).
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
29
Ecrivons maintenant un compteur plus évolué permettant de préciser le pas (incr) de
comptage, la valeur initale (init), s’incrémentant à chaque valeur vraie d’un flux X et
pouvant être réinitialisé (reset).
La définition complète de ce type de compteur est la suivante :
node COUNTER(init, incr : int; X, reset : bool) returns (C : int);
var PC : int;
let
PC = init -> pre C;
C = if reset then init
else if X then (PC + incr)
else PC;
tel
La variable intermédiaire PC représente la valeur précédente du compteur.Par ailleurs,
nous voyons ici que l’on peut utiliser la conditionelle if ... then ... else ... pour
écrire une instruction Lustre.
Ce compteur assez générique peut par exemple être utilisé pour énumérer les nombres
pairs avec odds = COUNTER(0, 2, true, true->false) ;
3.3
Lustre dans le projet Paparazzi
Comme nous l’avons vu dans la section 2.2.2 (page 15), notre travail de certification
s’effectuera sur le micro-contrôleur MCU1 qui est chargé des fonctions de :
– réception des événements de la radio-commande,
– génération du signal de commande des servo-moteurs,
– communication avec le micro-contrôleur MCU0 (pilote automatique),
– gestion des modes de fonctionnement.
Chacune de ces fonctions était initialement codée en C sous forme d’une fonction. Nous
souhaitons les ré-écrire en utilisant le langage Lustre. En effet, le langage Lustre peut être
compilé pour générer du code source C que l’on peut intégrer au code source existant.
Ainsi, le programme principal du micro-contrôleur, toujours écrit en C, peut faire appel
aux fonctions crées à partir du code source Lustre.
Nous nous intéresserons par la suite seulement au traitement des commandes reçues
depuis la radio-commande.
3.3.1
Entrées / Sorties
Le micro-contrôleur MCU1 étant chargé de réceptionner les commandes radio et d’actionner les servo-moteurs, il est physiquement relié à ces deux entités. Chacune correspond
à un port (une patte) du micro-contrôleur.
Le signal de la radio-commande arrive sur une entrée logique déclenchant une interruption (appelée INPUT CAPTURE1A) à chaque front montant généré par le récepteur radio. La
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
30
procédure liée à l’interruption est appelée et est chargée de calculer l’intervalle entre les
impulsions successives, afin de décoder le signal PPM, suivant la méthode expliquée à la
section 2.3.2 (page 21).
Le signal de commande des servo-moteurs doit être généré et envoyé sur une sortie (un
port) du micro-contrôleur. Pour cela, on utilise une minuterie (timer ). Un changement de
niveau logique est effectué sur le port correspondant du micro-contrôleur lorsque le temps
est écoulé. On peut donc réarmer la minuterie pour le prochain changement de niveau
logique. On génère ainsi le signal de commande des servo-moteurs, codé selon la méthode
PPM.
3.3.2
La communication inter-micro-contrôleur
La communication entre les deux micro-contrôleurs utilise le bus SPI2 . Le bus SPI
permet de faire communiquer plusieurs micro-contrôleurs sur un bus. Ils utilisent donc
un canal de communication commun. Comme nous l’avons précisé précédemment (2.2.2),
MCU0 est dit maı̂tre et MCU1 est esclave. Cela signifie que c’est toujours MCU0 qui
initie la communication. MCU1 doit répondre à une sollicitation et ne peut pas initier les
communications. L’arrivée d’une information sur le bus SPI provoque une interruption sur
MCU1. On peut donc traiter l’information envoyée par MCU0 et lui répondre.
Le système Paparazzi utilise le bus SPI pour échanger les valeurs de commande des
servo-moteurs. MCU0 donne à MCU1 les commandes de servo-moteurs calculées par le
pilote automatique et en réponse, MCU1 envoie à MCU0 les derniers événements reçus par
radio. L’intérêt de la communication maı̂tre-esclave réside dans la faible propagation des
défaillances. En effet, si MCU0 fonctionne correctement, MCU1 lui passe les valeurs les plus
récentes fournies par la radio-commande. Par contre si MCU0 ne fournit plus de commandes
de pilotage (pour une raison quelconque), cela ne perturbera pas le fonctionnement de
MCU1, qui n’aura simplement plus à répondre aux sollicitations de MCU0.
3.4
3.4.1
Détail du traitement de SIG INPUT CAPTURE1
Le code C existant
Le code C existant étant écrit manuellement, il est adapté pour un fonctionnement sur
micro-contrôleur, en particulier concernant l’empreinte mémoire et le volume de code.
La procédure de traitement listée dans l’annexe A (page 49) est très simple et utilise
quelques finesses de C. Tout d’abord, les variables utilisées pour stocker les dernières valeurs
sont statiques et donc résidentes en mémoire, afin d’occuper une place fixe et de réduire
le temps d’accès. Ensuite, on se rend compte que la façon de traiter cette interruption est
totalement séquentielle et donc très loin de l’optique propositionnelle envisagée.
En Lustre, l’ordre des instructions n’importe pas, car il s’agit d’assertions à satisfaire.
Ici, le simple calcul de la valeur de l’impulsion nécessite un ordre. Le stockage de la nouvelle
2
SPI : Serial Peripheral Interface
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
31
valeur doit par exemple se faire après avoir lu l’ancienne, qui peut donc être écrasée. Ces
petites difficultés seront traitées en utilisant la particularité des flots de données, qui ne
« perdent » pas les anciennes valeurs, mais ajoutent la nouvelle au flot. Ainsi, la durée
entre deux impulsions s’écrira simplement width = this - pre(this) en Lustre. En effet
la fonction pre(X) représente la valeur précédente du flot X. Ici, nous n’avons donc pas
besoin d’utiliser deux variables Lustre pour calculer l’intervalle entre les impulsions.
3.4.2
Périphériques utilisés sur le micro-contrôleur
Le signal reçu doit être conforme au standard PPM des radio-commandes. Selon ce
standard, le signal est modulé en intervalle entre les impulsions. Le micro-contrôleur étant
interrompu, la seule information dont on dispose est la date de l’interruption, par lecture
du compteur TCNT1 . Le micro-contrôleur stocke la valeur du compteur dans le registre
ICR1 lors de l’interruption. Ainsi, la lecture de ICR1 nous donne la date de l’interruption,
même si la lecture est effectuée plus tard. Le compteur TCNT1 est un compteur codé sur 16
bits. Il est réglé sur l’horloge du micro-contrôleur, soit 16 MHz. La valeur retournée étant
un entier naturel non signé, la taille du compteur est donc de 216 ([0, 65535]). Ce compteur
1
10−6 s, soit 62.5 ns. Le compteur boucle
permet donc de mesurer des durées minimales de 16
1
−6
16
au bout de 2 × 16 × 10 = 4.096 ms.
La valeur de chaque canal de la radio-commande étant matérialisée par un intervalle
entre deux impulsions successives de 0.9 ms à 2.1 ms environ, ce compteur peut être
utilisé pour mesurer cet intervalle. Cependant, on constate que pour le cas de l’impulsions
de synchronisation, d’une durée variant de 5 à 15 ms environ, ce compteur n’est plus
approprié, car il boucle trop rapidement.
Une second compteur est donc utilisé spécialement pour l’impulsion de synchronisation.
Il s’agit du compteur TCNT2 . Ce compteur est codé sur 8 bits seulement, mais son horloge
est 1024 fois plus lente que celle du micro-contrôleur, permettant ainsi de mesurer des
durées de 64 µs à 16.32 ms.
Cependant, l’interruption levée est liée au compteur TCNT1. Seul ce compteur là est sauvegardé lors de l’interruption. La lecture de TCNT2 se fait donc directement sur le compteur
et non sur un registre de sauvegarde.
3.4.3
Conséquence sur le code Lustre
La fonction C auto-générée par le code Lustre devra pouvoir accéder aux valeurs des
compteurs précités. Lustre n’étant pas prévu pour effectuer des accès matériels, il est donc
nécessaire de laisser ce type de code en C. Il a donc été choisi de lire les valeurs des
compteurs avant l’appel de la fonction Lustre. Ainsi, le code Lustre dispose de ses entrées
en une seule fois. Les sorties sont calculées au fur et à mesure de l’exécution du nœud
Lustre. Le nœud proprement dit devra indiquer :
– si une valeur de canal a été lue,
– la valeur du canal si elle a été lue,
– le numéro du canal dont la valeur a été lue,
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
32
Fig. 3.3 – Découpage modulaire du décodage des trames PPM en Lustre
– si on vient de terminer une trame PPM valide.
Bien évidemment, si on ne lit pas une valeur de canal, les informations concernant
le canal en cours (valeur et numéro) sont caduques. Le nombre de variables (flots de
données) en sortie devant être fixe, toutes seront fournies par la fonction Lustre, mais
certaines pourront être ignorées par le code C appelant. En effet, lorsque l’on décode une
impulsion ne correspondant pas à la valeur d’une voie (soit car il s’agit de l’impulsion de
synchronisation, soit car le signal radio est erroné par exemple), la « valeur du canal »
renvoyée est obsolète et doit être ignorée. Il en est de même pour le numéro du canal lu,
qui n’a lieu d’être que si un canal a réellement été lu.
La procédure Lustre à écrire devra donc comporter dans tous les cas :
– 2 entrées :
– la valeur du compteur TCNT1 lors de l’interruption,
– la valeur courante du compteur TCNT2 ;
– 4 sorties :
– la valeur du canal lue lors l’interruption,
– le numéro du canal lu,
– un booléen indiquant si on a lu une valeur de canal,
– un booléen indiquant si on a reçu une trame PPM complète.
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
3.4.4
33
Première spécification du décodage PPM
La seule information à notre disposition étant la “date” de l’interruption, on doit définir
ce qu’est une trame PPM en fonction de cette date. Le décodage d’une trame est séparé
en plusieurs parties et sous-parties (voir figure 3.3), sans notion d’ordre d’exécution.
Détection du type d’impulsion reçue
Cette détection repose sur le calcul de l’intervalle entre les deux dernières impulsions.
Ce calcul est effectué à la fois sur le compteur TCNT1 et le compteur TCNT2, afin de détecter
les impulsions de données (data pulses) et l’impulsion de synchronisation (sync pulse). Le
calcul de l’intervalle pour TCNT1 (resp. TCNT2) est effectué par le nœud width (resp. diff ),
Une fois la durée déterminée, on effectue une test afin de déterminer le type de l’impulsion lue. Les nœuds correct pulse et sync pulse sont chargés de ces tests. Les valeurs
seuil sont fournies par le code C à l’aide de constantes (sous forme de macro C) générées
à partir du fichier XML de configuration de la radio-commande.
Compte-tenu des plages d’utilisation des compteurs utilisés pour mesurer l’intervalle
entre deux impulsions, la notion d’impulsion de synchronisation prévaut sur l’impulsion de
données. En effet, le temps de synchronisation dure plus longtemps que le temps de bouclage
de TCNT1. Ainsi, lors d’un temps de synchronisation, il est possible que TCNT1 boucle et que
l’intervalle mesuré corresponde à une donnée. Afin d’éviter ce cas, dès lors qu’un temps de
synchronisation est détecté, on ignore une possible détection d’une impulsion de donnée.
Détermination de l’état d’avancement de la lecture
L’état d’avancement de la lecture dépend de plusieurs paramètres :
– Est-on en train de lire une trame ? Il s’agit de déterminer si une trame est déjà en
cours de lecture ou si on attend le début d’une nouvelle trame ;
– une erreur a-t-elle eu lieu précédemment pendant la lecture de la trame en cours ? Si
une erreur quelconque a eu lieu, on annule l’intégralité de la trame et on en attend
une nouvelle ;
– lit-on le dernier canal pour la trame en cours ? Si tel est le cas, on se prépare à
attendre une impulsion de synchronisation terminant la trame en cours ;
– attend-on une impulsion de synchronisation ? Ce cas intervient après le dernier canal,
ou lorsqu’on a annulé une trame à cause d’une erreur.
Traitement de la réception des impulsions par une machine à états
La machine à état présentée sur la figure 3.4 détaille le fonctionnement du décodage
d’une séquence PPM codée sur 6 canaux. Les états caractéristiques sont les suivants :
1 : état de fin et de début de trame PPM. Lorsqu’on est dans cet état, on signale la fin
d’une trame PPM valide en positionnant la variable valid à vrai. On en ressort sur
réception d’une impulsion de données. Si on reçoit une impulsion de synchronisation,
alors on passe dans l’état E ;
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
34
Fig. 3.4 – Machine à état décodant un signal PPM à 6 canaux
2 à 6 : états de réception d’impulsions de données. Comme précédemment, toute réception
d’une impulsion de synchronisation envoie sur l’état E ;
7 : état atteint lors de la réception de la dernière impulsion de données. On attend alors
une impulsion de synchronisation pour repasser en état 1 ;
E : état d’erreur. Lorsqu’on est en état d’erreur, on attend la prochaine impulsion de
synchronisation, qui marque le début d’une nouvelle trame. On passe alors en état 1
bis ;
1 bis : état de début de trame PPM atteint uniquement après une erreur. Contrairement
à l’état 1, cet état ne confirme pas la validité de la trame précédente, car il s’agissait
d’une trame erronée.
Les états 1 à 7 forment la chaı̂ne de fonctionnement normal de la machine à état.
Cette machine à état est spécifique au décodage sur 6 canaux. À partir de celle-ci, il
est facile de construire une machine à états générique pour décoder des trames PPM à N
canaux. La figure 3.5 donne la représentation d’une telle machine à états générique. Les
états i (i ∈ [2, N ]) correspondent aux états 2 à 6 de la machine précédente. L’état N+1 est
atteint lors de la dernière impulsion de données.
3.4.5
Détail de la détection d’erreur dans la trame PPM
La validité d’une trame PPM est spécifiée comme ceci :
– Une trame est considérée comme valide si sa réception s’est effectuée sans aucune
erreur ;
– Font partie de la trame toutes ses impulsions de données, ainsi que les deux durées
de synchronisation l’encadrant. Chaque temps de synchronisation appartient donc à
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
35
Fig. 3.5 – Machine à état générique décodant un signal PPM à N canaux
deux trames consécutives.
– À chaque instant, on sait si on attend une impulsion de données ou de synchronisation.
Si cette attente n’est pas confirmée par la réception de ladite impulsion, une erreur
est générée. On annule donc l’intégralité de trame, jusqu’à retrouver une impulsion
de synchronisation marquant le début de la trame suivante.
data pulse
sync pulse
current frame
error occured
last channel
expected channel
expecting sync pulse
valid
index
updated
❍
●
●
❍
❍
1
●
●
5
❍
●
❍
●
❍
❍
2
❍
❍
0
●
...
...
...
...
...
...
...
...
...
...
●
❍
●
❍
❍
6
❍
❍
4
●
●
❍
●
❍
●
0
❍
❍
5
●
❍
●
●
❍
❍
1
●
●
5
❍
●
❍
●
❍
❍
2
❍
❍
0
●
...
...
...
...
...
...
...
...
...
...
●
❍
●
❍
❍
6
❍
❍
4
●
●
❍
●
❍
●
0
❍
❍
5
●
❍
●
●
❍
❍
1
●
●
5
❍
Tab. 3.2 – Traitement d’une séquence PPM valide, pour un signal comportant 6 canaux
(● : vrai ; ❍ : faux)
Le tableau 3.2 montre le traitement de deux trames PPM valides comportant 6 canaux
de données. Les variables d’entrées sont data pulse et sync pulse. On utilise les variables
internes suivantes :
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
36
curren frame variable booléenne utilisée pour différencier le cas de la réception d’une
trame valide du cas où une erreur est survenue lors de la dernière trame (on attend
alors le début de la trame suivante),
error occured variable booléenne passant à vrai lorsqu’une erreur est détectée sur la
réception de l’impulsion (mauvais type d’impulsion reçue par exemple),
last channel variable booléenne indiquant si on est en train de traiter le dernier canal
de données pour la trame en cours (la prochaine impulsion devra alors être une
synchronisation),
expected channel variable entière (de 0 à PPM NB CHANNEL) permettant de savoir le
numéro du canal attendu pour l’impulsion en cours (la valeur 0 indique qu’on attend
l’impulsion de synchronisation),
expecting sync pulse variable booléenne signalant l’attente d’une impulsion de synchronisation (son état doit être cohérent avec celui de sync pulse).
Les variables valid, index, updated sont les variables de sortie :
valid variable booléenne dont l’état indique si on a reçu une trame PPM complète sans aucune erreur. Si elle est vrai alors on pourra exploiter les données reçues précédemment ;
index variable entière fournissant le numéro (de 0 à (PPM NB CHANNEL - 1) ) du canal
reçu. Cette valeur n’est significative que lorsque updated vaut vrai ;
updated variable booléenne passant à vrai si on a reçu une impulsion de données valide.
Le numéro du canal ainsi reçu est fourni par index.
3.4.6
Exemples d’erreurs à la réception
Le tableau 3.2 correspondait au fonctionnement normal du décodage PPM pour une
séquence à 6 voies. Nous présentons ici 2 exemples de comportements anormaux contre
lesquels le micro-contrôleur doit se prémunir. Tout d’abord, une erreur de transmission
peut provoquer l’invalidité d’une impulsion (intervalle trop court ou trop long). L’exemple
suivant traite le cas de la réception d’une séquence PPM codant 5 voies alors que le microcontrôleur est programmé pour décoder 6 voies. Ce cas correspond à une inadéquation
entre la radio-commande et le drone, dûe par exempls à une erreur de programmation ou à
l’utilisation d’une autre radio-commande sur la même fréquence radio. Dans tous ces cas,
le micro-contrôleur doit rejeter les trames PPM erronées.
Invalidité aléatoire d’une impulsion
Le tableau 3.3 montre un exemple de détection d’erreur à la réception. Ici, on s’attend à
une séquence PPM à 6 canaux. Les impulsions reçues correspondent aux attentes, jusqu’à
la sixième. En effet, celle-ci est reçue comme une impulsion de synchronisation au lieu
d’une donnée. Une erreur est donc levée (impulsion non conforme aux attentes). Ceci est
confirmé par le passage à vrai de error occured. Par conséquent, la valeur du canal n’est
pas mise à jour (updated vaut faux) et la variable current frame passe à faux.
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
37
On passe désormais dans une phase d’attente d’une nouvelle trame valide. Le numéro
du canal attendu devient 0, indiquant qu’on attend une impulsion de synchronisation.
La variable d’attente d’une impulsion de synchronisation sera donc à vrai au prochain
passage. Malheureusement, l’impulsion reçue est une donnée. Il y a donc toujours une
erreur, car on attendait un temps de synchronisation. Sur l’impulsion suivante, on reçoit
effectivement l’impulsion de synchronisation et la variable current frame redevient vrai.
Le déroulement de la séquence peut donc continuer normalement.
Lorsqu’une erreur est détectée, c’est donc toute la trame qui est rejetée, et on passe en
état d’attente d’une nouvelle trame.
data pulse
sync pulse
current frame
error occured
last channel
expected channel
expecting sync pulse
valid
index
updated
❍
●
●
❍
❍
1
●
●
5
❍
●
❍
●
❍
❍
2
❍
❍
0
●
●
❍
●
❍
❍
3
❍
❍
1
●
●
❍
●
❍
❍
4
❍
❍
2
●
●
❍
●
❍
❍
5
❍
❍
3
●
❍
●
❍
●
❍
0
❍
❍
4
❍
●
❍
❍
●
●
0
●
❍
5
❍
❍
●
●
❍
❍
1
●
❍
5
❍
●
❍
●
❍
❍
2
❍
❍
0
●
●
❍
●
❍
❍
3
❍
❍
1
●
●
❍
●
❍
❍
4
❍
❍
2
●
●
❍
●
❍
❍
5
❍
❍
3
●
●
❍
●
❍
❍
6
❍
❍
4
●
●
❍
●
❍
●
0
❍
❍
5
●
❍
●
●
❍
❍
1
●
●
5
❍
Tab. 3.3 – Traitement d’une séquence PPM dont une impulsion est mal reçue, pour un
codage sur 6 canaux (● : vrai ; ❍ : faux)
Mauvaise configuration du nombre de canaux
Une autre erreur possible est la mauvaise configuration du nombre de canaux de la
radio-commande. Cela peut être le cas si on utilise plusieurs types d’émetteurs dont les
caractéristiques diffèrent. Un exemple de réception d’une séquence PPM à 5 canaux alors
que le micro-contrôleur est configuré pour décoder une séquence à 6 canaux est donné par
le tableau 3.4.
Le comportement est ici normal lors des six premières impulsions. La septième impulsion est une impulsion de synchronisation, conformément au codage PPM sur 5 canaux.
Malheureusement, le décodage s’effectuant sur 6 canaux, on attend donc une impulsion de
données. Une erreur est donc levée. La trame est annulée (current frame passe à faux),
et on se met en attente d’une impulsion de synchronisation, marquant le début d’une nouvelle trame potentiellement valide (expecting sync pulse passe à vrai pour l’impulsion
suivante).
Le déroulement de la séquence est tel que les cinq impulsions suivantes sont des impulsions de données, donc on reste dans l’état d’erreur, jusqu’à la prochaine impulsions
de synchronisation. On commence alors la réception d’une nouvelle trame PPM. Les va-
CHAPITRE 3. UTILISATION D’UN LANGAGE SYNCHRONE
data pulse
sync pulse
current frame
error occured
last channel
expected channel
expecting sync pulse
valid
index
updated
❍
●
●
❍
❍
1
●
●
5
❍
●
❍
●
❍
❍
2
❍
❍
0
●
●
❍
●
❍
❍
3
❍
❍
1
●
●
❍
●
❍
❍
4
❍
❍
2
●
●
❍
●
❍
❍
5
❍
❍
3
●
●
❍
●
❍
❍
6
❍
❍
4
●
❍
●
❍
●
●
0
❍
❍
5
❍
●
❍
❍
●
❍
0
●
❍
5
❍
●
❍
❍
●
❍
0
●
❍
5
❍
●
❍
❍
●
❍
0
●
❍
5
❍
38
●
❍
❍
●
❍
0
●
❍
5
❍
●
❍
❍
●
❍
0
●
❍
5
❍
❍
●
●
❍
❍
1
●
❍
5
❍
●
❍
●
❍
❍
2
❍
❍
0
●
●
❍
●
❍
❍
3
❍
❍
1
●
Tab. 3.4 – Traitement d’une séquence PPM codée sur 5 canaux et interprétée comme étant
codée sur 6 canaux (● : vrai ; ❍ : faux)
riables numériques expected channel et index reprennent leur progression et la variable
current frame repasse à vrai.
3.5
Mise en œuvre opérationnelle
Le traitement des PPM tel que décrit précédemment a été écrit en Lustre. Ce code a
été testé opérationnellement sur une carte de commande réelle. Il a fait ses preuves et s’est
montré aussi fiable que le code existant entièrement écrit en C. De plus, la nécessité d’avoir
des informations en continu sur l’état du système a poussé à utiliser la liason série (RS232)
pour recueillir les informations de mise au point. Cette liaison n’est bien évidemment pas
utilisée en exploitation et les performances du code ne peuvent donc être que meilleures
que sur le banc de test.
Conclusion sur l’usage du langage synchrone Lustre
Le langage Lustre nous a permis d’écrire des blocs fonctionnels simples dont la sémantique est très proche du langage parlé. De cette façon, l’écart entre la spécification et le
code source est réduit au minimum. C’est une façon de s’assurer de la validité du code par
rapport auxdites spécifications.
Les deux exemples fournis à la section 3.4.6 montrent que le code écrit en Lustre
fonctionne mais ne constituent en rien des preuves de non vulnérabilité à des défauts du
signal radio reçu. Il reste désormais à effectuer des vérifications formelles sur le code source
écrit. Cela sera décrit dans le chapitre suivant.
Chapitre 4
Vérification des propriétés de sûreté
La vérification de propriétés de sûreté consiste à vérifier que le programme est en
adéquation avec sa spécification. Dans le cadre de ce stage de Master, nous avons écrit du
code de haut niveau en Lustre afin d’effectuer les vérifications en amont.
L’avantage de cette méthode est que le code source en Lustre est très proche de la
spécification. De ce fait, les erreurs sont plus rares et plus faciles à corriger. Nous verrons
que le code ainsi écrit n’est pas directement vérifiable. Nous présentons ici comment nous
avons procédé pour vérifier de telles propriétés.
4.1
Limitations du langage Lustre
Le langage Lustre impose quelques limitations parmi lesquelles les types de données
fournis par le langage. En effet, Lustre ne propose que les types bool, int et float pour
respectivement les booléens, les entiers et les flottants. Ceci pose problème lorsqu’on veut
intégrer du code Lustre sur un micro-contrôleur dont les types sont beaucoup plus détaillés
et précis. Par exemple, la librairie AVR en C propose les types uint8 t (resp. uint16 t
et uint32 t) pour les entiers non signés de 8 bits (resp. 16 et 32 bits). Cette lacune a
compliqué l’écriture du code Lustre car nous avons dû trouver une façon d’exprimer nos
spécifications malgré des types trop simplistes.
Il en résulte que l’on ne peut plus utiliser le vérificateur Lesar fourni avec le langage
Lustre car le code est partiellement écrit en C.
4.1.1
Première approche
La première idée envisagée pour pouvoir intégrer des types personnalisés dans le code
Lustre a été d’écrire en Lustre les opérations de base sur ces types (somme, multiplication,
égalité, comparaison, etc.). Pour cela, on écrit en Lustre les spécifications de chaque type.
Ainsi, on doit modéliser la modularité des types employés sur le micro-contrôleur.
Cette solution permet de spécifier complètement le comportement des types du microcontrôleur et donc d’obtenir un code source tout-Lustre. Cependant, le code C généré est
39
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
40
très lourd et très préjudiciable en terme de performance. De plus, nous avons remarqué que
le code C généré transforme les types int de Lustre en entier int C, qui sont interprétés
par la librairie AVR comme uint16 t. Or uint16 t est un type entier modulaire. Les tests
de comparaison par rapport à zéro sont donc erronés : ils peuvent être toujours vrais ou
toujours faux. Le comportement obtenu diffère donc de celui attendu. Cette solution ne
peut pas être retenue.
4.1.2
Seconde approche
Afin d’utiliser les types natifs du micro-contrôleur (uint8 t, uint16 t et uint32 t),
nous avons décidé de faire appel aux fonctions C sur ces types. En effet, comme il est
possible d’appeler des fonctions C, par exemple pour effectuer des opérations de bas niveau,
il est également possible d’importer de nouveaux types qui sont effectivement définis lors de
l’intégration avec le code C. Comme dans le cas précédent (4.1.1), il est nécessaire d’écrire
chacune des opérations élémentaires sur les nouveaux types définis, mais cette fois-ci, on
les écrit en C et on utilise donc les opérations de la librairie C.
L’amélioration est immédiate : on peut utiliser directement les types natifs pour écrire
du code Lustre. Le code C final sera composé des opérateur écrits en C intégrés dans le
code C généré à partir de Lustre. De plus, on peut s’affranchir des appels fonctionnels
(qui ralentissent l’exécution) en utilisant la primitive inline de C. Le code obtenu est donc
directement utilisable sur le micro-contrôleur (après compilation).
Cependant, cette approche pose problème lorsqu’il s’agı̂t de vérifier des propriétés du
code source de façon automatique. Le laboratoire VERIMAG de Grenoble, qui a défini le
langage Lustre, fournit avec celui-ci un outil de vérification appelé Lesar. Celui-ci permet de
vérifier si une assertion écrite en Lustre est vraie ou fausse. Cette assertion est l’expression
de la ou des propriétés que le code Lustre doit remplir le code Lustre.
4.2
Vérification de propriétés
On utilise donc l’outil Lesar pour vérifier des propriétés du code source Lustre. La
propriété à vérifier est une expression booléenne des variables du code Lustre. Comme les
variables Lustre sont des flux infinis de données, une propriété vérifiée l’est à tout moment
de l’exécution.
4.2.1
Principe
Vérifier une propriété consiste à écrire un nœud Lustre décrivant le fonctionnement
attendu lors de l’exécution du code Lustre. Ce nœud est écrit en Lustre.
En effet, l’intérêt d’écrire la propriété à vérifier dans le même langage que le programme
(ou le sous-programme) lui-même est de pouvoir facilement intégrer le programme à la
propriété. Ainsi, pour prouver qu’une expression B (la propriété) est un invariant sur un
programme P, on fabrique un nouveau programme P’ composé du corps de P et du système
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
41
Fig. 4.1 – Principe du programme de vérification
d’équations définissant B. La seule sortie de P’ sera B (cf. figure 4.1). Vérifier la propriété
B revient donc à s’assurer que la sortie est constante.
La génération de code repose sur la création d’un graphe d’états du système (cf. 3.4
et 3.5 par exemple). Cette machine à états peut être simplifée avec les règles classiques
[Jen92]. Si la propriété est invariante, alors la machine à états se réduit à un état unique.
4.2.2
Exemple
Soit un nœud modélisant une bascule pouvant être activée (set) ou réinitialisée (reset).
Ce noœud renvoie le niveau de la bascule sous forme de variable booléenne. On dispose
également d’un état initial (initial).
Soit SWITCH1 une première version de la bascule (cf. annexe B). Lorsque set est vrai,
on active la bascule. Sinon, si reset est vrai, alors on désactive la bascule. Ainsi lorsque
set et reset valent vrai en même temps, la bascule est activée. Dans les autres cas, la
bascule reste inchangée.
Soit SWITCH une seconde version de la bascule (cf. annexe B). Ici, on active la bascule si
set vaut vrai et si la bascule n’était pas déjà activée. Si set vaut faux, le comportement
est identique à celui de SWITCH1. La machine à états correspondant à SWITCH est donnée
sur la figure 4.2.
Nous allons vérifier que les nœuds SWITCH et SWITCH1 sont bien identiques tant que set
et reset ne sont pas vrais en même temps. Pour cela, écrivons un nœud de vérification
comparant les sorties de SWITCH et SWITCH1 :
node verif_switch{set, reset, inital: bool) returns (ok: boll);
var level, level1: bool;
let
level = SWITCH(set, reset, initial);
level1 = SWITCH1(set, reset, initial);
ok = (level = level1);
assert not(set and reset);
tel
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
initial / level
42
0
¬ initial / ¬ level
reset / ¬ level
1
2
¬ reset / level
¬ set / ¬level
set / level
Fig. 4.2 – Automate du nœud SWITCH
¬ initial / ok
initial / ok
set / ok
/ ok
¬ set / ok
¬ reset / ok
reset / ok
(a)
(b)
Fig. 4.3 – Automate du programme de vérification
On calcule ici les résultats donnés par des entrées identiques sur SWITCH et SWITCH1.
L’assertion « assert not(set and reset) » permet de s’assurer que set et reset ne
sont pas simultanéement vrai.
Le compilateur Lustre génère donc un automate décrivant notre programme de vérification. Cet automate est représenté sur la figure 4.3 (a). Il est donc possible en appliquant
les règles de manipulation des graphes d’états de réduire cet automate. On obtient donc
un automate minimal représenté figure 4.3 (b). Cet automate est réduit à un seul état.
Donc ok est un invariant pour le nœud verif switch. On a donc montré que SWITCH et
SWITCH1 ont le même comportement lorsque ¬(set ∧ reset).
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
43
Prototype du nœud ppm valid :
node ppm_valid(icr1: uint16_t; tcnt2: uint8_t)
returns (valid: bool;
value: uint16_t;
index: uint8_t;
updated: bool);
Tab. 4.1 – Code d’exécution pour SIG INPUT CAPTURE 1
Prototype du nœud ppm valid verif :
node ppm_valid_verif(icr1; tcnt2: int)
returns (valid: bool;
value: int;
index: int;
updated: bool);
Tab. 4.2 – Code de vérification pour SIG INPUT CAPTURE 1
4.2.3
La vérification dans le projet Paparazzi
Les paragraphes 4.1.1 et 4.1.2 ont proposé deux approches pour écrire du code Lustre
adapté au micro-contrôleur utilisé dans le projet Paparazzi. Cependant, aucune de ces
approches n’est utilisable telle quelle. En effet, la première permet de faire des vérifications
mais ne permet pas de générer du code exécutable, alors que la seconde est directement
utilisable mais ne permet aucune vérification.
L’idée retenue est donc de séparer le code d’exécution du code de vérification. De ce
fait, la validité des vérifications repose sur l’adéquation entre le code d’exécution et le code
de vérification.
Vérification d’une propriété sur SIG INPUT CAPTURE 1
Nous allons illustrer la séparation de code en reprenant l’exemple du traitement des
PPM (cf. 3.4). Le nœud SIG INPUT CAPTURE comporte 4 sorties : valid, value, index et
updated. Les spécifications du codage PPM stipulent que l’impulsion de synchronisation
permet de repérer la fin d’une trame et le début de la suivante. On ne peut donc pas lire
une valeur de canal lorsque la fin de trame est détectée (l’impulsion n’est pas une impulsion
de donnée). Nous allons vérifier que nous n’avons jamais valid et updated simultanément
vrais.
Le code d’exécution dont un extrait est présenté dans le tableau 4.1 fait apparaı̂tre les
types natifs du micro-contrôleur. En revanche le code de vérification (tableau 4.2) n’utilise
que les types définis par Lustre.
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
44
La vérification de l’exclusion mutuelle entre index et updated passe par l’écriture d’un
nœud de vérification :
node test_valid_updated(icr1; tcnt2: int)
returns (ok: bool);
var valid: bool;
value: int;
index: int;
updated: bool;
let
(valid, value, index, updated) = ppm_valid(icr1, tcnt2);
ok = not (valid and updated);
assert (icr1 >= 0 and icr1 < 65535); -- icr1 est un entier de 16 bits
assert (tcnt2 >= 0 and tcnt2 < 255); -- tcnt2 est un entier de 8 bits
let
Dans ce nœud, on utilise les entrées habituelles de ppm valid et on crée des variables
locales pour réceptionner les sorties. L’unique sortie ok est l’expression de la propriété à
démontrer : ¬(valid ∧ updated).
On peut donc utiliser le vérificateur Lesar sur ce nœud pour vérifier que ok est un
invariant.
Problème rencontré
La vérification de cette propriété simple est délicate. En effet, l’outil de vérification
Lesar est avant tout conçu pour travailler sur des variables booléennes. Les vérifications
sur des domaines numériques sont possibles mais uniquement sur des cas très simples. En
effet, une comparaison de 2 valeurs numériques par exemple n’est pas interprétée d’un
point de vue sémantique mais seulement logique. Lesar conservera donc une expression
comme (x ≤ −10) ∧ (x ≥ 10) au lieu d’indiquer qu’elle est toujours fausse. Ceci est dû au
fait que Lesar n’intègre pas d’arithmétique dans ses vérifications. La notion de domaine
d’une variable numérique serait nécessaire pour un tel cas.
Autre approche
Pour faire face au problème des variables numériques dans Lesar, une autre approche
a été envisagée : la modélisation des nombres en binaire. De cette manière, il est facile de
modéliser les types natifs du micro-contrôleur (notamment la modularité des entiers). On
obtient donc un code faisant intervenir exclusivement des variables booléennes.
Cependant, l’explosion combinatoire est telle que cette méthode est inexploitable. En
effet, au lieu de résonner sur les domaines et en particulier les limites de domaine des
variables numériques, cette approche considère toutes les variables comme indépendantes.
La taille de l’espace d’états devient donc 224 , soit environ 16.7 × 106 .
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
45
Bien que cette approche soit théoriquement réalisable, sa mise en œuvre est quasiimpossible dans le cadre d’un projet réel. En effet, la vérification d’une simple addition sur
8 bits prend un temps de l’ordre de la minute. De plus, on s’éloigne encore un peu plus du
code d’exécution. La validité de la vérification dépendant de la forte corrélation entre lede
définir code d’exécution et le code de vérification, il est difficile de faire confiance à une
méthode visant à ré-écrire tous les types de données sous forme binaire.
Conclusion
Cette étude a permis d’explorer les possibilités d’intégration de code « sûr » dans
un micro-drone. Les spécificités des drones et micro-drones imposent de fortes contraintes
opérationnelles, notamment car la plateforme de développement est différente de la cible
finale.
L’approche envisagée
La génération automatique de code à partir d’un langage de haut niveau tel que Lustre
est possible mais pose des problèmes quant à l’intégration au système global. En effet,
le code ainsi généré est théoriquement « sûr », mais les vérifications ne prennent pas en
compte l’aspect temporel du problème. Ainsi, la code auto-généré est deux fois plus lent
à l’exécution que le code original. Cependant, la charge maximale du micro-contrôleur ne
semble pas être atteinte et nous n’avons pas constaté de défaut de performance.
La vérification en tant que telle pose beaucoup de problèmes, principalement dûs aux
limitations du typage du langage Lustre. L’outil de vérification Lesar fourni avec la version
universitaire du langage Lustre ne permet pas de vérifier efficacement des propriétés sur
les domaines numériques. Les versions commerciales de Lustre telles que Scade intègrent
quant à elles des générateurs de code optimisé ainsi que des vérificateurs efficaces.
Méthode de travail
Même si la vérification de code source reste imparfaite, ce stage a été l’occasion de
ré-écrire une partie du code source critique dans un langage de haut niveau au plus près
des spécifications. Par cet méthode de travail, la sûreté du code source a été améliorée.
De plus, les tests effectués sur un banc de test utilisant une carte de commande réelle ont
permis de valider les modifications apportées avant de tester le nouveau code en vol.
L’accent a été mis sur la disponibilité et la réutilisabilité des travaux réalisés. En effet,
le projet Paparazzi est un projet libre (open source). Il est donc naturel que les travaux
effectués dans ce cadre soient disponibles avec le reste du projet Paparazzi. On peut donc
retrouver le code Lustre écrit durant ce stage sur le serveur CVS du projet1 . De plus, afin
que les utilisateurs potentiels puissent générer automatiquement le code source à partir
du code Lustre, il a été nécessaire d’améliorer le mode de diffusion des outils Lustre. Un
paquetage Debian a ainsi été créé.
1
Projet Paparazzi : http ://savannah.nongnu.org/projects/paparazzi/
46
CHAPITRE 4. VÉRIFICATION DES PROPRIÉTÉS DE SÛRETÉ
47
Perspectives
Le travail sur un drone est très enrichissant tout d’abord par l’aspect « tout-embarqué »
du concept mais aussi d’un point de vue sûreté de fonctionnement car la moindre défaillance
technique se paie comptant. L’amélioration de la sûreté d’un micro-drone devra donc
probablement passer par l’utilisation d’outils professionnels de génération de code et de
vérification comme c’est déjà le cas pour les avions traditionnels : Airbus utilise Scade
pour le code critique de ses avions de dernière génération.
Beaucoup de travail est encore à accomplir, notamment la recherche de solutions de
spécification et de normalisation du code source suffisamment simples à mettre en œuvre
et de coût modéré pour pouvoir envisager le développement de micro-drones abordables
techniquement et financièrement pouvant satisfaire à une future réglementation permettant
l’intégration réelle des drones civils dans les espaces contrôlés.
ANNEXES
Annexe A
Interruption SIG INPUT CAPTURE1 en C
SIGNAL( SIG_INPUT_CAPTURE1 )
{
static uint16_t last;
uint16_t this;
uint16_t width;
static uint8_t state;
static uint8_t sync_start;
this = ICR1;
width = this - last;
last = this;
/*
/*
/*
/*
/*
Last value of ICR1 */
to store current value of ICR1 */
to compute the width between last 2 pulses */
state = channel number */
date of last synch pulse */
/* reading date of interrupt */
/* computing pulse width */
/* storing current value as the last one */
if( state == 0 ) {
/*
uint8_t end = TCNT2;
/*
uint8_t diff = (end - sync_start); /*
sync_start = end;
/*
expecting a synch pulse */
reading date of counter TCNT2 */
computing length of synch pulse */
storing current value */
/* The frame period of the mc3030 seems to be 25ms.
* One pulse lasts from 1.05ms to 2.150ms.
* Sync pulse is at least 7ms : (7000*CLOCK)/1024 = 109
*/
if( diff > (uint8_t)(((uint32_t)(7000ul*CLOCK))/1024ul) ) {
state = 1;
/* this really is a synch pulse */
}
}
else {
/* Read a data pulses */
if( width < 700ul*CLOCK || width > 2300ul*CLOCK)
RestartPpmCycle();
/* this is not a data pulse */
ppm_pulses[state - 1] = width;
/* storing this value in an array */
49
ANNEXE A. INTERRUPTION SIG INPUT CAPTURE1 EN C
if (state >= PPM_NB_PULSES) {
ppm_valid = 1;
RestartPpmCycle();
} else
state++;
}
return;
}
50
/* reached last channel ? */
/* expecting synch pulse from now */
/* expect next chanel */
Annexe B
Code source Lustre pour la
vérification de propriétés
Nœud SWITCH1
node SWITCH1 (set, reset, inital:bool) returns (level: bool);
let
level = initial -> if set then true
else if reset then false
else pre(level);
tel
Nœud SWITCH
node SWITCH (set, reset, inital:bool) returns (level: bool);
let
level = initial -> if set and not pre(level) then true
else if reset then false
else pre(level);
tel
51
Bibliographie
[AE04]
R G Austin and G Earp. Power line inspection by UAV : A business case. In
19th international UAV Systems Conference. Bristol, UK, 2004.
[Bri04]
Pascal Brisset.
Drones civils : perspectives et réalités.
nical
report,
École
Nationale
de
l’Aviation
Civile,
www.recherche.enac.fr/~brisset/enac/brisset sapin.pdf.
[CC01]
Patrick Cousot and Radhia Cousot. Verification of embedded software : Problems and perspectives. Lecture Notes in Computer Science, 2211 :97– ? ?, 2001.
Tech2004.
[HCRP91] N. Halbwachs, P. Caspi, P. Raymond, and D. Pilaud. The synchronous data-flow
programming language LUSTRE. Proceedings of the IEEE, 79(9) :1305–1320,
September 1991.
[HR02]
Nicolas Halbwachs and Pascal RAYMOND. A tutorial of lustre, 2002.
[Hub01]
Arthur Huber. Death by a thousand cuts : micro-air vehicles in the
service of air force missions. Technical report, Air War College, 2001.
research.maxwell.af.mil/papers/ay2001/awe/huber.pdf.
[Jen92]
Kurt Jensen. Coloured petri nets - basic concepts, analysis methods and practical use, vol. 1 : Basic concepts. EATCS Monographs on Theoretical Computer
Science, pages 1–234, 1992.
[JLSD02] François Derkx Jean-Luc Sorin and Jean Dumoulin. Concept de plate-forme
mobile instrumentée (PMI) pour l’inspection d’ouvrages d’art. In Colloque
Micro-Drones 2002, 2002. www.supaero.fr/microdrone/.
[JLSL03]
Eric Floch Jean-Luc Sorin and Yvon Lesage. Projet de surveillance du trafic
routier par drones. In Journées Micro-Drones 2003, 2003.
[Lee01]
Edward A. Lee. Embedded software from concurrent component models. ACM
SIGPLAN Notices, 36(8) : ? ?– ? ?, 2001.
[MBV04] Jens Bange Marci Buschmann and Peter Vörsmann. MMA - a miniature unmanned aerial vehicle (mini-UAV) for meteorological puposes. In 16th Symposium on Boundary Layers and Turbulence, 2004.
[Pas03]
Claude Pastre. L’observation météorologique, quel avenir ? La Météorologie,
Février 2003.
52
BIBLIOGRAPHIE
53
[Sat]
Akira Sato. Research, development and civil application of an autonomous, unmanned helicopter.
Unmanned Vehicle Systems International.
www.uvs-international.org.
[USI04]
USICO. Workshop on Collision Avoidance and ATC/ATM Integration, Braumschweig, February 2004. www.usico.org.