Atlas Robotics
IMUCơ bản

Accelerometer là gì? Đo gia tốc và suy ra góc nghiêng

Atlasbot · 18/8/2026 · 11 phút đọc

Accelerometer là gì? Đo gia tốc và suy ra góc nghiêng
Accelerometer đo gia tốc theo 3 trục, dùng trọng lực để ước lượng góc nghiêng

Accelerometer (gia tốc kế) là một trong hai cảm biến chính bên trong IMU (đã học ở bài IMU là gì?), đo gia tốc theo 3 trục X, Y, Z. Nghe có vẻ trừu tượng, nhưng ứng dụng phổ biến nhất trong robot lại rất trực quan: dùng trọng lực để biết robot đang nghiêng bao nhiêu độ.

Khái niệm chính

Ngay cả khi đứng yên hoàn toàn, accelerometer vẫn đo được giá trị khoảng 9.8 m/s² (1g) theo trục thẳng đứng — đó chính là gia tốc trọng trường. Khi robot nghiêng, thành phần trọng lực này "chia" ra giữa các trục theo tỷ lệ phụ thuộc góc nghiêng, cho phép tính ngược lại góc nghiêng bằng lượng giác.

Nguyên lý hoạt động

Khi đứng thẳng:  trục Z ≈ 9.8 m/s²,  trục X, Y ≈ 0
Khi nghiêng θ:   trọng lực chia ra cả trục Z và trục nghiêng theo cos(θ)/sin(θ)

Cách tính góc nghiêng này chỉ chính xác khi robot đứng yên hoặc di chuyển đều — nguyên lý dựa vào giả định gia tốc đo được chỉ đến từ trọng lực. Khi robot tăng/giảm tốc, rung động do mặt sàn gồ ghề, hay va chạm nhẹ, accelerometer đo luôn cả gia tốc chuyển động thật lẫn trọng lực lẫn vào nhau — khiến góc nghiêng tính ra bị nhiễu, dao động liên tục dù robot không hề nghiêng thêm.

Đây là lý do accelerometer hiếm khi dùng một mình để tính góc nghiêng trong thực tế — thường kết hợp với gyroscope (đo vận tốc góc, không bị ảnh hưởng bởi rung động tuyến tính, học ở bài tiếp theo) qua bộ lọc như Complementary Filter hoặc Kalman Filter để lấy ưu điểm của cả hai: gyroscope chính xác tức thời nhưng trôi dần theo thời gian (drift), accelerometer không bị trôi nhưng nhiễu khi rung — kết hợp lại triệt tiêu nhược điểm của nhau.

Kiến thức kỹ thuật

Công thức

Góc nghiêng (pitch/roll) tính từ 3 thành phần gia tốc, dùng hàm atan2 để xử lý đúng cả 4 góc phần tư:

roll  = atan2(gia_toc_Y, gia_toc_Z)
pitch = atan2(-gia_toc_X, √(gia_toc_Y² + gia_toc_Z²))

VD: robot nghiêng về phía trước, đo được ax=-3.4, ay=0.1, az=9.2 (m/s²)
pitch = atan2(3.4, √(0.1² + 9.2²)) = atan2(3.4, 9.2) ≈ 0.353 rad ≈ 20.2°

Dùng atan2 thay vì atan đơn thuần vì atan2 xử lý đúng dấu và tránh chia cho 0 khi một trong hai thành phần bằng 0 — lỗi phổ biến khi mới viết code tính góc từ gia tốc.

Thông số

Dải đo (full scale)Độ nhạy tương ứng (MPU6050)Phù hợp
±2g16384 LSB/gChuyển động chậm, cần độ chính xác cao
±8g4096 LSB/gRobot di chuyển bình thường
±16g2048 LSB/gVa chạm/rung động mạnh

Ứng dụng thực tế

Trong kiến trúc AMR thực tế (đã học ở bài IMU trong AMR), dữ liệu accelerometer không dùng độc lập để tính góc nghiêng liên tục — vai trò chính của nó trong EKF là cung cấp một nguồn tham chiếu "không trôi" để bù cho hiện tượng drift của gyroscope (bài tiếp theo), và để phát hiện va chạm/rung động bất thường (dùng ngưỡng gia tốc đột biến để kích hoạt cảnh báo hoặc dừng khẩn cấp). Một ứng dụng khác ít được nhắc tới: đặt ngưỡng trên độ lớn tổng hợp √(ax²+ay²+az²) để phát hiện robot bị nhấc bổng hoặc va chạm mạnh — giá trị này lệch hẳn khỏi 9.8 m/s² (1g) khi có ngoại lực bất thường tác động, khác hẳn dao động nhẹ do rung sàn thông thường.

Ví dụ thực tế

import math

def tinh_goc_nghieng(ax, ay, az):
    roll = math.atan2(ay, az)
    pitch = math.atan2(-ax, math.sqrt(ay**2 + az**2))
    return math.degrees(roll), math.degrees(pitch)

# Robot dung yen, hoi nghieng nhe ve mot ben
roll, pitch = tinh_goc_nghieng(ax=1.2, ay=2.1, az=9.5)
print(f"Roll: {roll:.1f}°, Pitch: {pitch:.1f}°")
Output:
Roll: 12.4°, Pitch: -7.2°

Trong thực tế vận hành, nếu đo giá trị này trong lúc robot đang tăng tốc đột ngột, kết quả sẽ dao động mạnh dù robot không hề nghiêng thêm — minh chứng trực tiếp cho hạn chế đã nêu ở phần Nguyên lý hoạt động, lý do cần kết hợp gyroscope qua bộ lọc.

Lỗi thường gặp

  • Dùng atan thay vì atan2 — như ở mục Công thức, gây lỗi chia cho 0 hoặc sai dấu góc khi một thành phần gia tốc bằng 0 hoặc âm.
  • Tin tưởng góc nghiêng tính từ accelerometer khi robot đang tăng/giảm tốc — như ví dụ trên, kết quả bị nhiễu bởi gia tốc chuyển động thật, không chỉ trọng lực.
  • Chọn dải đo (full scale) không phù hợp ứng dụng — dải ±2g quá hẹp cho robot có va chạm/rung mạnh (giá trị vượt dải bị cắt/bão hoà), dải ±16g quá thô cho ứng dụng cần độ nhạy cao ở chuyển động chậm.
  • Dùng accelerometer một mình cho ứng dụng cần góc nghiêng liên tục chính xác — bỏ qua việc kết hợp gyroscope qua bộ lọc, dẫn tới dữ liệu nhiễu không ổn định trong khi di chuyển.

Kết luận

Accelerometer cho biết hướng trọng lực, từ đó suy ra góc nghiêng bằng công thức atan2 — nhưng chỉ đáng tin khi robot đứng yên hoặc chuyển động rất đều. Bài tiếp theo về gyroscope sẽ giải thích cảm biến bù trừ cho nhược điểm này.

Accelerometer là gì? Đo gia tốc và suy ra góc nghiêng — Atlasbot