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
udevna komputerze hosta (pliki w/etc/udev/rules.d/). Instrukcje te nadają urządzeniom określonego producenta odpowiednie uprawnienia dostępu.
Kolejnym kluczowym zadaniem mechanizmu
udevjest 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/video0na/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
--privilegedoraz mapowanie wolumenów-v /dev:/devw poleceniudocker runwymuszają 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
Prosze zapoznać się z dokumentacją na stronie producenta Pylon lub FLIR
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
Zainstalować w nim sterowniki do kamery Basler (paczka Pylon). Trzeba podać dane kontaktowe aby móc je pobrać.
Po zainstalowaniu sterowników, należy można sprawdzić czy działają poprawnie, uruchamiając narzędzie
pylonviewerw 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.shsprawdza 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.
- Exposure Time
- Gain
- Binning
- Region of Interest (ROI)
- Frame Rate
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.
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