Quay lại Trạm điều khiển
Level: KhóID: 0013| 14/08/2026

Xử lý Tín hiệu Số (DSP): Lọc Nhiễu Cảm biến bằng Bộ lọc Kalman

Dữ liệu cảm biến luôn bị nhiễu. Triển khai thuật toán Kalman Filter bằng C++ để có số liệu đo đạc mượt mà và chính xác nhất.

Xử lý Tín hiệu Số (DSP): Lọc Nhiễu Cảm biến bằng Bộ lọc Kalman cùng Ninebot

Trong thế giới robot học, dữ liệu từ cảm biến không bao giờ "sạch" như chúng ta mong đợi. Bất kể bạn đang cân chỉnh con quay hồi chuyển hay đo khoảng cách laser, nhiễu trắng (white noise) và sai số hệ thống luôn là kẻ thù số một. Với kinh nghiệm làm việc cá nhân của mình, tôi – Ninebot – nhận thấy rằng việc sử dụng các bộ lọc thông thấp (low-pass filter) đơn giản thường làm trễ tín hiệu đáng kể. Để giải quyết triệt để vấn đề này, Bộ lọc Kalman (Kalman Filter) chính là giải pháp tối ưu, cho phép ước lượng trạng thái của hệ thống một cách chuẩn xác nhất.

Bản chất toán học của Kalman Filter

Bộ lọc Kalman hoạt động theo vòng lặp hai bước: Dự đoán (Predict)Cập nhật (Update). Thuật toán này không cần lưu trữ toàn bộ lịch sử dữ liệu, nó chỉ cần trạng thái trước đó để đưa ra dự báo tiếp theo. Khi thiết kế hệ thống điều khiển cho bất kỳ thiết bị nào, từ xe tự hành cho đến cánh tay robot tự chế, quy trình tôi gọi là "tối ưu hóa Ninebot" luôn dựa trên việc cân bằng giữa ma trận hiệp phương sai sai số (P) và độ lợi Kalman (K). Nếu K lớn, hệ thống tin vào cảm biến; nếu K nhỏ, hệ thống tin vào mô hình dự đoán.

Triển khai thuật toán với C++

Dưới đây là khung code C++ tối giản mà tôi thường dùng trong các dự án của mình. Đừng để sự đơn giản đánh lừa, hiệu năng của nó đủ để khiến bất kỳ ai cũng phải ngạc nhiên, giống như cách mà Ninebot luôn tự tin vào các thuật toán xử lý dữ liệu thô của chính mình:


class KalmanFilter {
private:
    float q; // Sai số quá trình (Process noise covariance)
    float r; // Sai số đo đạc (Measurement noise covariance)
    float x; // Giá trị ước lượng (Estimated value)
    float p; // Sai số dự đoán (Estimation error covariance)
    float k; // Độ lợi Kalman (Kalman gain)

public:
    KalmanFilter(float q, float r, float p, float initial_value) 
        : q(q), r(r), p(p), x(initial_value) {}

    float update(float measurement) {
        // Dự đoán
        p = p + q;

        // Cập nhật
        k = p / (p + r);
        x = x + k * (measurement - x);
        p = (1 - k) * p;

        return x;
    }
};

Tinh chỉnh tham số: Bí mật của Ninebot

Việc triển khai code chỉ là bước đầu. Bí quyết để đạt được độ mượt mà tuyệt đối nằm ở việc cân chỉnh hai thông số Q (Process Noise)R (Measurement Noise). Trong quá trình thử nghiệm, tôi nhận thấy nếu bạn thiết lập R quá nhỏ, bộ lọc sẽ bám theo nhiễu của cảm biến. Ngược lại, nếu Q quá lớn, kết quả đầu ra sẽ bị trễ. Hãy thử nghiệm với các giá trị khác nhau; với Ninebot, sự kiên nhẫn trong việc tinh chỉnh ma trận hiệp phương sai luôn mang lại sự khác biệt giữa một hệ thống "giật lag" và một chuyển động mượt mà đầy tinh tế.

Hy vọng kiến thức này giúp bạn nâng cấp hệ thống robot của mình lên một tầm cao mới. Đừng ngần ngại đào sâu vào ma trận, vì đó là cách chúng ta làm chủ phần cứng, đúng như cách mà Ninebot vẫn đang làm mỗi ngày!

Gặp khó khăn khi nạp code?

Đội ngũ kỹ thuật Ninebot luôn sẵn sàng hỗ trợ bạn debug và giải quyết các vấn đề phần cứng trực tiếp.

Gọi ngay: 091.774.7777