Skip to content

ROS 2 alapfoglamak

ROS verziók és telepítés

Az ROS 2, a ROS legújabb kiadása, olyan szoftverkönyvtárak és eszközök készlete (middleware), amelyek segítenek robotalkalmazások fejlesztésében. Definíció szerint a middleware egy szoftver komponenseket összekötő szoftver. Ez egy olyan réteg, amely az operációs rendszer és az alkalmazások között helyezkedik el az elosztott számítógépes hálózat mindkét oldalán. Az ROS 2 megengedő, nyílt forráskódú, Apache 2.0 licenszelést használ.

Image title
ROS 2 áttekintés

A ROS 2007-es kiadása óta inkrementális frissítéseken esett át, tehát fundamentális változások nem, nagyobb fejlesztések viszont folyamatosan történtek. 2017-ben jött rá a robotikai közösség, hogy olyan alapvető limitációi vannak az eredeti 2007-es elképzelésnek, amit ilyen inkrementális módon sajnos nem lehet javítani. Így végül a Noetic Ninjemis (2025-ig támogatva) az ROS 1 utolsó kiadása, helyette párhuzamosan elkezdték fejleszteni az ROS 2-t. Ez egyben azt is jelenteti, hogy a korábbi forráskódokat nehezebben lehet portolni az új verzióra, cserébe rengeteg újdonságot, javítást, támogatást kaphatunk a fejlesztendő robotok, járművek számára.

A fentiek hatására tehát az ROS 2 átlépett az akadémiai kutatások világából az ipari fehasználásra. Érdekesség, hogy a NASA VIPER nevű holdjárója is ROS 2-t futtat. Emellett olyan autóipari óriások is használják, mint a Bosch, a BMW vagy a Volvo. Robotikai cégek közül pedig számos további példát lehetne hozni. Linkek: www.nasa.gov/viper/lunar-operations, rosindustrial.org/ric/current-members, www.bosch.com/stories/bringing-robotics-middleware-onto-tiny-microcontrollers. ROS felhasználók a világban: metrorobots.com/rosmap.html.

ROS 2 in space

Kép forrása: Robot Operating System 2: Design, Architecture, and Uses In The Wild: Steve Macenski et al.

Miért használjak framework-öt robotikai projektemhez?

Első robotikai projektünknél választhatjuk azt az utat, hogy framework nélkül teljesen saját megoldásként feljesztünk. Nyilván ennek is vannak előnyei (tanulás, futási gyorsaság, stb.). De hamarosan kelleni fog olyan algoritmus, amit akár mások implementáltak is, csak nem kompatibilis az eredeti elképzeléssel. Itt már célszerű meggondolni egy framework (pl a ROS 2) használatát. Megjegyzés, hogy nem a ROS 2 az egyetlen lehetőség számos hasonló, kisebb framework létezik: Player, YARP, Orocos, CARMEN, Orca, MOOS, and Microsoft Robotics Studio. Niylván mindegyiknek van előnye, ebben a tárgyban a támogatottság miatt mégis az ROS 2-re szoríthozunk.

Kép forrása: ros.org/blog/ecosystem

  • Plumbing: A ROS alapvetően egy üzenetküldő rendszert biztosít, amelyet gyakran "middleware"-nek vagy "plumbing"-nek neveznek. A kommunikáció az egyik első igény, amely felmerül egy új robotikai alkalmazás vagy bármilyen olyan szoftverrendszer implementálásakor, amelyhez hardverrel is csatlakozik. A ROS beépített és jól tesztelt üzenetküldő rendszere időt takaríthat meg, hiszen kezeli a kommunikáció részleteit a decentralizált csomópontok között, ezt nem kell külön implementálni. Sőt lehetőség van egy gépen Intra-process kommunikáció segítségével direkt memória elérésre is.
  • Eszközök: A hatékony alkalmazások fejlesztéséhez jó fejlesztői eszközökre van szükség. A ROS rendelkezik ilyen az eszközökkel, beleértve: a hibakeresést (rqt_console), a vizualizációt (Rviz2, Foxglove Studio), a diagramokat (rqt_plot, Foxglove Studio), a logolást (mcap) és a visszajátszást.
  • Képességek: Legyen szó GPS-eszköz-illesztőprogramról, négylábú robothoz való járás- és egyensúlyszabályozóról, vagy mobil robothoz való térképezőrendszerről, a ROS-nak vannak megoldásai a problémára. A driverektől az algoritmusokig, a felhasználói felületekig a ROS biztosítja azokat az építőelemeket, amelyek lehetővé teszik, hogy a saját alkalmazására koncentráljon.
  • Közösség: A ROS mögött egy nagy, globális és változatos közösség áll. Diákoktól és hobbiból űzőktől kezdve multinacionális vállalatokig és kormányzati ügynökségekig, az emberek és szervezetek minden szegmense működteti az ROS 2 projektet. Ez azért is fontos, mert a fejlesztés során rengeteg kérdés fog felmerülni. Ezek nagy részét már meg is válaszolta aközösség, az új kérdésekre pedig szívesen válaszolnak.

