Friday, December 12, 2014

Smart Crane Monitoring App

Hello everyone! This is an update on the Smart Crane Monitoring App project at Demola Tampere.

About the Project

More information about the project can be found here. Previous blog posts about the project can be found in the same page.

Our Progress

In the beginning of the project, one of the first things we worked on was the project playbook. It was reviewed in a meeting at Konecranes HQ, in which we also showed a draft application demoing sensor interaction. We also got to play with the industrial cranes in the testing facility (photos were not allowed). We had lots of fun!

Our team at Konecranes Headquarters


Next, we worked on the design of the user interface and defined the main interaction patterns and functionality of the application. We had weekly Skype meetings with our client for delivering updates on the progress. The skeleton of the app was laid out and choices concerning tools and libraries were made.

In the last weeks

A lot of work went into documenting use cases for the application, as these are one of the main deliverables of the project. We faced some delays in this process but implementation marched on.

Qt 5.x was chosen as the main library for app development, with the QtSql and QtMultimedia modules enabled, as well as the new WebEngine module in Qt 5.4. The libraries zbar and qchart are going to be used for reading Qr Codes and plotting graphs, respectively. The application is running on Android smoothly.

The backend uses MySQL Server 5 for all storage tasks. Currently there is no managed interface to the database. Acess control and data commiting is done solely through the MySQL driver, using users and roles from the DB system itself. All operations done by the client application are pure SQL queries.
 Some screenshots of the app running on the IDE and target devices:
Development Environment

App in action


Tuesday, December 2, 2014

dwEngine

The dw game engine showing off my programmer art.
I would like to show off a little side project of mine: the dwEngine. It is a game engine based off QtQuick2 and utilizes many of its features, benefitting from the great performance of QSG. It integrates Box2D, on the C++ side, for collision detection, raycasting and physics. As a bonus, it is being developed in paralell with its Android version, since it is so easy to port stuff.

My current goal is to get a complete Sonic the Hedgehog style engine working, replicating the original physics as closely as possible. The Sonic Physics Guide at Sonic Retro is a great resource, and the results so far are almost impossible to tell apart from the original games.

I shall publish a video once I get a more complete test level and a better recording setup. Submitting a demo to SAGE 2015 is my ultimate goal. Then I decide what to do with the engine from there.

Till next time!

Bonus screenshot: Debug mode on Android.


Sunday, April 27, 2014

Tutorial: Utilizando o Hadoop com o Eclipse no Ubuntu 14.04

Passo-a-passo:
  1. Instale a JDK com o seguinte comando no terminal:
    sudo apt-get install openjdk-7-jdk
  2. Baixar o Hadoop de http://ftp.unicamp.br/pub/apache/hadoop/common/current/hadoop-2.4.0.tar.gz
  3. Extraia para a pasta home
  4. Edite o arquivo ~/.bashrc e adicione as seguintes linhas ao início do arquivo:
    (edite a linha se o caminho do Hadoop for diferente)
    export PATH=$PATH:/home/seu-nome-de-usuario/hadoop-2.4.0/bin/
    export JAVA_HOME=/usr/lib/jvm/default-java/
  5. Faça logout, e depois faça login novamente
  6. O Hadoop está pronto para uso!
