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_cpp
package-t¶
Ha esetleg már létezne a example_launch_cpp
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_cpp" && echo Letezik || echo Nem letezik
rm -r ~/ros2_ws/src/example_launch_cpp
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_cpp
A terminál egy üzenetet küld vissza, amely megerősíti a example_launch_cpp
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_cpp
mkdir launch
Launch fájl létrehozása¶
cd launch
code turtlesim_mimic_launch.py
Állítsunk össze egy launch fájlt a turtlesim
csomag elemeivel, Python nyelv alkalmazásával.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
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='turtle1',
executable='turtlesim_node',
),
Node(
package='turtlesim',
namespace='turtle2',
executable='turtlesim_node',
name='turtle2_green',
parameters=[{'background_b': 160, 'background_g': 230, 'background_r': 0}],
),
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_cpp/launch # belépünk a launch fájlt tartalmazó mappába
ros2 launch turtlesim_mimic_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
vagy a ros2 run
paranccsal:
ros2 run rqt_graph rqt_graph
graph TD
T1([turtlesim1/turtlesim]):::red --> P1[ /turtlesim1/turtle1/pose]:::light --> M1([mimic]):::red
M1 --> C2[ /turtlesim2/turtle1/cmd_vel]:::light
C2 --> T2([turtlesim2/turtle2_green]):::red
n1([ /node]):::white -- publishes --> t[ /topic]:::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
Adjuk hozzá a package-hez, hogy bárhonnan indíthassuk¶
cd ~/ros2_ws/src/example_launch_cpp
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_cpp --symlink-install
source ~/ros2_ws/install/setup.bash
Ez a parancs most már bárhonnan kiadható:
ros2 launch example_launch_cpp turtlesim_mimic_launch.py
Házi feladat¶
Házi feladat
Készíts egy launch fájlt, amely a turtlesim
csomagból elindít egy turtlesim ablakot, és egy teleop_turtle
csomagból egy teleop_turtle_keyboard
node-ot. A teleop_turtle_keyboard
node segítségével a turtlesim ablakban mozgatható a teknős a billentyűzetről. A turtlesim háttere legyen piros. Készítsünk hozzá egy example_launch_py
python csomagot, és indítsuk el a launch fájlt a csomagból.
Megjegyzés python csomagok esetén¶
Amennyiben SetuptoolsDeprecationWarning: setup.py install is deprecated
hibaüzenetet kapunk, akkor a setuptools
csomag downgrade-elése szükséges. Ellenőrizzük a setuptools
csomag verzióját:
pip3 list | grep setuptools
Ha az eredmény újabb, mint 58.2.0
, akkor downgrade-elni kell a setuptools
csomagot:
pip install setuptools==58.2.0
Források¶
- foxglove.dev/blog/how-to-use-ros2-launch-files
- youtube.com/watch?v=PqNGvmE2Pv4&t
- docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Creating-Launch-Files.html
- docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html
- docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html
- docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher-And-Subscriber.html