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.