# สร้าง Launch File และบริหารจัดการ Node ในบทนี้ เราจะมาทำความเข้าใจ Launch File ซึ่งเป็นเครื่องมือสำคัญสำหรับการจัดการและรัน Node หลายตัว พร้อมกัน ## Launch File คืออะไร? Launch File เป็นไฟล์ที่ใช้สำหรับ บริหารจัดการการรัน Node หลายตัวพร้อมกัน ใน ROS2 โดยใช้ launch_ros และ launch module แทนที่จะต้องรันแต่ละโหนดด้วย ros2 run ทีละตัว Launch File ช่วยให้สามารถรันหลายโหนดได้ง่ายๆ ใช้ภาษาสคริปต์ Python ในการสร้าง Launch File สามารถกำหนด พารามิเตอร์, environment variable, log level และการเชื่อมโยงระหว่าง Node ต่างๆ ได้ ## ขั้นตอนการสร้าง Launch File เปิดโฟลเดอร์ /ros2_ws/src/my_package บน VS Code ```{image} images/c14/14.2.1.png :width: 80% :align: center ``` สร้างโฟลเดอร์ launch ใน /ros2_ws/src/my_package ```{image} images/c14/14.2.2.png :width: 80% :align: center ``` สร้างไฟล์ my_launch_file.launch.py ในโฟลเดอร์ launch ```{image} images/c14/14.2.3.png :width: 80% :align: center ``` เพิ่มเนื้อหาลงในไฟล์ my_launch_file.launch.py ดังนี้ ```{code-block} python 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 นำเข้าโมดูลที่จำเป็น ```{code-block} python from launch import LaunchDescription import launch_ros.actions ``` ฟังก์ชัน generate_launch_description() ```{code-block} python def generate_launch_description(): ``` รัน turtlesim_node 2 ตัว โดยใช้ Namespace ```{code-block} python 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']), ```{image} images/c14/14.2.4.png :width: 80% :align: center ``` ดังภาพตัวอย่างนั้น รัน turtlesim_node สองตัว พร้อมกำหนด namespace แยกกัน * เมื่อรัน Launch File นี้ จะเปิด หน้าต่าง turtlesim สองตัว แยกกัน * แต่ละตัวจะอยู่ใน namespace ของตัวเอง (/turtlesim1 และ /turtlesim2) * ทำให้สามารถควบคุมแยกกันได้ เช่น ส่งคำสั่ง cmd_vel แยกกันตาม namespac, คอมไพล์ ```{code-block} bash cd ~/ros2_ws colcon build source install/setup.bash ``` ```{image} images/c14/14.2.5.png :width: 80% :align: center ``` ## ทดสอบ รัน Launch File ```{code-block} bash ros2 launch my_package my_launch_file.launch.py ``` ```{image} images/c14/14.3.1.png :width: 80% :align: center ``` **Launch File** \ เปิดใช้งาน Node หลายตัวพร้อมกัน โดยไม่ต้องรันทีละคำสั่ง * สามารถกำหนดค่า Node ต่าง ๆ ในไฟล์ launch ได้ เช่น การตั้งค่าพารามิเตอร์, การกำหนด log level * ทำให้การควบคุม ง่ายขึ้น และ จัดการระบบได้อย่างเป็นระบบมากขึ้น * รองรับการใช้งานร่วมกับ ROS 2 Parameters **การควบคุมเต่า 2 แบบ** 1. การรัน turtlesim_node สองตัว * เปิด หน้าต่าง Turtlesim 2 ตัว โดยการใช้คำสั่ง ```{code-block} bash ros2 run turtlesim turtlesim_node ``` * โดยปกติแล้ว เมื่อรันคำสั่งนี้โดยไม่มีการตั้งค่าเพิ่มเติม มันจะสร้าง Node ที่มีชื่อเดียวกัน turtlesim ทั้งสองตัว (แต่จะต้องระบุชื่อที่แตกต่างกันถ้าต้องการควบคุมแยก) 2. การควบคุมเต่าแต่ละตัว * เปิด Terminal เพิ่มอีก 2 หน้าต่าง สำหรับใช้คำสั่ง turtle_teleop_key เพื่อควบคุมการเคลื่อนที่ของเต่า * ใช้คำสั่ง ```{code-block} bash ros2 run turtlesim turtle_teleop_key --ros-args --remap /turtle1/cmd_vel:=/turtlesim1/turtle1/cmd_vel ``` และ ```{code-block} bash ros2 run turtlesim turtle_teleop_key --ros-args --remap /turtle1/cmd_vel:=/turtlesim2/turtle1/cmd_vel ``` * การใช้คำสั่ง --remap จะช่วย กำหนดเส้นทาง (namespace) ของแต่ละเต่าแยกออกจากกัน เช่น turtlesim1 และ turtlesim2 ```{image} images/c14/14.3.2.png :width: 80% :align: center ``` 📌 สิ่งที่ต้องเข้าใจ * การเปิด Turtlesim หลายตัว สามารถทำได้โดยการรัน turtlesim_node หลายครั้ง * การควบคุมให้แต่ละเต่าแยกกันต้องใช้การตั้งค่า namespace หรือใช้ remap เพื่อแยกการส่งคำสั่งออกจากกัน * คำสั่ง turtle_teleop_key จะทำหน้าที่ส่งคำสั่งการเคลื่อนที่ (cmd_vel) ไปยังแต่ละเต่าตามที่เรากำหนดไว้ใน remap 💡 ข้อดีของวิธีนี้ * ง่ายต่อการทดสอบการควบคุมหลายตัวพร้อมกัน * สามารถกำหนดค่าต่าง ๆ ของแต่ละเต่าแยกจากกันได้ ❌ ข้อเสีย * ต้องเปิดหลาย Terminal จึงทำให้การจัดการค่อนข้างยุ่งยาก * ไม่เหมาะกับการทำงานที่ซับซ้อนหรือโปรเจกต์ที่มี Node หลายตัว (ควรใช้ Launch File จะดีกว่า)