Comme nous avons écrit un contrôleur de vol vérifié pour un quadcopter. Sur Ada

Une fois, pendant les vacances du Nouvel An, naviguant paresseusement sur Internet, les gaffeurs de notre * bureau R&D ont remarqué une vidéo des tests d'un prototype de robotaxi. Le commentateur a répondu avec un ton enthousiaste - une révolution, après tout. C'est génial, oui, mais le moment est venu - la révolution est là et c'est l'informatique qui les dirige.





Mais l'oreille entraînée a entendu autre chose dans le bruit du site d'essai. Le contrôleur de vitesse (la chose pour contrôler la poussée des hélices) a joué une mélodie au début, comme les pilotes de drone aiment le faire, qui utilisent souvent le contrôleur de vol Betaflight. Y a-t-il un vol bêta? Il semble que oui. Eh bien, ou certaines de ses variétés - il n'y a qu'environ une demi-douzaine de contrôleurs de vol ouverts.





Des flashbacks ont couru devant mes yeux, quelque part des profondeurs de l'inconscient, des informations oubliées sur le firmware de Toyota pour des millions de milliers de lignes de C et 2000 variables globales ont fait surface ( Toyota: 81564 erreurs dans le code ).





Après avoir examiné le code source de Betaflight sur github, cela a empiré, et le plus loin, le pire . Nous pensons que le code auto-écrit sera à peu près du même niveau. Cela signifie qu'il n'y a aucune garantie et la capacité non seulement d'assurer le fonctionnement sans problème du code, mais de comprendre complètement son travail. Et c'est le programme de contrôle pour un appareil lourd avec des vis tranchantes qui vole haut, rapidement. Ça devient effrayant: les jouets sont une chose, mais je ne voudrais pas voler dans un tel taxi.





Mais est-ce possible autrement? Vous pouvez, nous avons décidé!





Et ils ont décidé de le prouver. Un quadric FPV acrobatique basé sur STM32F405 a été acheté sur Avito, une carte Discovery pour le même contrôleur a été achetée pour le débogage, puis tout est comme un brouillard.





Alors, comment pourrait-il en être autrement?

Après une brève réunion, les réflexions suivantes ont surgi:





  • nous avons besoin d'une approche différente









  • , .





, - , . , [FC] .





:





  • - embedded





  • runtime RTOS, RTOS





  • , .





, , . , Ada. , , SPARK. [SRM] SPARK Ada, .





SPARK, , , , , , , , . Rust.





. , . , .





, , , , . , .





SPARK, :













  • null-





  • .





  • , .





  • , . !





    , ?





SPARK , , , . , , , . 





SPARK , Ada. Runtime; SPARK , .





:





:





, , .





SPARK , “” , . , - () .





SPARK : "" (Stone level) "" "" "" (Gold) "". :





Stone





, SPARK





Bronze





Stone + /





Silver





Bronze + runtime-





Gold





Silver + - -





Platinum





Gold +





Gold, - Boing 777 MAX. 





SPARK: , , (SMT - Z3), . , .





[SUG]





, "" - ECMA-, , . , , , . Rust, - - Perl, .





, , , , , , , , . Ada ( SPARK Ada) . , Ada embedded-.





 





"". , . , " ". " ". " ". " ". , .





Ravenscar, embedded-. , : -, , stdlib- .





Ravescar,





 Runtime





embedded - , RTOS, . Ada - Ada ( Ada tasks, ), (, , entries) . , .





embedded- :





  • zero-footprint - ; , TO MSP430





  • small footprint - Ada, , RAM





  • full ravenscar - Ravenscar/Extended Ravenscar









, - green threads, . , , .





, Ada stdlib STM32, . , .





“rustRustRUST”!





, , Rust . ? , Spark .





Ada - access types, , , - Spark , Rust. , ( /), ( ) .





, , - Rust, , , Ada/SPARK. [UPS]









, Ada/SPARK ? , ( - , - , - - ?), Ada . , (, ), placement constructor, .. limited- - , .





, – , . . - , , Ada.





layout : , . - , , .





IDE





IDE, VSCode , .









. , [EFF], , , “» Ada :





, SPARK/Ada . 21 [LIC] Ada, BasiLEO Ada 12, .





-

, - . , , .









, :





  • Veriflight - , .





  • Veriflight_board - , - . , .





, USB STM32 Interop Ada.









  • STM32F405 168 (192 RAM, 1M flash)





  • S.BUS USART1





  • 6- -





  • PWM





  • USB-, PHY- .





«» 2 :













(CMD task ) . , « , ». , - , . 20 .





- - . 3 PID-, . , - . - 200 . , .





, , .





PID :

















  • -





  • PID- ,





  • PID-





  • , ,





, - ( Arduino ) - C Wiring . . , - , [MHN], .





, , . 90 - (disarm).





, , PID . , , , , -- , .





, .





, .  , : , , Ada, .









Ada/SPARK , , , , .





R&D , , , , , , . 





, runtime- , - , , .





, embedded Ada.





, robotics automotive , « », , , : , .









[SUG] SPARK user guide https://docs.adacore.com/spark2014-docs/html/ug/index.html





[SRM] SPARK reference manual (https://docs.adacore.com/live/wave/spark2014/html/spark2014_rm/index.html)





[FC] Frama-C - plateforme d'analyse modulaire du code C https://frama-c.com/ 





[UPS] https://blog.adacore.com/using-pointers-in-spark





[MHN] https://nitinjsanket.github.io/tutorials/attitudeest/mahony 





[EFF] https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf





[LIC] https://en.wikipedia.org/wiki/Lunar_IceCube








All Articles