ROS 2 (Robot Operating System 2, w wyszukiwarce często zapisywany jako ROS2) to otwarty zestaw bibliotek i narzędzi do tworzenia oprogramowania robotów, od obsługi czujników po nawigację i planowanie ruchu. Działa na Linuksie albo Windowsie jako warstwa, przez którą programy robota wymieniają dane. Na początek najlepiej sprawdza się dystrybucja Jazzy Jalisco na Ubuntu 24.04, wspierana do maja 2029 roku. Pierwszy węzeł w Pythonie to około 30 linii kodu, a oficjalny samouczek szacuje tę część nauki na 20 minut.
Spis treści:
Czym jest ROS 2?
ROS 2 to druga generacja Robot Operating System, czyli otwartego ekosystemu, który daje gotową strukturę, narzędzia i biblioteki do budowania, uruchamiania i utrzymywania aplikacji robotów. Robot składa się w nim z wielu małych programów, a ROS 2 pilnuje, żeby dane trafiały od jednego do drugiego.
Dokumentacja projektu porównuje tę warstwę do instalacji hydraulicznej. Obraz z kamery płynie do programu, który go analizuje, a polecenia z planera trasy do sterownika silników. Ty piszesz logikę konkretnego zadania. Transport danych, ich format i to, kto czego słucha, masz gotowe.
Wokół komunikacji narosły kolejne piętra:
- framework: węzły, tematy, usługi, akcje, parametry i biblioteki dla C++ oraz Pythona,
- narzędzia: podgląd 3D, nagrywanie i odtwarzanie danych, uruchamianie wielu programów naraz, diagnostyka,
- gotowe możliwości: nawigacja, planowanie ruchu, manipulacja, percepcja i symulacja.
Projekt rozwija Open Robotics razem ze społecznością, a biblioteki klienckie rdzenia (rclcpp dla C++ i rclpy dla Pythona) są wydawane na licencji Apache 2.0. Dokumentacja wymienia trzy typowe miejsca pracy ROS 2: magazyny, gdzie prowadzi roboty mobilne i koordynuje całe floty, fabryki, gdzie robot z kamerą pobiera i odkłada detale, oraz szpitale, w których roboty wspierają opiekę nad pacjentami.
ROS a ROS 2 – co się zmieniło?
ROS 2 powstał jako nowa wersja z celowo złamaną zgodnością: kod z ROS 1 trzeba przenieść, ale w zamian system nie potrzebuje centralnego pośrednika, lepiej znosi słabą sieć i oficjalnie działa także na Windowsie. Pierwsza generacja jest zamknięta. Ostatnia dystrybucja ROS 1, Noetic Ninjemys, miała wsparcie do maja 2025 roku, a nowych wydań już nie będzie.
Prace nad ROS ruszyły w listopadzie 2007 roku. System był środowiskiem programistycznym dwuramiennego robota PR2 z firmy Willow Garage i powstawał pod bardzo konkretne warunki: jeden robot, mocny komputer na pokładzie, dobre łącze sieciowe, brak wymagań czasu rzeczywistego i zastosowania głównie na uczelniach.
Potem ROS wyszedł z laboratorium i trafił do robotów kołowych, humanoidów, ramion przemysłowych i samochodów autonomicznych. W tekście „Why ROS 2?” twórcy wypisali, czego stara architektura nie udźwignie: flot wielu robotów (w ROS 1 obsługiwanych obejściami wokół jednego centralnego mastera), małych mikrokontrolerów, sterowania w czasie rzeczywistym, zawodnych łączy, od słabego Wi-Fi po transmisję z kosmosu, i wdrożeń w gotowych produktach.
| Cecha | ROS 1 | ROS 2 |
|---|---|---|
| Wykrywanie programów | jeden centralny master | rozproszone, przez warstwę DDS |
| Słaba sieć | projekt zakładał dobre łącze | ustawienia jakości usług (QoS) dla łączy z opóźnieniami i stratami |
| Systemy | głównie Ubuntu, inne systemy eksperymentalnie | Ubuntu, Windows, RHEL; macOS wspierany przez społeczność |
| Czas rzeczywisty | poza założeniami projektu | wstępne wsparcie, tylko na Linuksie |
| Mikrokontrolery | tylko przez sterownik urządzenia | wstępne wsparcie dla układów bez systemu operacyjnego |
| Najnowsze wydanie | Noetic (ostatnie), wsparcie zakończone w maju 2025 | Lyrical Luth, wsparcie do maja 2031 |
Pod spodem ROS 2 korzysta z gotowego oprogramowania komunikacyjnego zgodnego ze standardem DDS (Data Distribution Service). Domyślnie jest to Fast DDS firmy eProsima, ale przy uruchomieniu można je zamienić na Cyclone DDS albo RTI Connext. Od wydania Kilted najwyższą kategorię wsparcia ma też Zenoh, protokół spoza rodziny DDS. DDS dokłada szyfrowanie i kontrolę dostępu (DDS-Security). Przy przenosinach ze starego systemu pomaga most ros1_bridge, który tłumaczy tematy i usługi, ale nie akcje. Most potrzebuje działającego ROS 1, więc na Ubuntu 24.04 go nie uruchomisz. Kod i tak trzeba przepisać, np. z biblioteki rospy na rclpy.
Wersje ROS 2: Humble, Jazzy czy Lyrical – którą wybrać?
Na start wybierz Jazzy Jalisco z Ubuntu 24.04. Ma wsparcie do maja 2029 roku, oficjalnie zalecaną parę z symulatorem Gazebo Harmonic i dwa lata dojrzewania pakietów za sobą. Humble bierz wtedy, gdy wymaga go sterownik twojego robota, a Lyrical Luth, gdy zaczynasz projekt na lata i wszystkie potrzebne pakiety mają już jego wersję.
| Dystrybucja | Premiera | Koniec wsparcia | Ubuntu | Gazebo w parze | Zostało wsparcia (od września 2026) |
|---|---|---|---|---|---|
| Humble Hawksbill (LTS) | 23 maja 2022 | maj 2027 | 22.04 | Fortress | ok. 8 miesięcy |
| Jazzy Jalisco (LTS) | 23 maja 2024 | maj 2029 | 24.04 | Harmonic | ok. 2 lata i 8 miesięcy |
| Kilted Kaiju | 23 maja 2025 | grudzień 2026 | 24.04 | Ionic | ok. 3 miesiące |
| Lyrical Luth (LTS) | 22 maja 2026 | maj 2031 | 26.04 | Jetty | ok. 4 lata i 8 miesięcy |
Daty pochodzą z listy dystrybucji ROS 2 i tabeli zgodności Gazebo (stan na 23 września 2026 roku). Ostatnia kolumna to odliczenie miesięcy od września 2026.
Rytm wydań jest stały. Nowa dystrybucja wychodzi co roku w maju, zwykle 23 maja, w Światowy Dzień Żółwia, a nazwy idą alfabetycznie: po Humble przyszły Iron, Jazzy, Kilted i Lyrical. Od Humble wydania z parzystych lat mają status LTS (długiego wsparcia) i dostają poprawki przez pięć lat. Wydania pośrednie, jak Iron z 2023 roku czy Kilted z 2025, żyją około półtora roku i służą raczej do testowania nowości. Wszystkie odgałęziają się od Rolling, czyli stale rozwijanej wersji roboczej.
Zanim wybierzesz, sprawdź sterowniki sprzętu. Wersję ROS 2 dyktuje zwykle robot, nie twoje preferencje. Unitree w pakiecie unitree_ros2 dla Go2, B2 i H1 poleca Humble na Ubuntu 22.04, tak samo jak sterownik spot_ros2 dla Spota od Boston Dynamics. TurtleBot 4 ma fabrycznie Jazzy, a sterownik ramion Universal Robots ma gałęzie od Humble aż po Lyrical. Humble wciąż dostaje poprawki (wydanie poprawkowe nr 15 ukazało się 14 września 2026 roku), ale jego wsparcie kończy się w maju 2027, więc projekt zaczęty na nim dziś za kilka miesięcy będzie wymagał przesiadki.
Każda dystrybucja jest przypięta do jednego wydania Ubuntu LTS. Jazzy na Ubuntu 22.04 postawisz tylko przez kompilację ze źródeł, a dla Humble na 24.04 gotowych pakietów nie ma wcale. Gdy system się nie zgadza, najprościej sięgnąć po kontener Dockera z właściwą wersją.
Podstawowe pojęcia: węzły, tematy, usługi i akcje
Węzeł (node) to pojedynczy program w systemie ROS 2, który robi jedną logiczną rzecz, np. czyta dane z lidaru albo wylicza trasę. Węzły rozmawiają ze sobą na trzy sposoby: przez tematy, czyli ciągły strumień danych, usługi, czyli krótkie pytanie z odpowiedzią, i akcje, czyli długie zadania z raportami postępu.
| Mechanizm | Jak działa | Kiedy go użyć | Przykład |
|---|---|---|---|
| Temat (topic) | wydawca wysyła dane pod nazwą tematu, odbiera je każdy subskrybent tej nazwy | ciągłe dane z czujników i stan robota | skany lidaru, położenia przegubów |
| Usługa (service) | klient wysyła zapytanie, jeden serwer odsyła wynik | szybkie obliczenie albo odczyt stanu | przeliczenie kinematyki odwrotnej |
| Akcja (action) | klient zleca cel, serwer raportuje postęp, cel da się anulować | zadania trwające sekundy lub minuty | dojazd do punktu na mapie |
Wiadomości mają ściśle określone typy. Komunikat z czujnika inercyjnego (IMU) zawsze podaje prędkość kątową jako wektor w radianach na sekundę, więc węzeł napisany przez kogoś innego odczyta go bez zgadywania.
Subskrybent nie musi przy tym wiedzieć, kto nadaje. Sterownik prawdziwego lidaru możesz więc podmienić na symulator albo nagranie, a reszta programów tego nie zauważy. Nagranie robi polecenie ros2 bag record, które po prostu podpina się do tematu jako kolejny odbiorca.
Usługa powinna odpowiadać szybko, bo klient zwykle czeka na wynik. Do długich czynności, które trzeba móc przerwać, są akcje: moduł nawigacji podaje po drodze, jak daleko jest do celu, a program nadrzędny może w każdej chwili zmienić zdanie i odwołać zadanie. Do tego dochodzą parametry, czyli ustawienia węzła zmieniane w trakcie pracy. Węzły mogą działać w jednym procesie, w osobnych procesach albo na różnych komputerach w sieci i odnajdują się same, bez centralnego rejestru.
Jak zainstalować ROS 2?
Najprostsza droga to Ubuntu 24.04 i pakiety deb: po dodaniu repozytorium ROS instalujesz Jazzy jednym poleceniem apt. Na innym systemie użyj obrazu Dockera albo Ubuntu w maszynie wirtualnej. Windows jest wspierany, ale gotowa paczka zawiera tylko część narzędzi.
Na Ubuntu instalacja wygląda tak. Pakiet ros2-apt-source, który dodaje klucze i adresy repozytorium ROS, zainstaluj poleceniami z oficjalnej instrukcji instalacji ROS 2 dla Ubuntu (krok o włączaniu repozytoriów). Same ustalają najnowszą wersję pakietu i dobierają plik do twojego wydania Ubuntu, więc nie przepisuj ich z tekstów sprzed kilku miesięcy.
# sprawdź, czy locale obsługuje UTF-8 (w minimalnych obrazach bywa POSIX)
locale
# włącz repozytorium Universe
sudo apt install software-properties-common
sudo add-apt-repository universe
# tutaj: instalacja pakietu ros2-apt-source według dokumentacji ROS 2
# narzędzia do budowania pakietów, aktualizacja systemu i sam ROS 2
sudo apt update && sudo apt install ros-dev-tools
sudo apt upgrade
sudo apt install ros-jazzy-desktop
# włączenie środowiska, potrzebne w każdym nowym terminalu
source /opt/ros/jazzy/setup.bash
Wariant desktop zawiera ROS, RViz, dema i samouczki. Na komputer samego robota wystarczy lżejszy ros-jazzy-ros-base: biblioteki komunikacji, typy wiadomości i narzędzia wiersza poleceń, bez okienek. Instalację sprawdzisz dwoma demami uruchomionymi w osobnych terminalach:
# terminal 1: nadajnik napisany w C++
ros2 run demo_nodes_cpp talker
# terminal 2: odbiornik napisany w Pythonie
ros2 run demo_nodes_py listener
Jeśli drugi terminal wypisuje wiadomości z pierwszego, działa i C++, i Python.
Oficjalne obrazy Dockera mają tagi dla każdej wspieranej dystrybucji: ros:humble, ros:jazzy, ros:kilted i ros:lyrical (tag latest wskazuje dziś Lyrical). Kontener uruchomisz poleceniem docker run -it ros:jazzy. To obrazy w wariancie ros-base, więc nadają się do nauki poleceń i do serwerów, a RViz i Gazebo wygodniej odpalać w systemie z grafiką.
Na Windowsie ROS 2 instaluje się z paczki binarnej (Jazzy ma pełne wsparcie na Windows 10, Lyrical na Windows 11). Paczka obejmuje cały zestaw podstawowy, ale tylko część pakietów wariantu desktop, a dla Windowsa tabela zależności nie przewiduje Gazebo. Chcesz symulacji? Postaw Ubuntu w maszynie wirtualnej. Komputery ARM64, takie jak Raspberry Pi z Ubuntu, dostają te same pakiety co zwykłe pecety: TurtleBot 4 ma na swoim Raspberry Pi 4B fabrycznie Ubuntu 24.04 Server z Jazzy.
Pierwszy węzeł w Pythonie
Pierwszy węzeł to zwykle nadajnik: program, który co pół sekundy publikuje tekst na temacie. Potrzebujesz przestrzeni roboczej, pakietu typu ament_python, jednego pliku z kodem i dwóch wpisów w konfiguracji pakietu.
Zacznij od przestrzeni roboczej i pakietu:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python --license Apache-2.0 py_pubsub
W katalogu ~/ros2_ws/src/py_pubsub/py_pubsub utwórz plik nadajnik.py. Kod jest wersją przykładu z oficjalnego samouczka, z polskimi nazwami i komentarzami, i działa zarówno na Humble, jak i na Jazzy:
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Nadajnik(Node):
def __init__(self):
# nazwa węzła, pod którą zobaczysz go w systemie
super().__init__('nadajnik')
# wydawca wiadomości tekstowych na temacie 'czat', kolejka 10 wiadomości
self.publisher_ = self.create_publisher(String, 'czat', 10)
# zegar, który co 0,5 s wywołuje funkcję wyslij
self.timer = self.create_timer(0.5, self.wyslij)
self.licznik = 0
def wyslij(self):
msg = String()
msg.data = 'Cześć, tu robot: %d' % self.licznik
self.publisher_.publish(msg)
self.get_logger().info('Wysyłam: "%s"' % msg.data)
self.licznik += 1
def main(args=None):
rclpy.init(args=args)
wezel = Nadajnik()
# spin obsługuje zegar i wywołania, aż przerwiesz program Ctrl+C
rclpy.spin(wezel)
wezel.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
Liczba 10 w create_publisher to rozmiar kolejki: ustawienie jakości usług, które ogranicza liczbę wiadomości czekających w buforze, gdy odbiorca nie nadąża. Funkcja rclpy.spin trzyma węzeł przy życiu i wywołuje jego funkcje, kiedy przychodzi na nie pora.
Teraz konfiguracja. W pliku package.xml dopisz zależności <exec_depend>rclpy</exec_depend> i <exec_depend>std_msgs</exec_depend>, a w setup.py, w sekcji console_scripts, wpis 'nadajnik = py_pubsub.nadajnik:main'. Potem zbuduj pakiet i uruchom węzeł:
cd ~/ros2_ws
colcon build --packages-select py_pubsub
source install/setup.bash
ros2 run py_pubsub nadajnik
# w drugim terminalu (po source install/setup.bash) podejrzyj temat
ros2 topic echo /czat
Odbiornik piszesz tak samo, tylko zamiast wydawcy tworzysz subskrypcję: self.create_subscription(String, 'czat', self.odbierz, 10). Nazwa tematu i typ wiadomości muszą się zgadzać po obu stronach, inaczej węzły nie wymienią ani jednej wiadomości.
RViz – jak zobaczyć to, co widzi robot?
RViz to trójwymiarowa przeglądarka danych robota. W jednym oknie pokazuje model maszyny w bieżącej pozycji, skany lidaru, chmury punktów, mapę i zaplanowaną trasę. Sam niczego nie symuluje: wyświetla to, co w danej chwili płynie tematami ROS 2.
W ROS 2 program nazywa się rviz2 i instaluje się razem z wariantem desktop. Uruchamiasz go poleceniem ros2 run rviz2 rviz2. Środek okna zajmuje widok 3D, po lewej stronie jest lista wyświetlaczy (Displays), a przyciskiem Add dodajesz kolejne. Każdy wyświetlacz rysuje jeden rodzaj danych:
- Laser Scan: skany lidaru 2D,
- PointCloud2: chmury punktów z lidaru 3D albo kamery głębi,
- RobotModel: model robota ustawiony według bieżących transformacji TF,
- TF: drzewo układów współrzędnych, czyli to, gdzie względem siebie są koła, kamera i lidar,
- Map i Path: mapa zbudowana przez robota i trasa wyznaczona przez moduł nawigacji,
- Camera i Image: obraz z kamery, także nałożony na scenę 3D.
Jeśli robot ma dwa lidary, dodajesz dwa wyświetlacze Laser Scan o różnych nazwach, np. przód i tył. Każdy wyświetlacz ma status: OK, Warning, Error albo Disabled. Kiedy scena zostaje pusta, zacznij właśnie od statusów, bo rozwinięty wyświetlacz z ostrzeżeniem mówi wprost, czego mu brakuje.
Najwięcej pożytku z RViz jest przy podłączaniu nowego czujnika. Skan przesunięty albo obrócony względem modelu robota zwykle wskazuje na błąd w opisie położenia czujnika w drzewie TF. Zanim zaczniesz podejrzewać sam lidar, sprawdź właśnie to.
Gazebo – symulacja robota bez sprzętu
Gazebo to symulator fizyki z tej samej rodziny projektów Open Robotics co ROS 2. Tworzy wirtualny świat z grawitacją, kolizjami i czujnikami, a węzły ROS 2 widzą symulowanego robota tak samo jak prawdziwego. Podział ról z RViz jest prosty: Gazebo wytwarza dane, RViz je pokazuje.
Uważaj na dwa Gazebo. Obecny (dawniej nazywany Ignition) uruchamia się poleceniem gz sim. Gazebo Classic to stara linia, której wsparcie skończyło się w styczniu 2025 roku, a wiele samouczków w sieci wciąż jej dotyczy.
Najprościej zainstalować Gazebo przez ROS: polecenie sudo apt install ros-jazzy-ros-gz ściąga wersję zalecaną dla twojej dystrybucji razem z pakietem ros_gz, który łączy symulator z ROS 2. Pary są ustalone: Humble z Fortress, Jazzy z Harmonic, Kilted z Ionic, Lyrical z Jetty. Część innych połączeń da się uruchomić, ale twórcy Gazebo ostrzegają, że wymaga to dodatkowej pracy.
Gazebo wychodzi we wrześniu (Harmonic w 2023, Ionic w 2024, Jetty w 2025 roku), a ROS 2 w maju, więc każda dystrybucja dostaje symulator wydany osiem miesięcy wcześniej. Wersje LTS obu projektów kończą wsparcie razem: Fortress w maju 2027 jak Humble, Harmonic w maju 2029 jak Jazzy, Jetty w maju 2031 jak Lyrical.
W symulatorze sprawdzisz nawigację, mapowanie i chwytanie, zanim robot uderzy w prawdziwą ścianę. Popularne platformy mają gotowe modele: symulację TurtleBota 4 producent przewidział do uruchamiania na zwykłym komputerze, obok narzędzi do konfiguracji robota.
Jakie roboty działają na ROS?
Na ROS 2 działają głównie roboty badawcze, edukacyjne i mobilne: TurtleBot 4, czworonogi i humanoid Unitree, Spot od Boston Dynamics, a przez sterowniki także coboty, np. Universal Robots.
| Robot | Rodzaj | Połączenie z ROS 2 | Wspierane wersje |
|---|---|---|---|
| TurtleBot 4 i 4 Lite | edukacyjny robot mobilny | ROS 2 fabrycznie na pokładowym Raspberry Pi 4B | Jazzy (Ubuntu 24.04) lub Humble (22.04) |
| Unitree Go2, B2, H1 | czworonogi i humanoid | pakiet unitree_ros2, komunikacja przez Cyclone DDS bez nakładki na SDK | Humble zalecany |
| Boston Dynamics Spot | czworonóg | sterownik spot_ros2 z tematami, usługami i akcjami | Humble (Ubuntu 22.04) |
| Universal Robots | coboty o udźwigu od 3 do 30 kg | sterownik ROS 2 i wtyczka externalControl w programie robota | od Humble do Lyrical |
W Unitree wiadomości ROS 2 sterują robotem bezpośrednio, bo jego SDK samo komunikuje się przez Cyclone DDS. Przy Spocie i ramionach UR pośredniczy sterownik, który wystawia funkcje maszyny jako zwykłe tematy, usługi i akcje.
Na gotowych robotach pracują też wspólne pakiety społeczności. Nav2 odpowiada za nawigację robotów mobilnych, a MoveIt 2 planuje ruch ramion, więc nie musisz sam pisać omijania przeszkód. Klasyczne roboty przemysłowe w fabrykach nadal programuje się głównie w językach producentów, a ROS 2 wchodzi do nich przez sterowniki, gdy trzeba połączyć ramię z kamerą, planerem albo robotem mobilnym.
ROS zainteresował też NASA. Już w 2014 roku twórcy ROS pisali, że NASA ma uruchomić ROS na humanoidzie Robonaut 2 na pokładzie Międzynarodowej Stacji Kosmicznej.
FAQ
Jaki program służy do programowania robotów?
To zależy od robota. Ramiona przemysłowe programuje się w środowisku producenta: panelem uczenia albo w symulatorze na komputerze, np. w RobotStudio od ABB, w językach takich jak KRL (KUKA) i RAPID (ABB). Roboty mobilne, badawcze i usługowe najczęściej programuje się na ROS 2, a ruch sprawdza w Gazebo, zanim trafi na sprzęt.
W jakim języku programuje się roboty?
W ROS 2 oficjalnie wspierane są C++ (biblioteka rclcpp) i Python (rclpy). Python wystarczy do nauki i do wielu węzłów wyższego poziomu. C++ wybiera się tam, gdzie liczy się wydajność, a część funkcji, np. węzły-komponenty ładowane do wspólnego procesu w trakcie pracy i przekazywanie wiadomości w pamięci, bez pośrednictwa DDS, jest na razie dostępna tylko w C++. Roboty przemysłowe mają dodatkowo własne języki producentów.
Jakie są przykłady robotów edukacyjnych?
W świecie ROS 2 wzorcem jest TurtleBot 4: jeździ na bazie iRobot Create 3, ma Raspberry Pi 4B, kamerę głębi OAK-D (w wersji Pro albo Lite) i lidar RPLIDAR A1M8, a producent opisuje go jako platformę do nauki i badań. Wersja Lite waży 3270 g, pełna 3945 g. Bez żadnego sprzętu zaczniesz od turtlesim, czyli symulowanego żółwia na ekranie, na którym ćwiczy się podstawy ROS 2.
Czy ROS 2 jest darmowy?
Tak. ROS 2 jest oprogramowaniem otwartym: biblioteki rdzenia mają licencję Apache 2.0, a RViz licencję BSD, więc możesz ich używać bez opłat także w projektach komercyjnych. Płacisz za sprzęt i ewentualnie za komercyjne dodatki, np. płatną wersję planera ruchu MoveIt z pomocą techniczną.
Co dalej po pierwszym węźle?
Kiedy nadajnik działa, dopisz do niego odbiornik i obejrzyj połączenie obu węzłów w narzędziu rqt_graph. Potem przejdź do turtlesim, a stamtąd do symulacji gotowego robota w Gazebo, podglądanej w RViz. To dobra kolejność, bo każdy krok dokłada tylko jedną nową rzecz.
Oprogramowanie to jednak tylko jedna warstwa maszyny. Żeby węzeł miał czym sterować, potrzebne są napędy, przekładnie, czujniki i zasilanie, a od ich parametrów zależy, co w ogóle da się zaprogramować. Jak te elementy składają się w działającą całość, opisujemy w przewodniku budowa robota.
Zdjęcie główne: Timothy Vollmer, Wikimedia Commons, licencja CC BY 2.0