Descrição da arquitectura do software do Robot |
O sistema operativo escolhido para este projecto é o Linux, porque para além de ser possuidor de vantagens, sobre um qualquer outro sistema, esta escolha vem no seguimento dos objectivos, pois o trabalho anterior também utiliza este sistema.
Vantagens do Linux em relação aos outros sistemas operativos:
- É um sistema operativo livre.
- Permite o acesso ao código (OPEN SOURCE).
- É um sistema operativo actual e em constante desenvolvimento.
- É bastante reconfigurável.
- Suporte para o barramento USB.
- Possibilidade de trabalhar com vídeo.
- Apoio a nível mundial.
- Vantagens didácticas (disponibilidade de código).
O software utilizado na implementação de sistema de navegação do robot foi desenvolvido em linguagem C. A escolha deste tipo de linguagem de programação é justificada pelo facto de ser uma linguagem bastante poderosa e familiar.
O software desenvolvido é constituído por três blocos relativos aos sensores utilizados: Hodometria, Visão e Infra-vermelhos. A informação proveniente dos sensores é fundida para a determinação do estado do veículo. O bloco da Fusão sensorial é o responsável pela determinação da posição e orientação do robot - navegação do robot. A informação dos sensores de infra-vermelhos foi apenas utilizada na primeira fase do desenvolvimento da navegação devido ao desenvolvimento de um sistemas de controlo em simultâneo. A escolha dos sensores de infra-vermelhos para a primeira solução de navegação tem como justificação os seguintes factores: a simplicidade, a resposta rápida e os contornos da pista serem uma linha.
A segunda fase do desenvolvimento da navegação tem como aspecto principal a introdução de um filtro de Kalman para a fusão sensorial. Nesta fase, os sensores de infra-vermelhos são substituídos pela visão. Esta substituição é justificada abaixo, na secção da implementação do filtro de Kalman.
Na figura abaixo é possível verificar que a informação dos infra-vermelhos afectava directamente o estado do veículo, o que tornava o robot muito sensível a correcções fortes da sua posição e orientação.

Figura 1– Arquitectura do software do sistema de navegação
Os blocos de software ilustrados na figura anterior são descrito nas secções seguintes. |
|
1 - Hodometria |
A inicialização da hodometria do robot é realizada pela função hodom_init(). Nessa função é criado o thread da hodometria que lança a função hodom(), a qual executa em ciclo fechado a leitura dos incrementos das rodas, a partir das leituras dos encoders ópticos. A leitura desses valores é efectuada pela função axisctr_rd_cnt().
O interface da informação hodometria com o filtro de Kalman é realizado na função update_robot_pos() .Esta função actualiza o estado do robot com os valores da previsão do filtro.
|
|
Funções utilizadas |
hodom_init() -> inicialização da hodometria
hodom() -> ciclo de hodometria
axisctr_rd_cnt() -> leitura dos encoders
update_robot_pos() -> actualização do estado |
|
2 - Sistema de Visão |
O sistema de visão é constituído por dois threads, um dedicado à aquisição cíclica de imagens e outro dedicado ao processamento de imagem. Este threads são criados na função vision_init(). A função que realiza a aquisição é a vision_acquire_head(). O processamento é realizado pela função vision_process_head(), o qual é constituído por três blocos: Pesquisa do alvo, Compensação da distorção e Conversão dos referenciais. O interface do resultado final do processamento de imagem com o filtro de Kalman é realizado na função pose_estimation().
O bloco da Calibração não faz parte do sistema de visão porque é realizada em off-line, no qual a intervenção humana é necessária. Este assunto é abordado pormenorizadamente na secção da Calibração do Sistema de Visão.
A figura 2 ilustra a arquitectura do sistema de visão:

Figura 2 – Arquitectura software do sistema de visão |
|
2.1 - Controlo e classificação de imagem |
Um dos requisitos da implementação do sistema de visão é desenvolvimento de funções que permitam o controlo de imagem e a classificação correcta das cores. As funções que solucionam esse requisito são vis_read_cam_opt() e vis_make_color_img(), respectivamente .
O controlo de imagem é um dos problemas da implementação de um sistema de visão, dada a sua dependência com o meio ambiente. A má iluminação e os reflexos da pista de teste exigiu um minucioso ajuste das características da imagem, de forma a que o contraste entre a cor do chão e das linhas seja bem definido. Das muitas tentativas realizadas, é importante ilustrar os três casos seguintes:
Caso 1 - Brightness:60000; Contrast:65535; Hue:65535; Colour:0

Figura 3 – a) imagem original; b) imagem classificada
Observação - No caso 1, o excesso de brilho tem como consequência a má definição da linhas da imagem classificada. As linhas são quase imperceptíveis.
Caso 2 - Brightness:20000; Contrast:65535; Hue:65535; Colour:0

Figura 4 – a) imagem original; b) imagem classificada
Observação - No caso 2, o pouco brilho utilizado torna a imagem muito escura, tornando difícil a distinção das linhas em determinadas zonas.
Caso 3 - Brightness:35000; Contrast:65535; Hue:65535; Colour:0

