Conheça o NuttX, o sistema operacional de tempo real usado em Drones

Esta não é a primeira vez que falo sobre NuttX aqui, mas resolvi fazer um texto mais completo para ressaltar as características deste Real Time Operating System, ou simplemente RTOS (pronuncia-se “ar-tós”), e por que usa-lo em seus projetos.

Primeiramente precisamos entender o que é um RTOS ou sistema operacional de tempo real, na tradução livre para português. Um RTOS é um sistema operacional onde as garantias temporais são respeitadas, usando uma frase mais simples significa dizer que as tarefas do sistema operacional serão executadas em tempos bem definidos.

Portanto, caso uma tarefa tenha que ser executada a cada 5 milisegundos, ela será executada neste período e qualquer outra tarefa, que esteja usando a CPU no momento em que esta tarefa mais prioritária precisa ser executada, será preemptada (será interrompida e continuará sua execução futuramente do ponto onde parou).

Agora que você já tem uma ideia do que vem a ser um RTOS, deve estar se perguntando: o que o NuttX tem de diferente dos demais RTOS e por que ele é usado em Drones? A resposta esta na interface de programação dos programas (API) dos demais RTOS. Cada RTOS implementa sua própria forma de programação, então uma tarefa escrita para um RTOS não pode ser livremente usada em outro RTOS sem modificações. Exemplos de outros RTOS: FreeRTOS, uC/OS-II, Chibios/RT, etc.

