Localização de marcadores Aruco

No último post, falamos sobre como ir do ponto A ao ponto B sem atingir nada. Mas, para contornar algo, você precisa entender onde estamos e onde existem obstáculos dinâmicos (nossos oponentes e não apenas).

Uma pessoa tem olhos, ouvidos e software estabelecidos pela natureza e pela experiência pessoal, para que possa se mover e navegar facilmente no espaço. O sistema de localização é quase o ponto de vista dos robôs. É necessário para que o robô possa navegar no espaço e, ajustando-se ao ambiente, mova-se nele.

Hoje falaremos sobre como resolvemos o problema de determinar a posição dos robôs no campo Eurobot, como fazer tudo isso, iniciar e configurar por si mesmo.



Condições de destino do sistema de localização


Um dos princípios do Eurobot Open é a autonomia. Autonomia de tudo o que está por trás do campo de jogo. Todos os cálculos, tomada de decisão e localização devem ser feitos em \ em robôs ou em locais especiais em campo.

O tamanho do campo é de 2x3 metros, e o erro no tamanho e na posição dos elementos de campo para campo geralmente é de 3-5 mm.

Na imagem abaixo, está um diagrama do campo Eurobot 2019 com zonas marcadas nas quais podemos colocar algo diferente de robôs.



  • 6 - Zona de Experiência (uma das tarefas adicionais)
  • 10 - Zonas de farol
  • 11 - Uma torre especial para a instalação de um dispositivo de rastreamento central (a seguir denominado CCC). Localizado acima do campo, a uma altura de 1 metro
  • Também nos próprios robôs podemos instalar beacons.

Para todas essas áreas e as dimensões dos próprios robôs, há restrições estritas de peso e tamanho, por causa das quais é impossível criar um grande supermodulo produtivo no qual tudo se encaixa. E também há um limite de 3 minutos na preparação para o lançamento. Durante esse período, uma ou duas pessoas da equipe devem retirar os robôs e tudo relacionado a eles, organizar, configurar e preparar o lançamento. Obviamente, quanto menos lixo você precisar definir e ajustar, menor a probabilidade de cometer um erro ou ser multado antes do início da batalha.


e outro segundo caixa cheia

Analisamos opções


Com a consciência de nossas capacidades e o desejo de obter precisão de posicionamento de pelo menos alguns milímetros, vamos ver o que geralmente podemos usar para resolver esse problema:

  • A odometria da roda usando codificadores localizados diretamente no acionamento ou medidores adicionais permite ler a distância percorrida pelo robô e determinar sua posição em relação ao ponto inicial. Muitas equipes da Eurobot o usam como método principal de localização. Essa é uma das fontes mais rápidas de informações de movimento do robô. No entanto, na prática, especialmente ao dirigir com rodas on-line (uma área de contato menor que as rodas clássicas, folga nos rolos e erros maiores de fabricação), a odometria é suscetível ao problema de acumular erros, que deve ser corrigido de alguma forma. Você pode alinhar com a superfície com coordenadas conhecidas ou pode complexar com um sistema adicional. Além disso, se você usar codificadores nas rodas motrizes, haverá o problema de derrapagem das rodas durante manobras afiadas e em colisões do robô. As rodas de medição podem se livrar desse problema, mas são difíceis de colocar em um pequeno robô.


    roda omni de medição fabricada com suspensão independente e com codificador magnético, que usamos em 2018
  • Os lidares têm vantagens significativas: temos uma visão quase circular e distâncias de obstáculos. Das desvantagens, vale destacar o alto preço, a dificuldade em tentar distinguir pequenos objetos distantes do lixo e um algoritmo de localização relativamente complicado. Os lidares baratos (como o rplidar) têm uma taxa de atualização e resolução angular razoavelmente baixos e também estão sujeitos à luz de outros lidares, rangefinders etc. Nos robôs, é difícil encontrar um lidar no nível lateral para usar os algoritmos clássicos do SLAM, mas com base nos dados fornecidos. As regras de elevação para sistemas de localização têm poucos objetos estáticos para ligação. No entanto, a equipe Skoltech patina com sucesso há vários anos usando o hokuyo ust-10lx e no ano passado ficou em segundo lugar na final européia da competição Eurobot na França.
  • Também consideramos sistemas inerciais , mas no nosso caso eles não se encaixavam bem. O acelerômetro é barulhento, o giroscópio está flutuando, você pode esquecer de usar a bússola em ambientes fechados. Mesmo o uso de um filtro Kalman não atinge a precisão desejada. Acontece que o IMU só pode ser usado efetivamente para correção em um período muito curto de tempo. O máximo de informações úteis que conseguimos obter com o pixhawk2 é o ângulo durante uma curva acentuada (de uma colisão, por exemplo).
  • O GPS não funciona em ambientes fechados, e a precisão sem o RTK é de metros.
  • Localização ultra-sônica . Uma das implementações pode ser encontrada aqui: m.habr.com/en/post/451408 . Infelizmente, a precisão de nossas tarefas não é muito alta (+ -2 cm), a diafonia afeta fortemente ou, se você usar sensores com proteção contra isso, é obtida uma baixa frequência de polling. Uma das equipes na Rússia usa essa solução com sucesso variável, e a equipe alemã Turag utiliza com sucesso uma tecnologia semelhante desenvolvida dentro do laboratório.
  • A odometria visual não fornece informações sobre a posição dos oponentes devido ao fato de que não há muitos pontos no campo para os quais será possível se apegar com segurança.
  • \ Duas câmeras estéreo possuem um ângulo estreito, o que não permite cobrir o campo quando localizado no dispositivo de rastreamento central ou obter uma visão circular ou pelo menos aceitável quando instalado em um robô.
  • Os marcadores fiduciários que escolhemos e que examinaremos em mais detalhes.

