Jetson nano csi camera on ROS

There are some ROS packages for using CSI cameras on ROS

https://github.com/sfalexrog/jetson_camera

https://github.com/peter-moran/jetson_csi_cam

I try both but only get good results with the first one. So I forked it on the following addres:

https://github.com/inaciose/jetson_camera

 

jetson_camera

ROS package for csi camera video publisher

roslaunch jetson_camera jetson_camera.launch

There also a simple node to capture and publish the CSI camera image.

https://github.com/inaciose/ackerbot/blob/8d1851bf0a04c5f8a2c333b18d5b47b5c3486391/src/csicam_publisher.cpp

 

Camera calibration

Doing camera calibration with jetson_camera package publishing video from a IMX219 camera.

A simples utilização do ficheiro de calibração no driver não rectifica a imagem. Para efectuar a retificação da imagem usar o pacote image_proc.

Investigar melhor no futuro a optimização da calibração de cameras de olho de peixe.

http://wiki.ros.org/camera_calibration

http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration

Commands

(terminal 1)
roslaunch jetson_camera jetson_camera.launch

(terminal 2)
rosrun camera_calibration cameracalibrator.py –size 9×6 –square 0.0265 image:=/main_camera/image_raw camera:=/main_camera

Problems running cameracalibrator.py

ImportError: No module named cv2

Python version error

The solution is changing the shebang to python3

alternative is direct runing

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

Service set_camera_info error

Waiting for service /main_camera/set_camera_info …
Service not found
QMutex: destroying locked mutex
QMutex: destroying locked mutex
Segmentation fault (core dumped)

O comando rosservice list não exibe nenhum serviço set_camera_info.

Execução com novo parametro

Globalmente, o processo de calibração seguido está descrito na wiki ros MonocularCalibration, no caso da camera csi com o jetson_camera é necessário incluir um parâmetro na chamada ao node cameracalibrator.py.

Conforme vi referido numa página web (noservice) , o node permite usar o parâmetro –no-service-check, que inibe a verificação dos serviços.

rosrun camera_calibration cameracalibrator.py –size 9×6 –square 0.0265 –no-service-check image:=/main_camera/image_raw camera:=/main_camera

Com este comando exibiu a seguinte janela.

Na janela é possível configurar o tipo de camera e a escala.

Como a camera tem um angulo de 160 graus penso que será uma camera olho de peixe.

Entretanto verifiquei no wiki ros camera calibration que a partir do melodic existem uma serie de parâmetros destinados a cameras olho de peixe.

–fisheye-recompute-extrinsicsts
–fisheye-fix-skew for fisheye
–fisheye-fix-principal-point
–fisheye-k-coefficients=NUM_COEFFS
–fisheye-check-conditions

De qualquer modo avancei com as seguintes configurações:

Pinhole = 1/1

Scale = 000/100

O interface tem 3 botões, Calibrate, Save e Commit.

Pelo que percebi o botão Commit só funciona bem se o serviço set_camera_info estiver disponível.

O botão Calibrate fica disponível depois de passarmos a imagem com os quadrados brancos e pretos, e os seus vertices em contacto serem detectados várias vezes.

Quando disponível cliquei no botão Calibrate e um conjunto de dados foram exibidos no terminal. Ver output de calibração.

De seguida cliquei em Save, e o seguinte ficheiro de arquivo ficou disponível

/tmp/calibrationdata.tar.gz

Deste arquivo destaco os seguintes ficheiros

ost.txt
ost.yaml

Estes ficheiros contêm os dados constantes no output de calibração. Em particular o ost.txt, é a segunda parte desse output.

O ficheiro ost.yaml contem os mesmos dados de calibração já no formato yaml que é usado no argumento camera_info_url nos drivers de camera para o ros.

Interrompi o funcionamento do node de captura de imagem e o node de calibração da camera.

Copiei o ficheiro para uma pasta, (~/.ros/camera_calibration)

Alterei o  parametro camera_info_url no ficheiro jetson_camera.launch para usar o esse ficheiro de calibração.

Quando lancei o jetson_camera.launch apareceu o seguinte warning.

[ WARN] [1630073534.594131929]: [camera] does not match name narrow_stereo in file /home/inaciose/catkin_ws/src/jetson_camera/camera_info/csi_cam_160_cal.yaml

A solução é trocar no ficheiro ost.yaml (antes de o copiar) o nome da camera para o nome certo. No caso:

# de
camera_name: narrow_stereo
# para
camera_name: camera

 

Still working on it

Usefull commands

Comandos uteis na calibração de uma camera IMX219 com o pacote jetson_camera.

roslaunch jetson_camera jetson_camera.launch

rosrun camera_calibration cameracalibrator.py –size 9×6 –square 0.0265 image:=/main_camera/image_raw camera:=/main_camera

rosrun camera_calibration cameracalibrator.py –size 9×6 –square 0.0265 –no-service-check image:=/main_camera/image_raw camera:=/main_camera

rosservice list

rosnode list

rostopic list

 

Extra urls

http://ros.org/wiki/camera_info_manager

http://ros.org/wiki/camera_calibration_parsers

http://wiki.ros.org/image_proc

Calibrar cameras olho de peixe
https://sites.google.com/site/scarabotix/ocamcalib-toolbox

Image pipeline alternativo
https://github.com/DavidTorresOcana/image_pipeline

Exemplos de mensagens nos topicos

rostopic echo /main_camera/camera_info

header: 
  seq: 5781
  stamp: 
    secs: 1630064629
    nsecs: 882128788
  frame_id: "main_camera_optical"
height: 480
width: 640
distortion_model: ''
D: []
K: [nan, 0.0, nan, 0.0, nan, nan, 0.0, 0.0, 0.0]
R: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
P: [nan, 0.0, nan, 0.0, 0.0, nan, nan, 0.0, 0.0, 0.0, 0.0, 0.0]
binning_x: 0
binning_y: 0
roi: 
  x_offset: 0
  y_offset: 0
  height: 0
  width: 0
  do_rectify: False

Output de calibração

**** Calibrating ****
mono fisheye calibration...
D = [-0.16411803209719655, 0.5323506420170566, -0.667575196157337, 0.3072524695696274]
K = [217.77569928178522, -3.0709848224418317, 315.6222686786177, 0.0, 285.57107620446374, 240.32213346777095, 0.0, 0.0, 1.0]
R = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P = [217.77569928178522, -3.0709848224418317, 315.6222686786177, 0.0, 0.0, 285.57107620446374, 240.32213346777095, 0.0, 0.0, 0.0, 1.0, 0.0]
None
# oST version 5.0 parameters


[image]

width
640

height
480

[narrow_stereo]

camera matrix
217.775699 -3.070985 315.622269
0.000000 285.571076 240.322133
0.000000 0.000000 1.000000

distortion
-0.164118 0.532351 -0.667575 0.307252

rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

projection
217.775699 -3.070985 315.622269 0.000000
0.000000 285.571076 240.322133 0.000000
0.000000 0.000000 1.000000 0.000000

('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')

Sources

noservices
https://answers.ros.org/question/62778/ros_camera_info-service-not-found-for-usb_cam/

 

No caso de uma camera usb (usb_cam), quando se clica no botão Commit, sai-se do programa e o node de captura da camera usb exibe a seguinte linha.

 

[ INFO] [1630076380.945883171]: writing calibration data to /home/inaciose/.ros/camera_info/head_camera.yaml