Você está na página 1de 61

UNIVERSIDADE PAULISTA UNIP I.C.E.

T INSTITUTO DE CINCIAS EXATAS E ENGENHARIA GRADUAO EM ENGENHARIA DA COMPUTAO

DANILO ARAUJO LUIZ

SISTEMA AUTNOMO DE NAVEGAO COM KINECT E ARDUINO

SO PAULO 2011

Danilo Araujo Luiz

SISTEMA AUTNOMO DE NAVEGAO COM KINECT E ARDUINO

Trabalho de Concluso de Curso para obteno do ttulo de Graduao em Engenharia de Computao apresentado Universidade Paulista UNIP.

Orientador: Prof. Dr. Orlando Del Bianco Filho

So Paulo 2011

Luiz, Danilo Araujo. Sistema autnomo de navegao com Kinect e Arduino. / Danilo Araujo Luiz. - So Paulo, 2011. 59f. : il. color. Trabalho de concluso de curso (graduao), apresentado ao Instituto de Cincias Exatas e Tecnologia da Universidade Paulista, So Paulo, 2011. rea de concentrao: Inteligncia Artificial. Orientao: Prof. Dr. Orlando Del Bianco Filho.

1. Driverless car. 2. Lgica Fuzzy. I. Ttulo.

Danilo Araujo Luiz

SISTEMA AUTNOMO DE NAVEGAO COM KINECT E ARDUINO

Trabalho de Concluso de Curso para obteno do ttulo de Graduao em Engenharia de Computao apresentado Universidade Paulista UNIP.

Aprovado em: BANCA EXAMINADORA

________________________________________________ Professor Orientador Dr. Orlando Del Bianco Filho

___ /___/___

________________________________________________ Professor Coordenador Dr. Francisco Correa

___ /___/___

________________________________________________ Professor Ricardo Bacci

___ /___/___

DEDICATRIA

Dedico este trabalho aos meus pais, minha namorada, aos meus amigos e todos aqueles que buscam meios de melhorar o mundo em que vivemos.

AGRADECIMENTOS

Em primeiro lugar agradeo aos meus pais Edinei Luiz e Maria Aparecida Araujo Luiz que sempre me incentivaram a estudar para conseguir obter o que desejar na vida. Em segundo lugar agradeo minha namorada Flavia Sousa da Silva que me ajudou e incentivou em todos os momentos. Tambm houve alguns amigos que deram apoio idia do projeto, tais como Andrews Regis da Penha Alves, Sandeep Kumtakar e Thiago Marcel Lima. Devo tambm agradecer a todos os professores que tive contato durante todos esses 5 anos cursando Engenharia. Sobretudo os professores do curso especfico de Engenharia de Computao: Flvio Mendona, Jos Augusto Pinheiro Christino, Orlando Del Bianco Filho, Orlando Onofre Junior, Ricardo Bacci e ao nosso professor Coordenador Francisco Correa.

Parte

da

ausncia

de

humanidade do computador deve-se a que, competentemente programado e trabalhando bem, completamente honesto. (Isaac Asimov)

RESUMO

Aps o lanamento da tecnologia do Kinect da Microsoft surgiram diversas iniciativas de uso alternativo, uma vez que o mesmo foi projetado para jogos. Essas deram idias para projetos que envolviam processamento de imagem em tempo real. Uma dessas idias foi a construo de um sistema autnomo de navegao utilizando o Kinect pela University of Bundeswehr Munich no projeto: Kinect-Enabled Autonomous Mini-car Navigation, algo que a Google Inc. j vinha trabalhando, porm em grande escala e com outra tecnologia, que tambm tinha o mesmo princpio de construir um sistema que permitisse a movimentao de um carro sem motorista. Todos esses projetos utilizavam softwares no oficiais da Microsoft para programao, eram os chamados Kinect Hacks. A partir de 16 de junho de 2011 o pacote de desenvolvimento do Kinect para Windows foi oficialmente lanada pela Microsoft. Este projeto teve como objetivo criao de um prottipo de um carro capaz de desviar-se de obstculos. Diferente da maioria dos projetos existentes utilizou-se do sensor de profundidade do Kinect invs de sonares. Alm do pacote de desenvolvimento do Kinect para Windows, tambm se utilizou de uma plataforma de hardware livre: o Arduino, que atuou diretamente nos circuitos eltricos.

Palavras chave: driverless car, lgica fuzzy, Kinect, Arduino,

ABSTRACT

After the launching of Kinect technology from Microsoft Corporation a lot of initiatives of alternative use has appeared, once the device was designed for game using. Those initiatives have inspired who wanted to work with real-time image processing projects. One of those ideas was the designing of a autonomous navigation system using Kinect by the University of Bundeswehr Munich with the project: Kinect-

Enabled Autonomous Mini-car Navigation, something that Google Inc. have been working in a large scale and using another technology, both have the same principle to design a driverless car system. All of the projects which were using non-official software from Microsoft to programming were called as Kinect Hacks. From June 16th 2011 the official Kinect software development kit for Windows was launched by Microsoft. The purpose of this Project was to create a car prototype with an obstacle avoidance system. Most of the project of this nature is built using sonars, this project uses the Kinect depth sensor to detect obstacles. Beyond the Kinect for Windows SDK, the open-source single-board microcontroller: the Arduino that was acting directly to electrical circuits.

Keywords: driverless car, fuzzy logic, Kinect, Arduino,

SUMRIO 1. 2. 2.1 2.2 2.3 3. 4. 4.1 4.2 4.3 4.4 5. Introduo ................................................................................................ 9 Referencial terico ................................................................................. 14 Relao Interdisciplinar ...................................................................... 14 Kinect ................................................................................................. 15 Arduino ............................................................................................... 16 Metodologia ........................................................................................... 17 Projeto ................................................................................................... 18 Fase I Programando com o Kinect .................................................. 18 Fase II Programando com o Arduino ............................................... 18 Fase III Integrando a programao ao carro rdio-controlado ........ 19 Fase IV Ajustes de cdigos e de circuitos ....................................... 22 Consideraes finais ............................................................................. 24

Referncias......................................................................................................23 Anexos.............................................................................................................32

1. INTRODUO

Desde os tempos primrdios da civilizao humana, o homem tem desenvolvido ferramentas para facilitar a vida. Grande parte deste conhecimento adquirido foi perdido atravs das guerras e durante a poca da Idade Mdia. No entanto, a partir do sculo XVIII com a Revoluo Industrial e as novas descobertas no campo da energia eltrica, voltamos a progredir tecnologicamente em uma velocidade maior. No final do sculo XIX surgiram primeiros os automveis e em seguida no incio do sculo XX, os primeiros avies. Depois tivemos duas grandes Guerras Mundiais, onde a tecnologia deu mais um significativo passo com a introduo dos computadores para clculos balsticos e popularizao dos diversos meios de transporte. A partir da segunda metade do sculo XX houve grandes avanos na computao. Tivemos a miniaturizao dos componentes eletrnicos o que possibilitou a criao dos circuitos integrados, que por sua vez possibilitaram o surgimento dos computadores pessoais. Inclusive podemos considerar a criao e a evoluo dos videogames como algo importante para a realizao deste projeto, que tambm foram possveis devido ao surgimento destes mesmos circuitos integrados. Com a popularizao do computador pessoal, da internet e dos dispositivos eletrnicos como celular, GPS, tocadores de udio, etc, houve duas tendncias que inspiraram elaborao deste projeto: estudos em robtica e inteligncia artificial, e tambm a infeliz quantidade de acidentes de trnsito.

Estudos em Robtica e Inteligncia Artificial

Enquanto a Robtica constitui-se de estudos de sistemas mecnico-eltricos, a rea de Inteligncia Artificial visa criar sistemas capazes de realizar decises. comum que sejam trabalhadas em conjunto, principalmente pela necessidade de algoritmos e linguagens de programao atuando em sistemas eltricos, o que ocorre, por exemplo, nos computadores. Atualmente grande parte do desenvolvimento de robs tem como fim o uso militar. Inclusive dados do incio de 2011, mostraram que h mais de 2000 robs no Afeganisto auxiliando os soldados estadounidenses.