Marcadores fiduciários


A navegação por marcadores existe há muito tempo. Puramente teoricamente, o chamado marcador pode ser qualquer objeto. Mas há muitos problemas ao usar:

  • restrições devido à resolução da câmera;
  • falta de confiabilidade da detecção ao usar a cor como principal fonte de informação;
  • a necessidade de determinar a orientação do marcador;
  • marcas de baixo contraste funcionam bem apenas sob boa luz;
  • é necessário um alto poder de processamento do equipamento (processamento em tempo real dos quadros recebidos).

Para contornar os problemas acima, você geralmente precisa usar algo simples e inequívoco para reconhecimento, por exemplo, um círculo colorido ou um quadrado (e eu gostaria de um pato amarelo).

imagem
diferentes tipos de marcadores

De fato, além de determinar a posição de um marcador, muitas vezes é necessário determinar sua singularidade, por exemplo, para detectar vários objetos ao mesmo tempo. Para fazer isso, você pode alterar a cor ou a forma, mas enfrentaremos rapidamente uma diminuição na confiabilidade da detecção.
Esse problema é bastante comum e existem muitos padrões de marcadores. O mais famoso deles é o código qr, mas raramente é usado para problemas de localização devido à redundância e à necessidade de alta resolução. Como regra, todos os marcadores são de duas cores (geralmente preto e branco), de forma simples (geralmente um quadrado) e de alguma forma codificam o identificador em si mesmos. Os marcadores mais famosos para localização são Aruco, April Tag, ARToolKit.

Qualquer pessoa interessada em aprender mais sobre eles é um artigo interessante que também compara a confiabilidade de sua detecção.

Marcadores de fractal
Há momentos em que precisamos detectar um objeto de longe e de branco para ele. O uso de vários marcadores de tamanhos diferentes é uma maneira, mas você pode fazê-lo de maneira mais esperta e usar marcadores "fractal", cujas partes diferentes funcionam em diferentes escalas da imagem.

docs.google.com/document/u/1/d/1SdsOTjGdu5o8gy2Ot2FDqYDS9ALgyhOBJcJHOZBR7B4/mobilebasic

No nosso caso, temos muitos aspectos positivos do uso de marcadores:

  • com a possibilidade de instalar uma câmera estática com um bom ângulo de visão e marcação, isso não requer equipamentos difíceis de encontrar e potencialmente não é muito difícil de implementar;
  • a câmera remota pode avaliar a posição de todos os objetos nos quais podemos colocar marcadores;
  • os cálculos são realizados não no dispositivo de bordo do robô, mas em um computador separado (mas há um problema com a confiabilidade e atrasos na transferência de dados);
  • a capacidade de resolver qualquer outro problema associado à visão.