A grande vantagem do NuttX é o fato de utilizar o padrão POSIX, assim você pode escrever um programa que rodará em Linux/*NIX e depois configura-lo para rodar no NuttX sem muito trabalho. E várias empresas já descobriram esta vantagem e estão começando a usar o NuttX ou a dar suporte a ele em seus processadores/microcontroladores, como é o caso da Atmel, a empresa que fabrica os microcontroladores usados nas placas Arduino: http://www.atmel.com/about/news/release.aspx?reference=tcm:26-63482

Interessante, mas como posso começar a testar o NuttX? A melhor forma é ter uma placa suportada pelo NuttX e começar compilando para rodar na sua placa. Mas caso você não tenha uma placa embarcada, não tem problema, você pode rodá-lo emulado num computador x86 ou poderá usar o QEMU para ver o funcionamento dele numa placa ARM: http://www.zilogic.com/blog/tutorial-nuttx.html

Quais placas suportam o NuttX? Atualmente mais de 90 placas são suportadas, dentre elas: Freedom Board KL25Z da Freescale, Stellaris LM4F120 LaunchPad da Texas Instruments, STM32F4Discovery da ST, Teensy Board da PJRC, etc. Infelizmente não existe um porte para Raspberry Pi, pois segundo Gregory Nutt (o criador do NuttX) esta placa é bem suportada pelo Linux e o NuttX não seria tão vantajoso neste caso.

É importante entender que o NuttX é voltado para microcontroladores de baixo a médio poder de processamento, mas não é ideal para microcontralores com poucos recursos (<8KB RAM e/ou <16KB Flash). Neste caso RTOS como o FreeRTOS ou Chibios seriam uma melhor alternativa.

Outro detalhe importante: o Linux também é usando em drones. Por exemplo o AR.Drone da Parrot utiliza Linux internamente e recentemente a Linux Foundation está trabalhando num projeto para avançar o desenvolvimento do Linux em Drone: https://www.dronecode.org

Apesar disso é provável que o NuttX continuará a ser usado em Drones ao lado do Linux que exige um processador com mais poder de processamento e consequentemente um pouco mais caro.

Nota: O NuttX é usado no projeto PX4/Pixhawk Autopilot e no VRBrain. O Pixhawk é o hardware vendido pela 3DRobotics para Drone inteligentes.

16 thoughts on “Conheça o NuttX, o sistema operacional de tempo real usado em Drones

    1. Bom dia Murilo,
      Eu tenho um AR.Drone 2, mas ainda não desenvolvi um drone do zero. Quero desenvolver um drone para mapeamento aéreo e conversão para 3D. Você já desenvolveu ou está desenvolvendo um drone? []’s, Alan

      1. Oi Alan, eu tenho um AR.Drone 1 e um drone montado do zero.

        Usei o Ardrone 1 para começar um firmware do zero, já que supostamente a parte mecânica e elétrica já estaria testa. Encontrei vários pedaços de código soltos dos drivers do AR.Drone 1, juntei tudo e fiz uma engenharia reversa da saída da IMU com o firmware 1.11.5. Depois de compilado, enviou o executável pelo ftp do ardrone, e executo pelo telnet, então ele dá um kill no program.elf e passa a controlar tudo.
        No post http://dronespersonalizados.blogspot.com.br/p/ardrone.html tem o código e vídeo do que já consegui fazer. Pelo que eu li, a interface dos motores do AR.Drone 2, e a mesma do 1, via I2C.
        E adicionou magnetrômetro e barômetro fazendo o AR.Drone 2 ser 10 DOF. O AR Drone 1 é só 6 DOF (não tem noção do norte, o yaw fica louco, e nem noção de altitude após 4 metros).

        O drone montado do zero, depois do pacote padrão de hélices, motores, esc, frame e bateria. Procurei os sensores da IMU separados, tipo o mpu6050, bmp85, hmc5883, todos I2C, mas ficou muito zoado, então parti para placas 10 DOFs integrando o mpu6050, hmc5883, ms5611 como o GY86. Testei o Freeimu no GY86 e realmente fica perfeito a orientação 3D e altitude com precisão de centímetros. É bom testar a IMU com o cubo 3D do processing que vem no Freeimu. Depois até testei a IMU do ardrone com esse cubo 3D. Pois depois que a IMU tá funcionando direito sem ruido, é mais fácil colocar os 3 PIDs de rate, 3 PIDs de angulo, 2 PIDs do GPS, e o PID de altitude para controlar os motores. Ai por uma porta UDP recebo do joystick do Xbox360 os setpoint dos PIDs.
        Usando um beaglebone no drone ficou bem parecido com o Ardrone que é Linux também, o problema é que o Linux demora segundos para reiniciar em caso de pane. E com Tiva/Stellaris, KL25z, STM32, e Arduino o reboot é instantâneo. Com o arduino testei o Multiwii, mas o código não é muito organizado e não tem um RTOS. Com a Tiva coloquei o FreeRTOS com a API do energia e no KL25Z também FreeRTOS com API do mbed. E no STM32 FreeRTOS com API de mbed e também só com o CMSIS. Depois o multiwii baseflight para stm32 que sofre do mesmo problema do multiwii para arduino. Seguido do OpenPilot para STM32 que usa FreeRTOS e é muito bem estruturado. E o PX4 Autopilot para STM32 que usa o Nuttx e é muito bem estruturado.

        Depois de tudo que testei eu voto que os requisitos mínimos para um drone descente são um IMU 10 DOF + GPS, com um RTOS que dê boot instantâneo (FreeRTOS ou Nuttx) rodando em um ARM Cortex-Mx em comunicação via i2c ou serial com um placa Linux (Beaglebone ou Rasberry PI) com conexão WiFi potente com o PC/ground station para provê telemetria e vídeo HD em tempo real.
        O resto seria requisitos mecânicos e elétricos, tipo o Gimbal e os servos para estabilizar a câmera do mapeamento e fotografia 3D.

  1. Ola Murilo e Alan,
    Estava indo pelo caminho de comprar um kit com placa pronta , software pronto , de repente li a make-magazine 37 sobre drones, achei o blog do Murilo com as suas montagens e ontem leio aqui no blog do Alan , mais uma parte de informação e pirei na vontade de montar do zero , com sistema operacional , aplicação e partes customizadas e possivelmente usando uma launchpad TIVA da texas,
    Abs a todos

    1. Oi Jeronimo, montar do zero é bom que dá para fazer do jeitinho que você quer. Se tas começando agora eu te recomendo pegar um Tiva CC3200 que já tem WiFi de 2.4ghz, antes eu usava um Tiva C com o kit da Anaren de 915mhz, mas é muita mão de obra para fazer uma comunicação que deveria ser trivial com o PC. Dai o próximo passo seria conectar um IMU 10 DOF na porta i2c da Tiva CC3200 então já tirei senso total de orientação 3D, com roll, pitch, yaw e altitude testados num cubo 3d como o que vem no freeimu. Neste checkpoint já tem conexão Wifi com PC e orientação 3D perfeita. Agora é só ligar os ESCs dos motores em 4 pinos de saída PWM da Tiva CC3200 e sair voando por ai. O software pode ser o FreeRTOS ou o Nuttx. O Nuttx mais recente tem um porte template para a Tiva CC3200 já com a comunicação WiFi ok, ai dá para adaptar a Freeimu nele e uma lógica para controlar os PWM dos ESC/Motores a partir da orientação 3d da freeimu. Receber os comandos do joystick pelo WiFi é só alegria.
      E como é WiFi dá para usar um Android/Iphone/WindowsPhone/PC para pilotar.

      1. Murilo ,
        Repetindo o Alan : obrigado pela aula repassando a sua experiencia na construção de drones. Eu participo de um hackerspace (CalangoHC.cc) aqui em Brasilia e estamos no inicio do projeto de um Vant para monitoramento ambiental. Já tenho a CC3200 e vou buscar uma IMU 10 DOF com GPS para começar os testes.
        Obrigado

  2. Caros, gostaria apenas que parassem de usar o termo “drone” para se referir a UAV ou VANT (em Português). O termo drone carrega uma conotação militar (e negativa) muito forte e isso inclusive está causando problemas para aeromodelistas e estudiosos do assunto devido à percepção errada do público.

    Grato

  3. Oi Adilson,
    Boa observação, mas não sei se isso resolve, agora que já jogaram na mídia que estão usando Drones para jogar bomba na cabeça de qualquer uma que ameace a paz mundial. E a turma daqui gosta de promover o atraso de vida sobre qualquer pretexto, promovendo a ignorância como medalha de honra. Não importa o nome que dê, qualquer coisa que promova a ciência, tecnologia ou meritocracia, sempre vai aparece um contingente enorme de idiotas, ignorantes e invejosos para impedir qualquer tentativa de desenvolvimento qualquer coisa, não importa se é drone, uav ou vant.
    De qualquer forma para evitar gastar energia e tempo lutando contra os ignorantes é melhor chamar de uav ou vant como você sugeriu.

  4. Olá Murilo,
    Muito obrigado pela aula que você me deu!
    Eu estava pensando em comprar uma Pixhawk e colocar no meu AR Drone, mas creio que as opções que você me apresentou são mais interessantes.
    Realmente uma TiVA CC3200 com NuttX controlando a placa dos propulsores do AR Drone é uma ótima idéia. De qualquer forma ainda precisaria da placa FreeIMU para ter um controle com 10 DoF.

    Você participa de alguma lista de discussão sobre quadricopteros? Eu assino a drones-discuss@googlegroups.com mas apenas como ouvinte.

    Seria interessante se fizessemos uma placa com um microcontrolador bem suportado pelo NuttX (STM32) com um módulo WiFi CC3200, com todos os sensores para obter 10 DoF + GPS e com a parte de potência dos motores. Uma placa All in One como a Crius. O que você acha da ideia?
    []’s, Alan

  5. Oi Alan,
    Passei o dia lendo teu blog desde do primeiro post em 2005, parecia eu contando uma história 🙂 Fiquei fã. Tem de tudo de cnc. uclinux, nuttx, até em bios já mexesse, teve uma foto nostálgica do ami bios gráfico que quase choro de emoção. Vi que passasse um tempo na UFRGS, ou também passei por lá naquele curso de desenvolvimento de semicondutores. E que depois fosse para China.
    Tu tem muito equipamento ai, de solda digital, soprador, e estação bga? E uma facilidade para fabricar as PCBs?

    A Pixhawk é muito boa e também muita cara. Vi que tem um kit http://pixhawk.org/modules/px4ioar.
    Que substitui a placa do ardrone v1 e v2 mas também é muito caro.
    Já a tiva cc3200 tá uns 30 dólares e a FreeIMU / Gy86 tá uns 25 dólares.
    Procurando no google mpu6050+hmc5883+ms5611 encontra um bocado desses IMUs i2c.

    Eu assino algumas listas, vou me inscrever nessa que indicasse também.

    Essa ideia de fazer uma placa all in one é espetacular, tipo mpu6050+hmc5883+ms5611+gps+ microcontrolador arm-cortex-mx (cc3200 é um cortex-m4)? com nuttx ou freertos, talvez sonar para ajudar no pouso, conexão wifi do cc3200, daria para botar os ESCs também, ou um esquema para motores brushed pequenos tipo o crazyfly e outro pico/nano-copteros. E ai bota as câmeras, para filmar em 3d e reconstruir e imprimir e cnc 🙂

    Tu usa o hangouts, skype ou qualquer outra para agente entrar em contato? vamos vê se agente consegue fazer nascer uma solução completa made in brazil.

  6. Oi Murilo,
    Obrigado pelos comentários, eu também estou lendo seu blog, muito massa, parabéns.
    Sim, eu já fiz um bocado de maluquices nestes últimos 34 anos (sou de 80). Talvez a que eu mais me orgulho foi ter criado a primeira prova de conceito do Linux rodando direto na BIOS: https://www.youtube.com/watch?v=nuzRsXKm_NQ (infelizmente tive que tirar a trilha sonora original do video por causa dos direitos autorais).

    Realmente a Pixhawk é muito cara. Tem um clone dela mais em conta no DX.com, mas seria melhor realmente criar uma placa equivalente com mais recursos. Eu estava pensando em usar um STM32F107 junto com o CC3200 porque ele tem poucos pinos disponíveis, mas vamos analisar com mais calma, talvez os pinos disponíveis já sejam suficientes para controlar todos os sensores que precisamos controlar. Isso iria ajudar a diminuir muito o custo da placa.

    Eu uso Hangout (GTalk), meu usuário é acassis _AT_ gmail _DOT_ com

    Me adiciona para conversarmos sobre o projeto desta placa. []’s, Alan

  7. Na minha opinião poderia usar um STM32F437VI ele roda a 180 Mhz e tem 2 MB de flash, ou seja bastante espaço para adicionar muitas funcionalidades. Um diferencial do PX4 é que ele server para varias plataformas de VANTs, multi-rotores, helicópteros, aviões e até veículos. Isso é muito bom, pois a mesma plataforma de hardware serve para vários fins. Um outro recurso interessante seria colocar um bom sistema de failsafe, o PX4 usa um segundo microcontrolador para essa tarefa. A ideia de construir algo “made in Brasil” é excelente!!

  8. Olá Klausenner,
    obrigado pela sugestão! A ideia inicial de usar um STM32F107 era apenas pela questão do custo, mas aprendi na prática que é mais importante usar um chip melhor para depois não ficar reduzindo o tamanho do código pra caber. Assim você acaba perdendo mais tempo tentando otimizar o tamanho do código que realmente implementando os recursos necessários.
    Você também tem interesse em desenvolver algo nacional? []’s, Alan

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s