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. เครื่องมือบรรทัดคำสั่ง