Depois de analisar os sistemas acima, decidimos pela detecção de marcadores. Isso nos permitiu não apenas liberar nossos odroides nos robôs, mas também permitir que eles vissem toda a situação no campo do ponto de vista de um pássaro.

Como funciona fora da caixa


A "confiabilidade" da detecção de marcadores é um termo relativo. Tarefas diferentes requerem diferentes níveis de precisão e estabilidade. A inclusão desses parâmetros depende do sensor de vídeo, lentes, condições de iluminação etc.


No nosso caso, com um tamanho de campo de 2x3 metros e uma câmera a apenas um metro acima, é necessário usar uma óptica de grande angular com um campo de visão de pelo menos 120-140 graus para garantir a visibilidade de todo o espaço de jogo, o que afeta negativamente a detecção (e sua precisão) de pequenos marcadores ao longe canto do campo de jogo e sob condições de iluminação arbitrárias tornam essa tarefa ainda mais difícil.
Como a prática demonstrou, mesmo sob condições normais, completamente naturais e iluminadas, podem ocorrer definições errôneas da posição do marcador.



Portanto, as imagens a seguir mostram dois quadros consecutivos com resultados de detecção de marcador: a direção do eixo Z (azul) é alterada em 180 graus.




www.youtube.com/watch?v=xzG2jQfxLlY

Trazendo a um estado competitivo


Mude o algoritmo


Para determinar com precisão a localização do robô no campo, você precisa conhecer a posição angular da câmera, a transformação geral do sistema de coordenadas e a posição da câmera em relação à posição do campo. Para fazer essa conversão, desenvolvemos nosso próprio algoritmo. Como uma pessoa desliga o centro de controle central manualmente, além de os campos serem ligeiramente diferentes um do outro, não é possível sempre obter a mesma posição da câmera. O deslocamento angular da câmera em relação ao campo tem um efeito muito negativo na detecção da posição dos robôs. A solução fundamental é determinar vários marcadores estáticos que podemos definir antes da partida para a calibração.

A biblioteca Aruco em opencv fornece a capacidade de determinar a posição do marcador 6dof em relação à câmera. No começo, tentamos usá-lo, mas ficou muito instável e impreciso. No nosso caso, quando a posição da câmera é conhecida, é fixa e os robôs (e marcadores associados) se movem em um plano que não passa pelo ponto de conexão da câmera, é racional nos limitarmos à tarefa de detectar a posição 3dof (z-const, x-y, + rotação ao redor um eixo z) através da triangulação de um ponto em um plano em um ângulo visível.

Espera-se que uma diminuição na dimensão e um aumento na base da triangulação (o tamanho do marcador versus a distância do plano dos marcadores à câmera) do problema resolvido reduz o nível de incerteza e ruído dos resultados da detecção.
Para fazer isso, em vez da função padrão

cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs); 


que, com base nos cantos encontrados dos marcadores, determina a 6dof posição do marcador, escrevemos nosso estimador de posição, trabalhando de acordo com os seguintes princípios:

  • A posição da câmera 3D é conhecida antecipadamente;
  • a altura do marcador é conhecida antecipadamente;
  • como resultado da detecção, são conhecidos pixels (v, u) dos 4 cantos dos marcadores;
  • como resultado da calibração da câmera, uma matriz de câmera 4x4 é definida;
  • conhecendo a 'matriz da câmera', a posição e a orientação da câmera, a posição dos ângulos de pixel do marcador, é possível obter a projeção da posição dos ângulos no espaço 3D no plano z no qual os vértices do marcador estão localizados (a altura do marcador é determinada pelo seu número);
  • executando a etapa anterior para todos os quatro cantos dos marcadores e calculando a média dos dados obtidos, é possível obter coordenadas 3D dos vértices dos marcadores no sistema de coordenadas da câmera;
  • aplicando a transformação da câmera SK no SK do campo de jogo, são obtidas as coordenadas do marcador no campo SK.