Figura 5 – a) imagem original; b) imagem classificada
Observação – No caso 3, o contraste entre as linhas e o chão da pista está bem definido, apesar de se verificar o reflexo da iluminação na zona em linha faz um “v”. Os valores utilizados no controlo da imagem podem variar entre 0 a 65535(mínimo e máximo, respectivamente). |
|
2.2 - Algoritmo de Pesquisa do Alvo |
O algoritmo de pesquisa dos pontos das linhas limites da pista baseia-se numa procura de pixels pretos ao longo de um segmento. A procura dos pixels pretos da linha é realizada numa aérea de pesquisa constituída por duas zonas(esquerda e direita). A restrição da área de pesquisa visa diminuir o tempo necessário para varrer todos os pixels dessa área, optimizando o processamento de imagem. A divisão da área de pesquisa em duas zonas tem como objectivo facilitar a distinção lógica das linhas, ou seja, identificar se é a linha esquerda ou direita relativamente ao referencial do robot.
A validação da linha em cada zona é efectuada pela continuidade do percurso de pesquisa num dado número de linhas da imagem. O valor do número de linhas que validam o segmento é definido pelo diferença de linhas entre o ponto inicial e final. Se não existir continuidade entre esses limites o segmento não válido, logo não é considerado como pertencente à linha.
A função que realiza a análise dos pixels ao longo das linhas é a vis_search_vertical() . A análise do pixels ao longo das colunas é feita pela função vis_search_horizontal().
Na figura abaixo é possível verificar que na zona esquerda o algoritmo realiza por acção da função vis_search_line() um varrimento horizontal de várias linhas até encontrar pixels pretos de uma mancha escura do chão. Quando é detectado o primeiro pixel dessa mancha, as funções anteriores traçam um percurso assinalado de vermelho ao longo da mancha. No entanto, essa mancha de pixels pretos não é validada com um segmento das linhas da pista, devido à não continuidade num número mínimo de linhas da imagem.
Na zona direita da área de pesquisa a validação do segmento de recta foi positiva, visto que o percurso efectuado pelo algoritmo ao longo dessa mancha de pixels pretos atingiu o número mínimo de linhas da imagem.

Figura 6 – Pesquisa dos pontos da linha na imagem
Quando um segmento de pixels pretos é validado como parte de uma linha da pista, determinados pixels são convertidos em pontos na imagem e depois compensados pela Look Up Table(matriz) de calibração. Esta compensação é realizada pela função v_calib_func(). Após a devida compensação da distorção, provocada pela lente da câmara, o pontos no referencial da imagem são convertidos para o referencial do robot pela função v_world_xyz().
|
|
Funções utilizadas |
Inicializações:
vision_init() -> inicializações da visão.
v_calib_load() -> leitura dos parâmetros de calibração.
v_lut_load() -> leitura da LUT da compensação da distorção.
v_world_load() -> leitura dos pontos de referencia no mundo.
world_map_load() -> leitura do mapeamento do mundo.
vis_read_cam_opt()-> definições do controlo de imagem
Aquisição:
vision_acquire_head() -> ciclo de aquisição
vis_vidcat() -> captura de uma imagem
Processamento:
vision_process_head() -> ciclo de processamento
vis_make_color_img() -> classificação das cores
vis_scan_target() -> pesquisa do alvo na imagem
Pesquisa do alvo:
vis_search_vertical() -> pesquisa vertical da linha
vis_search_horizontal() -> pesquisa horizontal da linha
vis_search_line() -> pesquisa de linha
Compensação da distorção:
v_calib_func() -> função que compensa a distorção da imagem
Conversão dos referenciais:
v_world_xyz() -> conversão dos referenciais imagem/robot |
|
3 - Fusão sensorial |
A fusão sensorial tem como base as duas funções do filtro de Kalman: time_update() e measurement_update(). A primeira realiza a previsão do estado do robot e da confiança do sistema(matriz P) a partir da informação da hodometria( incrementos dos encoders-rodas). A segunda realiza correcções da posição e orientação do robot segundo os erros entre as observações e as estimativas da posição de alvos(landmarks) no mundo, que neste caso são as linhas. As estimativas da posição dos alvos no mundo são realizadas pela função pose_estimation(). Por outras palavras, esta função faz o matching(emparelhamento) do pontos observados no mapa do mundo.
A figura 7 ajuda a compreensão da fusão da informação proveniente dos sensores utilizados:

Figura 7 – Estimação da posição/orientação do robot
Nota: A grande vantagem da fusão sensorial é a utilização simultânea muitos sensores com características que podem ser semelhantes ou completamente diferentes. |
|
3.1 - Matching no mundo |
O processo de procura de pontos correspondentes no mundo aos observados é designado por matching(emparelhamento). Os pontos resultantes deste processo são os chamados pontos ou valores estimados.
Na figura 8 é visível a diferença entre o valor estimado e observado para o ângulo . É esta diferença(inovação) a responsável pela correcção da previsão do estado do robot.

Figura 8 – Estimação vs Observação
|
|
Funções utilizadas |
Inicializações: kalman_init() -> inicialização do filtro de Kalman.
Matching: pose_estimation() -> estimação dos pontos observados.
Previsão - filtro de Kalman: Time_update() -> previsão do estado do robot.
Correcção - filtro de Kalman: measurement_update() -> correcção do estado do robot. |
|
4 - Infra-vermelhos |
No diagrama da arquitectura do software do sistema de navegação é possível verificar que existe ligação deste bloco à fusão sensorial, isto porque as funções desenvolvidas para os sensores de infra-vermelhos afectam directamente o estado do robot. Existem duas funções desenvolvidas para este tipo de sensor que são a sen_ir_hodom_corr_recta() e a sen_ir_hodom_corr_curva(). A primeira executa correcções da posição nas rectas quando é detectado a linha preta, ao passo que a segunda função executa correcções da posição do robot nas curvas. Estas funções são inicializadas pela função sen_ir_init().
|
|
Funções utilizadas |
sen_ir_init() -> inicialização dos sensores de infra-vermelhos
sen_ir_hodom_corr_recta() -> correcção nas rectas
sen_ir_hodom_corr_curva() -> correcção nas curvas |
|