Existem diversos outros usos da Inteligncia Artificial, como controlar trens e metrs, a exemplo da linha 4 Amarela do Metr/ViaQuatro de So Paulo. Tambm vemos este tipo de uso de Inteligncia Artificial em lanamento de msseis e naves espaciais.

Do avano da tecnologia aos seus malefcios

Apesar de todos os avanos tecnolgicos para proporcionar uma qualidade de vida melhor, bem como facilidades no dia-a-dia, tambm tivemos muitos efeitos adversos deste mundo tecnolgico. O homem sempre procurou novas formas de facilitar sua vida, seja por motivos altrustas ou totalmente egostas, eis que no desde o final do sculo XIX contemplamos criao do automvel. Com toda essa quantidade de inovaes tecnolgicas foi uma questo de tempo at a que tecnologia se voltasse contra os homens. Claro que toda tecnologia pode ser usada para fins destrutivos, como tambm o mau uso da mesma pode causar graves desastres. Desde que os automveis existem, tambm existem os acidentes

automobilsticos. E por mais que diversas causas sejam apontadas, a forma que muitos encontraram para sanar este problema so estudos no campo de sistemas autnomos de navegao. Segundo a pesquisa realizada para este projeto, muitos acidentes ocorrem em boas condies de trnsito, como bom asfalto, durante o dia e clima no chuvoso. E a maior causa dos acidentes a falta de ateno, a qual deve estar sendo maximizada j que atualmente temos na mdia mais de um celular por pessoa no Brasil, alm disso, o uso da internet vem crescendo nos celulares e tambm com a popularizao de sistemas de posicionamento global conhecido comumente como GPS (Global Positioning System) que dentre outras funes tambm pode exibir TV Digital.

Outras iniciativas

Existem outros estudos sendo realizados em relao criao de sistemas autnomos de navegao, como o caso da Google Inc. No primeiro episdio da mini-srie Brave New World com Stephen Hawking possvel ver uma demonstrao razovel deste projeto da Google Inc. O projeto consiste na construo de um sistema autnomo de navegao, auxiliado por GPS para seguir uma rota, contudo utiliza-se de outros artifcios para evitar colises. Recentemente tambm foi publicado um estudo do MIT (Massachusetts Institute of Technology) a respeito de um sistema para auxiliar motoristas. Neste caso, o sistema complementar, no substitui um ser humano. Na China tambm vem sendo realizado uma pesquisa, pela National University of Defense Technology, na construo de um sistema autnomo de navegao que se assemelha muito com o que a Google Inc. vem desenvolvendo.

2. REFERENCIAL TERICO

2.1

Relao Interdisciplinar

Durante a elaborao deste projeto muitos conhecimentos foram adquiridos, bem como muitos outros conhecimentos adquiridos em classe foram utilizados. Seguem listadas as matrias e onde ocorreu seu emprego. Desenho Tcnico, na elaborao da caamba para acomodao do notebook, circuitos e baterias. Estatstica Descritiva, na anlise dos dados obtidos atravs de diversos sites, sobretudo do IBGE (Instituto Brasileiro de Geografia e Estatstica). Eletricidade e Calor, Complementos de Fsica e Materiais Eltricos que forneceram as bases necessrias para trabalhar com componentes eletrnicos. Anlise de Algoritmos e Estrutura de Dados, Arquitetura de Computadores e Tecnicas de Programao, Engenharia de Software e Tpicos de Programao Avanada, Linguagens Formais e

Compiladores, Automao de Processos e Controle, Tpicos de Inteligncia Artificial que contriburam para a elaborao de toda a programao realizada. Tratamento Vetorial de Imagens e Processamento de Sinais Digitais que forneceram as bases para a elaborao de uma lgica baseada em imagem. Destacam-se tambm as matrias de Circuitos Lgico-Digitais, Microprocessadores e Microcontroladores, e Sistemas Digitais em Engenharia da Computao, pois foram as matrias fundamentais para a concretizao deste projeto, uma vez que tambm foram base para um pr-projeto no final de 2010. Essas matrias fazem toda a ligao com os conceitos aprendidos em eletricidade e os conceitos aprendidos em lgicas de programao.

2.2

Kinect

Para a elaborao deste projeto houveram duas principais tecnologias envolvidas: Kinect e Arduino. Ainda que ambas tecnologias sejam da parte de hardware, cada uma teve um propsito diferente como veremos a seguir. Nesta sesso trataremos de uma breve descrio do Kinect. O Kinect pode ser definido por: um sensor de profundidade. Ele um complemento ao console de videogame Xbox 360. Sua principal funo reconhecer a presena de seres humanos e mapear os movimentos para dentro do jogo. Devido ao seu hardware enxuto, surgiram iniciativas para o uso em projetos de reconhecimento de objetos, reconhecimento de gestos e at mesmo avaliando a profundidade dos objetos prximos como foi o caso deste projeto. Para seu funcionamento o Kinect possui um emissor de Infravermelho e um receptor, alm de uma cmera VGA e uma srie de 4 microfones dispostos de uma maneira que pode facilitar o reconhecimento da posio do usurio. A partir do clculo do tempo da emisso do Infravermelho e sua recepo, possvel mensurar qual a distncia de cada pixel na imagem gerada (neste caso gera-se uma matriz onde cada ponto da imagem tem uma coordenada X, Y e Z, sendo esta ltima a distncia). Com o sucesso dentro e fora dos videogames a Microsoft lanou o pacote de desenvolvimento de aplicaes do Kinect para Windows em junho de 2011. Uma vez que o uso comercial no fosse o propsito deste pacote de desenvolvimento, diversos trabalhos envolvendo acessibilidade ou reconhecimento de imagens foram realizados. Estima-se que a Microsoft ir lanar uma verso paga do pacote de desenvolvimento de aplicaes do Kinect para Windows em 2012.

2.3

Arduino

Conceitualmente o Arduino uma plataforma de hardware livre. Consiste-se numa srie de circuitos integrados que so facilmente adaptados para sistemas de pequeno porte. Surgiu em 2005 numa tentativa de produzir um hardware que fosse barato e ao mesmo tempo de fcil programao. Teve grande reconhecimento e popularizao de 2006 em diante. Possui internamente alguns resistores, regulador de tenso, capacitores e principalmente um microcontrolador e conversor para interface serial. Atualmente vem com um conversor FTDI para a comunicao e programao diretamente pela USB. Sua praticidade se d ao fato que alm do hardware simplificado e embutido, possui um ambiente integrado de desenvolvimento de software que trabalha com a linguagem C e C++. De modo geral essa plataforma oferece muitas vantagens para os desenvolvedores, no entanto sua principal vantagem que trabalha com linguagem de programao de alto nvel. Alm do desenvolvimento contnuo da plataforma, alguns fabricantes montam mdulos para Arduino que realizam operaes especficas, tais como adaptador de rede, adaptador wireless, adaptador de rdio frequncia e etc.

3. METODOLOGIA

Este projeto foi organizado em milestones que em ingls significa: marcos. Ainda que envolva desenvolvimento de hardware e software, existiam dependncias entre algumas fases do projeto. Podemos definir o projeto em 5 fases que representam esses milestones. A primeira fase, que ser detalhada posteriormente, foi o desenvolvimento do programa principal que recebe informaes do Kinect. A segunda fase foi adaptar este programa principal para comunicar-se com o Arduino. A terceira fase foi estabelecer uma ligao entre o Arduino e o Carro rdio-controlado. A quarta fase conceitualmente foi a fase dedicada a ajustes de software e talvez hardware. A quina fase considerada como esta documentao em si. Devido espera do lanamento do pacote de desenvolvimento do Kinect para Windows e sua dependncia para as demais fases do projeto, efetivamente, iniciouse o projeto em Agosto, depois de muito estudo da plataforma de desenvolvimento. Havia a possibilidade de trabalhar com bibliotecas no oficiais do Kinect, o que poderia mudar o sistema operacional e a linguagem de programao. O cronograma completo est disponvel no anexo I.

