Phan Vu Hoang gửi vào
- 65864 lượt xem
Hầu như bất cứ ai trong chúng ta đều có trong tay một chiếc điện thoại smartphone (rất xin lỗi các bạn không dùng) và chắc cũng đã từng chơi qua những game đòi hỏi phải nghiêng và quay điện thoại (đặc biệt là đua xe). Vậy đã bao giờ bạn tự hỏi làm sao một chiếc điện thoại có thể biết khi nào nó bị nghiêng? Dĩ nhiên là không phải do nó thông minh rồi. Trên thực tế, bên trong một chiếc smartphone thường sẽ có một con chip nhỏ gọi là IMU (Inertial Measurement Unit) dùng để đo những chuyển động này. Trong bài viết dưới đây, mình sẽ giới thiệu tới các bạn những điều cơ bản về IMU. Ồ, và với những ai hứng thú, một module IMU loại thông thường có giá không hề đắt, các bạn có thể mua về và tự làm cho mình những dự án thật cool!
Giới thiệu chung
Trước hết, một module IMU sẽ bao gồm hai cảm biến: cảm biến gia tốc (accelerometer) và cảm biến quay (gyroscope). Ở đây mình sẽ không nói rõ cách thức hoạt động của hai loại cảm biến này mà sẽ chủ yếu tập trung vào cách sử dụng và các ứng dụng thực tế.
- Accelerometer (gọi tắt là accel): như tên gọi của nó, accel đơn giản là một cảm biến đo gia tốc của bản thân module và thường sẽ có 3 trục xyz ứng với 3 chiều không gian (loại 1 và 2 trục ít dùng). Lưu ý là accel đo cả gia tốc của trọng lực nên giá trị thực khi đo sẽ bao gồm cả trọng lực.
- Gyroscope (gọi tắt là gyro): là một loại cảm biến đo tốc độ quay của nó quanh một trục. Tương tự với accel, gyro cũng thường có 3 trục xyz.
Một ví dụ đơn giản, khi bạn đặt một con chip IMU thẳng đứng như trên và để im không chuyển động, giá trị trả về sẽ là accel = [0.0, -9.8, 0.0] và gyro = [0.0, 0.0, 0.0] do chỉ có trọng lực trái đất tác dụng lực và không có bất cứ chuyển động quay nào cả. Lưu ý rằng gyro chỉ đo tốc độ quay chứ không đo trực tiếp góc quay, nên khi bạn quay module một góc nào đó rồi dừng, giá trị của gyro sẽ tăng lên rồi hạ xuống về 0.
Ứng dụng và những dự án hay
Hẳn các bạn đã hình dung ra việc một chiếc smartphone sử dụng module IMU thế nào rồi chứ? Nhưng những ứng dụng của IMU không chỉ dừng lại ở đó, có vô vàn những thiết bị và dự án sử dụng IMU như một cách để kiểm soát cân bằng hoặc định hướng chuyển động cho robot, máy bay... Dưới đây là một số đề tài thường sử dụng IMU, các bạn có thể tự tìm hiểu và làm tại nhà:
- Robot 2 bánh tự cân bằng
- Máy bay điều khiển từ xa (drone)
- Chuột máy tính trên không
- Tay cầm chơi game
- Hệ thống giữ thăng bằng cho camera/máy ảnh.
- Các ứng dụng: đếm số bước chân, cảm biến rơi, cảm biến rung/lắc...
- Và còn nhiều ứng dụng khác nữa để bạn khám phá!
Lưu ý: một module IMU đầy đủ sẽ được gọi là 6-DOF (6 Degrees Of Freedom) tức là 6 trục độc lập (3 của accel và 3 của gyro). Tuy vậy đôi khi như thế vẫn là không đủ, những dự án phức tạp hơn như là điều hướng máy bay hoặc robot có thể sẽ cần đến 9-DOF (thêm một cảm biến từ trường 3 trục - magnetometer - hoạt động gần giống một la bàn để định hướng), hoặc 10-DOF (thêm một áp kế - barometer - dùng để đo độ cao) hoặc thậm chí 11-DOF (thêm module GPS để xác định vị trí). Phù, quá nhiều trục phải không? Đừng lo, phần lớn các ứng dụng có thể làm tại nhà chỉ cần một IMU 6-DOF là đủ.
Một số vấn đề thường gặp
Có trong tay một module IMU thật tuyệt phải không? Còn chờ gì nữa mà không sử dụng ngay!? Đáng tiếc là không nhanh như thế, IMU - cũng như nhiều cảm biến khác - cần được hiệu chỉnh trước khi sử dụng nếu muôn có một kết quả đáng tin cậy. Sau đây là những vấn đề cần lưu tâm khi sử dụng một module IMU:
- Accelerometer: accel luôn có offset trên mỗi trục làm cho giá trị đo được thường lệch đi so với thực tế một chút. Ngoài ra, giá trị đó được theo accel thường khá nhiễu khiến cho việc đọc trở nên khó khăn.
- Gyroscope: cũng như accel, gyro cũng có offset (hay còn gọi là bias) làm lệch các giá trị đo. Một vấn đề khác nữa có thể gặp phải của gyro là drift, có nghĩa là bias thay cũng thay đổi chậm theo thời gian. Dù vậy, điểm cộng là gyro lại ít bị nhiễu hơn accel.
Vậy thì làm thế nào đối phó với những vấn đề này? Với offset là hằng số thì đơn giản chỉ là đo lại giá trị đó và trừ vào giá trị đo. Với việc tín hiệu bị nhiễu thì có thể dùng một bộ lọc điện tử tần số thấp (digital low-pass filter), các bạn có thể tham khảo library Filters trên diễn đàn Arduino (http://playground.arduino.cc/Code/Filters). Vấn đề drift của gyro thì có thể dùng bộ lọc cao tần (digital high-pass filter) do gyro drift khá chậm.
Một cách chuyên nghiệp hơn, nếu các bạn muốn đo một cách chính xác góc quay thì có một giải pháp rất thông dụng là sensor fusion, có nghĩa là sẽ dùng cả gyro và accel để đo góc và dùng một số loại thuật toán để gộp 2 giá trị với nhau, bù trừ nhau để đưa ra kết quả chính xác nhất. Một số thuật toán thường dùng hiện nay là:
- Complementary filter: loại này đơn giản nhất nhưng cũng khá hiệu quả
- Kalman filter: hơi phức tạp nhưng phổ biến nhất và rất hiệu quả, kể cả trong những ứng dụng chuyên nghiệp
- Mahony filter: khả năng ngang với Madgwick filter
- Madgwick filter: cái này khá mới so với những cái trên nhưng mình cũng đã thử và thấy rất hiệu quả
Tất cả những filter trên hiện nay đều đã được viết dưới dạng library cho Arduino nên các bạn có thể update trực tiếp bằng IDE Arduino. Các bạn cũng có thể tìm thấy rất nhiều ví dụ trong các thư viện đó. Mình sẽ viết một bài hướng dẫn cụ thể hơn kèm ví dụ cho một module IMU nếu có thời gian.
IMU trong tầm tay
IMU không phải là một module quá đắt, các bạn hoàn toàn có thể mua và vọc tại nhà. Chỉ lưu ý là module của các nhà sản xuất khác nhau sẽ có cách thiết lập khác nhau. Sau đây là một số model thông dụng:
- Invensense MPU-6050: có kèm sensor fusion sẵn trên chip (gọi là DMP - Digital Motion Processor), breakout board có thể tìm thấy: GY-521 breakout board (không rõ xuất xứ, nhưng rẻ), breakout board của Sparkfun (đắt hơn kha khá).
- STMicroelectronics LSM9DS0: cái này là 9-DOF và độ chính xác khá cao nên sẽ đắt hơn. Breakout board có thể tìm thấy của Sparkfun hoặc Adafruit nhưng khá đắt, cá nhân mình thích MPU-6050 hơn, nếu cần 9-DOF thì lấy con MPU-9150.
- Bosch BNO055: cái này cũng là 9-DOF, mới ra lò không lâu và đặc biệt là nó có một con microcontroller bên trong dùng cho sensor fusion, mình đã test thử và hoạt động rất tốt. Hiện tại mình mới chỉ thấy Adafruit sản xuất breakout board cho con IMU này.
Kết luận
Nói chung mình thấy IMU là một module rất thú vị và có rất nhiều ứng dụng. Với những ai ưa thử thách thì nó cũng thách thức sự kiên trì bằng việc tinh chỉnh thông số các bộ lọc cho sensor fusion. Có thể nói sử dụng IMU không khó nhưng để sử dụng một cách hiệu quả thì cũng đòi hỏi công sức để hiệu chỉnh, tùy ứng dụng. Tuy vậy, một khi module của bạn sẵn sàng, các bạn sẽ thấy thật đáng công sức. :)
Nếu bạn có bất cứ vấn đề gì liên quan đến IMU hoặc thậm chí là AHRS, hãy liên lạc với mình để có thể thảo luận. Nhân tiện, hãy ghé thăm dự án của mình về chuột máy tính trên không tại https://github.com/Ventilateur/BluetoothMouseControl. Mọi ý kiến đóng góp đều được hoan nghênh, cảm ơn các bạn đã đọc bài.