Vòng lặp điều khiển robot: Sense - Think - Act
Atlasbot · 26/6/2026 · 11 phút đọc
Dù là robot hút bụi 500 nghìn đồng hay AMR công nghiệp vài trăm triệu, gần như mọi hệ thống điều khiển robot đều chạy theo cùng một mô hình gốc: Sense → Think → Act (Cảm biến → Xử lý → Điều khiển), lặp lại liên tục hàng chục đến hàng trăm lần mỗi giây.
Khái niệm chính
Sense (Cảm biến): đọc dữ liệu thô từ phần cứng — giá trị encoder, gia tốc từ IMU, khoảng cách từ cảm biến siêu âm/LiDAR. Đây là bước "nhìn vào thế giới thực".
Think (Xử lý): từ dữ liệu cảm biến, tính toán ra quyết định — có vật cản phía trước không, cần rẽ trái hay đi thẳng, tốc độ động cơ cần tăng hay giảm bao nhiêu. Bước này chứa các thuật toán như PID, path planning, hoặc đơn giản chỉ là vài câu lệnh so sánh.
Act (Điều khiển): gửi lệnh xuống cơ cấu chấp hành — set PWM cho driver động cơ, bật/tắt relay. Đây là bước duy nhất thực sự tác động ngược lại thế giới vật lý.
Sau bước Act, thế giới thực thay đổi (robot đã di chuyển một chút), vòng lặp quay lại bước Sense để đọc trạng thái mới.
Nguyên lý hoạt động
Cách dễ nhất để cảm nhận mô hình này là nhìn vào một đoạn giả mã cho robot né vật cản bằng một cảm biến siêu âm phía trước:
loop (chạy ở tần số cố định, ví dụ 50Hz):
# Sense
distance = doc_cam_bien_sieu_am()
# Think
if distance < NGUONG_AN_TOAN:
lenh = "RE_PHAI"
else:
lenh = "DI_THANG"
# Act
gui_lenh_toi_driver_dong_co(lenh)
doi_den_chu_ky_tiep_theo()
Tần số vòng lặp (loop rate) quyết định robot "phản ứng nhanh" đến mức nào. Nếu vòng lặp chạy ở 10Hz, robot chỉ cập nhật quyết định mỗi 100ms một lần — với robot di chuyển 1 m/s, nghĩa là nó có thể đi thêm 10cm trước khi kịp phản ứng với vật cản mới xuất hiện.
Kiến thức kỹ thuật
Công thức
Tổng quát hoá ví dụ trên thành công thức khoảng cách phản ứng (reaction distance) — quãng đường robot đi được trong khoảng thời gian "mù" giữa 2 lần cập nhật vòng lặp:
Khoang_cach_phan_ung = Toc_do_robot × Chu_ky_vong_lap
= Toc_do_robot / Tan_so_vong_lap
VD: robot 1.5 m/s, vòng lặp tránh vật cản chạy 20Hz (chu kỳ 50ms)
Khoảng cách phản ứng = 1.5 × 0.05 = 0.075m = 7.5cm
VD: cùng tốc độ, hạ tần số xuống 5Hz (chu kỳ 200ms)
Khoảng cách phản ứng = 1.5 × 0.2 = 0.3m = 30cm — tệ hơn 4 lần
Thông số
Một hệ thống robot hoàn chỉnh thực chất là nhiều vòng lặp Sense-Think-Act lồng nhau, mỗi vòng chạy ở tần số phù hợp với bản chất công việc:
| Tầng vòng lặp | Tần số điển hình | Chạy ở đâu |
|---|---|---|
| PID tốc độ/vị trí động cơ | 500Hz – 1kHz | MCU (cần độ trễ thấp, xác định) |
| Tránh vật cản cục bộ | 10 – 50Hz | MCU hoặc MPU |
| Nhận diện vật thể/AI thị giác | 10 – 30Hz | MPU có GPU (Jetson) |
| Lập kế hoạch đường đi toàn cục | ~1Hz hoặc khi có thay đổi lớn | MPU chạy ROS2/Nav2 |
Ứng dụng thực tế
Công thức khoảng cách phản ứng ở trên là cơ sở tính toán an toàn thực tế: nếu cảm biến dừng khẩn cấp (bumper/LiDAR an toàn) chỉ phát hiện được vật cản trong phạm vi 20cm, và vòng lặp an toàn chạy ở tần số khiến khoảng cách phản ứng vượt quá 20cm ở tốc độ tối đa robot đang chạy, hệ thống không an toàn về mặt thiết kế — robot có thể đâm vào vật cản trước khi kịp phản ứng dù cảm biến và code đều "hoạt động đúng". Đây là lý do vòng lặp an toàn luôn cần chạy nhanh hơn nhiều so với vòng lặp logic thông thường, và tốc độ tối đa cho phép của robot phải được giới hạn dựa trên đúng phép tính này, không chỉ dựa vào khả năng cơ khí của động cơ.
Ví dụ thực tế
def khoang_cach_phan_ung(toc_do_ms, tan_so_hz):
chu_ky = 1 / tan_so_hz
return toc_do_ms * chu_ky
for f in [5, 10, 20, 50]:
d = khoang_cach_phan_ung(1.5, f)
print(f"Tan so {f}Hz -> khoang cach phan ung = {d*100:.1f}cm")
Output:
Tan so 5Hz -> khoang cach phan ung = 30.0cm
Tan so 10Hz -> khoang cach phan ung = 15.0cm
Tan so 20Hz -> khoang cach phan ung = 7.5cm
Tan so 50Hz -> khoang cach phan ung = 3.0cm
Tăng tần số vòng lặp gấp đôi luôn giảm đúng một nửa khoảng cách phản ứng — mối quan hệ tỷ lệ nghịch tuyến tính này là công cụ tính toán nhanh khi cần quyết định tần số vòng lặp an toàn tối thiểu cho một tốc độ robot cho trước.
Lỗi thường gặp
Khi robot "phản ứng chậm" hoặc "giật cục", nguyên nhân gần như luôn nằm ở một trong ba bước:
- Sense chậm hoặc bị block — cảm biến trả dữ liệu trễ, bị nhiễu (cần lọc, VD: moving average, Kalman filter), hoặc tệ hơn là code đọc cảm biến bị chặn (blocking I/O) khiến cả vòng lặp phải chờ — tương tự vấn đề "callback chặn executor" đã học ở chuyên mục ROS2, chỉ khác tầng ứng dụng.
- Think tốn thời gian — thuật toán xử lý quá nặng cho tần số vòng lặp yêu cầu (VD: chạy inference AI nặng ngay trong vòng lặp an toàn tần số cao) — cần tối ưu thuật toán hoặc tách ra chạy ở vòng lặp tần số thấp hơn riêng.
- Act có độ trễ — driver động cơ phản hồi chậm, hoặc giao tiếp giữa MCU và driver bị nghẽn (VD: dùng I2C/UART tốc độ thấp cho lệnh cần phản hồi tức thời).
- Không tính khoảng cách phản ứng khi chọn tốc độ tối đa robot — như đã nói ở mục Ứng dụng thực tế, đặt tốc độ tối đa mà không đối chiếu với tần số vòng lặp an toàn thực tế là lỗ hổng thiết kế nghiêm trọng, không phải lỗi code thông thường.
Kết luận
Nắm được mô hình Sense-Think-Act giúp khoanh vùng lỗi nhanh hơn nhiều so với mò từng dòng code — luôn tự hỏi "vấn đề đang ở bước nào?" trước khi debug sâu hơn, và luôn tính khoảng cách phản ứng khi thiết kế tốc độ/tần số cho vòng lặp an toàn. Bài tiếp theo trong chuyên mục đi sâu vào PID — thuật toán phổ biến nhất nằm trong bước "Think" của vòng điều khiển tốc độ động cơ.