4. PROJETO

O potencial do Kinect despertou uma srie de idias para trabalhar com processamento de imagens. No entanto, j faz algum tempo que o interesse por inteligncia artificial e robtica se fazia presente na minha viso de futuro. Devido quantidade de tempo de translado do meu local de trabalho at minha casa, percebi que dirigir uma enorme perda de tempo devido ao trnsito catico da cidade de So Paulo. Ainda que defenda o transporte em massa privado conhecidos como nibus fretado para se locomover do trabalho para casa, h pessoas que prezam pela individualidade e conforto de seus carros. De toda forma o avano da tecnologia tem proporcionado maiores distraes para os motoristas que insistem em desrespeitar as leis de trnsito utilizando celulares, GPS com TV Digital, os que dirigem bbados ou com sono e tantas outras aes que infringem o cdigo nacional de trnsito. Pensando nisso, surgiu-se a idia de automatizar o processo de navegao dos carros, tirando a responsabilidade do motorista e atribuindo a um sistema autnomo. Por questes oramentrias e de tempo, optou-se por construir um prottipo de um carro capaz de locomover-se autonomamente desviando-se de obstculos. Fase I Programando com o Kinect

4.1

Esta fase em princpio parecia ser a parte mais difcil da programao. Havia grandes preocupaes por parte de colegas, amigos e professores por conta da novidade que era a tecnologia. Aps obter muita documentao sobre o Kinect, considerei que estava aprendendo muito mais ingls do que a programar com o mesmo. No incio havia pouca informao sobre Kinect em portugus, encontrei apenas um site a respeito, depois que j havia assistido aos vdeos do site Channel9 da Microsoft que criou uma seo especial para falar de projetos com Kinect. Outra publicao encontrada foi uma traduo literal de alguns sites que foi descoberta somente durante a elaborao da documentao.

Inicialmente tive que entender como funcionava a programao em C#, ainda que j tivesse programado algo em Visual Basic, ASP, PHP, Java, Delphi, Javascript e Assembly (para 8051), no sou necessariamente programador. Quando a Microsoft lanou o pacote de desenvolvimento do Kinect para Windows, algo que surpreendeu e agradou a todos foi a possibilidade de programar em diversas linguagens diferentes. Ainda que os exemplos que vieram com este pacote fossem em C# e C++, a quantidade de cdigo necessrio para realizar as mesmas tarefas eram diferentes nessas duas linguagens. Por isso optei por utilizar o C#. Depois de procurar e no encontrar nada a respeito, acabei tendo que desenvolver um cdigo prprio para determinar a distncia de dois pontos da imagem, um do lado esquerdo e um do lado direito. A maioria dos projetos com Kinect estava utilizando o sensor de profundidade para reconhecimento de seres humanos que o seu foco principal. Depois de algumas tentativas, descobri que com uma simples linha, conseguia capturar a informao que precisava. Aproveitei o cdigo principal que ensina a trabalhar com profundidade que est disponvel no Channel9 pelo nome de Working with Depth Data. Adicionei o monitoramento de um ponto do lado esquerdo e de um ponto do lado direito, e que me exibisse qual a distncia de cada um desses pontos. Para finalizar a fase I, ainda aprimorei o cdigo criando uma lgica para agir em relao aos possveis obstculos detectveis. Inicialmente a lgica era baseada em 4 opes: Obstculo do lado esquerdo; Obstculo do lado direito; Obstculo em ambos os lados; Nenhum obstculo detectado.

O problema desta lgica que era possvel atender a duas opes. Quando algum obstculo era detectado em um lado e depois no outro lado, a lgica retornava a mensagem que alcanou obstculo de um lado e tambm em ambos os lados. Este conflito foi corrigido ainda nessa fase. Ento adotei a lgica fuzzy onde uma varivel pode pertencer a dois grupos dependendo do intervalo de tolerncia. Em termos prticos, atribu a minha lgica as possveis entradas:

Obstculo esquerda; o Obstculo somente esquerda; o Obstculo tambm direita;

Obstculo direita; o Obstculo somente direita; o Obstculo tambm esquerda;

Nenhum obstculo.

Para facilitar a compreenso os anexos II e III possuem o cdigo-fonte e o Diagrama de Blocos respectivamente. Implementando esta pequena alterao, quando um obstculo era encontrado de um lado, observava-se se tambm estava atingindo o outro lado. Mesmo que um nico obstculo seja encontrado ao mesmo tempo atingindo os dois pontos monitorados, por mais que o processamento seja rpido, o mapeamento do ambiente ser feito ponto a ponto e no ser simultneo. Logo, por uma frao de segundo o sistema pode encontrar o obstculo primeiro do lado esquerdo e depois do lado direito ou vice versa. Quaisquer que sejam as respostas, a lgica ser capaz de tratar.

4.2

Fase II Programando com o Arduino

Devido quantidade de informao e documentao a respeito de programao com Arduino, foi fcil encontrar e adaptar um cdigo que pudesse controlar a direo de um carro. Claro que alguns conceitos em eletrnica como o uso de portas lgicas e rels foram importantes para determinar uma lgica. Como havia a necessidade de utilizar um notebook para processar o Kinect e rodar o Microsoft Visual C# 2010 Express, a lgica atribuda ao Arduino foi realizar a varredura da porta serial e ler cdigos ASCII. Para cada direo foi atribudo um cdigo ASCII diferente. Basicamente foram: Q frente e esquerda; W frente;

E frente e direita; A esquerda; S R; D direita; Z R e esquerda; P Desligar todas sadas lgicas.

Maiores detalhes sobre esta lgica esto no anexo V. Alm de atribuir uma lgica ao Arduino, tive de voltar ao programa principal em C# e adicionar a funo de enviar um sinal para a porta serial de acordo com a resposta gerada. Ou seja, se havia um obstculo esquerda, o programa deveria enviar um sinal e para que o Arduino direcionasse os rels de forma a virar o carro direita e manter o movimento de trao frente.

4.3

Fase III Integrando a programao ao carro rdio-controlado

Ainda que tivessem sido definidos milestones para cada aspecto do projeto, fossem de software ou hardware, a fase III foi pensada durante a fase II. Afinal a lgica para o Arduino dependeria diretamente do circuito. Originalmente a idia foi abrir o carro e medir correntes e tenses at descobrir um meio de movimentar o carro. Nesta fase o carro foi levemente danificado e no realizava curva direita perfeitamente. A ausncia do esquema eltrico do carro levou realizao destes testes at que se descobriu que havia quatro pontos que se conectados ao terra do circuito, realizavam as quatro funes principais de movimentar as rodas dianteiras para esquerda e direita e as rodas traseiras para frente e para trs. Para evitar queimas de ambos os lados, criei uma placa intermediria com apenas quatro rels que isolavam os circuitos do carro e do Arduino. Do lado de acionamento dos rels, estavam todos ligados ao terra do Arduino e cada um ligado a uma porta lgica de sada. Do lado de fechamento de circuito dos rels, estavam todos ligados ao terra do circuito impresso do carro e cada um ligado queles quatro pontos localizados. Apesar de no ter o esquema eltrico dessa primeira verso de placa, possvel ver fotos desta no anexo VIII.

4.4

Fase IV Ajustes de cdigos e de circuitos