Usando com o Eclipse:
JARs que necessitam ser adicionadas a um projeto MR no Eclipse
  1. Crie um novo Projeto Java;
  2. Entre nas propriedades do novo projeto criado;
  3. Na seção "Java Build Path", na aba "Libraries", clique em "Add external JARs..." e adicione os JARs. Para usar o MapReduce por exemplo, veja a figura acima. Todos estão na pasta do hadoop, em share/hadoop/*
  4. Nem todos of JARs são úteis ou relevantes ao seu projeto, mas não faz mal adicionar todos se quiser;
  5. Pode começar a programar. A compilação ocorre automaticamente e a saída é na pasta bin/ da raiz do projeto. 
Para executar seu projeto, vá até a pasta dele através do terminal e execute:
HADOOP_CLASSPATH=bin hadoop [caminho.para.a.classe.Main] [entrada] [saída] 
Exemplo:
HADOOP_CLASSPATH=bin hadoop org.camargo.hadoop.wc.WcMain ./data/teste.txt ./out

Aviso: é necessário apagar a pasta de saída entre as execuções, o Hadoop geralmente se recusa a escrever para uma pasta existente.

Saturday, April 19, 2014

Download: Raspbian Wheezy com Qt 5.2 (twolife.be)


Resolvi facilitar a vida de quem teria que passar pelos mesmos perrengues que eu, e disponibilizar uma imagem do Raspbian com os pacotes do repositório twolife.be. Sobre essa imagem:
  • Pode caber em um cartão SD de 2GB! (exige um retrabalho da tabela de partições da imagem padrão do Raspbian)
  • Deve ser descompactada antes de ser utilizada (formato lzma);
  • Não inclui a partição de boot. Você deve sobrescrever a partição de raiz (segunda partição) de um SD válido do Raspbian com esse sistema de arquivos ext4.
  • Repito: NÃO é uma imagem de disco, é uma imagem de sistema de arquivo.
  • Só possui o usuário root, a senha é "pi";
  • Algumas coisas foram removidas, como por exemplo, o lxde e interface gráfica, arquivos de documentação, o swapfile foi praticamente removido (8MB), etc; Depois de expandir o fs em uma partição maior, você pode reinstalar tudo de novo via apt-get;
  • Inclui um exemplo para testar o Qt5, na pasta /root;
  • Não se esqueça de utilizar o resize2fs ou o raspi-config depois de copiar o sistema de arquivos, para aproveitar ao máximo o espaço disponível no SD.
Não é complicado usar essa imagem, se você souber o que está fazendo. Se alguém pedir, faço um tutorialzinho ;)


Boa programação!

Friday, February 28, 2014

Tutorial: Qt 5.2 no RaspberryPi (Outdated)


Depois de apanhar um bocado, consegui fazer um programa escrito em Qt5 funcionar no Raspberry Pi com aceleração de hardware via OpenGLES 2.0. A principal dificuldade é que não há pacotes prontos no repositório oficial do Raspbian Wheezy. O Arch Linux possui uma versão recente do Qt5.2 em seus repositórios mas não foi compilada especificamente pro Pi, então faltam os plugins de plataforma da QPA. Mas tem várias alternativas pra rodarmos o Qt5 acelerado.

Do jeito mais simples pro mais complicado, podemos:
  • Utilizar uma tarball pré-compilada, fornecida por Heater, um membro da comunidade;
  • Utilizar o repositório do Sebastien Noel;
  • Atualizar a distribuição Raspbian para a versão Jessie; ou
  • Compilar o Qt5 nós mesmos.
Compilar o Qt5 para o Pi requer que compilemos no próprio dispositivo, ou a utlização de uma cadeia de ferramentas de compilação cruzada (cross-compiler), o que é bem complicado. Compilar o Qt5 no Pi requer mais de dois dias, um swapfile grande, e um hd externo, além de muita paciência. Então descartaremos essa possibilidade.

Importante: todos os comandos listados a seguir devem ser executados como root (use sudo -i para entrar em modo root). Algumas operações requerem espaço considerável no disco, então recomenda-se um cartão SD de 8GB. Fique atento ao espaço disponível em / com o comando df. Não se esqueça de expandir o sistema de arquivos na configuração inicial!

Utilizando a tarball do Heater

Existe um pacote do Qt5.2 pré-compilado fornecido por um membro da comunidade. Mais detalhes sobre o pacote podem ser encontrados nesse post. O processo de instalação é muito simples, apenas extrair o pacote, so é preciso configurar algumas variáveis de ambiente depois.

Vamos baixar o arquivo, extraí-lo, e remover o pacote para economizar espaço:
 wget https://dl.dropboxusercontent.com/u/81267937/qt5.2-rpi.tgz
 tar xvzf qt5.2-rpi.tgz
 rm qt5.2-rpi.tgz

E mover o diretório base do Qt para /opt, criando os symlinks necessários em /usr/local.
 mv qt5 /opt
 ln -s /opt/qt5 /usr/local/qt5

Agora precisamos configurar as variáveis de ambiente. Fazemos isso de forma sistêmica editando /etc/profile. Adicione essas linhas ao final do arquivo:
 export PATH=${PATH}:/usr/local/qt5/bin
 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/qt5/lib
 export QT_PLUGIN_PATH=/usr/local/qt5/plugins

Tudo deve estar pronto! Reinicie o Pi para colocar as novas configurações em vigor.

Utilizar o repositório do Sebastien Noel (twolife.be)

Para facilitar a vida, recomendo utilizar a imagem que disponibilizei aqui. Estará desatualizada assim que o Rapbian Jessie sair oficialmente, mas pelo que pude testar é estável e funciona muito bem.

dist-upgrade para o Raspbian Jessie 

Essa forma pode parecer mais simples, mas como é um repositório de testes não há garantias de estabilidade, o update demora bastante e provavelmente vai remover pacotes que talvez você utilize. Recomenda-se fazer um backup antes de atualizar a distribuição, sempre! Nossa sorte é que o Pi não pode ser brickado, basta flashear o cartão SD novamente, mas é trabalhoso reconfigurar todo o sistema.

Primeiro, atualizamos o sistema de forma normal, com
 apt-get update && apt-get upgrade  

Em seguida, vamos atualizar a lista de repositórios. Edite o arquivo /etc/apt/sources.list e substitua todas as ocorrências de wheezy por jessie. E  atualizamos a distibuição:
 apt-get update && apt-get upgrade && apt-get dist-upgrade

Isso deve demorar. E de vez em quando apt engatilha um pedido de confirmação, então fique atento! Quanto tudo estiver pronto, reinicie o Pi (comando reboot). Se não aparecer nenhum problema, já podemos instalar o Qt5! Assim:
 apt-get install qt5-base qtdeclarative5-*

Compilando e executando um programa

Agora que já temos uma build do Qt em mãos, podemos compilar e testar um programa! Uma boa alternativa é a demo Qt5 Cinematic Experience do grupo QUIt Coding, que demostra várias capacidades da biblioteca e ainda tem uma versão otimizada para o RaspberryPi! Para obter o código da aplicação:
 wget http://quitcoding.com/download/Qt5_CinematicExperience_rpi_1.0.tgz
 tar xvzf Qt5_CinematicExperience_rpi_1.0.tgz
 rm Qt5_CinematicExperience_rpi_1.0.tgz

Esse exemplo não pode ser compilado out-of-source, pela versão dos arquivos de projeto. Então o qmake é executado na mesma pasta:
 cd Qt5_CinematicExperience_rpi_1.0
 qmake
 make

Se tudo correr bem, já podemos rodar a demo. Do console de texto, podemos utilizar o plugin de plataforma eglfs (EGL Fullscreen) para executar o programa direto do framebuffer em tela cheia:
 ./Qt5_CinematicExperience -platform eglfs

Só nos resta aproveitar a performance nativa do Qt5 e a excelente GPU do Raspberry. Boa programação!
Um pouco difícil de ver pela claridade, mas esse deve ser o resultado final...