Tartalom
  1. ROS 2 launch és ROS 2 egyéb haladó koncepciók
    1. Bevezető
    2. Előkészületek
      1. Hozzuk létre a example_launch package-t
      2. Launch mappa
    3. Launch fájl létrehozása
      1. Kód részleteinek áttekintése
    4. ROS2 launch használata
    5. Tanulmányozzuk az elindított rendszert
    6. Adjuk hozzá a package-hez, hogy bárhonnan indíthassuk
  2. Források

ROS 2 launch és ROS 2 egyéb haladó koncepciók

Bevezető

Az ROS 2 launch rendszere segíti a felhasználó által definiált rendszer konfigurációjának megadását, majd a konfiguráció szerinti végrehajtását. A konfigurációs lépés a következőket tartalmazza:

  • mely programok kerüljenek futtatásra,
  • milyen argumentumokat kapjanak a futtatott programok,
  • ROS-specifikus konvencióknak megfelelő összetevők, amelyek a komponensek könnyű újrahasznosíthatóságát teszik lehetővé.

Fontos megemlíteni továbbá, hogy a megoldás felügyeli az elindított folyamatokat, és képes reagálni a folyamatok futási állapotában bekövetkező változásokra.

Launch fájlok készítése történhet Python, XML, vagy YAML segítségével.

Előkészületek

Hozzuk létre a example_launch package-t

Ha esetleg már létezne a example_launch package akkor töröljük. (Gépteremben elképzelehető, hogy előző félévben valaki létrehozta.)

cd ~ && test -d "ros2_ws/src/example_launch" && echo Letezik || echo Nem letezik
rm -r  ~/ros2_ws/src/example_launch

Nyissunk egy új terminált, és source-oljuk a telepítést (ha nincs bashrc-ben), hogy a ros2 parancsok működjenek.

Navigáljunk az már létrehozott ros2_ws könyvtárba.

Fontos, hogy a csomagokat az src könyvtárban kell létrehozni, nem a munkaterület gyökerében. Tehát navigáljunk a ros2_ws/src mappába, és futtassuk a package létrehozó parancsot:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake example_launch

A terminál egy üzenetet küld vissza, amely megerősíti a example_launch csomag és az összes szükséges fájl és mappa létrehozását.

Launch mappa

Hozzunk létre egy mappát a launch fájlok részére:

cd ~/ros2_ws/src/example_launch
mkdir launch

Launch fájl létrehozása

cd launch
code turtlesim_mimc_launch.py

Állítsunk össze egy launch fájlt a turtlesim csomag elemeivel, Python nyelv alkalmazásával.

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            namespace='turtlesim1',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            namespace='turtlesim2',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            executable='mimic',
            name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])

A fent leírt módon létrehozott launch fájl a korábbiakban megismert turtlesim csomag három node-ját indítja el. A cél két turtlesim ablak megnyitása, majd az egyik teknős mozgásának megismétlése a másik teknőssel. A két turtlesim node indításában mindössze a névtér (namespace) tér el. Az egyedi névterek alkalmazása lehetővé teszi két azonos node egyidejű elindítását névkonfliktus nélkül. Így mindkét teknős ugyanazon a topicon fogad utasításokat, és ugyanazon a topicon közli a helyzetét. Az egyéni névterek lehetővé teszik a két teknős üzeneteinek megkülönböztetését.

Az utolsó node szintén a turtlesim csomagból van, viszont a futtatható fájl eltér: mimic. Ez a csomópont ki van egészítve névmegfeleltetésekkel. Például az egyszerű /input/pose megfelelője ezesetben /turtlesim1/turtle1/pose és a korábban megismert /output/cmd_vel most /turtlesim2/turtle1/cmd_vel. Ez azt jelenti, hogy mimic feliratkozik a /turtlesim1/sim pose topic-ra, és újra publisholja úgy, hogy /turtlesim2/sim sebesség utasítása feliratkozzon rá. Tehát, turtlesim2 utánozni fogja turtlesim1 mozgását.

Kód részleteinek áttekintése

Ezek a kifejezések Python launch modulokat importálnak.

from launch import LaunchDescription
from launch_ros.actions import Node

Ezt követően kezdődik a launch leírása:

def generate_launch_description():
  return LaunchDescription([

  ])

A launch leírásban szereplő első két utasítás indítja a két turtlesim ablakot:

Node(
    package='turtlesim',
    namespace='turtlesim1',
    executable='turtlesim_node',
    name='sim'
),
Node(
    package='turtlesim',
    namespace='turtlesim2',
    executable='turtlesim_node',
    name='sim'
),

Végül megtörténik a mozgás utánzását megvalósító node indítása is:

Node(
    package='turtlesim',
    executable='mimic',
    name='mimic',
    remappings=[
      ('/input/pose', '/turtlesim1/turtle1/pose'),
      ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
    ]
)

ROS2 launch használata

A létrehozott launch fájl elindítása az alábbi módon történik:

cd ~/ros2_ws/src/example_launch/launch # belépünk a launch fájlt tartalmazó mappába
ros2 launch turtlesim_mimc_launch.py

Két turtlesim ablak fog megnyílni, és a következő [INFO] kimenet lesz látható, felsorolva az indított node-okat:

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [11714]
[INFO] [turtlesim_node-2]: process started with pid [11715]
[INFO] [mimic-3]: process started with pid [11716]

Hogy kipróbáljuk az elindított rendszer működését, egy új terminálban hirdessünk olyan üzenetet, amellyel a turtle1 mozgatható:

ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"

A fent bemutatott direkt módon kívül egy launch fájl futtatható csomag által is:

ros2 launch <csomag_megnevezése> <launch_fájl_neve>

Olyan csomagok esetében, amelyek launch fájlt tartalmaznak, érdemes létrehozni egy exec_depend függőséget a ros2launch csomagra vonatkozóan a csomag package.xml fájljában:

<exec_depend>ros2launch</exec_depend>

Ezzel biztosítható, hogy az ros2 launch parancs elérhető a csomag buildelése után.

Tanulmányozzuk az elindított rendszert

Úgy, hogy minden eddig elindított node fut, egy újabb terminálban futtassuk az rqt_graph eszközt, amely grafikusan szemlélteti a launch fájl segítségével kialakított rendszert:

rqt_graph

Adjuk hozzá a package-hez, hogy bárhonnan indíthassuk

cd ~/ros2_ws/src/example_launch
code .

A package.xml-hez a <test_depend> elé szúrjuk be következő sort:

<exec_depend>ros2launch</exec_depend>

A CMakeLists.txt-hez a ament_package() elé szúrjuk be következő 2 sort:

install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME})

Buildeljük a szokáso módon:

cd ~/ros2_ws
colcon build --packages-select example_launch
source ~/ros2_ws/install/setup.bash

Ez a parancs most már bárhonnan kiadható:

ros2 launch example_launch turtlesim_mimc_launch.py

Források