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
สร้างโฟลเดอร์ launch ใน /ros2_ws/src/my_package
สร้างไฟล์ my_launch_file.launch.py ในโฟลเดอร์ launch
เพิ่มเนื้อหาลงในไฟล์ 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']),
ดังภาพตัวอย่างนั้น รัน turtlesim_node สองตัว พร้อมกำหนด namespace แยกกัน
เมื่อรัน Launch File นี้ จะเปิด หน้าต่าง turtlesim สองตัว แยกกัน
แต่ละตัวจะอยู่ใน namespace ของตัวเอง (/turtlesim1 และ /turtlesim2)
ทำให้สามารถควบคุมแยกกันได้ เช่น ส่งคำสั่ง cmd_vel แยกกันตาม namespac,
คอมไพล์
cd ~/ros2_ws
colcon build
source install/setup.bash
14.3. ทดสอบ รัน Launch File
ros2 launch my_package my_launch_file.launch.py
Launch File
เปิดใช้งาน Node หลายตัวพร้อมกัน โดยไม่ต้องรันทีละคำสั่ง
สามารถกำหนดค่า Node ต่าง ๆ ในไฟล์ launch ได้ เช่น การตั้งค่าพารามิเตอร์, การกำหนด log level
ทำให้การควบคุม ง่ายขึ้น และ จัดการระบบได้อย่างเป็นระบบมากขึ้น
รองรับการใช้งานร่วมกับ ROS 2 Parameters
การควบคุมเต่า 2 แบบ
การรัน turtlesim_node สองตัว
เปิด หน้าต่าง Turtlesim 2 ตัว โดยการใช้คำสั่ง
ros2 run turtlesim turtlesim_node
โดยปกติแล้ว เมื่อรันคำสั่งนี้โดยไม่มีการตั้งค่าเพิ่มเติม มันจะสร้าง Node ที่มีชื่อเดียวกัน turtlesim ทั้งสองตัว (แต่จะต้องระบุชื่อที่แตกต่างกันถ้าต้องการควบคุมแยก)
การควบคุมเต่าแต่ละตัว
เปิด 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
📌 สิ่งที่ต้องเข้าใจ
การเปิด Turtlesim หลายตัว สามารถทำได้โดยการรัน turtlesim_node หลายครั้ง
การควบคุมให้แต่ละเต่าแยกกันต้องใช้การตั้งค่า namespace หรือใช้ remap เพื่อแยกการส่งคำสั่งออกจากกัน
คำสั่ง turtle_teleop_key จะทำหน้าที่ส่งคำสั่งการเคลื่อนที่ (cmd_vel) ไปยังแต่ละเต่าตามที่เรากำหนดไว้ใน remap
💡 ข้อดีของวิธีนี้
ง่ายต่อการทดสอบการควบคุมหลายตัวพร้อมกัน
สามารถกำหนดค่าต่าง ๆ ของแต่ละเต่าแยกจากกันได้
❌ ข้อเสีย
ต้องเปิดหลาย Terminal จึงทำให้การจัดการค่อนข้างยุ่งยาก
ไม่เหมาะกับการทำงานที่ซับซ้อนหรือโปรเจกต์ที่มี Node หลายตัว (ควรใช้ Launch File จะดีกว่า)