Home » Tutoriais » Python

Category Archives: Python

[Tutorial] Primeiro Web App com Python e Flask

Python é uma das linguagens mais versáteis dentro das aplicações atuais. Podemos encontrar aplicações em scripts de infraestrutura, computação científica, inteligência artificial e também um web app.

A criação de um web app com Python necessita de uma ajuda tornando o projeto bem simples. O ajudante é o Flask, um micro framework do Python. Ser um micro framework trás alguns benefícios para o projeto, pois possibilita flexibilizar quais outros frameworks poderão ser acoplados para proporcionar melhor desempenho.

Chega de conversa, vamos codar!
Primeiro passo é instalar o pacote do Flask no projeto, no terminal execute:

pip install flask

Agora crie um arquivo Python e digite o seguinte código:

Na linha 1, é realizada a importação da classe Flask definida no pacote flask.

Na linha 3 é criado um objeto Flask, o seu construtor recebe como parâmetro o nome da aplicação. Pode ser informado como uma string ou utilizando uma variável de ambiente __name__.

A linha 5, cria o servidor de aplicação do Flask e o executa. Por padrão, ele sobe na porta 5000. Então acesse o endereço: http://localhost:5000/

O resultado que deve-se obter é:

O problema da página não encontrada é devido a falta de configuração de um rota de acesso com o retorno do HTML desejado. Para isso, vamos definir um método e atribuir uma anotação de rota para o método. A rota raiz de qualquer página web é o “/”, e geralmente é definida pelo arquivo index. Utilizaremos esse mesmo padrão para definir o método principal.

Entre as linhas 6 e 8, está a definição do método com a rota para acesso. A função deve retornar um HTML para que seja renderizado pelo navegador.

Reiniciando o servidor e acessando o endereço novamente, chegamos ao seguinte resultado:

Agora sim! A mágica aconteceu!!!
Mas claro, que misturar código HTML com Python não é uma boa prática! No próximo post vamos descobrir como renderizar um arquivo HTML com Flask.

Até a próxima!
E que a força esteja com você!

[Tutorial] Services no ROS

Assim como publisherssubscribers, um service permite que dados sejam passados de um nó para o outro. Só que os services têm uma característica diferente. A passagem é feita através de uma função de um nó servidor para o nó cliente, ou seja, são enviados paramêtros para essa função e é aguardado um valor de retorno. Por exemplo: o nó A chama a função x do nó B, esperando um retorno y para continuar a execução do seu código. As entradas e saídas dessa função são definidas através de mensagens.

Como comentado acima, existem dois elementos principais na criação de um service:

  • Server (Servidor): especifica um callback que é responsável por tratar a requisição ao service e avisá-lo sobre a requisição. (provedor do service)
  • Client (Cliente): tem acesso ao service através de um proxy local. (executa a chamada ao service)

Hello Service!

O primeiro passo para definição de um service é determinar quais são os paramêtros de entrada e saída. Isso é feito em um arquivo separado de código, como um arquivo de configuração. A estrutrura deste arquivo é similar a definição de uma mensagem do ROS.

Como exemplo, têm-se um programa que realiza a contagem de palavras em um array. Pode-se definir então, um paramêtro de entrada do tipo String e um paramêtro de saída do tipo inteiro. Agora, cria-se o arquivo ContaPalavras.srv, que contém a descrição dos paramêtros de entrada e saída. Seu conteúdo é:

Os três traços (—) delimitam a área de definição dos paramêtros de entrada e saída. Os arquivos que definem um service devem ser salvos com a extensão .srv dentro de um diretório de mesmo nome (srv), do seu pacote.

Com a definição do arquivo de serviço concluída, é necessário informar ao ROS que existe um service para compilar no pacote. O procedimento é bem similarao de gerar mensagens, onde deve-se incluir algumas diretizes no arquivo CMakeLists.txt respectivo ao pacote.

Na diretriz find_packages inclui-se o pacote de dependência message_generation, veja abaixo:

Na sequência deve-se informar quais são os arquivos .srv que devem ser adicionados ao processo de compilação do pacote:

Por fim, é necessário informar a diretriz que realiza o processo de gerar as dependências do arquivo de configuração do serviço:

Após a definição das diretrizes de compilação do pacote no arquivo CMakeLists.txt, é necessário executar o comando catkin_make no diretório raiz do seu workspace (ex: /home/user/catkin_ws/). Para conferir se tudo ocorreu com êxito, execute o comando rossrv show ContaPalavras.srv . Ele deve exibir o conteúdo do arquivo .srv .

Dando vida ao Service

Com todas as definições de um service feitas, é hora de implementar o código do server , que irá prover a função callback para a chamada do client. O server  fica ativo esperando durante a execução do sistema, esperando as requisições.

Um server para o arquivo ContaPalavras.srv é apresentado a seguir. Utiliza-se a linguagem Python para a criação do código. Veja o arquivo server.py:

Consumindo um Service

Para consumir um service deve-se criar uma chamada para sua função. Existem duas maneiras para realizar a requisição. A primeira é através do comando rosservice e a outra é através de um código client. Veja a seguir.

ROSSERVICE

Criando o client.py

Executando Clients and Services

São necessários três janelas de terminais, uma para cada comando, confira a seguir:

Para mais informações sobre o ROS, acesse aqui.

Referências utilizadas:

  1. Quigley, Morgan, et al. ROS: An Open-Source Robot Operating System. ICRA workshop on open source software. Vol. 3. No. 3.2. 2009.
  2. Martinez, Aaron, and Fernández, Enrique. Learning ROS for robotics programming. Packt Publishing Ltd, 2013.
  3. Joseph, Lentin. Mastering ROS for robotics programming. Packt Publishing Ltd, 2015.
  4. Quigley, Morgan, Gerkey, Brian, and Smart, William D.. Programming Robots with ROS: A Practical Introduction to the Robot Operating System. O’Reilly Media, Inc., 2015.