Solução de problemas de iluminação e desempenho


A estabilidade e a velocidade de detecção dos marcadores dependem fortemente das condições de iluminação ambiental e da estrutura do plano de fundo, quanto mais objetos diferentes no quadro, mais tempo demora o processamento. Uma vez que as regras da iluminação e do fundo do Eurobot não são regulamentadas de forma alguma, elas podem mudar bastante de tempos em tempos; pode haver outros campos, pessoas no fundo. Em particular, podem ser esperadas exposições adicionais de robôs inimigos, flashes da câmera ou holofotes que caem no campo de visão da câmera.

Para reduzir a influência da iluminação ambiental na estabilidade da detecção de marcadores, foi desenvolvido um "design" especial no qual marcadores aruco invertidos foram usados. A parte escura é substituída por um filme retrorrefletivo e uma luz de fundo de LED ativa é instalada diretamente na câmera. O processamento da imagem é realizado em negativo, enquanto o contraste do fundo é muito menor que o contraste dos seus próprios marcadores.

Aumentar o contraste do marcador permite selecionar efetivamente regiões de interesse no quadro e procurar marcadores apenas neles, e não em todo o quadro, o que melhora significativamente a produtividade.


Comparação das diferenças de contraste entre um marcador padrão e um marcador com uma superfície reflexiva

Nós selecionamos ferro


Como as condições de iluminação não estão definidas e a velocidade dos robôs pode ser bastante grande, desde o início procurávamos uma câmera com obturador global, e não com obturador de rolamento. A diferença é que o global coleta informações sobre o brilho dos pixels ao mesmo tempo e rolando linha por linha, pelo que pode haver distorções na forma geométrica dos objetos em movimento.
A câmera mais acessível é a oCam-1mgn, usada por 2 anos. No entanto, é preto e branco e possui uma resolução de apenas 1Mpx, localizada na borda inferior de uma resolução aceitável (o número de pixels na imagem, por 1 "pixel" do marcador).
Inicialmente, o detector era considerado na mesma placa única que os próprios robôs - odroid xu4, e a velocidade de trabalho era de cerca de 20 fps, no entanto, o desejo de pendurar funcionalidades adicionais no centro de controle central e o entendimento de que era necessária uma câmera melhor levaram a substituir o PC por um processador Intel mais vigoroso. Nuc e a câmera ... a câmera que ainda estamos pegando para a nova temporada.

Começamos o projeto


Supõe-se ainda que você já tenha o ROS Kinetic ou Melodic configurado.

A primeira coisa a fazer é baixar e instalar o OpenCV 3, Eigen3 e o projeto https://bitbucket.org/eurobot1718/ocam_usb_cam (para a câmera Ocam) ou usar outro projeto com estrutura semelhante à publicação de dados em tópicos.

Clonamos o repositório com o projeto detector de arude: https://gitlab.com/eurobot2019/aruco_detector e gui para ele https://github.com/alexpostnikov/aruco-gui
Depois de instalar os projetos, você precisa calibrar a câmera e obter a matriz de dispersão e a matriz de distorção da câmera e, em seguida, agrupar tudo no arquivo yaml “camera_params.yml”. Um exemplo simples é o uso de um tabuleiro de xadrez. Link para a implementação em C ++, onde você só precisa coletar e especificar os parâmetros da placa e da câmera, bem como o nome do arquivo de saída.

As principais configurações estão no arquivo aruco_detector_params.yml:

  • len_of_cube_markers e width_marker o comprimento e a largura dos marcadores em metros;
  • markers_height - comparação do marcador e sua altura;
  • marcadores - uma matriz que descreve se um determinado marcador pertence a um robô específico. Indica os marcadores no sentido horário. E no caso dos oponentes, como a direção deles não é importante para nós, a ordem dos marcadores na configuração também não é importante. Você só precisa especificar o código do marcador. Também temos marcadores na capa, seus números são destacados separadamente;
  • static_markers_ids - marcadores pesquisados ​​durante o processo de calibração;
  • markers_position - um dicionário com o deslocamento e a rotação de cada marcador em relação ao centro do robô;
  • brightness_threshold não pode ser tocado - isso é usado na calibração automática inicial da luz;
  • camera_position_yellow e um parâmetro semelhante servem como configurações padrão no caso de falha na calibração.

