3. node · topic · message
สามคำนี้คือทั้งหมดที่ต้องเข้าใจเพื่ออ่านระบบ ROS 2 ให้ออก
คำ |
คืออะไร |
เทียบกับของที่คุ้นเคย |
|---|---|---|
node |
โปรแกรมย่อยหนึ่งตัวที่ทำงานอย่างเดียว |
พนักงานหนึ่งคน |
topic |
ช่องที่มีชื่อ ใช้ส่งข้อมูล |
สายพานที่มีป้ายชื่อ |
message |
รูปแบบของข้อมูลที่ส่ง |
แบบฟอร์มที่ตกลงกันไว้ |
node ที่ส่งข้อมูลเข้า topic เรียกว่า publisher · node ที่รับเรียกว่า subscriber
Important
publisher ไม่รู้ว่าใครรับ และไม่สนใจว่ามีคนรับไหม มันส่งเข้า topic แล้วจบหน้าที่ จะมีคนรับ 0 คนหรือ 10 คนก็ทำงานเหมือนเดิม
ข้อนี้คือเหตุผลที่ระบบยืดหยุ่น แต่ก็เป็นเหตุผลที่ความผิดพลาดเงียบได้ — ส่งไปแล้วไม่มีใครรับ ก็ไม่มีอะไรฟ้อง
ลองด้วย turtlesim
turtlesim เป็นโปรแกรมเต่าที่ติดมากับ ROS 2 ใช้เห็นภาพได้เร็วที่สุด
เปิด 3 terminal (ทุกอันต้อง source /opt/ros/humble/setup.bash ก่อน)
terminal 1 — เปิดหน้าต่างเต่า
ros2 run turtlesim turtlesim_node
terminal 2 — คุมด้วยปุ่มลูกศร
ros2 run turtlesim turtle_teleop_key
กดลูกศรแล้วเต่าจะขยับ (ต้องคลิกให้ terminal นี้ทำงานอยู่)
terminal 3 — แอบดูข้อมูลที่ไหลอยู่
ros2 topic echo /turtle1/cmd_vel
กดลูกศรอีกครั้ง จะเห็นข้อมูลไหลออกมาแบบนี้
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
Tip
นี่คือความสามารถที่สำคัญที่สุดของ ROS 2 — คุณเพิ่งแอบดูข้อมูลระหว่าง 2 โปรแกรม โดยไม่ได้แก้โค้ดทั้งคู่ และไม่ได้หยุดมันด้วย
ตอนหุ่นจริงไม่ขยับ คำสั่งนี้คือคำสั่งแรกที่ควรใช้ — จะรู้ทันทีว่าคำสั่งถูกส่งออกมาไหม
รูปแบบของข้อความ
ข้อมูลข้างบนคือ message ชนิด geometry_msgs/msg/Twist — ดูรูปแบบเต็มได้ด้วย
ros2 interface show geometry_msgs/msg/Twist
Vector3 linear
Vector3 angular
linear.x คือความเร็วเดินหน้า (เมตร/วินาที) · angular.z คือความเร็วหมุน (เรเดียน/วินาที)
Note
Twist คือชนิดเดียวกับที่ใช้สั่งหุ่น AGV จริง ๆ ผ่าน topic ชื่อ /cmd_vel
เต่าตัวนี้กับหุ่นหนัก 200 กก. รับคำสั่งรูปแบบเดียวกันเป๊ะ
ข้อนี้มีประโยชน์จริง — โค้ดที่เขียนคุมเต่าได้ เอาไปคุมหุ่นจริงได้โดยแทบไม่ต้องแก้
ดูว่าใครคุยกับใคร
ros2 node list
/turtlesim
/teleop_turtle
ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
ดูรายละเอียดของ topic เดียว — ใครส่ง ใครรับ กี่ตัว
ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1
Important
Publisher count: 0 คือเบาะแสสำคัญ แปลว่าไม่มีใครส่งข้อมูลเข้า topic นี้เลย
ต่อให้ชื่อ topic โผล่ใน ros2 topic list ก็ตาม
เจอบ่อยตอน node ที่ควรส่งยังไม่ได้เปิด หรือเปิดแล้วแต่พังตั้งแต่ตอนเริ่ม
กับดัก — ชื่อไม่ตรงกัน
ความผิดพลาดที่พบมากที่สุดของคนเพิ่งเริ่ม คือ สะกดชื่อ topic ไม่ตรงกัน
node หนึ่งส่งเข้า /cmd_vel อีก node รอฟัง /cmd_vel_nav — ทั้งคู่ทำงานปกติ
ไม่มี error ไม่มีคำเตือน แต่ข้อมูลไม่ถึงกันชั่วนิรันดร์
ตรวจด้วย ros2 topic list แล้วดูว่ามีชื่อแปลก ๆ ที่ไม่ควรมีโผล่มาไหม
ถ้ามี /cmd_vel และ /cmd_vel_nav อยู่ด้วยกันทั้งที่ควรมีตัวเดียว แปลว่าสะกดพลาด
ก่อนหน้า: 2. ติดตั้ง · ต่อไป: 4. เครื่องมือบรรทัดคำสั่ง