Dev Life

Missão para Marte – PyCon 2014

Nos divertimos muito na PyCon 2013 com nossa arma Nerf gigante movida a e-mail. Fez muito sucesso com o público e, para a PyCon 2014, queríamos fazer algo ainda mais legal. Então, é claro que deveríamos começar com... um aspirador de pó. Neste post do blog, mostramos como fomos de um aspirador de pó para um Mars Rover e acabamos nos divertindo muito de novo na PyCon deste ano.
Imagem para Missão para Marte – PyCon 2014

Nos divertimos muito na PyCon 2013 com nossa arma Nerf gigante movida a e-mail. Fez muito sucesso com o público e, para a PyCon 2014, queríamos fazer algo ainda mais legal. Então, é claro que deveríamos começar com… um aspirador de pó. Neste post do blog, mostramos como fomos de um aspirador de pó para um Mars Rover e acabamos nos divertindo muito de novo na PyCon deste ano.

De origens humildes… uma missão para Marte

Anton, nosso engenheiro elétrico que virou desenvolvedor de software, comprou um aspirador robô da Neato depois de muita pesquisa, comparando o Neato com o popular Roomba da iRobot. O fator decisivo? Os aspiradores da Neato têm uma API que permite controlá-los por código. Exatamente o que precisaríamos para nossa missão para Marte.

Uma das muitas coisas de que gostamos em trabalhar na Rackspace, empresa que adquiriu o Mailgun em 2012, é o hackday mensal. Nele, toda a equipe de engenharia do escritório se reúne para trabalhar em qualquer coisa que considere interessante, seja relacionada a um projeto oficial da Rackspace ou não. Chamamos alguns colegas da Rackspace e passamos o dia trabalhando no código que usaríamos para controlar o robô.

Sabíamos que queríamos dar às pessoas a capacidade de enviar comandos por e-mail para o robô como um mecanismo de controle e que o robô deveria conseguir se mover para frente, para trás e girar 360 graus. Também queríamos conseguir “coletar amostras” da superfície marciana, ou seja, ligar o aspirador e tirar uma foto usando a câmera montada no que viria a ser a torre de instrumentos principal do rover.

Como funciona

Muitos dos detalhes do nosso jogo para a PyCon deste ano eram diferentes, mas aprendemos uma coisa com o ano passado:
o acesso à rede poderia ser complicado no local da conferência. O endereço IP do Raspberry Pi poderia não ser acessível publicamente, então talvez não fosse possível fazer um POST HTTP para ele.
– Mailgun na PyCon 2013
Para resolver isso, usamos o Redis para garantir que o rover pudesse recuperar comandos do servidor, desde que o Raspberry Pi tivesse uma conexão com a internet. Aqui está como isso se parece conceitualmente:
+ - - - - - + +-----------+ +------------+ +--------------+ | | | | | | | | SMTP | | HTTP | | | Email client +-----> | Mailgun +-----> | Web server | | | | | route | | | +--------------+ | | | | | | | | +-----+------+ +-----------+ | | | Redis lpush | (local) | | | v | +--------------+ +------------+ | | Redis brpop | | | | | Raspberry Pi | | Raspery Pi Camera | | GPIO +-------------------+ +-------------------> | Brick Pi | | serial port +-------------------+ +-------------------> | Neato Vac | +-------------------+
Com isso resolvido, trabalhamos nos controles principais.
Abaixo estão exemplos do código que usamos para realmente controlar o robô:
controlar a torre da câmera com o BrickPi:

                                

                                    def init(host, password): """Init the required components.""" print "Init BrickPi" BrickPiSetup() BrickPi.MotorEnable[PORT_D] = 1 def camera_control(command, mission_control_address): print "Camera control module received:", command if command in ("up", "down"): if command "up": BrickPi.MotorSpeed[PORT_D] = -100 elif command "down": # despite the fact that the surface gravity of Mars is only # about 38% of Earth's there is still less force required to # bring the camera down BrickPi.MotorSpeed[PORT_D] = 50 BrickPiUpdateValues() sleep(0.5) # stop the motor BrickPi.MotorSpeed[PORT_D] = 0 BrickPiUpdateValues() elif command == "take_picture": camera.capture(file_name) send_picture(file_name, mission_control_address) def send_picture(file_name, mission_control_address) """Send picture back to the Mission Control Center.""" r = requests.post( "https://api.mailgun.net/v2/mailgun.net/messages", auth=("api", "***"), files=[("attachment", open(file_name))], data={"from": "Mars Rover ", "to": mission_control_address, "cc": "nsa@mailgun.net", # oops "subject": "A message from Mars", "text": "The picture of the surface is attached!"})
                                
                            

Controlar o aspirador:

                                

                                    def init(host, password): print "Init Vacuum Base!!!" vac_port = serial.Serial("/dev/ttyACM1") def vac_run_command(command, read_response=True): print "Vacuum base control module received:", command try: vac_port.write(command) if not read_response: # provided command doesn't have a response return return read_response() except: # fault tolerance for the WIN! reconnect()
                                
                            

Aceitar solicitações POST do Mailgun:

                                

                                    @app.route('/mission_control', methods=['POST']) def mission_control(): """Commands from Mailgun arrive here.""" command_message = request.form['stripped-text'] from_ = request.form['From'] for command in parse(command_message): robot.run(command, from_) return "10-4"
                                
                            

Vamos precisar de mais Legos

