Lab01-KameraRGB

Nowoczesne Sensory w Robotyce

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Laboratorium 0: Wprowadzenie

Powrót do wyboru zajęć ## Ważne uwagi organizacyjne

Ze sprzętem laboratoryjnym należy obchodzić się ostrożnie. Nie odłączać kabli sieciowych od komputerów.

Cel zajęć

Celem zajęć jest uruchomienie kamery w kontenerze Docker oraz wizualizacja danych w różnych narzędziach przeznaczonych do tego.

Dostępne kamery

Materiały do pracy

Przygotowanie środowiska - wstęp

Należy sprawdzić czy kamera jest poprawnie podłączona do komputera i czy jest wykrywana przez system operacyjny. Można to zrobić za pomocą polecenia lsusb w terminalu, które powinno wyświetlić listę podłączonych urządzeń USB.

Uwaga dotycząca sprzętu: Reguły udev i indeksacja urządzeń

W systemach z rodziny Linux domyślne uprawnienia do interfejsów USB są restrykcyjne. Aby oprogramowanie (np. węzły ROS) uruchamiane bez uprawnień administratora mogło komunikować się z kamerą, konieczne jest skonfigurowanie reguł systemowych udev na komputerze hosta (pliki w /etc/udev/rules.d/). Instrukcje te nadają urządzeniom określonego producenta odpowiednie uprawnienia dostępu.

Kolejnym kluczowym zadaniem mechanizmu udev jest rozwiązanie problemu dynamicznej alokacji portów. Po fizycznym odłączeniu i ponownym podłączeniu kamery, system operacyjny często przydziela jej nowy, rosnący identyfikator (np. zmieniając węzeł z /dev/video0 na /dev/video1). Prowadzi to do awarii algorytmów, które odwołują się do sztywnej ścieżki w plikach konfiguracyjnych. Prawidłowo zdefiniowana reguła potrafi rozpoznać urządzenie po jego fizycznym numerze seryjnym (Serial Number) i utworzyć stałe dowiązanie symboliczne. Dzięki temu oprogramowanie robota zawsze korzysta z niezmiennej ścieżki, niezależnie od kolejności uruchamiania portów USB.

Uwaga organizacyjna: Na niniejszych zajęciach laboratoryjnych omijamy powyższe problemy wykorzystując konteneryzację. Flaga --privileged oraz mapowanie wolumenów -v /dev:/dev w poleceniu docker run wymuszają dostęp do pełnego drzewa urządzeń. Wdrożenie systemu na rzeczywistym robocie mobilnym wymusza jednak konfigurację reguł udev.

Przygotowanie środowiska - konfiguracja

Samodzielna konfiguracja
  1. Prosze zapoznać się z dokumentacją na stronie producenta Pylon lub FLIR

  2. Następnie, utworzyć własny kontener z ROS 2 Humble. Można skorzystać z gotowego szablonu, który znajduje się w repozytorium nswr/lab1/docker

  3. Zainstalować w nim sterowniki do kamery Basler (paczka Pylon). Trzeba podać dane kontaktowe aby móc je pobrać.

  4. Po zainstalowaniu sterowników, należy można sprawdzić czy działają poprawnie, uruchamiając narzędzie pylonviewer w katalogu /opt/pylon/bin. Powinno ono wykryć podłączoną kamerę i umożliwić podgląd obrazu.

Gotowe środowisko

Zamiast samodzielnej konfiguracji, można skorzystać z gotowego obrazu Dockera, który został przygotowany specjalnie na potrzeby tych zajęć. Obraz ten zawiera już zainstalowane sterowniki do kamery Basler oraz podstawowe narzędzia do pracy z ROS 2. Aby pobrać ten obraz, należy użyć polecenia:

docker pull stanislawkuczma/nswr:ros2-humble-camera-basler

Kontener posiada już biblioteki do obsługi kamery Basler, ale nie posiada jeszcze sterowników ROS 2. W kolejnych zadaniach będziemy je instalować i konfigurować.