A következő ábra egy egyszerű vonalkövető robot node-jait (programjait) és topic-jait (~kommunkáció) szemléltei:

graph TD;

    camd([/cam_driver]):::red --> im1[ /image1<br/>sensor_msgs/Image]:::light
    im1 --> li1([ /line_detect_node]):::red
    im1 --> st1([ /stop_detect_node]):::red
    li1 --> li2[ /line<br/>example_msgs/Line]:::light
    st1 --> st2[ /stop<br/>example_msgs/Stop]:::light
    li2 --> nav([ /line_detect_node]):::red
    st2 --> nav
    nav --> cmd[ /cmd_vel<br/>geometry_msgs/Twist]:::light
    cmd --> control([ /robot_control]):::red
    n1([ /node]):::white -- publishes --> t[ /topic<br/>msg_type]:::white
    t -- subscribes --> n2([ /node]):::white
    classDef light fill:#34aec5,stroke:#152742,stroke-width:2px,color:#152742  
    classDef dark fill:#152742,stroke:#34aec5,stroke-width:2px,color:#34aec5
    classDef white fill:#ffffff,stroke:#152742,stroke-width:2px,color:#152742
    classDef red fill:#ef4638,stroke:#152742,stroke-width:2px,color:#fff

Forrás: Bestmann, Marc & Fakultät, Min & Zhang, Jianwei & Hendrich, N.. (2017). Towards Using ROS in the RoboCup Humanoid Soccer League. Masterthesis

Nézzünk egy másik példát, ami sebességadatokból, IMU-ból, távolságadatokból készít térképeket.

graph LR;

    odom[ /odom<br/>nav_msgs/Odometry]:::light --> slam([ /slam_node]):::red
    speed[ /speed<br/>geometry_msgs/Twist]:::light --> slam
    imu[ /imu<br/>sensor_msgs/Imu]:::light --> slam
    scan[ /scan<br/>sensor_msgs/PointCloud2]:::light --> slam
    n1([ /node]):::white -- publishes --> t[ /topic<br/>msg_type]:::white
    slam --> pose[ /global_pose<br/>geometry_msgs/Pose]:::light
    slam --> map_g[ /map_grid<br/>nav_msgs/OccupancyGrid]:::light
    slam --> map_p[ /map_points<br/>sensor_msgs/PointCloud2]:::light
    t -- subscribes --> n2([ /node]):::white
    classDef light fill:#34aec5,stroke:#152742,stroke-width:2px,color:#152742  
    classDef dark fill:#152742,stroke:#34aec5,stroke-width:2px,color:#34aec5
    classDef white fill:#ffffff,stroke:#152742,stroke-width:2px,color:#152742
    classDef red fill:#ef4638,stroke:#152742,stroke-width:2px,color:#fff

ROS 2 mappaszerkezet

~/ros2_ws$ ls

build  install  log  src
graph TD;

    W1{{ Workspace</br>pl. ros2_ws }}:::light --> S1{{ Source space</br>src }}:::white
    W1 --> B1{{ Build space</br>build }}:::white
    W1 --> I1{{ Install space</br>install }}:::white
    W1 --> L1{{ Log space</br>log }}:::white
    S1 --> P1{{ package1 }}:::white
    S1 --> P2{{ package2 }}:::white
    S1 --> P3{{ bundle_packages }}:::white
    P1 --> LA1{{ launch }}:::white
    P1 --> SR1{{ src }}:::white
    P2 --> LA2{{ launch }}:::white
    P2 --> SR2{{ src }}:::white

    classDef light fill:#34aec5,stroke:#152742,stroke-width:2px,color:#152742  
    classDef dark fill:#152742,stroke:#34aec5,stroke-width:2px,color:#34aec5
    classDef white fill:#ffffff,stroke:#152742,stroke-width:2px,color:#152742
    classDef red fill:#ef4638,stroke:#152742,stroke-width:2px,color:#fff
graph TD;

    W2{{ other_ws }}:::light --> S2{{ src }}:::white
    W2 --> B2{{ build }}:::white
    W2 --> I2{{ install }}:::white
    W2 --> L2{{ log }}:::white

    classDef light fill:#34aec5,stroke:#152742,stroke-width:2px,color:#152742  
    classDef dark fill:#152742,stroke:#34aec5,stroke-width:2px,color:#34aec5
    classDef white fill:#ffffff,stroke:#152742,stroke-width:2px,color:#152742
    classDef red fill:#ef4638,stroke:#152742,stroke-width:2px,color:#fff
~/ros2_ws/
├──build  
├──install  
├──log
└──src/
    ├── bundle_packages 
       ├── cone_detection_lidar
          ├── launch
          └── src
       ├── my_vehicle_bringup
          └── launch
       ├── other bundle package1
       ├── other bundle package2
       └── img
    └── wayp_plan_tools
        ├── csv
        ├── launch
        └── src