A matriz de transformação do sistema de coordenadas da câmera para o sistema de coordenadas do campo está no arquivo transform_from_cam_to_map.xml

Depois de todas as configurações, você finalmente precisa executá-lo. Os caminhos para o arquivo com os parâmetros, o lado padrão e o caminho para o dispositivo de vídeo são definidos em aruco_detector_debug.launch, que iniciaremos. Porém, para um lançamento completo, é melhor usar o script bash aruco.bash, que, além do detector, lança o gui (127.0.0.1►000). Aqui podemos escolher o lado, iniciar a calibração e controlar o sistema. Na segunda janela, zonas de interesse e marcadores encontrados são visíveis.



Agora nos tópicos: "/ enemy_robot1 / aruco", "/ enemy_robot2 / aruco", "/ big_robot / aruco", "/ small_robot / aruco", a posição dos robôs encontrados será publicada.

Viva! Fomos capazes de obter as coordenadas dos robôs. Isso é apenas, como você pode ver, eles estão errados. Isso ocorre porque, antes do uso, é necessário calibrar a posição da câmera em relação ao campo. Para isso é necessário

  • defina os cubos nos cantos do campo, enquanto é importante que eles sejam girados pelos lados especificados na configuração
  • ajuste a inclinação da câmera para que todo o espaço necessário caia no quadro
  • ajuste o brilho da luz de fundo até a detecção confiável de marcadores
  • no gui, selecione o lado desejado e clique em "calibrar"
  • o estado de "pesquisar cubos estáticos" deve mudar para "pesquisar cubos"

Fazemos marcadores e TsUS


De acordo com as regras, podemos colorir nossos robôs como quisermos e, além disso, usar um lugar especial nos nossos e de outras pessoas, no qual você pode colocar algo com tamanho de até 10x10x8cm. Um local especial está localizado na tampa do robô, tem uma altura fixa e melhor visibilidade para o centro de controle central, exceto quando o robô está sob a câmera.


altura e dimensões dos faróis no robô

Portanto, como principais marcadores para nossos robôs, usamos paralelepípedos de 10x10x108 cm colados nos 4 lados do aruco, além de marcadores adicionais na parte superior de nossos robôs para localização em uma área complexa sob a câmera.

Como não podemos prender nada na tampa do inimigo, decidimos fazer marcadores na forma de uma pirâmide truncada para expandir o alcance da visibilidade. E como você pode ver - o marcador tornou-se visível muito melhor.



Imprimimos a base da pirâmide cúbica em uma impressora 3D para que ela seja suficientemente forte e tenha uma montagem conveniente e confiável.



Modelos para imprimir um cubo, uma pirâmide e uma montagem correspondente estão localizados aqui.

Este cubo é colado com um refletor (usamos branco AVERY
DENNISON V6700B com 50 mm de largura, embora seja mais caro, funciona muitas vezes melhor que o chinês barato), e os marcadores em si são colados sobre ele. A maneira mais fácil de fazer isso é cortar os marcadores na plotadora, embora você possa cortá-los em papel ou filme em algumas horas pacíficas (um conjunto consiste em 16 marcadores).

Aqui está o kit do nosso ano passado.


várias "gerações" de nossos marcadores

Eles também podem ser usados ​​como marcadores estáticos para calibração. Para fazer isso, coloque-os nos cantos distantes do campo e clique em calibrar.

Montagem de um dispositivo de rastreamento central


O que é necessário:


Computador de placa única. Esses desenhos foram feitos para a localização da Intel NUC, mas você pode pensar em colocar no gabinete, por exemplo, odroid xu4 ou raspberry pi4.

oCam . Na verdade, a câmera, para a qual tudo está indo. Alteramos a lente padrão para 2,5 mm para um amplo ângulo de visão
Display (LCD de compartilhamento de onda de 7 polegadas HDMI (B)) Com a ajuda, a calibração e várias outras operações são realizadas.