Considerando que a Fase V do projeto esta documentao, vamos falar ento a ltima fase do prottipo, que foi mais conturbada do que o esperado. Infelizmente o circuito do carro queimou-se. A primeira idia que veio cabea foi substituir o circuito por outro circuito com apenas quatro rels. A maior parte do desenvolvimento foi pensado de maneira lgica e no considerou-se as caractersticas eltricas dos componentes. Embora tenha sido simples acionar o movimento de trao para frente ou para trs utilizando rels, no funcionou muito bem na movimentao da direo. O controle da direo era realizado com seis fios e mesmo realizando diversas combinaes, nenhuma apresentou um resultado satisfatrio e que pudesse ser reproduzido com os conhecimentos em eletrnica do momento. Fotos tambm presentes no anexo VIII. Uma ltima tentativa em ressoldar os transstores da placa original resolveu o problema eltrico. Infelizmente tambm ocorreu um problema mecnico. A soluo foi comprar outro carro. Aps a compra do outro carro, muito foi pensado numa soluo que pudesse aproveitar a placa intermediria com os quatro rels e que pudesse aproveitar toda programao do Arduino. Diante dos materiais em vista, percebi que tinha adquirido um controle a mais. A soluo encontrada foi implementar o acionamento dos rels no controle. E isto foi feito muito facilmente. O funcionamento do controle bem simples de modo mecnico. Quando movimentasse para algum dos lados ou para frente e para trs, fechasse o circuito com o terra comum. Descoberto isso, soldei os quatro pontos correspondentes direo e o terra do circuito do controle. Aparentemente tudo o que precisava ser feito, estava feito. Paralelamente a todos esses processos, tambm trabalhei em duas coisas: a caamba para carregar o notebook e um meio de ligar o Kinect com baterias. A caamba do notebook foi feita com isopor condensado e rodas genricas para cadeiras ou prateleiras. Alm disso, foi utilizado cola quente para juntar as bordas. Por fim, tambm utilizei palitos de churrasco com fita Silver Tape para montar o engate ligado ao carrinho que est em detalhe no final do anexo X.

O circuito que faz com que o Kinect funcione a baterias pode ser visto no anexo VII, aproveitou-se o cabo USB proprietrio do Kinect e cortou-se a parte da fonte que se ligava tomada. O circuito bem simples, possui um regulador de tenso de 12V e dois capacitores para realizar a filtragem. Originalmente ligava-se as duas baterias de 12V em paralelo com o propsito de fornecer a mesma corrente por mais tempo. Porm na prtica, somente quando coloca-se as duas baterias em srie gerando 24V e passando pelo regulador de 12V que conseguiu-se ligar o Kinect. Como essas baterias so genricas e no possuo informaes sobre suas capacidades eltricas e fsicas, conseguiu-se uma autonomia de 10 minutos pelo menos. Mesmo tendo soldado a placa intermediria no controle remoto, o sistema continuava no funcionando de maneira adequada. Tambm se descobriu que durante a movimentao do carro, acabava ocorrendo um mau contato entre o controle e a placa intermediria, e entre o Arduino e a placa intermediria. Tendo este novo cenrio, a soluo foi retirar os conectores e soldar o controle diretamente placa. E ao invs de ter um duplo contato para ligar no Arduino, a ponta de ligao no Arduino permaneceu-se igual, contudo a ponta de ligao placa, foi soldada diretamente. Essas alteraes constam no anexo IX. Depois deste esforo o sistema continuava no funcionando. At que se descobriu que o Arduino no fornecia corrente suficiente para acionar dois rels ao mesmo tempo. A soluo foi adicionar transstores NPN ao circuito e resistores para evitar a queima do Arduino. Efetivamente a mudana significativa foi que as sadas do Arduino acionavam somente os transstores que estavam ligados em srie com os respectivos rels. J esses rels foram ligados diretamente na sada de 5V do Arduino que ao contrrio das sadas lgicas, possua uma corrente capaz de acionar os dois rels ao mesmo tempo, enquanto duas portas lgicas acionavam os dois transstores. Esta verso 2.5 da placa intermediria pode ser vista no incio do anexo X. Por questes de espao, a placa intermediria foi remodelada e tambm foram adicionados diodos para evitar a queima dos transstores, esses diodos foram colocados em paralelo aos rels realizando o trabalho de proteo. O esquema eltrico final da placa intermediria est disponvel no anexo VI e as fotos no anexo X

5. CONSIDERAES FINAIS

A experincia adquirida neste projeto foi edificante. Foi interessante saber que s vezes buscamos solues complexas quando s precisamos de solues simples, como foi o caso de integrar o Arduino ao carro rdio-controlado, quando integr-lo ao controle remoto foi muito mais simples e o risco de perda muito menor. Desde o princpio sabia que com determinao e estudo chegaria ao resultado final, fosse usando o pacote de desenvolvimento do Kinect para Windows oficial ou usando outras bibliotecas gratuitas. Bem, como sempre soube que o mais trabalhoso de todo o trabalho seria esta documentao. Foi excelente contar com meus professores para a orientao do projeto, em especial ao professor Jos Augusto Pinheiro Christino que graas quantidade de aulas que tivemos neste ltimo semestre, pde acompanhar de perto os avanos do projeto. Igualmente satisfatrio foi no final de 2010 quando tivemos que montar um projeto com o microcontrolador 8051 para os professores Orlando Onofre Junior e Orlando Del Bianco Filho, que serviu de base para a realizao deste projeto. Inclusive a adoo do Arduino vem de forma a facilitar no cumprimento de prazos, j que tambm poderia ter utilizado um 8051 programando em Assembly e fazendo transmisso de dados via conexo serial. Acredito que o sucesso do projeto em parte deve-se s aulas que tive durante esses 5 anos de Engenharia, e at mesmo matrias deste ltimo semestre acabaram influenciando alguma coisa no projeto. Acredito que todo meu esforo valeu a pena e quero continuar estudando Inteligncia Artificial e Robtica, seja por hobby ou profissionalmente.

REFERNCIAS

A Navigation and Obstacle Avoidance Algorithm for Mobile Robots Operating in Unknown, Maze-Type Environments. Disponvel em:

<http://www.ee.nmt.edu/~wedeward/papers/2004ITEA.pdf>. Acesso em: 05 nov. 2011.

Adding a Kinect to an iRobot Create. Disponvel em: <http://www.ros.org/wiki/kinect/Tutorials/Adding%20a%20Kinect%20to%20an%20iRo bot%20Create>. Acesso em: 12 nov. 2011.

ANTHONY, Sebastian. Hacked Microsoft Kinect trained to recognize objects. Disponvel em: <http://downloadsquad.switched.com/2010/11/29/hacked-microsoftkinect-trained-to-recognize-objects/>. Acesso em: 05 nov. 2011.

Arduino. Disponvel em: <http://pt.wikipedia.org/wiki/Arduino>. Acesso em: 06 nov. 2011.

Arduino Uno. Disponvel em: <http://arduino.cc/en/Main/ArduinoBoardUno>. Acesso em: 06 nov. 2011.

AOUDE, Georges; et al. Threat Assessment Design for Driver Assistance System at Intersections. Disponvel em: <http://acl.mit.edu/projects/tam.htm>. Acesso em: 12 nov. 2011.

Automvel.

Disponvel

em: Acesso

<http://www.cepa.if.usp.br/energia/energia1999/Grupo4A/automovel.htm>. em: 05 nov. 2011.

AXE, David. Um a cada cinquenta soldados no Afeganisto um rob. Disponvel em: <http://www.gizmodo.com.br/conteudo/um-a-cada-cinquenta-

soldados-no-afeganistao-e-um-robo/>. Acesso em: 12 nov. 2011.

BENNETT, Dylan. RC Car. <http://mboffin.net/category/rc-car/>. Acesso em: 13 nov. 2011.

BOUFFARD, Patrick. Quadrotor Autonomous Flight and Obstacle Avoidance with Kinect Sensor. Disponvel em:

<http://www.youtube.com/watch?v=eWmVrfjDCyw&feature=player_embedded>. Acesso em: 13 nov. 2011.

BRAIN, Marshall; HARRIS, Tom. Como funcionam os receptores GPS. Disponvel em: <http://informatica.hsw.uol.com.br/receptores-gps.htm>. Acesso em: 05 nov. 2011.

