Atlas Robotics
ROS2 cơ bảnCơ bản

ROS2 là gì? Framework middleware cho robot

Atlasbot · 16/8/2026 · 10 phút đọc

ROS2 là gì? Framework middleware cho robot
ROS2 là mạng lưới node phân tán, không có "trạm trung tâm"

Cái tên "Robot Operating System" (ROS) khiến nhiều người mới nhầm tưởng đây là một hệ điều hành thay thế Linux/Windows — thực ra không phải vậy. ROS2 chạy trên Ubuntu như một phần mềm bình thường, đóng vai trò middleware: lớp trung gian giúp hàng chục tiến trình độc lập trên robot (đọc LiDAR, chạy SLAM, điều khiển động cơ, tính đường đi...) nói chuyện được với nhau theo một chuẩn thống nhất.

Khái niệm chính

Một hệ thống robot thực tế không chạy trong một chương trình duy nhất — nó là tập hợp nhiều node (tiến trình nhỏ, mỗi node làm đúng một việc), cần trao đổi dữ liệu liên tục với nhau. ROS2 cung cấp sẵn:

  • Cơ chế giao tiếp chuẩn hoá giữa các node (topic, service, action — xem các bài riêng)
  • Công cụ dòng lệnh để quan sát/debug hệ thống đang chạy (ros2 topic list, ros2 node list...)
  • Hệ sinh thái package có sẵn khổng lồ: Nav2 (điều hướng), SLAM Toolbox/Cartographer (dựng bản đồ), driver cho hầu hết LiDAR/camera/động cơ phổ biến
  • Hỗ trợ đa ngôn ngữ (C++ qua rclcpp, Python qua rclpy) — các node viết bằng ngôn ngữ khác nhau vẫn giao tiếp bình thường

ROS2 khác ROS1 ở điểm nào

Khác biệt lớn nhất: ROS1 cần một tiến trình trung tâm gọi là roscore — mọi node phải đăng ký qua đó mới tìm thấy nhau, nếu roscore chết thì cả hệ thống mất kết nối. ROS2 bỏ hẳn khái niệm này, chuyển sang mô hình phân tán (decentralized) dựa trên DDS (Data Distribution Service — xem bài riêng): các node tự "quảng bá" sự tồn tại của mình trên mạng, không phụ thuộc một điểm chết duy nhất.

Tóm lại: ROS2 là bộ công cụ + giao thức giao tiếp chuẩn hoá cho phần mềm robot, không phải hệ điều hành — chạy trên Ubuntu, giúp nhiều node độc lập phối hợp thành một hệ thống hoàn chỉnh mà không cần một "trạm trung tâm" duy nhất.

Nguyên lý hoạt động

     ┌──────────────┐        topic         ┌──────────────┐
     │  Node LiDAR  │ ───────────────────► │  Node SLAM   │
     └──────────────┘                       └──────┬───────┘
                                                     │ topic (bản đồ)
                                                     ▼
     ┌──────────────┐        service        ┌──────────────┐
     │ Node điều    │ ◄─────────────────────│  Node Nav2   │
     │ khiển động cơ│                        └──────────────┘
     └──────────────┘

Mỗi mũi tên trên là một kết nối được thiết lập tự động khi hai node cùng "khai báo" quan tâm tới cùng một topic/service — không cần cấu hình địa chỉ IP hay port thủ công. Toàn bộ đồ thị giao tiếp này (gọi là ROS graph) có thể xem trực quan bằng lệnh rqt_graph, công cụ debug đầu tiên hầu như ai cũng dùng khi mới bắt đầu với ROS2.

Kiến thức kỹ thuật

Thông số

Các bản phát hành (distro) ROS2 phổ biến hiện tại và hệ điều hành tương ứng — luôn ưu tiên bản LTS (Long Term Support) cho dự án chạy dài hạn:

DistroUbuntuLoại phát hành
Humble Hawksbill22.04LTS (hỗ trợ 5 năm)
Iron Irwini22.04Chuẩn (hỗ trợ ~1.5 năm)
Jazzy Jalisco24.04LTS (hỗ trợ 5 năm)

ROS2 phát hành mỗi 6 tháng, bản LTS ra mỗi 2 năm — chọn đúng distro khớp phiên bản Ubuntu đang dùng là bước đầu tiên tránh hàng loạt lỗi cài đặt khó hiểu.

