# Basic ROS 2 Commands (คำสั่งพื้นฐาน ROS 2) หลังจากที่เราได้ติดตั้งระบบเรียบร้อยแล้ว ในบทนี้เราจะมาเรียนรู้คำสั่งพื้นฐานในการควบคุมหุ่นยนต์ผ่าน **Command Line Interface (CLI)** เพื่อให้เห็นภาพการทำงานจริงโดยไม่ต้องเสี่ยงกับหุ่นยนต์ราคาแพง เราจะใช้ **Turtlesim** (โปรแกรมจำลองหุ่นยนต์เต่า) ซึ่งเป็น "Hello World" ของโลก ROS มาเป็นตัวเดินเรื่องในการเรียนรู้ครั้งนี้ ## Turtlesim (เริ่มต้นกับเต่าน้อย) **Turtlesim** คือแพ็กเกจจำลองหุ่นยนต์ 2 มิติที่แถมมากับ ROS 2 เหมาะอย่างยิ่งสำหรับการเรียนรู้เรื่อง Node และ Topic เพราะมีความเรียบง่ายและเห็นผลลัพธ์ทันที ### Installation (การติดตั้ง) ตรวจสอบว่าติดตั้งแพ็กเกจแล้วหรือยัง (ปกติจะมาพร้อม `ros-jazzy-desktop`) หากยังไม่มีให้ติดตั้งด้วยคำสั่ง: ```{code-block} console $ sudo apt update $ sudo apt install ros-jazzy-turtlesim ``` ### Starting Nodes (การเริ่มใช้งาน) เราต้องเปิด **Terminal** ขึ้นมา 2 หน้าต่าง เพื่อรันโปรแกรม 2 ส่วนแยกกัน 1. **Terminal 1: เปิดตัวจำลอง (Simulator)** คำสั่งนี้จะเรียกหน้าต่างกราฟิกที่มีเต่าสีเขียวตรงกลาง ```{code-block} console $ ros2 run turtlesim turtlesim_node ``` ```{image} images/c5/5.1.2.1.png :width: 80% :align: center ``` 2. **Terminal 2: เปิดตัวควบคุม (Teleoperation)** คำสั่งนี้จะรับค่าจากคีย์บอร์ดเพื่อส่งไปบังคับเต่า ```{code-block} console $ ros2 run turtlesim turtle_teleop_key ``` ```{image} images/c5/5.1.2.2.png :width: 80% :align: center ``` **วิธีเล่น:** คลิกที่หน้าต่าง **Terminal 2** (ตัวควบคุม) แล้วลองกดปุ่มลูกศร เพื่อบังคับเต่าเดิน หากเต่าเดินชนขอบกำแพง จะมีข้อความแจ้งเตือน (Warning) ขึ้นมาที่หน้าจอ Log :::{note} **คำสั่ง `ros2 run` คืออะไร?** ใช้สำหรับสั่งรันโปรแกรม (Executable) ที่อยู่ในแพ็กเกจของ ROS 2 **รูปแบบคำสั่ง:** `ros2 run ` * **Package Name:** ชื่อกล่องเก็บโค้ด (เช่น `turtlesim`) * **Executable Name:** ชื่อไฟล์โปรแกรมที่ต้องการรัน (เช่น `turtlesim_node`) ::: ## ROS 2 Nodes (โหนดและการทำงาน) ในระบบ ROS 2 โปรแกรมแต่ละตัวที่ทำงานอยู่จะเรียกว่า **Node** ลองตรวจสอบดูว่าตอนนี้มี Node อะไรทำงานอยู่บ้าง ### Checking Active Nodes เปิด Terminal ช่องใหม่ (ช่องที่ 3) แล้วพิมพ์คำสั่ง: ```{code-block} console $ ros2 node list ``` ```{image} images/c5/5.2.png :width: 80% :align: center ``` **ผลลัพธ์ที่ได้:** * `/turtlesim`: คือหน้าต่างกราฟิกรูปเต่า * `/teleop_turtle`: คือโปรแกรมรับค่าคีย์บอร์ด ```{note} **System Nodes:** ท่านอาจไม่เห็น Node ชื่อ `/rosout` หรือ `/parameter_events` ในรายการปกติ เพราะ ROS 2 ซ่อนไว้ แต่พวกมันทำงานอยู่เบื้องหลังเสมอ * **/rosout:** ทำหน้าที่รวบรวม Log ข้อความต่างๆ * **/parameter_events:** ทำหน้าที่จัดการการเปลี่ยนแปลงค่าตัวแปรระบบ ``` ### Node Management Commands (คำสั่งจัดการโหนด) ```{list-table} :widths: 30 70 :header-rows: 1 * - Command - Description * - `ros2 node list` - แสดงรายชื่อ Node ทั้งหมดที่กำลังทำงานอยู่ * - `ros2 node info ` - ดูรายละเอียดเชิงลึกของ Node นั้น (เช่น มี Topic อะไรบ้าง, ให้บริการ Service อะไรบ้าง) **ตัวอย่าง:** `ros2 node info /turtlesim` ``` ## ROS 2 Topics (ช่องทางการสื่อสาร) **Topic** เปรียบเสมือน "ท่อส่งข้อมูล" ที่ Node ใช้คุยกัน เช่น Node คีย์บอร์ดส่งคำสั่งความเร็วผ่านท่อชื่อ `/turtle1/cmd_vel` ไปให้ Node เต่า ตรวจสอบ Topic ที่มีอยู่ในระบบ: ```{code-block} console $ ros2 topic list ``` ```{image} images/c5/5.3.png :width: 80% :align: center ``` ### Understanding Data Types (ทำความเข้าใจข้อมูล) ข้อมูลที่วิ่งใน Topic มีหลายรูปแบบ เรามาดูตัวที่สำคัญกันครับ #### 1. Pose (ตำแหน่งและทิศทาง) * **Topic:** `/turtle1/pose` * **Data:** $x, y$ (ตำแหน่งแกน 2 มิติ), $\theta$ (มุมหัน) **เรื่องน่ารู้: มุมเรเดียน (Radian)** ในทางวิศวกรรมหุ่นยนต์ เราไม่ใช้องศา (Degree) แต่ใช้ **Radian** * **0:** หันหน้าไปทางขวา (ทิศตะวันออก) * **3.14 ($\pi$):** หันหลังกลับ (180 องศา) * **6.28 ($2\pi$):** หมุนครบ 1 รอบ (360 องศา) #### 2. Color Sensor (เซนเซอร์สี) * **Topic:** `/turtle1/color_sensor` * **Data:** `r`, `g`, `b` (ค่าสีพื้นหลังที่เต่าเหยียบอยู่ 0-255) #### 3. Command Velocity (คำสั่งความเร็ว) * **Topic:** `/turtle1/cmd_vel` * **Type:** `geometry_msgs/msg/Twist` นี่คือ Topic มาตรฐานสำหรับการสั่งเคลื่อนที่หุ่นยนต์ ประกอบด้วย 2 ส่วนหลัก: ```{list-table} :widths: 25 25 50 :header-rows: 1 * - Component - Axis - Description * - **Linear** - `x` - ความเร็วแนวตรง (เดินหน้า +, ถอยหลัง -) หน่วยเป็น m/s * - **Linear** - `y` - ความเร็วสไลด์ข้าง (สำหรับหุ่นยนต์ Omni/Mecanum) * - **Angular** - `z` - ความเร็วในการหมุนรอบตัวเอง (หมุนซ้าย +, หมุนขวา -) หน่วยเป็น rad/s ``` ## ROS 2 Services (การเรียกใช้บริการ) **Service** เป็นการสื่อสารแบบ "ขอมา-จัดให้" (Call & Response) ต่างจาก Topic ที่ส่งข้อมูลรัวๆ ตลอดเวลา Service จะทำงานเมื่อถูกเรียกเท่านั้น และจะมีการตอบกลับว่า "ทำสำเร็จหรือไม่" ### รายชื่อ Service ที่มี (Service List) ตรวจสอบ Service ทั้งหมดที่หุ่นยนต์เต่าให้บริการ: ```{code-block} console $ ros2 service list ``` ```{image} images/c5/5.4.png :width: 80% :align: center ``` ### ลองเรียก Service ผ่าน Command Line (CLI) การเรียก Service ผ่าน Terminal นั้นค่อนข้างซับซ้อน เพราะเราต้องรู้โครงสร้างข้อมูล (Type) และพิมพ์พารามิเตอร์ในรูปแบบ YAML/JSON ให้ถูกต้องเป๊ะๆ **ตัวอย่างที่ 1: สั่งลบเส้นปากกา (Clear)** Service นี้เรียกง่าย เพราะไม่ต้องส่งค่าอะไรเข้าไป (Empty Request) ```{code-block} console $ ros2 service call /clear std_srvs/srv/Empty ``` **ตัวอย่างที่ 2: สั่งวาร์ปเต่า (Teleport Absolute)** Service นี้ต้องส่งค่าพิกัด $x, y, \theta$ เข้าไป ซึ่งต้องพิมพ์ยาวมาก: ```{code-block} console $ ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 5.5, y: 5.5, theta: 0.0}" ``` จะเห็นว่าการพิมพ์คำสั่งยาวๆ แบบนี้เสี่ยงต่อการพิมพ์ผิด (Syntax Error) และจดจำยากมาก ในหัวข้อถัดไปเราจึงจะแนะนำให้ใช้เครื่องมือ **GUI (RQT)** แทน ซึ่งสะดวกกว่ามาก ## ROS 2 Parameters (ตัวแปรระบบ) **Parameter** คือค่าคงที่สำหรับตั้งค่า Node (Configuration) เช่น ความเร็วสูงสุด หรือ สีพื้นหลัง ตรวจสอบ Parameter: ```{code-block} console $ ros2 param list ``` ```{image} images/c5/5.5.png :width: 80% :align: center ``` **ลองเปลี่ยนสีพื้นหลัง (Background Color)** Turtlesim อนุญาตให้เราเปลี่ยนสีพื้นหลังผ่าน Parameter ได้ ```{code-block} console # Change background red channel to 150 $ ros2 param set /turtlesim background_r 150 ``` ```{image} images/c5/5.5.1.png :width: 80% :align: center ``` *(หมายเหตุ: สีอาจจะยังไม่เปลี่ยนทันที จนกว่าจะมีการ Refresh หน้าจอ หรือใช้ Service `/clear`)* ## RQT (เครื่องมือครอบจักรวาล) การพิมพ์คำสั่งผ่าน Terminal บางครั้งก็ลำบากและมองไม่เห็นภาพรวม **RQT** (ROS Qt) คือโปรแกรม GUI ที่รวมเครื่องมืออำนวยความสะดวกไว้มากมาย เปิดโปรแกรม: ```{code-block} console $ rqt ``` ```{image} images/c5/5.6.png :width: 80% :align: center ``` ### Topic Monitor (ดูค่าสดๆ) ใช้สำหรับแอบดูข้อมูลที่วิ่งอยู่ในระบบ * ไปที่เมนู **Plugins** $\rightarrow$ **Topics** $\rightarrow$ **Topic Monitor** * ติ๊กถูกหน้า `/turtle1/pose` * ขยายดูค่า $x, y$ แล้วลองขับเต่าดู จะเห็นตัวเลขวิ่งตามจริง ```{image} images/c5/5.6.1.png :width: 80% :align: center ``` ### Message Publisher (สั่งงานด้วยมือ) ใช้สำหรับส่งคำสั่งหลอกๆ เข้าไปในระบบ (โดยไม่ต้องเขียนโค้ด) * ไปที่เมนู **Plugins** $\rightarrow$ **Topics** $\rightarrow$ **Message Publisher** * เลือก Topic `/turtle1/cmd_vel` กดปุ่ม **+ (Add)** * ขยายช่อง `linear` แก้ค่า `x` เป็น `1.0` (เดินหน้า) * ติ๊กถูกช่องหน้าชื่อ Topic เพื่อเริ่มส่งคำสั่ง (เต่าจะเดินหน้าไม่หยุด) ```{image} images/c5/5.6.2.png :width: 80% :align: center ``` ### Service Caller (ลองเรียกใช้ฟังก์ชัน) * ไปที่เมนู **Plugins** $\rightarrow$ **Services** $\rightarrow$ **Service Caller** * เลือก Service `/clear` แล้วกดปุ่ม **Call** (เส้นจะหายไป) * เลือก Service `/spawn` กำหนดพิกัด $x=5, y=5$ แล้วกด **Call** (จะมีเต่าตัวใหม่ชื่อ `turtle2` โผล่มา) * เลือก Service `/kill` ใส่ชื่อ `turtle1` แล้วกด **Call** (เต่าตัวแรกจะหายไป) ```{image} images/c5/5.6.3.png :width: 80% :align: center ``` --- เครื่องมือ **RQT** นี้มีประโยชน์มากในการตรวจสอบระบบ (Debug) เวลาเขียนโค้ดจริงแล้วหุ่นยนต์ไม่เดิน หรือเซนเซอร์ไม่ส่งค่า เราจะใช้ RQT เข้ามาเช็คเป็นด่านแรกเสมอ