Tira de LED. Usado para iluminar a superfície reflexiva dos marcadores. É melhor usar o mais brilhante disponível.

Bateria 16,8V LiPo. Nós usamos 4s5200mAh. São as mesmas baterias do robô, pois são convenientes e duram muito tempo.

Conversor dc-dc abaixador. Para alimentar a faixa de LED. Nuc e o roteador são alimentados diretamente pela bateria, porque todos os chicotes de energia já estão neles.

Peças impressas. Isso, em particular, um suporte de câmera, uma tela e cantos para a montagem do gabinete: https://yadi.sk/d/swUJUwxTnTVYFw

Detalhes da habitação. No nosso caso, era uma folha de carbono de 2 mm. Mas essa não é a melhor opção, como condutora de carbono, difícil de processar e não tão leve quanto, por exemplo, o plexiglass - talvez a opção mais simples. Embora muito mais difícil. Encontre o link acima.

Roteador (Zyxel keenetic extra). Tivemos que removê-lo do estojo para caber em tamanho e peso. Mas, no caso geral, não recomendamos isso.
Muitas pequenas coisas. Parafusos M3 * 8 ~ 40pcs, racks para placas de circuito impresso 3x10 ~ 12pcs, fios, chaves de fenda, wago, etc.

Assembléia


Primeiro você precisa preparar os cantos impressos, pressionando as porcas neles. Pode ser que haja poucos encaixes de pressão e eles precisem ser levemente colados ou usar porcas fundidas
Em seguida, você precisa instalar esta parte na base. Ele fornece um posicionamento claro do centro de controle central em seu lugar.



Agora montamos o suporte da câmera, inserimos oCam lá, colamos a luz de fundo da faixa de LED o mais próximo possível da lente e prendemos o módulo na base.





Depois disso, você pode instalar todas as paredes laterais, fixando-as nos cantos descritos anteriormente. Os furos para eles são melhores para serem combatidos com antecedência.



Colocamos um computador de placa única e um roteador. No nosso caso, esses são extra-apetitosos NUC e Zyxel.






E temos o sistema de rastreamento montado. Resta apenas ajustar a inclinação da câmera.


depuração de localização em 2018

Qual é o resultado


Então, contamos todos os segredos que nos permitem repetir nosso sistema com nossas próprias mãos. Utilizando-o, você pode rapidamente e sem alterações fazer o seu sistema para localizar o robô no campo Eurobot. E com alterações mínimas, crie um sistema de rastreamento bastante universal e confiável para algo. No entanto, vale considerar que, ao usar o aruco 8x8, um tamanho de marcador de 10x8cm e uma câmera em 1Mpx, não é particularmente possível aumentar o raio de detecção, no entanto, se tivermos limitações estritas de tamanho e desempenho, geralmente usaremos equipamentos mais interessantes.

Este ano, as regras mencionaram o uso do aruco 4x4, bem como suas faixas sem interseção para cada lado do campo. Num futuro próximo, planejamos integrar isso à nossa solução, para que no futuro não tenhamos medo da interseção dos números dos marcadores. Outro item obrigatório, mas o que ainda não foi feito é a calibração manual em campo.
No próximo artigo, falaremos sobre o nível mais baixo de robôs, como a cinemática dos robôs é considerada, como controlamos servidores, motores e cones ao trabalhar com freertos.

Quero agradecer:

Alexey Postnikov (em nome de quem provavelmente valeu a pena publicar tudo) - em geral, todo o código deste artigo e ajuda diretamente na redação do artigo.
Egor Alexandrov - para todos os desenhos e modelos, assistência na redação do artigo e 34 vírgulas.
Tamara Sinelnikova - pela ajuda na redação do artigo.

E o resto da equipe!

Faltam menos de quatro meses para o início da competição, mas a equipe Sberbank Eurobot ainda está aberta a novos participantes. Nosso telegrama: https://t.me/SetUpSber

Artigos anteriores:

O que é comum entre um revólver, anilhas e um robô autônomo
Pilha de navegação própria. Melhor que ROS?

Source: https://habr.com/ru/post/pt482220/


All Articles