Protocol

Lớp giao tiếp thật sự bên dưới ROS2 là DDS (Data Distribution Service) — một chuẩn publish-subscribe công nghiệp của tổ chức OMG, vốn đã dùng lâu năm trong hàng không/quốc phòng trước khi ROS2 chọn làm nền tảng. ROS2 không tự viết DDS riêng mà dùng một lớp trừu tượng gọi là RMW (ROS Middleware interface) để "cắm" nhiều implementation DDS khác nhau vào cùng API — phổ biến nhất là Fast DDS (mặc định của eProsima), Cyclone DDS, và RTI Connext — đổi implementation DDS không cần sửa code ứng dụng, chỉ cần đổi biến môi trường RMW_IMPLEMENTATION.

Ứng dụng thực tế

Trong một AMR có nhiều máy tính onboard (VD: Jetson Orin Nano chạy nhận diện vật thể, máy tính công nghiệp chạy Nav2/SLAM), các node ROS2 chạy trên các máy khác nhau vẫn tự động "thấy nhau" và giao tiếp qua mạng Ethernet nội bộ nhờ cơ chế discovery của DDS — không cần lập trình viên tự viết code mở socket hay quản lý kết nối mạng thủ công, khác hẳn việc tự thiết kế giao thức mạng riêng cho từng loại dữ liệu (ảnh, LiDAR, lệnh điều khiển) nếu không dùng ROS2.

Ví dụ thực tế

# Terminal 1
$ ros2 run demo_nodes_cpp talker
# Terminal 2
$ ros2 run demo_nodes_py listener
Output (Terminal 1 - talker):
[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'

Output (Terminal 2 - listener):
[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [listener]: I heard: [Hello World: 2]

Hai node này là ví dụ demo có sẵn trong ROS2 — chạy độc lập, không "biết" nhau khi khởi động, nhưng tự động kết nối qua DDS ngay khi cả hai cùng chạy trên cùng mạng. Đây là minh chứng trực quan nhất cho mô hình phân tán đã nói ở phần Nguyên lý hoạt động.

Lỗi thường gặp

  • Quên source file setup.bash trước khi chạy lệnh ROS2 — mỗi terminal mới cần chạy source /opt/ros/<distro>/setup.bash (và source install/setup.bash cho workspace riêng) trước khi các lệnh ros2/package tự viết hoạt động — quên bước này gây lỗi "command not found" hoặc "package not found" dù code hoàn toàn đúng.
  • Xung đột ROS_DOMAIN_ID giữa nhiều robot trên cùng mạng — mặc định mọi node dùng chung domain ID 0, khiến 2 robot khác nhau trên cùng mạng WiFi vô tình "thấy" và nhận nhầm dữ liệu của nhau — luôn đặt ROS_DOMAIN_ID riêng biệt cho từng robot khi vận hành nhiều robot cùng lúc.
  • Nhầm lẫn khái niệm/lệnh giữa ROS1 và ROS2 — tài liệu/tutorial cũ trên mạng vẫn còn rất nhiều nói về ROS1 (roscore, rosrun, catkin) — dùng nhầm lệnh ROS1 trong môi trường ROS2 sẽ không hoạt động, luôn kiểm tra tài liệu ghi rõ ROS1 hay ROS2.
  • DDS discovery không hoạt động qua VPN/router phức tạp — cơ chế discovery mặc định dựa trên multicast, không phải mọi mạng (đặc biệt VPN hoặc mạng doanh nghiệp có cấu hình chặn multicast) đều cho phép — cần cấu hình DDS discovery server hoặc unicast riêng cho các trường hợp mạng phức tạp.

Kết luận

ROS2 là middleware, không phải hệ điều hành — vai trò của nó là chuẩn hoá cách các node độc lập trên robot giao tiếp, dựa trên nền tảng DDS phân tán không cần trạm trung tâm. Hiểu đúng vai trò này giúp tránh nhầm lẫn phổ biến nhất khi mới tiếp cận ROS2. Bài tiếp theo trong chuyên mục nói về Workspace — nơi tổ chức code nguồn trước khi biên dịch thành các package ROS2 chạy được.

ROS2 là gì? Framework middleware cho robot — Atlasbot