Brave New World with Stephen Hawking. Disponvel <http://www.channel4.com/programmes/brave-new-world-with-stephenhawking/episode-guide/series-1/episode-1>. Acesso em: 17 out. 2011.

em:

CASTRO, Andr. Comeando a usar o SDK do Kinect. Disponvel em: <http://www.100loop.com/destaque/comeando-a-usar-o-sdk-do-kinect/>. Acesso em: 11 ago. 2011.

CAZAN, Vlad. Kinect Fan Control via Arduino. Disponvel em: <http://www.vladcazan.com/kinect-hacking/kinect-arduino-control>. Acesso em: 05 nov. 2011.

Celulares aumentam acidentes de trnsito. Disponvel em: <http://info.abril.com.br/noticias/tecnologia-pessoal/celulares-aumentam-acidentesde-transito-08072011-17.shl>. Acesso em: 05 nov. 2011.

Circuito integrado. Disponvel em: <http://pt.wikipedia.org/wiki/Circuito_integrado>. Acesso em: 06 nov. 2011.

CIRIACO,

Douglas.

que

Inteligncia

Artificial?

Disponvel

em:

<http://www.tecmundo.com.br/1039-o-que-e-inteligencia-artificial-.htm>. Acesso em: 05 nov. 2011.

Computador. Disponvel em: <http://pt.wikipedia.org/wiki/Computador>. Acesso em: 05 nov. 2011.

Connecting a 12V relay to Arduino. Disponvel em: <http://www.instructables.com/id/Connecting-a-12V-Relay-to-Arduino/step6/Theschematic/>. Acesso em: 12 nov. 2011.

Curiosidades e estatsticas sobre acidentes de trnsito. Disponvel em: <http://www.dirigindoseguro.com.br/?p=8>. Acesso em: 05 nov. 2011.

Dados

gerais

do

Brasil

Acidentes

de

Trnsito.

Disponvel

em:

<www.cesvibrasil.com.br/seguranca/biblioteca_dados.shtm>. Acesso em: 05 nov. 2011.

De 2005 para 2008, acesso Internet aumenta 75,3%. Disponvel em: <http://www.ibge.gov.br/home/presidencia/noticias/noticia_visualiza.php?id_noticia=1 517>. Acesso em: 05 nov. 2011.

Em 2006, a esperana de vida do brasileiro ao nascer era de 72,3 anos. Disponvel em:

<http://www.ibge.gov.br/home/presidencia/noticias/noticia_visualiza.php?id_noticia=1 043&>. Acesso em: 05 nov. 2011.

ESA desenvolve inteligncia artificial. Disponvel <http://inteligenciaeconomica.com.pt/?p=4147>. Acesso em: 05 nov. 2011.

em:

FAIRHEAD, Harry. China and the rise of the driverless car. Disponvel em: <http://www.i-programmer.info/news/105-artificial-intelligence/2876-china-and-therise-of-the-driverless-car.html>. Acesso em: 11 ago. 2011.

________________. Sebastian Thrun on Google's driverless car. Disponvel em: <http://www.i-programmer.info/news/105-artificial-intelligence/2217-sebasitian-thrunon-googles-driverless-car.html>. Acesso em: 05 nov. 2011.

________________. Google drives a car. Disponvel em: <http://www.iprogrammer.info/news/105-artificial-intelligence/1434-google-drives-a-car.html>. Acesso em: 05 nov. 2011.

______________.

All

About

Kinect.

Disponvel

em:

<http://www.i-

programmer.info/babbages-bag/2003-kinect-the-technology-.html>. Acesso em: 12 nov. 2011.

FERNANDEZ, Dan. Working with Depth Data. Disponvel em: <http://channel9.msdn.com/Series/KinectSDKQuickstarts/Working-with-Depth-Data>. Acesso em: 16 jun. 2011.

Getting started with Microsoft Kinect SDK. Disponvel em: <http://www.iprogrammer.info/programming/hardware/2623-getting-started-with-microsoft-kinectsdk.html>. Acesso em: 12 nov. 2011.

Getting started with Microsoft Kinect SDK - Depth and Video space. Disponvel em: <http://www.i-programmer.info/programming/hardware/2822-getting-started-withmicrosoft-kinect-sdk-depth-and-video-space-.html>. Acesso em: 12 nov. 2011.

Getting

Started

with

PC

Kinect.

Disponvel

em:

<http://www.i-

programmer.info/programming/hardware/1905-getting-started-pc-kinect.html>. Acesso em: 12 nov. 2011.

GUIMARES, Ricardo. Trem descarrila na Linha 4-Amarela da ViaQuatro (Metr SP). Disponvel em: <http://diariodacptm.blogspot.com/2011/06/trem-descarrila-nalinha-4-amarela-da.html>. Acesso em: 06 nov. 2011.

Hacked Kinect Enabled Autonomous Mini Robot Car Navigation. Disponvel em: <http://www.adafruit.com/blog/2010/12/10/hacked-kinect-enabled-autonomous-minirobot-car-navigation/>. Acesso em: 13 nov. 2011.

Histria

do

Automvel.

Disponvel

em:

<http://www.historiadetudo.com/automovel.html>. Acesso em: 06 nov. 2011.

Historia do primeiro computador. Disponvel <https://sites.google.com/site/historiasobreossitesdebusca/Historia-datecnologia/historia-do-primeiro-computador>. Acesso em: 06 nov. 2011.

em:

Histria dos Computadores e Computao. Disponvel <http://www.lsi.usp.br/~leminski/040907.htm>. Acesso em: 06 nov. 2011.

em:

Histria

dos

jogos

eletrnicos.

Disponvel

em:

<http://pt.wikipedia.org/wiki/Hist%C3%B3ria_do_videogame>. Acesso em: 06 nov. 2011.

Inteligncia

artificial.

Disponvel

em:

<http://pt.wikipedia.org/wiki/Inteligencia_artificial>. Acesso em: 05 nov. 2011.

Internet. Disponvel em: <http://pt.wikipedia.org/wiki/Internet>. Acesso em: 12 nov. 2011.

iPadand Kinect-Controlled Car. Disponvel <http://www.gauravmanek.com/blog/?p=33l>. Acesso em: 12 nov. 2011.

em:

JAMES, Mike. Robot cars - provably uncrashable? Disponvel em: <http://www.iprogrammer.info/programming/artificial-intelligence/2726-robot-cars-provably0uncrashable.html>. Acesso em: 13 jul. 2011.

_____________. AI at the Crossroads - predicting who is going to run a red light. Disponvel em: <http://www.i-programmer.info/news/105-artificialintelligence/3413-ai-at-the-crossroads-predicting-who-is-going-to-run-a-redlight.html>. Acesso em: 01 dez. 2011.

____________. Getting started with Microsoft Kinect SDK Depth. Disponvel em: <http://www.i-programmer.info/programming/hardware/2714-getting-started-withmicrosoft-kinect-sdk-depth.html>. Acesso em: 12 nov. 2011.

____________. Getting started with Microsoft Kinect SDK - Player index. Disponvel em: <http://www.i-programmer.info/programming/hardware/2791-gettingstarted-with-microsoft-kinect-sdk-player-index.html?start=1>. Acesso em: 12 nov. 2011.

Kinect. Disponvel em: <http://pt.wikipedia.org/wiki/Kinect>. Acesso em: 12 nov. 2011.

KinectSensor - Anlise Geral do Sensor Kinect da Microsoft. Disponvel em: <http://code.google.com/p/kinmob/wiki/KinectSensor>. Acesso em: 12 nov. 2011.

Kinect Enabled Autonomous Mini Robot Car Navigation. Disponvel em: <http://www.youtube.com/watch?v=NmnepqAQIlk&feature=player_embedded>. Acesso em: 13 nov. 2011.

Kinect for Windows. Disponvel em: <http://kinectforwindows.org/>. Acesso em: 13 nov. 2011.

Kinect

for

Windows

FAQ.

Disponvel

em:

<http://kinectforwindows.org/resources/faq.aspx>. Acesso em: 13 nov. 2011.