Különbségek az ROS 1 és ROS 2 között

  • Változások a Middleware-ben
    A ROS 1 a Master-Slave architektúrát és az XML-RPC middleware-t használja. A ROS 2 ezzel szemben a Data Distribution Service (DDS) használ, amely nagyobb hatékonyságot és megbízhatóságot, alacsony késleltetést és skálázhatóságot, valamint konfigurálható szolgáltatásminőségi (QoS) paramétereket biztosít. Többek között így nem kell roscore-t indítani. Az XML-RPC jobb az egyszerű távoli eljáráshívásokhoz, míg a DDS hozzáadott komplexitása lehetővé teszi, hogy jobban támogassa a valós idejű rendszereket.
  • Változások a ROS API-ban
    A ROS 1 két különálló könyvtárral rendelkezik: a C++ nyelvhez készült roscpp és a Pythonhoz készült rospy. Ezek nem teljesen azonosak egymással a funkciók tekintetében. Ezzel szemben a ROS 2 egy C nyelven írt alapkönyvtárral - rcl (ROS klienskönyvtár) - rendelkezik, amelyre könyvtárak épülnek. Ez biztosítja, hogy az alapvető funkciók hamarabb elérhetők legyenek a különböző API-kban. Ez az egyik fő oka annak, hogy a ROS 2 a korábbi Pythonon és a C++-on kívül több nyelvi támogatást is képes nyújtani: például rclada Ada, rclcpp C++, rclgo Go, rclpy Python, rcljava Java, rclnodejs Node.js, rclobjc Objective C (iOS), rclc C, ros2_rust Rust, ros2_dotnet .NET, ros2cs ros2_dotnet alternatíva C# nyelven.

  • Változások az adatformátumban
    A ROS 2 az MCAP formátumot használja, ami nem dedikáltan az ROS saját formátuma, hanem egy nyílt forráskódú konténerfájl-formátum multimodális log-adatokhoz. Támogatja az időbélyegzővel ellátott, előre sorba rendezett adatokat, és ideális a pub/sub vagy robotikai alkalmazásokban való használatra. Bővebben: mcap.dev

Pár hasznos újítás

  • Valós idejű feldolgozás
    A fenti funkciók összegzése, valamint a DDS használata lehetővé teszi, hogy a ROS 2 kiválóan alkalmas legyen a valós idejű (real time) feldolgozásra, különösen akkor, ha determinisztikus, alacsony késleltetésű kommunikációra van szükség.
  • QoS: Quality of Service A ROS 2 lehetővé teszi az adatáramlás konfigurálását, ami befolyásolja az adatok küldésének és fogadásának módját. Ez magában foglalja az üzenetek megbízhatóságára, határidejére és prioritására vonatkozó beállításokat, amelyek biztosíthatják, hogy a kritikus üzenetek időben kézbesítésre kerüljenek.
  • Többszálú végrehajtás
    A ROS 2 támogatja a több csomópont valóban párhuzamos futtatását, így a modern többmagos processzorok sokkal jobban kihasználhatók, mint a ROS 1 esetében.

áttekintés Forrás: husarnet.com/blog/ros2-docker

Egyéb változások

  • A Catkin eltűnt, helyére az Ament (Colcon) lépett, mint build rendszer. Az overlay-ek lehetővé teszik egy másodlagos munkaterület létrehozását, amely nem befolyásolja az elsődleges munkaterületet - ez akkor hasznos, ha új csomagokkal kell kísérletezni, de úgy, hogy ez ne befolyásolja az alapkonfigurációt (ezt "underlay"-nek hívják).
  • A ROS 2 visszafelé nem kompatibilis a ROS 1-gyel. Következésképpen a ROS 1 csomagok valószínűleg nem fognak működni a ROS 2-vel, és átdolgozást igényelnének, és más szoftverek, amelyeket a ROS 1-gyel szoktál használni, már nem fognak működni.
  • A ROS 1 elsősorban az Ubuntu számára készült. A ROS 2 fut MacOS, Windows, Ubuntu és más (akár Real-Time) operációs rendszereken is.

Verziók

ROS verziók és telepítés



gantt
    dateFormat  YY-MM
    title       ROS 2 Distros
    excludes    weekends
    tickInterval 365days
    %% (`excludes` accepts specific dates in YYYY-MM-DD format, days of the week ("sunday") or "weekends", but not the word "weekdays".)
    axisFormat %y

    section ROS 2
    Jazzy   :active, r012, 2024-05-23, 5y
    .       :active, r011, 2021-01-01, 0d %% placeholder
    Iron    :active, r010, 2023-11-01, 188d
    .       :active, r011, 2021-01-01, 0d %% placeholder
    Humble  :active, r009, 2022-05-23, 5y
    .       :active, r011, 2021-01-01, 0d %% placeholder
    Galactic:active, r008, 2021-05-23, 1y

Alt text

Distrok százalékos megoszlása az időben: metrics.ros.org/rosdistro_rosdistro.html

Static Badge

A Humble Hawksbill vagy röviden Humble egy long term support (LTS) release, 5 évig támogatott (2022 májusától 2027 májusáig)

További release-ek: docs.ros.org/en/humble/Releases.html

Források