Com o software pronto, começamos a transformar nosso aspirador de pó em um Mars Rover.

Começamos procurando o melhor lugar para comprar Legos de uma cor só no atacado. Precisaríamos de muitos Legos pretos, cinzas e brancos se fôssemos criar um rover autêntico. Acontece que o eBay é o melhor lugar para comprar Legos, muitas vezes por quilo. US$ 118 depois, estávamos prontos para começar.

Dois homens e uma criança trabalham juntos em uma mesa comprida coberta por pilhas de blocos de construção classificados

Montamos uma equipe de elite de engenharia para a missão, incluindo o filho de quatro anos de um dos membros da equipe do Mailgun, e espalhamos todos os Legos que formariam o corpo do rover. Aqui você vê Anton, Ralph e Luca nos preparativos. Depois de criar o protótipo de alguns dos principais componentes, formalizamos nosso design. O rover teria uma câmera oscilante (alimentada por um motor Mindstorm Lego) montada no topo de uma torre de controle com integração para Raspberry PiBrickPi e bateria reserva. Grande parte do corpo do rover também seria coberta por um painel solar USB funcional.

Diagrama de quadro branco mostrando vistas aéreas e traseiras de um robô com marcadores para painel solar, câmera e Raspberry Pi

Alguns tropeços, algumas risadas e algumas horas depois, estávamos no caminho certo para ter um robô montado para demonstrar na apresentação do hackday que, por coincidência, estava programada para mais tarde naquele dia no escritório da Rackspace.

Um homem trabalha em uma construção complexa de LEGO construída sobre a base de um aspirador de pó robótico

E aqui está um close da torre de controle principal. A peça com o adesivo do Mailgun é a bateria reserva. O Raspberry Pi e o BrickPi estão montados sobre isso, e você pode ver o motor Lego no topo da foto. A câmera do Raspberry Pi está um pouco fora de quadro.

Um robô construído com peças de LEGO e componentes eletrônicos, apresentando um logotipo do Mailgun em sua base

Aqui está uma vista traseira do rover. Grande parte dos detalhes decorativos cromados foi adicionada por nosso membro mais jovem da missão, incluindo os dois bonecos de Lego. Um deles é um marinheiro, e o outro é um pirata. No fim das contas, essa seria apenas uma parte da missão que exigiria muita criatividade, como você verá mais adiante.

Duas minifiguras de LEGO estão no convés de um modelo de navio de LEGO feito sob medida

Terminamos um longo dia fazendo uma demonstração do rover para nosso escritório. Aqui está Anton analisando o rover finalizado.

Um homem se agacha e aponta para um pequeno robô enquanto um grupo de pessoas assiste

Prezada TSA,

Sabíamos que não poderíamos levar o rover no avião para Montreal com a gente. Parece uma bomba, admitimos isso, e não queríamos ter uma longa e agradável conversa com uma equipe de agentes da TSA. Então, guardamos o rover cuidadosamente em uma mala grande, protegemos com cerca de 30 camisetas 50-50 bonitas e macias da American Apparel que distribuiríamos às pessoas na conferência que testassem o rover. Também incluímos um bilhete para a TSA, informando que era um robô feito com um Raspberry Pi. Tínhamos certeza de que abririam a bolsa para dar uma olhada, mas não contávamos com o quão detalhista seria essa olhada.

Novo e melhorado… mas não por escolha

Quando chegamos ao nosso hotel em Montreal e abrimos a mala, nosso primeiro pensamento foi: droga, eles devem ter jogado muito a bolsa de um lado pro outro, porque muitas peças se soltaram completamente. No entanto, após uma inspeção mais atenta, ficou claro que a TSA havia desmontado o rover, praticamente Lego por Lego. Alguns componentes ainda estavam intactos, mas as estruturas mais complexas, como a estrutura e a torre de controle, foram meticulosamente desmontadas.

Com o café na mão, e a duas horas da abertura da conferência, espalhamos os Legos em uma mesa, de novo, e começamos a remontar. O problema que enfrentamos foi que não havíamos trazido Legos extras. Como tínhamos improvisado o design inicial, não tínhamos uma planta para seguir e, por isso, cada Lego teria que ser colocado exatamente como estava antes se quiséssemos manter o design original.

Não é preciso dizer que acabamos optando por um design ligeiramente diferente, que acabou usando cerca de 30% menos Legos para criar o mesmo design funcional.

Um laptop, smartphone, painel solar e vários componentes eletrônicos e de plástico em uma mesa branca

Embora frustrante no começo, a reconstrução do rover acabou sendo muito divertida. Acabamos conversando com vários entusiastas de Lego durante a manhã, e algumas pessoas até entraram na brincadeira e ajudaram um pouco. No meio do dia, nosso Mars Rover estava totalmente operacional e foi uma ótima maneira de conhecer a comunidade do Python. Alguns dos nossos hackers favoritos que conhecemos foram as pessoas mais jovens que vieram à PyCon pela primeira vez. Aqui está uma foto tirada pela própria câmera do rover depois que nosso jovem amigo controlou o bot enviando comandos por e-mail do telefone de seu pai. Diríamos que a missão foi um sucesso!

Um homem e um menino usando crachás sorriem para uma foto em um grande local fechado

Então, essa é a história do nosso Mars Rover. Não importa o que aconteça, a gente sempre se diverte muito na PyCon. Mal podemos esperar pelo ano que vem para fazer tudo de novo.

Até lá! Bons envios.

A equipe do Mailgun.