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