Atlas Robotics
Bài 5/6 · khoảng 8 phút

Công cụ debug TF

Ba công cụ dùng xuyên suốt mọi module sau khi làm việc với TF: static_transform_publisher (publish một transform tĩnh không cần viết code), view_frames (vẽ toàn bộ cây TF hiện tại ra file), tf2_echo (xem giá trị một transform theo thời gian thực).

static_transform_publisher — publish tĩnh không cần viết code

Publish một lần lên /tf_static, hợp cho quan hệ cố định vĩnh viễn (ví dụ cảm biến gắn cứng trên khung robot, không có khớp chuyển động). Đây chính xác là cách demo_tf.launch.py tạo ra static_frame:

ros2 run tf2_ros static_transform_publisher \
  --x 1.0 --y 0.0 --z 0.5 --frame-id world --child-frame-id static_frame

Không cần viết TransformBroadcaster tay cho những trường hợp tĩnh đơn giản như thế này.

Phân biệt động và tĩnh, ngay trên dữ liệu thật

Hai lệnh tf2_echo dưới đây chạy trên 2 transform của chính demo_tf.launch.py: một động, một tĩnh.

view_frames — vẽ cả cây ra file

Nghe /tf + /tf_static trong 5 giây, xuất ra file PDF vẽ cây TF hiện có, kèm tần số publish từng frame — hữu ích để phát hiện frame nào "chết" (tần số 0 hoặc không xuất hiện trong cây):

ros2 run tf2_tools view_frames

RViz — cách trực quan nhất

Display TF trong RViz (bật/tắt từng frame, xem trực quan trục XYZ) là cách trực quan nhất để "nhìn thấy" cây TF đang chuyển động, thay vì đọc số trong terminal.

Thử ngay

Cần 2 terminal (đã source install/setup.bash, xem Module 0):

# Terminal 1 — để chạy, đừng tắt
ros2 launch ros2_basics demo_tf.launch.py
# Terminal 2 — tự thoát sau 5 giây, mở PDF vừa xuất ra để đối chiếu
ros2 run tf2_tools view_frames
# Terminal 2 — số liệu đổi liên tục: frame ĐỘNG. Ctrl+C để dừng
ros2 run tf2_ros tf2_echo world moving_frame
# Terminal 2 — số liệu KHÔNG đổi: frame TĨNH. Ctrl+C để dừng
ros2 run tf2_ros tf2_echo world static_frame

Ví dụ trong dự án Atlas

Từ Module 4 trở đi, đây là bộ lệnh đầu tiên chạy mỗi khi robot "không đứng đúng chỗ" trong RViz hay Nav2 báo lỗi TF:

ros2 run tf2_tools view_frames                     # cây TF thật của Atlas có đủ frame chưa?
ros2 run tf2_ros tf2_echo map base_link             # robot đang ở đâu trên bản đồ?
ros2 run tf2_ros tf2_echo odom base_link            # có đang trôi bất thường không?

Đây không phải lệnh học cho biết — đã tự dùng tf2_echo/view_frames để debug thật trong quá trình xây atlas_control/atlas_slam, ví dụ xác nhận diff_drive_controller có publish đúng odom→base_footprint hay không trước khi nghi ngờ tới AMCL.