Kinect for Windows - System requirements and Installation instructions. Disponvel em: <http://kinectforwindows.org/download/>. Acesso em: 13 nov. 2011.

MARQUEJANE, Andr Luiz Fogaa. Brasil j tem 1 celular por pessoa. Disponvel em: <http://www.techguru.com.br/brasil-ja-tem-1-celular-por-pessoa/>. Acesso em: 05 nov. 2011.

MOREIRA, Eduardo. Problemas na rede BlackBerry reduziram drasticamente acidentes de trnsito nos Emirados rabes. Disponvel em:

<http://www.techtudo.com.br/noticias/noticia/2011/10/problemas-na-rede-blackberry-

reduziram-drasticamente-acidentes-de-transito-nos-emirados-arabes.html>. Acesso em: 05 nov. 2011.

Microcontrolador. Disponvel em: <http://pt.wikipedia.org/wiki/Microcontrolador>. Acesso em: 06 nov. 2011.

Microprocessador. Disponvel em: <http://pt.wikipedia.org/wiki/Microprocessador>. Acesso em: 06 nov. 2011.

NAN, Hao. Car takes long drive - by itself. Disponvel em: <http://www.chinadaily.com.cn/cndy/2011-08/03/content_13037633.htm>. Acesso em: 03 ago. 2011.

NET.2971 - How to use the SerialPort class in WPF. Disponvel em: <http://wrb.home.xs4all.nl/Articles_2010/Article_ArduinoWPFSerialPort.htm>. Acesso em: 12 nov. 2011.

que

um

circuito

integrado?

Disponvel

em:

<http://elektron.no.sapo.pt/oqueecircuitointegrado1.htm>. Acesso em: 05 nov. 2011.

Obstacle Avoiding Robot using AVR ATmega32 Part III. Disponvel em: <http://extremeelectronics.co.in/robotics/obstacle-avoiding-robot-using-avratmega32-%E2%80%93-part-iii/>. Acesso em: 05 nov. 2011.

PEEK, Brian. et al. Kinect for Windows SDK Quickstarts. Disponvel em: <http://channel9.msdn.com/Series/KinectSDKQuickstarts>. Acesso em: 16 jun. 2011.

Readme for Kinect for Windows SDK - Beta 2 release. Disponvel em: <http://kinectforwindows.org/download/readme.htm>. Acesso em: 13 nov. 2011.

Revoluo Industrial - Histria da Revoluo Industrial. Disponvel em: <http://www.historiadomundo.com.br/idade-moderna/revolucao-industrial.htm>. Acesso em: 05 nov. 2011.

REYNOLDS, Craig. Steering Behaviors For Autonomous Characters. Disponvel em: <http://www.red3d.com/cwr/steer/>. Acesso em: 06 nov. 2011.

Robtica. Disponvel em: <http://pt.wikipedia.org/wiki/Rob%C3%B3tica>. Acesso em: 05 nov. 2011.

Robot Recipe: Nicholas. Disponvel em: <https://decibel.ni.com/content/docs/DOC8409>. Acesso em: 12 nov. 2011.

SANTOS, Marco Aurlio da Silva. Como surgiu o avio? Disponvel em: <http://www.mundoeducacao.com.br/fisica/como-surgiu-aviao.htm>. Acesso em: 05 nov. 2011.

SAXENA, Ashutosh. High Speed Obstacle Avoidance using Monocular Vision and Reinforcement Learning. Disponvel em:

<http://www.cs.cornell.edu/~asaxena/rccar/>. Acesso em: 06 nov. 2011.

SESHI. Fuzzy Logic - Obstacle Avoidance WPF. Disponvel em: <http://www.codeproject.com/KB/recipes/Seshi_FuzzyLogic.aspx>. Acesso em: 13 nov. 2011.

SHARMA, Suhas. [DIY] Kinect AC Power Adapter / Connector for the Old Xbox 360. Disponvel em: <http://suhastech.com/xbox-360/homemade-kinect-hack-usb-acpower-adapter-connector-for-the-xbox-360/>. Acesso em: 13 nov. 2011.

SILVA,

Paulo.

potencial

do

Kinect!

Disponvel

em:

<http://pplware.sapo.pt/pessoal/informatica/o-potencial-do-kinect/>. Acesso em: 13 nov. 2011.

Simple obstacle avoidance code for sumobot? Disponvel em: <http://www.societyofrobots.com/robotforum/index.php?topic=8388.0>. Acesso em: 13 nov. 2011.

Sistema

de

posicionamento

global.

Disponvel

em:

<http://pt.wikipedia.org/wiki/Sistema_de_posicionamento_global>. Acesso em: 05 nov. 2011.

SPICER, John. Connect to the Arduino with C#. Disponvel em: <http://www.technicana.com/physical-computing/73-connect-to-the-arduino-with-c.html>. Acesso em: 12 nov. 2011.

Tecnologia Driverless Linha 4 - Amarela do metr de So Paulo. Disponvel em: <http://www.viaquatro.com.br/>. Acesso em: 06 nov. 2011.

Using Relays with Arduino Turning on the Lights. Disponvel em: <http://www.glacialwanderer.com/hobbyrobotics/?p=9>. Acesso em: 12 nov. 2011.

Xbox. Disponvel em: <http://pt.wikipedia.org/wiki/Xbox>. Acesso em: 06 nov. 2011.

What

we're

driving

at.

Disponvel

em:

<http://googleblog.blogspot.com/2010/10/what-were-driving-at.html>. Acesso em: 05 nov. 2011.

ANEXO I Cronograma

ANEXO II

Cdigo-fonte da aplicao em C# para o processamento do Kinect

///////////////////////////////////////////////////////////////////////// // // Arquivo MainWindow.xaml.cs // ///////////////////////////////////////////////////////////////////////// using using using using using using using using using using using using using using using using System; System.Collections.Generic; System.IO.Ports; System.Linq; System.Text; System.Windows; System.Windows.Controls; System.Windows.Data; System.Windows.Documents; System.Windows.Input; System.Windows.Media; System.Windows.Media.Imaging; System.Windows.Navigation; System.Windows.Shapes; Coding4Fun.Kinect.Wpf; Microsoft.Research.Kinect.Nui;

namespace WorkingWithDepthData { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } // Prepara o programa para trabalhar com as rotinas do Kinect Runtime nui = new Runtime(); // Carrega todas as funes durante a inicializao do programa private void Window_Loaded(object sender, RoutedEventArgs e) { // Cria-se e abre-se a conexo com a porta serial // Envia-se um caractere p para resetar todas portas lgicas do Arduino // Este caractere foi previamente configurado no Arduino para esta ao // Aps esta ao a conexo com a porta serial fechada. var serialPort1 = new SerialPort("COM4", 9600); serialPort1.Open(); serialPort1.Write("p"); serialPort1.Close(); // Iniciam-se as rotinas de uso da cmera, sensor de profundidade e // de reconhecimento de corpos humanos. nui.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking); nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady);

