Hiệu chuẩn IMU (IMU Calibration): loại bỏ sai số hệ thống
Atlasbot · 18/8/2026 · 11 phút đọc
Đặt một IMU nằm yên hoàn toàn trên bàn, gyroscope lẽ ra phải báo vận tốc góc = 0 trên cả 3 trục — nhưng thực tế luôn có một giá trị lệch nhỏ, gọi là bias (sai số hệ thống, offset). Nếu không loại bỏ bias này, robot sẽ "tưởng" mình đang quay dù đang đứng yên — dẫn tới odometry hoặc dữ liệu giữ thăng bằng sai lệch tích luỹ dần theo thời gian (đúng vấn đề drift đã học ở bài Gyroscope là gì?).
Khái niệm chính
IMU giá rẻ (loại MEMS như MPU6050) sản xuất hàng loạt luôn có sai số nhỏ giữa các chip khác nhau — không con chip nào cho giá trị 0 tuyệt đối khi đứng yên hoàn toàn, dù cùng model. Ngoài ra, bias còn thay đổi nhẹ theo nhiệt độ môi trường, nghĩa là hiệu chuẩn lúc sáng có thể hơi lệch so với buổi trưa nắng nóng.
Nguyên lý hoạt động
Cách đơn giản và phổ biến nhất: giữ IMU hoàn toàn đứng yên vài giây khi khởi động, đọc nhiều mẫu liên tiếp, tính trung bình — giá trị trung bình này chính là bias, trừ đi mỗi lần đọc dữ liệu sau đó.
const int SAMPLES = 200;
float gyroZ_bias = 0;
void calibrateGyro() {
long sum = 0;
for (int i = 0; i < SAMPLES; i++) {
int16_t gz = mpu.getRotationZ();
sum += gz;
delay(5);
}
gyroZ_bias = sum / (float)SAMPLES; // giá trị lệch khi đứng yên
}
void loop() {
int16_t raw = mpu.getRotationZ();
float gyroZ_calibrated = raw - gyroZ_bias; // trừ bias trước khi dùng
}
Lưu ý quan trọng: robot phải đứng hoàn toàn yên trong lúc hiệu chuẩn — nếu bị rung động hoặc di chuyển nhẹ trong lúc lấy mẫu, bias tính ra sẽ sai, khiến dữ liệu sau đó còn lệch nhiều hơn cả khi không hiệu chuẩn.
Với accelerometer, cách tương tự nhưng phức tạp hơn một chút — cần đặt cảm biến ở 6 hướng khác nhau (mỗi trục hướng lên và hướng xuống) để tách riêng được bias khỏi giá trị trọng lực thật, thay vì chỉ đo ở một tư thế như gyroscope.
Kiến thức kỹ thuật
Công thức
Số mẫu lấy trung bình ảnh hưởng trực tiếp độ chính xác của bias tính được — nhiều mẫu hơn giảm nhiễu ngẫu nhiên trong ước lượng bias, theo quy luật thống kê cơ bản:
Sai_số_ước_lượng_bias ∝ Độ_lệch_chuẩn_nhiễu / √(Số_mẫu)
VD: độ lệch chuẩn nhiễu gyroscope ~2 LSB, lấy 200 mẫu
Sai_số_ước_lượng_bias ≈ 2/√200 ≈ 0.14 LSB (khá nhỏ, đủ tốt)
Lấy 20 mẫu thay vì 200:
Sai_số_ước_lượng_bias ≈ 2/√20 ≈ 0.45 LSB (kém chính xác hơn ~3 lần)
→ Tăng số mẫu giúp cải thiện nhưng theo quy luật căn bậc hai (giảm dần
hiệu quả) — tăng gấp 4 lần số mẫu chỉ giảm sai số đi 2 lần, không phải 4 lần
Thông số
| Cảm biến | Số tư thế cần | Độ phức tạp hiệu chuẩn |
|---|---|---|
| Gyroscope | 1 (đứng yên bất kỳ hướng nào) | Thấp |
| Accelerometer | 6 (mỗi trục hướng lên/xuống) | Cao hơn, cần tách bias khỏi trọng lực |
Ứng dụng thực tế
Hiệu chuẩn IMU là bước chuẩn bị bắt buộc trước khi dùng dữ liệu cho EKF trong kiến trúc AMR thực tế (đã học ở bài IMU trong AMR) — bias chưa hiệu chuẩn sẽ khiến ngay cả thuật toán fusion tốt nhất cũng cho kết quả sai có hệ thống, vì EKF chỉ xử lý được nhiễu ngẫu nhiên, không tự động phát hiện và loại bỏ được sai số hệ thống (bias) nếu không được hiệu chuẩn trước khi đưa vào bộ lọc.
Ví dụ thực tế
import numpy as np
def hieu_chuan_gyro(mau_du_lieu):
return np.mean(mau_du_lieu)
# Mo phong 200 mau gyro Z khi dung yen, co nhieu ngau nhien quanh bias thuc = 15
np.random.seed(42)
mau = np.random.normal(loc=15, scale=2, size=200)
bias_uoc_luong = hieu_chuan_gyro(mau)
print(f"Bias uoc luong: {bias_uoc_luong:.2f} (gia tri thuc: 15.0)")
# Ap dung bias vao du lieu moi
gia_tri_moi_raw = 18
gia_tri_da_hieu_chuan = gia_tri_moi_raw - bias_uoc_luong
print(f"Gia tri sau hieu chuan: {gia_tri_da_hieu_chuan:.2f}")
Output:
Bias uoc luong: 14.87 (gia tri thuc: 15.0)
Gia tri sau hieu chuan: 3.13
Bias ước lượng (14.87) rất gần giá trị thực (15.0) nhờ lấy trung bình 200 mẫu — đúng nguyên tắc đã tính ở mục Công thức, sai số ước lượng nhỏ dần theo căn bậc hai số mẫu.
Lỗi thường gặp
- Hiệu chuẩn khi robot không đứng hoàn toàn yên — như đã nêu ở phần Nguyên lý hoạt động, bias tính sai khiến dữ liệu sau đó lệch nhiều hơn cả khi không hiệu chuẩn.
- Lấy quá ít mẫu để tiết kiệm thời gian khởi động — như tính ở mục Công thức, giảm số mẫu làm tăng sai số ước lượng bias theo quy luật căn bậc hai, cần cân bằng giữa thời gian khởi động và độ chính xác.
- Chỉ hiệu chuẩn gyroscope mà bỏ qua accelerometer — accelerometer cũng có bias cần hiệu chuẩn (dù phức tạp hơn, cần 6 tư thế), bỏ qua khiến ước lượng góc nghiêng (bài Accelerometer là gì?) vẫn sai lệch có hệ thống.
- Hiệu chuẩn một lần rồi dùng mãi mãi không cập nhật lại — bias thay đổi nhẹ theo nhiệt độ, với ứng dụng cần độ chính xác cao nên hiệu chuẩn lại định kỳ hoặc ít nhất mỗi lần khởi động robot.
Kết luận
Hiệu chuẩn IMU là bước đơn giản nhưng dễ bị bỏ qua khi mới bắt đầu — chỉ vài dòng code lấy trung bình lúc đứng yên đã loại bỏ được phần lớn sai số hệ thống, giúp dữ liệu gyroscope/accelerometer đáng tin cậy hơn hẳn cho các bước tiếp theo như tính odometry hay giữ thăng bằng. Đây là bài cuối của chuyên mục IMU — chuyên mục Computer Vision/AI tiếp theo đi vào tầng xử lý cao hơn: từ khung hình camera thô tới nhận diện vật thể bằng AI.