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 ส่วนแยกกัน

  1. Terminal 1: เปิดตัวจำลอง (Simulator) คำสั่งนี้จะเรียกหน้าต่างกราฟิกที่มีเต่าสีเขียวตรงกลาง

    $ ros2 run turtlesim turtlesim_node
    
    _images/5.1.2.1.png
  2. Terminal 2: เปิดตัวควบคุม (Teleoperation) คำสั่งนี้จะรับค่าจากคีย์บอร์ดเพื่อส่งไปบังคับเต่า

    $ ros2 run turtlesim turtle_teleop_key
    
    _images/5.1.2.2.png

วิธีเล่น: คลิกที่หน้าต่าง 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
_images/5.2.png

ผลลัพธ์ที่ได้:

  • /turtlesim: คือหน้าต่างกราฟิกรูปเต่า

  • /teleop_turtle: คือโปรแกรมรับค่าคีย์บอร์ด

Note

System Nodes: ท่านอาจไม่เห็น Node ชื่อ /rosout หรือ /parameter_events ในรายการปกติ เพราะ ROS 2 ซ่อนไว้ แต่พวกมันทำงานอยู่เบื้องหลังเสมอ

  • /rosout: ทำหน้าที่รวบรวม Log ข้อความต่างๆ

  • /parameter_events: ทำหน้าที่จัดการการเปลี่ยนแปลงค่าตัวแปรระบบ

5.2.2. Node Management Commands (คำสั่งจัดการโหนด)

Command

Description

ros2 node list

แสดงรายชื่อ Node ทั้งหมดที่กำลังทำงานอยู่

ros2 node info <node_name>

ดูรายละเอียดเชิงลึกของ Node นั้น (เช่น มี Topic อะไรบ้าง, ให้บริการ Service อะไรบ้าง)

ตัวอย่าง: ros2 node info /turtlesim

5.3. ROS 2 Topics (ช่องทางการสื่อสาร)

Topic เปรียบเสมือน "ท่อส่งข้อมูล" ที่ Node ใช้คุยกัน เช่น Node คีย์บอร์ดส่งคำสั่งความเร็วผ่านท่อชื่อ /turtle1/cmd_vel ไปให้ Node เต่า

ตรวจสอบ Topic ที่มีอยู่ในระบบ:

$ ros2 topic list
_images/5.3.png

5.3.1. 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 ส่วนหลัก:

Component

Axis

Description

Linear

x

ความเร็วแนวตรง (เดินหน้า +, ถอยหลัง -) หน่วยเป็น m/s

Linear

y

ความเร็วสไลด์ข้าง (สำหรับหุ่นยนต์ Omni/Mecanum)

Angular

z

ความเร็วในการหมุนรอบตัวเอง (หมุนซ้าย +, หมุนขวา -) หน่วยเป็น rad/s

5.4. ROS 2 Services (การเรียกใช้บริการ)

Service เป็นการสื่อสารแบบ "ขอมา-จัดให้" (Call & Response) ต่างจาก Topic ที่ส่งข้อมูลรัวๆ ตลอดเวลา Service จะทำงานเมื่อถูกเรียกเท่านั้น และจะมีการตอบกลับว่า "ทำสำเร็จหรือไม่"

5.4.1. รายชื่อ Service ที่มี (Service List)

ตรวจสอบ Service ทั้งหมดที่หุ่นยนต์เต่าให้บริการ:

$ ros2 service list
_images/5.4.png

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
_images/5.5.png

ลองเปลี่ยนสีพื้นหลัง (Background Color) Turtlesim อนุญาตให้เราเปลี่ยนสีพื้นหลังผ่าน Parameter ได้

# Change background red channel to 150
$ ros2 param set /turtlesim background_r 150
_images/5.5.1.png

(หมายเหตุ: สีอาจจะยังไม่เปลี่ยนทันที จนกว่าจะมีการ Refresh หน้าจอ หรือใช้ Service /clear)

5.6. RQT (เครื่องมือครอบจักรวาล)

การพิมพ์คำสั่งผ่าน Terminal บางครั้งก็ลำบากและมองไม่เห็นภาพรวม RQT (ROS Qt) คือโปรแกรม GUI ที่รวมเครื่องมืออำนวยความสะดวกไว้มากมาย

เปิดโปรแกรม:

$ rqt
_images/5.6.png

5.6.1. Topic Monitor (ดูค่าสดๆ)

ใช้สำหรับแอบดูข้อมูลที่วิ่งอยู่ในระบบ

  • ไปที่เมนู Plugins \(\rightarrow\) Topics \(\rightarrow\) Topic Monitor

  • ติ๊กถูกหน้า /turtle1/pose

  • ขยายดูค่า \(x, y\) แล้วลองขับเต่าดู จะเห็นตัวเลขวิ่งตามจริง

_images/5.6.1.png

5.6.2. Message Publisher (สั่งงานด้วยมือ)

ใช้สำหรับส่งคำสั่งหลอกๆ เข้าไปในระบบ (โดยไม่ต้องเขียนโค้ด)

  • ไปที่เมนู Plugins \(\rightarrow\) Topics \(\rightarrow\) Message Publisher

  • เลือก Topic /turtle1/cmd_vel กดปุ่ม + (Add)

  • ขยายช่อง linear แก้ค่า x เป็น 1.0 (เดินหน้า)

  • ติ๊กถูกช่องหน้าชื่อ Topic เพื่อเริ่มส่งคำสั่ง (เต่าจะเดินหน้าไม่หยุด)

_images/5.6.2.png

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 (เต่าตัวแรกจะหายไป)

_images/5.6.3.png

เครื่องมือ RQT นี้มีประโยชน์มากในการตรวจสอบระบบ (Debug) เวลาเขียนโค้ดจริงแล้วหุ่นยนต์ไม่เดิน หรือเซนเซอร์ไม่ส่งค่า เราจะใช้ RQT เข้ามาเช็คเป็นด่านแรกเสมอ