Do uruchomienia kontenera można użyć skryptu run.sh, który znajduje się w repozytorium nswr/lab1/run.sh. Należy uzupełnić zmienne IMAGE_NAME oraz CONTAINER_NAME zgodnie z pobranym obrazem i swoim numerem indeksu.

Uwaga skrypt run.sh sprawdza czy kontener o podanej nazwie już istnieje i w takim przypadku go zatrzymuje i usuwa, a następnie uruchamia nowy kontener z podanym obrazem.

Aby wejść do już uruchomionego kontenera, w nowym oknie terminala, można użyć polecenia:

docker exec -it <CONTAINER_NAME> bash

Jeżeli jest informacja o braku takiego kontenera, proszę go uruchomić poleceniem docker start <CONTAINER_NAME> i ponownie spróbować wejść do kontenera.

Driver w ROS 2

Po uruchomieniu kontenera, należy zainstalować sterowniki ROS 2, teraz one będą się różnić w zależności od kamery, jednak dla obu kamer będzie to polegało na sklonowaniu odpowiedniego repozytorium z GitHub i zbudowaniu go w przestrzeni roboczej ROS 2.

mkdir ~/ros2_ws/src
cd ~/ros2_ws/src

Dla kamery FLIR należy sklonować repozytorium: git clone -b humble-devel https://github.com/ros-drivers/flir_camera_driver

Dla kamery Basler należy sklonować repozytorium:

git clone -b humble https://github.com/basler/pylon-ros-camera

Szczegółowe instrukcje dotyczące instalacji i konfiguracji sterowników można znaleźć w dokumentacji dołączonej do repozytorium.

Proszę zapoznać się z dokumentacją, ponieważ może ona zawierać dodatkowe kroki konfiguracyjne.

po poziomu cd ~/ros2_ws należy zbudować przestrzeń roboczą ROS 2 poleceniem:

colcon build --symlink-install

Po zbudowaniu przestrzeni roboczej, należy ją aktywować poleceniem:

source install/setup.bash

Uruchomienie węzła ROS 2

Po zainstalowaniu sterowników i zbudowaniu przestrzeni roboczej, można uruchomić węzeł ROS 2, który będzie odpowiedzialny za komunikację z kamerą. W zależności od kamery, polecenie do uruchomienia węzła będzie się różnić.

FLIR

ros2 launch spinnaker_camera_driver driver_node.launch.py camera_type:=blackfly_s serial:="'<camera_serial_number>'"

Basler

ros2 launch pylon_ros2_camera_wrapper pylon_ros2_camera.launch.py

Po uruchomieniu węzła, można sprawdzić czy kamera jest poprawnie wykrywana i czy dane są publikowane na odpowiednich tematach ROS 2. Można to zrobić za pomocą polecenia:

ros2 topic list

Powinno ono wyświetlić listę topic’ów, na których publikowane są dane

Wyświetlenie danych

Aby wyświetlić obraz z kamery, można użyć narzędzia rqt_image_view, które jest częścią pakietu rqt. Należy uruchomić to narzędzie poleceniem:

ros2 run rqt_image_view rqt_image_view

Można również użyć narzędzia rviz2, lub foxglove.

Zmiana parametrów kamery

Aby zmienić parametry kamery, można użyć narzędzia ros2 param, które pozwala na zarządzanie parametrami węzłów ROS 2. Należy najpierw znaleźć nazwę węzła, który odpowiada za komunikację z kamerą, a następnie użyć polecenia ros2 param set do zmiany wartości wybranego parametru. Na przykład, aby zmienić ekspozycję kamery, można użyć polecenia:

ros2 param set /camera_node_example exposure_time 10000

Można też wykorzystać narzędzia rqt_reconfigure, które pozwala na interaktywną zmianę parametrów węzłów ROS 2. Należy uruchomić to narzędzie poleceniem:

ros2 run rqt_reconfigure rqt_reconfigure

