Como escribimos un controlador de vuelo verificado para un quadcopter. En Ada

Una vez, en las vacaciones de Año Nuevo, navegando perezosamente por Internet, los chapuceros de nuestra * oficina de I + D notaron un video de las pruebas de un prototipo de robotaxi. El comentarista respondió con un tono entusiasta: una revolución, después de todo. Es genial, sí, pero el momento es ahora: la revolución está por llegar y TI los está liderando.





Pero el oído entrenado escuchó algo más en el ruido del sitio de prueba. El controlador de velocidad (lo que controla el empuje de las hélices) tocó una melodía al principio, como les gusta hacer a los pilotos de drones, que a menudo usan el controlador de vuelo Betaflight. ¿Hay un vuelo beta? Parece que sí. Bueno, o algunas de sus variedades, solo hay alrededor de media docena de controladores de vuelo abiertos.





Flashbacks corrieron ante mis ojos, en algún lugar de las profundidades del subconsciente, información olvidada sobre el firmware de Toyota para millones de miles de líneas de C y 2000 variables globales surgieron ( Toyota: 81564 errores en el código ).





Después de revisar el código fuente de Betaflight en github, empeoró aún más, y cuanto más, peor . Sospechamos que el código autoescrito será aproximadamente del mismo nivel. Esto significa que no hay garantía y la capacidad no solo para garantizar el funcionamiento sin problemas del código, sino para comprender completamente su funcionamiento. Y este es el programa de control para un dispositivo pesado con tornillos afilados que vuela alto, rápido. Da miedo: los juguetes son una cosa, pero no me gustaría viajar en un taxi así.





¿Pero es posible de otra manera? ¡Puedes, decidimos!





Y decidieron probarlo. En Avito se compró un FPV quadric acrobático basado en STM32F405, se compró una placa Discovery para el mismo controlador para depurar, y luego todo es como una niebla.





Entonces, ¿cómo podría ser de otra manera?

Después de una reunión rápida, surgieron los siguientes pensamientos:





  • necesitamos un enfoque diferente









  • , .





, - , . , [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 - plataforma para análisis modular de código 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