Simulation I

We decided to create a virtual model of the vision subsystem to simulate and better understand the behavior of each of its parts. Furthermore it will be useful as a decision tool (how many cameras are needed, where they will be positioned). The cameras will be virtually simulated with Simulink 3D animation block, which gives us the possibility of positioning a camera arbitrarily in space and show their vision. We also simulate the calibration of the cameras (we will calibrate virtual cameras using a virtual calibration pattern).

When the simulator is ready we can evaluate the error in estimating the position of the ball (since we know the exact position of the ball and the estimate of the vision system) and use that result to choose if we need more cameras or need to reposition them.

The following posts will describe each block used in the simulator.

————————————————————————————————————————————————————————————

Tradução para o português:

Nós decidimos criar um modelo virtual do subsistema de visão para simular e entender melhor o comportamento de cada uma de suas partes. Além disso ele será útil como uma ferramenta de decisão (quantas câmeras serão necessárias, onde elas estarão posicionadas). As câmeras serão virtualmente simuladas com o bloco Simulink 3D animation, o qual nos dá a possibilidade de posicionar uma câmera arbitrariamente no espaço e mostrar a sua visão. Iremos também simular o processo de calibração das câmeras (iremos calibrar câmeras virtuais, usando um padrão de calibração virtual).

Quando o simulador estiver pronto poderemos avaliar o erro na estimativa da posição da bolinha (uma vez que sabemos a posição exata da bolinha e sabemos a estimativa do sistema de visão) e com base nessa avaliação que decidiremos se precisamos de mais câmeras ou se precisamos reposicioná-las.

Os próximos posts irão descrever cada bloco que será usado no simulador.

The Vision Subsystem

lens

As mentioned earlier, during the course of the project we will further deepen the explanation given on each of the blocks shown in the “Overview”, and today it’s the Vision Subsystem turn.

A possible functioning for the vision subsystem is shown below:

Overview_Vision