// Cria-se um evento para tratar do sensor de profundidade nui.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady); // Abre-se um canal para exibio do vdeo da cmera VGA // e determina-se a resoluo de 640 por 480 (largura por altura). nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color); // Abre-se um canal para processamento do sensor de profundidade // e determina-se a resoluo de 320 por 240 (largura por altura). nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex); } // Trata as informaes vindas do sensor de profundidade void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e) { // Converte as informaes de profundidade de cada pixel numa matriz // colorida para representar a distncia dos pixels byte[] ColoredBytes = GenerateColoredBytes(e.ImageFrame); // Gera a imagem baseada nas cores das distncias PlanarImage image = e.ImageFrame.Image; image1.Source = BitmapSource.Create(image.Width, image.Height, 96, 96, PixelFormats.Bgr32, null, ColoredBytes, image.Width * PixelFormats.Bgr32.BitsPerPixel / 8); // Determina uma posio X e Y para monitorar a distncia var distanciaR = e.ImageFrame.GetDistance(50, 100); var distanciaL = e.ImageFrame.GetDistance(270, 100); // Mostra na tela do programa aonde qual a distncia de cada ponto monitorado label1.Content = "Prximo obstculo direita: \n " + distanciaR; label2.Content = "Prximo obstculo esquerda: \n " + distanciaL; // Declara a criao de uma conexo com a porta serial var serialPort1 = new SerialPort("COM4", 9600); //Abre a conexo com a porta serial serialPort1.Open(); // Avaliam-se as distncias do lado direito e esquerdo // para determinar qual ao ser tomada // uma vez decidida a ao, um caractere ASCII enviado a porta serial. // O que cada caractere significa ser analisado e interpretado pela // programao existente no Arduino. // // // if { Foi implementada uma lgica fuzzy para tratar da possibilidade de obstculos dos dois lados. Sem isso duas aes poderiam ser tomadas simultaneamente causando um conflito e travando todo o sistema. (distanciaR <= 1000) if (distanciaL <= 1000) { label3.Content = " Parar e voltar!"; serialPort1.Write("z"); }

else { label3.Content = " Obstculo direita"; serialPort1.Write("q"); } }

if (distanciaL <= 1000) { if (distanciaR <= 1000) { label3.Content = " Parar e voltar!"; serialPort1.Write("z"); } else { label3.Content = "Obstculo esquerda"; serialPort1.Write("e"); } } if (distanciaL > 1000 && distanciaR > 1000) { label3.Content = " Caminho livre"; serialPort1.Write("w"); } // Fecha a porta serial serialPort1.Close(); } // Gera a imagem da cmera de vdeo e mostra na tela void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) { PlanarImage imageData = e.ImageFrame.Image; image2.Source = BitmapSource.Create(imageData.Width, imageData.Height, 96, 96, PixelFormats.Bgr32, null, imageData.Bits, imageData.Width * imageData.BytesPerPixel); } // Gera o mapa de cores para a profundidade de cada pixel private byte[] GenerateColoredBytes(ImageFrame imageFrame) { int height = imageFrame.Image.Height; int width = imageFrame.Image.Width; // Gerao da matriz com a profundidade de cada pixel Byte[] depthData = imageFrame.Image.Bits; // colorFrame contm as informaes para gerao das cores para cada pixel // na imagem // Gerao da matriz com cores para cada pixel Byte[] colorFrame = new byte[imageFrame.Image.Height * imageFrame.Image.Width * 4]; //Constantes para gerar os ndices as cores Azul, Verde e Vermelho const int BlueIndex = 0; const int GreenIndex = 1; const int RedIndex = 2;

// Clculos para chegar na distnia de cada pixel var depthIndex = 0; for (var y = 0; y < height; y++) { var heightOffset = y * width; for (var x = 0; x < width; x++) { var index = ((width - x - 1) + heightOffset) * 4; var distance = GetDistanceWithPlayerIndex(depthData[depthIndex], depthData[depthIndex + 1]); // Para distncias menores a 85 cm, a cor vermelha ser mostrada if (distance <= 850) { colorFrame[index + BlueIndex] = 0; colorFrame[index + GreenIndex] = 0; colorFrame[index + RedIndex] = 255; } // Para distncias entre 85 e 90 cm, uma colorao laranja escuro // ser mostrada else if (distance < 900) { colorFrame[index + BlueIndex] = 0; colorFrame[index + GreenIndex] = 51; colorFrame[index + RedIndex] = 255; } // Para distncias entre 1 metro e 90 cm, uma colorao laranja // mdia ser mostrada else if (distance < 1000) { colorFrame[index + BlueIndex] = 0; colorFrame[index + GreenIndex] = 102; colorFrame[index + RedIndex] = 255; } // Para distncias entre 1 e 1,20 metro, uma colorao laranja // clara ser mostrada else if (distance < 1200) { colorFrame[index + BlueIndex] = 0; colorFrame[index + GreenIndex] = 153; colorFrame[index + RedIndex] = 255; } // Para distncias entre 1,20 e 1,50 metro, uma colorao amarela // ser mostrada else if (distance < 1500) { colorFrame[index + BlueIndex] = 0; colorFrame[index + GreenIndex] = 255; colorFrame[index + RedIndex] = 255; }

// Para distncias entre 2 metros e 1,50 metro, uma colorao // esverdeada ser mostrada else if (distance < 2000) { colorFrame[index + BlueIndex] = 0; colorFrame[index + GreenIndex] = 255; colorFrame[index + RedIndex] = 204; } // Para distncias superiores a 2 metros uma colorao azul // escura ser mostrada else if (distance > 2000) { colorFrame[index + BlueIndex] = 128; colorFrame[index + GreenIndex] = 0; colorFrame[index + RedIndex] = 0; } // Colorao do usurio quando detectado if (GetPlayerIndex(depthData[depthIndex]) > 0) { colorFrame[index + BlueIndex] = 255; colorFrame[index + GreenIndex] = 255; colorFrame[index + RedIndex] = 255; // Caso pretenda-se realizar aes perante a deteco de um // ser humano, essas aes podem ser adicionadas neste ponto. // Contudo at onde estudado, no conseguiu-se uma maneira de // des-detectar seres humanos. Durante os testes conseguiu-se // enviar um cdigo para desligamento do sistema aps deteco. } depthIndex += 2; } } return colorFrame; }

// Determina quantos seres humanos foram detectados private static int GetPlayerIndex(byte firstFrame) { //returns 0 = no player, 1 = 1st player, 2 = 2nd player... //bitwise & on firstFrame return (int)firstFrame & 7; }

// Configura os bytes correspondentes a seres humanos e matrix de pixels private int GetDistanceWithPlayerIndex(byte firstFrame, byte secondFrame) { //offset by 3 in first byte to get value after player index int distance = (int)(firstFrame >> 3 | secondFrame << 5); return distance; }

// Funo de fechamento da janela, o Kinect desligado e uma ltima mensagem // enviada para a porta serial que o Arduino interpretar para desligar todas // as portas lgicas. private void Window_Closed(object sender, EventArgs e) { nui.Uninitialize(); var serialPort1 = new SerialPort("COM4", 9600); serialPort1.Open(); serialPort1.Write("p"); serialPort1.Close(); } // Modifica o ngulo da cmera e sensores de acordo com a elevao escolhida private void button1_Click(object sender, RoutedEventArgs e) { nui.NuiCamera.ElevationAngle = (int)slider1.Value; } } }

Cdigo da parte visual do programa em C#.


///////////////////////////////////////////////////////////////////////// // // Arquivo MainWindow.xaml // /////////////////////////////////////////////////////////////////////////

<Window x:Class="WorkingWithDepthData.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="550" Width="909" Loaded="Window_Loaded" Closed="Window_Closed"> <Grid Height="500" Width="859"> <Image Height="240" Width="320" Name="image1" Stretch="Fill" Margin="130,12,409,248" /> <Image Height="240" Width="320" Name="image2" Stretch="Fill" Margin="502,12,78,248" /> <Label Content=" Direita" Height="50" HorizontalAlignment="Right" Margin="0,276,398,0" Name="label1" VerticalAlignment="Top" Width="160" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="354,12,0,0" Name="rectangle2" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="306,12,0,0" Name="rectangle3" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="402,60,0,0" Name="rectangle4" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="354,60,0,0" Name="rectangle5" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="306,60,0,0" Name="rectangle6" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="402,108,0,0" Name="rectangle7" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" />

