14. สร้าง Launch File และบริหารจัดการ Node

ในบทนี้ เราจะมาทำความเข้าใจ Launch File ซึ่งเป็นเครื่องมือสำคัญสำหรับการจัดการและรัน Node หลายตัว พร้อมกัน

14.1. Launch File คืออะไร?

Launch File เป็นไฟล์ที่ใช้สำหรับ บริหารจัดการการรัน Node หลายตัวพร้อมกัน ใน ROS2 โดยใช้ launch_ros และ launch module แทนที่จะต้องรันแต่ละโหนดด้วย ros2 run ทีละตัว Launch File ช่วยให้สามารถรันหลายโหนดได้ง่ายๆ ใช้ภาษาสคริปต์ Python ในการสร้าง Launch File สามารถกำหนด พารามิเตอร์, environment variable, log level และการเชื่อมโยงระหว่าง Node ต่างๆ ได้

14.2. ขั้นตอนการสร้าง Launch File

เปิดโฟลเดอร์ /ros2_ws/src/my_package บน VS Code

_images/14.2.1.png

สร้างโฟลเดอร์ launch ใน /ros2_ws/src/my_package

_images/14.2.2.png

สร้างไฟล์ my_launch_file.launch.py ในโฟลเดอร์ launch

_images/14.2.3.png

เพิ่มเนื้อหาลงในไฟล์ my_launch_file.launch.py ดังนี้

from launch import LaunchDescription
import launch_ros.actions

def generate_launch_description():
    return LaunchDescription([
        launch_ros.actions.Node(
           namespace= "turtlesim1",
           package='turtlesim',
           executable='turtlesim_node',
           output='screen'
           ),
        launch_ros.actions.Node(
           namespace= "turtlesim2",
           package='turtlesim',
           executable='turtlesim_node',
           output='screen'
           ),
   ])

โครงสร้างของโค้ดของ Launch File นำเข้าโมดูลที่จำเป็น

from launch import LaunchDescription
import launch_ros.actions

ฟังก์ชัน generate_launch_description()

def generate_launch_description():

รัน turtlesim_node 2 ตัว โดยใช้ Namespace

    return LaunchDescription([
        launch_ros.actions.Node(
           namespace= "turtlesim1",
           package='turtlesim',
           executable='turtlesim_node',
           output='screen'
           ),
        launch_ros.actions.Node(
           namespace= "turtlesim2",
           package='turtlesim',
           executable='turtlesim_node',
           output='screen'
           ),
   ])

อธิบายโค้ด

  • สร้าง LaunchDescription ที่มี 2 Node

  • แต่ละ Node ใช้ turtlesim_node จากแพ็กเกจ turtlesim

  • กำหนด namespace ต่างกัน

    • turtlesim1 →เป็น turtlesim_node ตัวแรก

    • turtlesim2 →เป็น turtlesim_node ตัวที่สอง

  • output='screen' ให้แสดงผลลัพธ์บน Terminal \

เปิดไฟล์ setup.py ขึ้นมาเพื่อแก้ไขเพิ่ม Launch File
เพิ่ม: ('share/' + package_name + '/launch', ['launch/my_launch_file.launch.py']),

_images/14.2.4.png

ดังภาพตัวอย่างนั้น รัน turtlesim_node สองตัว พร้อมกำหนด namespace แยกกัน

  • เมื่อรัน Launch File นี้ จะเปิด หน้าต่าง turtlesim สองตัว แยกกัน

  • แต่ละตัวจะอยู่ใน namespace ของตัวเอง (/turtlesim1 และ /turtlesim2)

  • ทำให้สามารถควบคุมแยกกันได้ เช่น ส่งคำสั่ง cmd_vel แยกกันตาม namespac,

คอมไพล์

cd ~/ros2_ws
colcon build
source install/setup.bash
_images/14.2.5.png

14.3. ทดสอบ รัน Launch File

ros2 launch my_package my_launch_file.launch.py
_images/14.3.1.png

Launch File
เปิดใช้งาน Node หลายตัวพร้อมกัน โดยไม่ต้องรันทีละคำสั่ง

  • สามารถกำหนดค่า Node ต่าง ๆ ในไฟล์ launch ได้ เช่น การตั้งค่าพารามิเตอร์, การกำหนด log level

  • ทำให้การควบคุม ง่ายขึ้น และ จัดการระบบได้อย่างเป็นระบบมากขึ้น

  • รองรับการใช้งานร่วมกับ ROS 2 Parameters

การควบคุมเต่า 2 แบบ

  1. การรัน turtlesim_node สองตัว

  • เปิด หน้าต่าง Turtlesim 2 ตัว โดยการใช้คำสั่ง

ros2 run turtlesim turtlesim_node
  • โดยปกติแล้ว เมื่อรันคำสั่งนี้โดยไม่มีการตั้งค่าเพิ่มเติม มันจะสร้าง Node ที่มีชื่อเดียวกัน turtlesim ทั้งสองตัว (แต่จะต้องระบุชื่อที่แตกต่างกันถ้าต้องการควบคุมแยก)

  1. การควบคุมเต่าแต่ละตัว

  • เปิด Terminal เพิ่มอีก 2 หน้าต่าง สำหรับใช้คำสั่ง turtle_teleop_key เพื่อควบคุมการเคลื่อนที่ของเต่า

  • ใช้คำสั่ง

ros2 run turtlesim turtle_teleop_key --ros-args --remap /turtle1/cmd_vel:=/turtlesim1/turtle1/cmd_vel

และ

ros2 run turtlesim turtle_teleop_key --ros-args --remap /turtle1/cmd_vel:=/turtlesim2/turtle1/cmd_vel
  • การใช้คำสั่ง --remap จะช่วย กำหนดเส้นทาง (namespace) ของแต่ละเต่าแยกออกจากกัน เช่น turtlesim1 และ turtlesim2

_images/14.3.2.png

📌 สิ่งที่ต้องเข้าใจ

  • การเปิด Turtlesim หลายตัว สามารถทำได้โดยการรัน turtlesim_node หลายครั้ง

  • การควบคุมให้แต่ละเต่าแยกกันต้องใช้การตั้งค่า namespace หรือใช้ remap เพื่อแยกการส่งคำสั่งออกจากกัน

  • คำสั่ง turtle_teleop_key จะทำหน้าที่ส่งคำสั่งการเคลื่อนที่ (cmd_vel) ไปยังแต่ละเต่าตามที่เรากำหนดไว้ใน remap

💡 ข้อดีของวิธีนี้

  • ง่ายต่อการทดสอบการควบคุมหลายตัวพร้อมกัน

  • สามารถกำหนดค่าต่าง ๆ ของแต่ละเต่าแยกจากกันได้

❌ ข้อเสีย

  • ต้องเปิดหลาย Terminal จึงทำให้การจัดการค่อนข้างยุ่งยาก

  • ไม่เหมาะกับการทำงานที่ซับซ้อนหรือโปรเจกต์ที่มี Node หลายตัว (ควรใช้ Launch File จะดีกว่า)