simulationros2tutorialamrgazeborosbag2debugsimulation

ROS 2 từ A đến Z (P7): Simulation, rosbag2 và Debug

Mô phỏng robot trong Gazebo Harmonic, ghi/replay dữ liệu bằng rosbag2 (MCAP), và bộ công cụ debug ROS 2 — bài kết của series cho người mới (Jazzy, 6/2026).

Nguyễn Anh Tuấn3 tháng 4, 20267 phút đọcCập nhật: 14 thg 6, 2026
ROS 2 từ A đến Z (P7): Simulation, rosbag2 và Debug

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.

Mô phỏng và debug robot trong ROS 2
Mô phỏng và debug robot trong ROS 2

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ùng gazebo hay roslaunch gazebo_ros đều đã lỗi thời. Bản mới là Gazebo Sim (trước gọi Ignition), cài qua ros_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 .mcap mở 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

  1. ros2 node list — node của tôi có chạy không? Không thấy → lỗi build/launch.
  2. ros2 topic list — topic có tồn tại không? Không → sai tên topic.
  3. ros2 topic hz /topic — có ai publish không? 0 Hz → publisher chết.
  4. ros2 topic echo /topic — nội dung message có đúng không? Sai → lỗi logic.
  5. 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 /scan vs /laser/scan) → không báo lỗi, chỉ là không có data. rqt_graph phơ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

NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Bài viết liên quan

Digital Twins và ROS 2: Simulation trong sản xuất
simulation

Digital Twins và ROS 2: Simulation trong sản xuất

3/4/202611 phút đọc
NT
Sim-to-Real Pipeline: Từ training đến robot thật
simulation

Sim-to-Real Pipeline: Từ training đến robot thật

2/4/202615 phút đọc
NT
Bắt đầu với MuJoCo: Cài đặt đến mô phỏng robot đầu tiên
simulation

Bắt đầu với MuJoCo: Cài đặt đến mô phỏng robot đầu tiên

30/3/202611 phút đọc
NT