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