Proszę bazować na dokumentacji, na przykład kamera Basler nie posiada możliwości zmiany frame ratu’u po uruchomieniu. Zauważyłem też, że ta sama kamera nie za bardzo się lubi z rqt_reconfigure, więc najlepiej jest zmieniać parametry za pomocą ros2 param set. Natomiast FLIR posiada możliwość zmiany frame rate’u, ale zmaina ekpsozycji jest defaltowo niedostępna, więc trzeba przejrzeć pliki uruchamiające. ## Zadanie

Proszę sprawdzić jakie parametry można zmieniać w kamerze i jak wpływają one na jakość obrazu. Proszę również spróbować zmienić kilka parametrów i zobaczyć jak wpływają one na obraz.

  1. Exposure Time
  2. Gain
  3. Binning
  4. Region of Interest (ROI)
  5. Frame Rate
Zadanie: proszę wybrać 3 z powyższych parametrów i zmienić ich wartości, a następnie opisać jak wpływają one na jakość obrazu. Proszę również dołączyć zrzuty ekranu, nie trzeba ich łączyć można je nazwać np. gain01.png, gain09.png itd. Dla frame rate’u można zrobić screen shot z ros2 topic hz, który pokazuje częstotliwość publikowania danych.

Wstęp do kalibracji kamery

Kalibracja kamery jest procesem, który pozwala na określenie parametrów wewnętrznych i zewnętrznych kamery. Parametry wewnętrzne opisują właściwości optyczne kamery, takie jak ogniskowa, punkt główny, czy współczynnik kształtu pikseli. Parametry zewnętrzne opisują położenie i orientację kamery w przestrzeni.

Artykuł o kalibracji kamery

Proszę pobrać i zainstalować pakiet camera_calibration, który jest częścią ROS 2, aby móc przeprowadzić kalibrację kamery. Można to zrobić za pomocą polecenia:

sudo apt install ros-humble-camera-calibration

Następnie, należy uruchomić narzędzie do kalibracji kamery poleceniem:

ros2 run camera_calibration cameracalibrator --size <size> --square <square_size> --ros-args -r image:=camera_node_example/image_raw

Zadanie

Proszę dokonać kalibracji kamery, korzystając z powyższego narzędzia. W tym celu należy poprawnie uzupełnić dane dotyczące rozmiaru planszy. Kalibrując kamerę proszę starać się uzyskać jak najlepsze kąty widzenia planszy, oraz jej rozmiary.

Po zakończeniu kalibracji w terminalu należy znaleźć wyniki.

image_width: 1440
image_height: 1080
camera_name: "pylon_camera"
camera_matrix:
  rows: 3
  cols: 3
  data: [1182.076341466904, 0.0, 745.719763960083, 0.0, 1182.1562723312031, 586.9611143687932, 0.0, 0.0, 1.0]
distortion_model: "plumb_bob"
distortion_coefficients:
  rows: 1
  cols: 5
  data: [-0.23696461760800433, 0.08719420863808569, 0.00031189430352460666, -0.0003178248640267326, 0.0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
projection_matrix:
  rows: 3
  cols: 4
  data: [1076.090576171875, 0.0, 749.3348798443039, 0.0, 0.0, 1120.1810302734375, 591.6241031923128, 0.0, 0.0, 0.0, 1.0, 0.0]
To są wyniku uzyskane podczas mojej kalibracji, każda kalibracja będzie się różnić, proszę jej użyć jako sugestii, a nie jako gotowego rozwiązania.

Teraz będziemy dążyć do uzyskania wyprostowanego obrazu z kamery, który będzie pozbawiony zniekształceń optycznych. Aby to osiągnąć, należy wykorzystać parametry kalibracji do przekształcenia surowego obrazu z kamery. Można to zrobić za pomocą narzędzia image_proc, które jest częścią ROS 2. Należy uruchomić to narzędzie poleceniem:

ros2 run image_proc image_proc