The ambient light is received on each of the cameras, which translates the distribution of incoming light into its sensor in an array of pixels (for more information on the digital representation of images visit: http://www.stanford.edu/class/cs101/image-introduction.html). This matrix of pixels undergoes a process called thresholding, which acts much like a filter, accepting the color values you choose and rejecting the others. It is then generated a binary image, where pixels that have passed the color test are given value ‘1 ‘and all other pixels receive the value ‘0’.

Two threshold examples are given below:

thresholding_example_thresholded

The left image is the original, and the right one is the image after a threshold, where only a few shades of blue are accepted. The pixels shown in white have value ‘1 ‘.

In the ping-pong scenario we would see something like this:

threshold_pingpongball

We will use a thresholding to isolate the ball from the rest of the image (therefore only the accepted orange hues consistent with the ball and lighting conditions will be accepted).

After the binary image has been generated it is then used by an algorithm to estimate the coordinates (in pixels) of the center of the ball. Joining the coordinates of where the ball was found in the image from camera 1 (Xc_1, Yc_1) with the ones from camera 2 (Xc_2, Yc_2) we can reconstruct the 3D scene, and then find the three-dimensional position of the ball (Stereo Vision block).

In each block discussed above exists an error insertion (quantization error of the cameras, inaccuracy in the output of the image recognition algorithm, imprecision in the positioning of cameras, etc …) and so the final measure of three-dimensional position of the ball ( Xn, Yn, Zn) is intrinsically corrupted with random errors, (hence comes the subscript ‘n’ in each of the coordinates – meaning noise). That’s where the last block of the drawing, the Kalman filter, comes in. To give us a better estimate of the position of the ball it also takes into account the physical description of its movement, and in each iteration it makes a “weighted average” from where the previous subsystem thinks the ball is and where the physical model predicts that the ball should be. The output of the Kalman filter is also the output of the vision subsystem.

————————————————————————————————————————————————————————————

Tradução para o português:

Como mencionado anteriormente, ao longo do decorrer do projeto iremos aprofundar mais a explicação dada sobre cada um dos blocos mostrados no post “Overview”, e hoje é a vez do subsistema de visão.

Um possível funcionamento para o subsistema de visão está desenhado à seguir:

Overview_Vision

A luz do ambiente é recebida em cada uma das câmeras, que traduz a distribuição de luz recebida em seu sensor em uma matriz de pixels (para mais informações sobre a representação digital de imagens acesse: http://www.stanford.edu/class/cs101/image-introduction.html). Essa matriz de pixels passa por um processo chamado thresholding, que atua praticamente como um filtro, deixando passar os pixels com valores de cor desejados e rejeitando os outros. É gerada então uma imagem binária, onde os pixels que passaram no teste de cor recebem valor ‘1’ e todos os outros pixels recebem valor ‘0’.

Dois exemplos de threshold são dados à seguir:

thresholding_example_thresholded

À esquerda está a imagem original, e a direita está a imagem depois de passar por um threshold, onde somente alguns tons de azul são aceitos. Os pixels mostrados em branco tem valor ‘1’.

No caso do ping-pong teríamos o seguinte threshold:

threshold_pingpongball

Utilizaremos o threshold para isolar a bolinha do resto da imagem (portanto só serão aceitos tons de laranja condizentes com a bolinha e as condições de iluminação).

Após a imagem binária ter sido gerada ela é passada por um algoritmo que estima as coordenadas (em pixels) de onde está o centro da bolinha. Juntando-se as coordenadas em que a bolinha foi achada na imagem da câmera 1 (Xc_1 , Yc_1) com as da câmera 2 (Xc_2 , Yc_2) é possível reconstruir a cena 3d, para então encontrar a posição tridimensional da bolinha (Sistema de visão estéreo mostrado na figura).

Em cada um dos blocos discutidos acima existiu uma inserção de erro (erro de quantização das câmeras, imprecisão no algoritmo de reconhecimento de imagem, imprecisão no posicionamento das câmeras, etc…) e por isso a medida final da posição tridimensional da bolinha (Xn , Yn, Zn) está intrínsicamente corrompida com erros aleatórios, (daí que vem o subscrito ‘n’ em cada um das coordenadas – noise). É aí que entra o último bloco do desenho, o filtro de Kalman. Para nos dar uma estimativa melhor da posição da bolinha ele leva em conta também a descrição física do movimento dela, sendo que em cada iteração ele faz uma “média ponderada” entre, onde o subsistema anterior acha que a bolinha está, e onde o modelo físico prevê que a bolinha deveria estar. A saída do filtro de Kalman é também a saída do subsistema de visão.

Overview

maze_showing_path

So, let’s start with the first step when doing anything relatively complex: break it down in smaller parts!

We’ve sketched an overview of the project as a whole, and reached the following consensus:

Overview

This sketch not only lowers the perceived complexity of the original problem (once we explicitly define what “play ping-pong” means it gets easier to decide how a machine will be able to do it), but it also helps us to achieve a better understanding of what are the main constituents of the project and where the speed-bottlenecks most probably are.

Everything starts with the light from the scene being captured by the camera and therefore entering the first step, the Vision System (this part is in charge of interpreting the images from each camera to estimate the three-dimensional position and velocity of the ping-pong ball). After the first subsystem is the decision step, this subsystem handles the most “intelligent” part of the entire process, and is responsible for choosing where and how to hit the ball. Following the decision is the Control System, wherein the setpoints are translated into the required voltages for each actuator (electric motors coupled to each joint of the robot).

Each of the subsystems shown above will be developed further in a dedicated post as the project proceeds.

————————————————————————————————————————————————————————————

Tradução para o português:

Vamos começar então com o primeiro passo para se fazer qualquer coisa relativamente complexa: quebrá-la em partes menores!

Desenhamos então um overview do projeto inteiro, e o consenso chegado está a seguir:

Overview

Desenhar esse esquema não só diminui a complexidade percebida do problema proposto (quando definimos explicitamente o que é “jogar ping-pong”, fica mais fácil decidir como uma máquina será capaz de fazê-lo), como também nos ajuda a entender melhor quais são os principais constituintes do projeto e onde possivelmente estarão os gargalos em questão de tempo.

Tudo começa com a luz da imagem sendo capturada pelas câmeras e entrando na parte de visão do sistema (essa parte encarrega-se de interpretar as imagens de cada uma das câmeras, para estimar a posição tridimensional e a velocidade da bolinha).  Após o primeiro subsistema tem-se a parte de decisão, esse subsistema cuida da parte mais “inteligente” do processo inteiro, sendo ele o responsável por escolher onde e como rebater a bolinha. Na sequência temos o subsistema de controle, em que os setpoints são traduzidos para as tensões necessárias em cada atuador (motores elétricos acoplados a cada uma das juntas do robô).

Cada um dos subsistemas mostrados acima será aprofundado mais em um post dedicado à ele conforme o projeto prosseguir.

Start Here

switch_on

Welcome to thep3blog! We created this blog for the documentation and sharing of the  development stages of a ping-pong playing robot. You will find in the posts a summary of some of the ideas behind the workings of it, from the image recognition of the ball to the planning of a strategy.

We plan to post photos and videos of the process and also code developed by us. Readers are welcome to comment and suggest improvements and new ideas.

We will try to expose all the prerequisites for a complete understanding of the material presented here, but this is not always possible. If necessary links will be posted to other sites with more detailed information.

Enjoy!

 

————————————————————————————————————————————————————————————

Tradução para o português:

Bem vindo ao thep3blog! Nós criamos esse blog com o intuito de documentar e compartilhar as etapas de desenvolvimento de um robô que joga ping-pong. Você irá encontrar nos posts um resumo de algumas das idéias por trás do funcionamento dele, do reconhecimento da bolinha até o planejamento de jogadas.

Planejamos postar fotos e vídeos do processo e também código desenvolvido por nós. Os leitores são bem-vindos para comentar e sugerir aprimoramentos e novas idéias.

Tentaremos expor todos os pré-requisitos para o completo entendimento do material aqui apresentado, mas nem sempre isso será possível, quando for o caso postaremos links para outros sites com informações mais detalhadas.

Aproveitem!