Camera calibration gazebo

Camera calibration gazebo

Ultimamente tenho usado mais o gazebo para simular os robots e os diversos ambientes em que eles podem actuar.

A utilização que tenho feito do gazebo tem sido essencialmente orientada para o desenvolvimento de soluções para a viatura robótica do automec que será usada para competir nas provas de condução autónoma no Festival Nacional de Robótica.

Ao captarem a realidade as cameras introduzem distorção na representação que é feita. Essa distorção torna-se bastante visível quando se usa quadros de xadrez nas tomadas de imagem.

Apesar de ter lido que no gazebo a camera está pré calibrada e que não necessita de ser calibrada[1]  pelo processo usado em cameras reais, uma investigação breve sobre IPM (Inverse Perspective Mapping), deixou claro que a utilização do quadro de xadrez é um elemento essencial para encontrar os parâmetros da transformação, e que todos os processos descritos incluíam a fase de calibração da camera, pela que a reprodução deste processo no gazebo torna-se importante.

Além disso também podemos definir os parâmetros intrínsecos no xml que define a camera [2].

Após uma pesquisa na web encontrei o pacote  calibration_gazebo que após experimentar verifiquei que funcionava bem num dos exemplos que tinha integrado, mas que quando aplicado ao ambiente simulado usado no projecto do automec não funcionava.

Como alternativa usei apenas ficheiro sdf que define o quadro de xadrez, integrando-no pacote que define o ambiente de simulação.

Desta forma o quadro de xadrez fica disponível para inserção no ambiente simulado recorrendo a facilidade de drag and drop do gazebo.

Para o efeito cria-se uma pasta chamada chessboard, dentro da pasta models do pacote que define o ambiente simulado, no caso do automec (simulation_environment)

De seguida, copia-se os seguintes ficheiros para dentro da pasta criada. O ficheiro xacro serve apenas para gerar o ficheiro sdf, caso desejemos que o xadrez tenha outras características, como por exemplo quadrados de tamanho diferente.

  • https://github.com/inaciose/calibration_gazebo/blob/master/sdf/landmark.sdf
  • https://github.com/inaciose/calibration_gazebo/blob/master/sdf/landmark.sdf.xacro

Muda-se o nome nos ficheiros para chessboard, assim como todas as ocorrencias de landmark no seu conteúdo.

Nessa mesma pasta cria-se o ficheiro model.config com o seguinte conteúdo.

 
<model> 
  <name>chessboard</name> 
  <version>1.0</version> 
  <sdf version="1.4">
  chessboard.sdf
  </sdf>
  <description>
    Chessboard.
  </description>
</model>

No ficheiro package.xml do pacote, caso não esteja já definido deveremos acrescentar as seguintes linhas.

  <export>
    <gazebo_ros gazebo_model_path="${prefix}/models"/>
  </export>

As características do xadrez pré definido são:

  • quadrados (vertices internos): 8×6
  • tamanho: 0.03

Para colocar o quadro de xadrez no ambiente simulado basta arrastar a sua designação para a posição adequada (em frente da camera). Roda-lo de forma aos quadrados ficarem voltados para a camera. Durante o procedimento de calibragem, devemos desloca-lo e roda-lo até ficar disponível o botão Calibrate .

O seguinte comando dá inicio ao processo de calibragem. Nesse comando há que substituir o nome do tópico e da camera pelos correctos

rosrun camera_calibration cameracalibrator.py –size 8×6 –square 0.03 image:=/image_topic camera:=/camera

No caso do ROS noetic há que lançar o node da seguinte forma:

python3 /opt/ros/noetic/lib/camera_calibration/cameracalibrator.py –size 8×6 –square 0.03 image:=/image_topic camera:=/camera

Quando este comando é executado aparece uma janela onde fica visível a imagem captada pela camera, e quando é caso disso a indicação dos vertices identificados pelo programa.

Alem de 3 botões desligados  (calibrate, save e commit) que se activam quando o programa capturar uma serie de imagem do quadro de xadrez com os vertices identificados.

Vai ser necessário identificar esses vertices algumas vezes, de vários angulos e distancias, sendo que é exibida na consola uma linha com os dados adquiridos em cada posição e orientação considerada.

Quando estiver activo, deve-se clicar no botão Calibrate, surgindo na consola os parâmetros de calibragem calculados recolhidos.

Posteriormente clicar no botão save para guardar um ficheiro de arquivo (/tmp/calibrationdata.tar.gz) com as várias imagens consideradas no processo de calibragem, e dois ficheiros com os parâmetros para calibrar a camera (ost.txt e ost.yaml)

Quando se clica no botão commit, é criado um ficheiro camera.yaml na seguinte pasta: ~/.ros/camera_info

O conteúdo do ficheiro criado nesta pasta é igual ao do ficheiro ost.yaml, e contêm os parâmetros de calibração da camera.

[1]
https://answers.ros.org/question/28957/calibrate-gazebo-camera/

[2]
https://answers.ros.org/question/11965/using-camera-sensor-in-gazebo/