Bạn đã đi hết hành trình: cài đặt (P1), giao tiếp (P2), cấu hình (P3), mô tả robot (P4), điều khiển phần cứng (P5), và tự hành (P6). Bài cuối này là ba kỹ năng giúp bạn làm việc hiệu quả mỗi ngày: Simulation (test không cần robot thật), rosbag2 (ghi/replay dữ liệu), và Debug (tìm lỗi nhanh).
Phiên bản (6/2026): ROS 2 Jazzy (Ubuntu 24.04). Quan trọng: Gazebo Classic đã EOL — dùng Gazebo mới (Harmonic) với lệnh
gz sim. rosbag2 trên Jazzy mặc định lưu định dạng MCAP.
1. Simulation — test robot mà không cần phần cứng
Mua robot thật đắt và dễ hỏng khi code còn bug. Simulation cho bạn một robot ảo với vật lý thật (trọng lực, ma sát, va chạm) để thử thuật toán an toàn. Hệ mô phỏng mặc định của ROS 2 là Gazebo (bản mới tên Harmonic, lệnh gz sim).
Cài đặt Gazebo Harmonic + bridge
# Gazebo mới + cầu nối ROS 2 ↔ Gazebo
sudo apt install -y ros-jazzy-ros-gz
# Kiểm tra
gz sim --version
Lưu ý quan trọng:
gazebo_ros_pkgs(Gazebo Classic) không còn trên Jazzy. Mọi tutorial cũ dùnggazebohayroslaunch gazebo_rosđều đã lỗi thời. Bản mới là Gazebo Sim (trước gọi Ignition), cài quaros_gz.
ros_gz bridge — nối ROS 2 với Gazebo
Gazebo và ROS 2 là hai hệ riêng. ros_gz_bridge dịch message giữa chúng — ví dụ đưa /cmd_vel (ROS) vào Gazebo, và đưa /scan (LiDAR ảo trong Gazebo) ra ROS:
# Cầu nối topic cmd_vel: ROS Twist ↔ Gazebo Twist
ros2 run ros_gz_bridge parameter_bridge \
/cmd_vel@geometry_msgs/msg/[email protected]
Trong launch file (cách thực tế), spawn robot từ URDF vào Gazebo:
# launch/sim.launch.py (rút gọn)
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
# Mở Gazebo với một world trống
# (gz sim -r empty.sdf — chạy ngầm qua ros_gz_sim launch)
# Spawn robot từ topic /robot_description vào Gazebo
Node(
package='ros_gz_sim', executable='create',
arguments=['-topic', 'robot_description', '-name', 'my_robot'],
),
# Bridge các topic cần thiết
Node(
package='ros_gz_bridge', executable='parameter_bridge',
arguments=[
'/cmd_vel@geometry_msgs/msg/[email protected]',
'/scan@sensor_msgs/msg/[email protected]',
],
),
])
Cách nhanh nhất để thấy Nav2 chạy trong sim mà không tự dựng world: dùng package demo đã đóng gói sẵn ở Phần 6 (nav2-minimal-tb3-sim).
Các lựa chọn sim khác (6/2026): Ngoài Gazebo còn có Webots (miễn phí, dễ cho người mới), NVIDIA Isaac Sim (đồ hoạ đẹp, dùng nhiều cho AI/RL, cần GPU mạnh), và MuJoCo (vật lý chính xác cho RL). Người mới nên bắt đầu với Gazebo hoặc Webots vì tích hợp ROS 2 sẵn.
2. rosbag2 — "hộp đen" của robot
rosbag2 ghi lại mọi message trên các topic, rồi phát lại y hệt sau này. Đây là công cụ vô giá: chạy robot thật một lần, ghi data, rồi về nhà replay để debug thuật toán hàng trăm lần mà không cần robot.
# Ghi TẤT CẢ topic
ros2 bag record -a -o my_session
# Ghi chỉ vài topic cần thiết
ros2 bag record /scan /odom /cmd_vel -o nav_test
# Xem thông tin file bag
ros2 bag info my_session
# Phát lại (replay) — các node khác nhận data như robot đang chạy thật
ros2 bag play my_session
# Phát lại chậm 0.5x để quan sát kỹ
ros2 bag play my_session --rate 0.5
Mới (Jazzy, 6/2026): rosbag2 mặc định dùng định dạng MCAP (thay SQLite cũ) — nhanh hơn, nhỏ hơn, đọc được bằng nhiều công cụ ngoài (Foxglove, PlotJuggler). File
.mcapmở trực tiếp trong Foxglove để xem trực quan.
Ứng dụng thực tế của rosbag2:
- Debug lỗi hiếm: robot thỉnh thoảng đâm tường — ghi liên tục, khi xảy ra thì có data để mổ xẻ.
- Test hồi quy: replay cùng một bag qua thuật toán cũ và mới để so sánh.
- Thu data train AI: ghi sensor + action làm dataset cho imitation learning.
Đọc bag bằng code (Python) để phân tích:
# Đọc bag bằng rosbag2_py
import rosbag2_py
from rclpy.serialization import deserialize_message
from sensor_msgs.msg import LaserScan
reader = rosbag2_py.SequentialReader()
reader.open(
rosbag2_py.StorageOptions(uri='nav_test', storage_id='mcap'),
rosbag2_py.ConverterOptions('', ''))
while reader.has_next():
topic, data, t = reader.read_next()
if topic == '/scan':
msg = deserialize_message(data, LaserScan)
print(f'{t}: {len(msg.ranges)} tia LiDAR')
3. Debug — bộ công cụ tìm lỗi ROS 2
Khi robot "không chịu chạy", đây là quy trình kiểm tra từ đơn giản đến sâu.
CLI — kiểm tra nhanh
# Kiểm tra sức khoẻ toàn hệ thống ROS 2
ros2 doctor
# Liệt kê node / topic đang chạy
ros2 node list
ros2 topic list
# Topic này có ai publish không? Tần số bao nhiêu?
ros2 topic hz /scan # tần số (Hz)
ros2 topic bw /scan # băng thông
ros2 topic echo /cmd_vel # in nội dung message
# Node này kết nối gì?
ros2 node info /controller_manager
rqt — công cụ đồ hoạ
# Xem đồ thị node ↔ topic (ai nói chuyện với ai)
rqt_graph
# Xem log nhiều màu, lọc theo node/level
ros2 run rqt_console rqt_console
# Vẽ đồ thị dữ liệu theo thời gian (vd vận tốc)
ros2 run rqt_plot rqt_plot
rqt_graph là công cụ debug số một cho người mới: nếu topic không nối giữa hai node, bạn thấy ngay — thường là do sai tên topic hoặc quên remap (gặp ở Phần 3).
Logging trong code
Đặt mức log để in nhiều/ít thông tin:
# Python — đổi mức log
self.get_logger().debug('Chi tiết chỉ hiện khi bật DEBUG')
self.get_logger().info('Thông tin bình thường')
self.get_logger().warn('Cảnh báo')
self.get_logger().error('Lỗi')
# Chạy node với mức log DEBUG
ros2 run my_pkg my_node --ros-args --log-level debug
Quy trình debug 5 bước cho người mới
ros2 node list— node của tôi có chạy không? Không thấy → lỗi build/launch.ros2 topic list— topic có tồn tại không? Không → sai tên topic.ros2 topic hz /topic— có ai publish không? 0 Hz → publisher chết.ros2 topic echo /topic— nội dung message có đúng không? Sai → lỗi logic.rqt_graph— kết nối có đúng không? Đứt → quên remap.
Lỗi "im lặng" phổ biến nhất: hai node publish/subscribe khác tên topic (vd
/scanvs/laser/scan) → không báo lỗi, chỉ là không có data.rqt_graphphơi bày ngay.
Tổng kết series ROS 2 từ A đến Z
Qua 7 phần, bạn đã đi từ con số 0 đến một bộ kỹ năng ROS 2 thực chiến:
| Phần | Bạn học được |
|---|---|
| P1 | Cài đặt Jazzy, node publisher/subscriber đầu tiên |
| P2 | Topics, Services, Actions |
| P3 | Parameters, Launch, Lifecycle |
| P4 | TF2, URDF, RViz2 |
| P5 | ros2_control, hardware interface C++ |
| P6 | Nav2 — robot tự hành |
| P7 | Simulation, rosbag2, Debug |
Bước tiếp theo của bạn? Chọn một project nhỏ — vd một AMR diff-drive trong Gazebo chạy Nav2 — và ghép tất cả lại. Khi kẹt, quay về đúng phần tương ứng. Học ROS 2 không phải đọc cho hết, mà là build cho chạy được. Chúc bạn build vui!
Bài viết liên quan
- ROS 2 từ A đến Z (P6): Nav2 — Robot tự hành — Chạy Nav2 trong sim ở bài này
- ROS 2 từ A đến Z (P1): Cài đặt và Node đầu tiên — Quay lại điểm bắt đầu
- Giới thiệu ROS 2: Nền tảng lập trình robot thế hệ mới — Tổng quan kiến trúc ROS 2