<Rectangle Height="50" HorizontalAlignment="Left" Margin="354,108,0,0" Name="rectangle8" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="306,108,0,0" Name="rectangle9" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Label Content=" Esquerda" Height="50" HorizontalAlignment="Left" Margin="125,276,0,0" Name="label2" VerticalAlignment="Top" Width="179" /> <Rectangle Height="50" HorizontalAlignment="Right" Margin="0,12,631,0" Name="rectangle10" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="226,12,0,0" Name="rectangle11" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="130,12,0,0" Name="rectangle12" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="226,60,0,0" Name="rectangle13" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="178,60,0,0" Name="rectangle14" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="130,60,0,0" Name="rectangle15" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="226,108,0,0" Name="rectangle16" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="178,108,0,0" Name="rectangle17" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="130,108,0,0" Name="rectangle18" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Label Content=" Estado Atual" Height="43" HorizontalAlignment="Left" Margin="178,341,0,0" Name="label3" VerticalAlignment="Top" Width="243" Foreground="Red" FontSize="24" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="402,156,0,0" Name="rectangle1" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="354,156,0,0" Name="rectangle19" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="306,156,0,0" Name="rectangle20" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="226,156,0,0" Name="rectangle21" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="178,156,0,0" Name="rectangle22" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="130,156,0,0" Name="rectangle23" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> <Slider Height="34" HorizontalAlignment="Left" Margin="567,292,0,0" Name="slider1" VerticalAlignment="Top" Width="205" Interval="1" Minimum="-27" Maximum="27" SmallChange="1" IsSnapToTickEnabled="True" />

<Label Content="{Binding Path=Value, ElementName=slider1}" Height="42" HorizontalAlignment="Left" Margin="660,315,0,0" Name="label5" VerticalAlignment="Top" Width="53" FontSize="24" /> <Button Content="Ajustar ngulo" Height="33" HorizontalAlignment="Right" Margin="0,363,87,0" Name="button1" VerticalAlignment="Top" Width="205" Click="button1_Click" /> <Rectangle Height="50" HorizontalAlignment="Left" Margin="402,12,0,0" Name="rectangle24" Stroke="White" StrokeThickness="3" VerticalAlignment="Top" Width="50" /> </Grid> </Window>

Complementar s informaes acima, este aplicativo foi desenvolvido numa aplicao WPF em C#. Alm das bibliotecas de referncia padres, tambm foram utilizadas as bibliotecas

Coding4Fun.Kinect.Wpf.dll e Microsoft.Research.Kinect.dll.

ANEXO III Diagrama de Blocos

ANEXO IV Tela da aplicao em C#

O quadro do lado esquerdo representa a imagem gerada pelo sensor de profundidade; O quadro do lado direito representa a imagem capturada pela cmera de vdeo.

ANEXO V

Cdigo-fonte da aplicao em C que interpreta as informaes para o Arduino e age nas sadas do mesmo interagindo com o mundo eltrico/fsico. // Prepara todas as sadas que sero utilizadas e configura qual ser a velocidade de bits por segundo na transmisso serial. void setup() { pinMode(10, OUTPUT); pinMode(8, OUTPUT); pinMode(6, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9800); } // Rotina que se repetir durante toda a execuo do programa, repetindo-se quando chegar ao fim. void loop() { // Verifica se a porta serial est disponvel if(Serial.available()) { // Declara uma varivel e monitora os dados da porta serial que a preenchero. int c = Serial.read(); // Caso seja o caractere ASCII que representa a letra a, ir desligar a sada 4 se estiver ligada e ligar a sada 6. Isto evita conflitos, como virar para a esquerda e direita ao mesmo tempo. // A lgica a seguir tambm utilizada para as demais direes. if (c == 'a') { digitalWrite(4,LOW); digitalWrite(6,HIGH); } else if (c == 'q') { digitalWrite(4,LOW); digitalWrite(6,HIGH); digitalWrite(8,LOW); digitalWrite(10,HIGH); }

else if (c == 'd') { digitalWrite(6,LOW); digitalWrite(4,HIGH); } else if (c == 'e') { digitalWrite(4,HIGH); digitalWrite(6,LOW); digitalWrite(8,LOW); digitalWrite(10,HIGH); } else if (c == 's') { digitalWrite(10,LOW); digitalWrite(8,HIGH); digitalWrite(6,LOW); digitalWrite(4,LOW); } else if (c == 'z') { digitalWrite(10,LOW); digitalWrite(8,HIGH); digitalWrite(6,HIGH); digitalWrite(4,LOW); } else if (c == 'w') { digitalWrite(10,HIGH); digitalWrite(8,LOW); digitalWrite(6,LOW); digitalWrite(4,LOW); } else if (c == 'p') { digitalWrite(10,LOW); digitalWrite(8,LOW); digitalWrite(6,LOW); digitalWrite(4,LOW); } } }

ANEXO VI Esquema eltrico final da placa intermediria entre o Arduino e o Controle Remoto

Todos os diodos so do tipo 1N4007, todos os rels so de 5V, todos os transstores so NPN modelo C945 e todos os resistores so de 68. Todos os componentes esto agrupados em 2 pares. Os circuitos eltricos do controle remoto e do Arduino esto isolados pelos rels.

ANEXO VII Esquema eltrico de alimentao alternativo fonte de 12V para o Kinect

Por motivos de performance e mobilidade, este pequeno circuito teve de ser montado e acoplado ao cabo USB proprietrio do Kinect. A nica alterao ao cabo USB original foi cortar o cabo da fonte e anex-lo ao fio deste esquema eltrico acima. Para regular a tenso em 12V foi necessrio gerar 24V com duas baterias recarregveis de 12V e pass-las por um regulador do tipo LM7812C, os capacitores do esquema realizam o trabalho de filtragem mantendo a mesma corrente e tenso.

Foto do esquema eltrico acima. Do lado esquerdo h dois plugs macho para conectar as baterias de 12V e do lado direito a um plug fmea para ser conectado ao cabo USB modificado.

Foto do esquema eltrico com detalhe no regulador de tenso e capacitores.

Cabo USB proprietrio do Kinect modificado na extremidade onde era localizado a fonte de 12V e substituda por um plug macho.

Bateria de 12V recarregvel com plug fmea.

ANEXO VIII Verso original do projeto

Esquema inicial de acoplagem caamba. Foi descartado pois a cada frenagem a caamba chocavase com o carro. Alm disso, este sistema permitia que a caamba direcionasse o carro por conta do peso e flexibilidade do plstico anexado.

Inicialmente foram soldados os contatos dos rels de trao, os contatos que direcionavam o veculo e o contato do negativo que junto de qualquer outro contato, fechava o circuito e agira na movimentao do veculo.

Detalhe do resultado final da soldagem dos fios de ligao placa intermediria.

Detalhe dos fios saindo por fora do carro sem arterar nada em sua estrutura.

Detalhe da ligao do carro placa intermediria original.

Placa intermediria original: todos os fios eram encaixados nos conectores.

Placa intermediria original: detalhe do verso.

Aps queimar o chip do carro, uma nova placa foi criada com apenas 4 rels.

Detalhe da ligao do novo circuito do carro.

ANEXO IX Verso 2 do projeto

Placa intermediria na segunda verso, sem conectores, tudo foi soldado para evirar mau contato.

Placa intermediria na segunda verso: detalhe da frente.

ANEXO X Verso 3 do projeto

Placa intermediria na verso 2.5: foram inseridos diodos, resistores e transstores.

Placa intermediria na verso 2.5: detalhe da frente.

Detalhe da soldagem no controle remote: no houve mudana no circuito do mesmo.

Placa intermediria na verso 3: detalhe de lado.

Placa intermediria na verso 3: detalhe de cima.

Placa intermediria na verso 3: detalhe do verso.

Caamba montada para carregar o notebook

Novo carro sem circuitos alterados. O Kinect foi colado com fita isolante na parte superior.

Detalhe da diferena de tamanhos.

Detalhe da parte traseira do carro.

Detalhe da parte traseira com o conector da caamba.

Detalhe do conector acoplado caamba.

Detalhe do prottipo completo.

Detalhe do encaixe dos cabos, baterias e circuitos.

ANEXO XI Banner da Apresentao

ANEXO XII Apresentao do projeto

Por restries de espao, o projeto foi apresentado numa mesa. Todavia, para simular a movimentao do carro, ele foi colocado em um apoio, onde as rodas podiam movimentar-se sem sair da mesa.