2011-02-01 10 views
13

Vì vậy, tôi đã đấu tranh với vấn đề này một thời gian, và không có bất kỳ may mắn khai thác sự khôn ngoan của internets và bài viết SO liên quan về chủ đề này.Cách hiệu chỉnh Accelerometer Android & Giảm nhiễu, loại bỏ trọng lực

Tôi đang viết một ứng dụng Android sử dụng Accelerometer phổ biến, nhưng dường như tôi đang nhận được một lượng "tiếng ồn" đáng kinh ngạc ngay cả khi nghỉ ngơi, và dường như không biết cách xử lý nó như các bài đọc của tôi cần phải tương đối chính xác. Tôi nghĩ rằng có lẽ điện thoại của tôi (HTC Incredible) bị rối loạn chức năng, nhưng cảm biến dường như hoạt động tốt với các trò chơi và ứng dụng khác mà tôi đã chơi.

Tôi đã cố gắng sử dụng nhiều "bộ lọc" khác nhau nhưng dường như tôi không thể che giấu tâm trí của mình xung quanh chúng. Tôi hiểu rằng trọng lực phải được giải quyết theo một cách nào đó, và có lẽ đó là nơi tôi đang đi sai. Hiện nay tôi đã cố gắng này, chuyển thể từ một SO answer, trong đó đề cập đến một ví dụ từ iPhone SDK:

   accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor); 
       accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor); 


       double x = event.values[0] - accel[0]; 
       double y = event.values[1] - accel[1]; 

Các tấm áp phích nói đến "chơi với" giá trị kFilteringFactor (kFilteringFactor = 0.1f trong ví dụ) cho đến khi hài lòng . Thật không may tôi vẫn dường như nhận được rất nhiều tiếng ồn, và tất cả điều này dường như làm là làm cho các bài đọc đến như là số thập phân nhỏ, mà không giúp tôi tất cả những gì nhiều, và nó dường như chỉ làm cho cảm biến ít nhạy cảm. Các trung tâm toán học của bộ não của tôi cũng bị tàn phá từ nhiều năm bỏ bê, vì vậy tôi không hoàn toàn hiểu cách bộ lọc này hoạt động như thế nào.

Ai đó có thể giải thích cho tôi về một số chi tiết cách đi về việc nhận số hữu ích đọc từ gia tốc kế? Một hướng dẫn ngắn gọn sẽ là một sự giúp đỡ đáng kinh ngạc, vì tôi đã không tìm thấy một hướng dẫn thực sự tốt (ít nhất là nhằm vào trình độ kiến ​​thức của tôi). Tôi cảm thấy thất vọng vì tôi cảm thấy như tất cả những điều này nên rõ ràng hơn với tôi. Bất kỳ trợ giúp hoặc hướng nào sẽ được đánh giá cao, và tất nhiên tôi có thể cung cấp thêm mẫu từ mã của tôi nếu cần thiết.

Tôi hy vọng tôi không yêu cầu được cho ăn bằng thìa quá nhiều; Tôi sẽ không hỏi, trừ khi tôi đã cố gắng tìm ra nó một thời gian. Nó cũng giống như có một số quan tâm từ các thành viên SO khác.

+7

Hãy cho tôi biết nếu bạn nhận được bất kỳ khách hàng tiềm năng nào về phần "loại bỏ trọng lực", hoạt động kinh doanh phụ của tôi là * đóng cửa * này! –

+3

Haha Jon, bạn không nghe thấy? Google cố định trọng lực. Họ sẽ sớm phát hành API. – malfunction

Trả lời

4

Để đọc chính xác từ gia tốc kế, bạn cần sử dụng tốc độ phương trình = SQRT (x * x + y * y + z * z). Sử dụng điều này, khi điện thoại nghỉ ngơi tốc độ sẽ là trọng lực - 9,8m/s. Vì vậy, nếu bạn trừ (SensorManager.GRAVITY_EARTH) thì khi điện thoại ở chế độ nghỉ, bạn sẽ có giá trị đọc là 0 m/s. Đối với tiếng ồn, Blrfl có thể đúng về gia tốc rẻ tiền, ngay cả khi điện thoại của tôi nghỉ ngơi, nó liên tục nhấp nháy một vài phần nhỏ của một mét trên giây. Bạn chỉ có thể đặt một ngưỡng nhỏ, ví dụ: 0,4m/s và nếu tốc độ không vượt quá mức đó, thì nó sẽ nghỉ ngơi.

+0

Cảm ơn bạn đã trả lời bobby! Đây chỉ là những gì tôi đang tìm kiếm. Tôi sẽ phải thử điều này và tôi sẽ đăng kết quả của mình sau khi tôi có cơ hội. – malfunction

+2

Chỉ cần nghĩ rằng tôi muốn đề cập rằng câu trả lời này là khá đáng kể không chính xác, như đã giải thích trong [câu hỏi này trên Physics SE] (http://physics.stackexchange.com/questions/57523/do-you-use-the-magnitude- phương trình-to-get-tốc độ-từ-một-gia tốc). –

+1

có sự khác biệt giữa gia tốc và tốc độ. Bạn đang đo gia tốc (m/s^2) và không tăng tốc (m/s). Lực hấp dẫn là 9,8m/s^2 và không phải 9,8m/s. – Shai

5

Câu trả lời một phần:

Độ chính xác. Nếu bạn đang tìm kiếm độ chính xác cao, gia tốc kế rẻ tiền bạn tìm thấy trong điện thoại di động sẽ không cắt mù tạt. Để so sánh, một cảm biến ba trục phù hợp cho sử dụng công nghiệp hoặc khoa học chạy ở phía bắc của 1.500 đô la chỉ cho cảm biến; thêm phần cứng để cấp năng lượng cho nó và biến số đọc của nó thành thứ gì đó mà máy tính có thể tăng gấp đôi giá. Các cảm biến trong một chiếc điện thoại chạy tốt dưới $ 5 về số lượng.

Tiếng ồn. Cảm biến giá rẻ không chính xác và tính không chính xác được dịch thành tiếng ồn. Một cảm biến không chính xác không di chuyển sẽ không luôn hiển thị số không, nó sẽ hiển thị các giá trị ở hai bên trong một số phạm vi. Về điều tốt nhất bạn có thể làm là mô tả cảm biến trong khi bất động để có được ý tưởng ồn ào như thế nào và sử dụng nó để làm tròn số đo của bạn thành một thang đo ít chính xác hơn dựa trên lỗi dự kiến. (Nói cách khác, Nếu nó nằm trong phạm vi ± x m/s^2 của số không thì có thể nói cảm biến không chuyển động, nhưng bạn không thể chắc chắn vì nó có thể di chuyển rất chậm.) để làm điều này trên mọi thiết bị, bởi vì chúng không sử dụng cùng một gia tốc và tất cả chúng đều hoạt động khác nhau. Tôi đoán đó là một lợi thế mà iPhone có: phần cứng khá đồng nhất.

Trọng lực. Có một số cuộc thảo luận trong số SensorEvent documentation về lực hấp dẫn bao nhiêu ngoài những gì gia tốc nói. Bạn sẽ nhận thấy nó mang nhiều điểm giống với mã bạn đã đăng, ngoại trừ việc nó rõ ràng hơn về những gì nó đang làm.:-)

HTH.

+0

Cảm ơn câu trả lời chu đáo, Blrfl. Đã giải quyết một số vấn đề mang tính khái niệm hơn mà tôi đã gặp phải và xác nhận rằng tôi không điên vì nhận thấy sự biến động về giá trị đến từ gia tốc kế. – malfunction

1

Bạn đối phó với sự hốt hoảng như thế nào? Bạn làm mịn dữ liệu. Thay vì nhìn vào chuỗi các giá trị từ cảm biến làm giá trị của bạn, bạn trung bình chúng trên cơ sở liên tục và chuỗi mới được hình thành sẽ trở thành giá trị bạn sử dụng. Điều này di chuyển mỗi giá trị jittery gần với trung bình di chuyển. Tính trung bình nhất thiết phải loại bỏ các biến thể nhanh chóng trong các giá trị liền kề .. và là lý do tại sao mọi người sử dụng thuật ngữ Thấp (tần số) Lọc qua vì dữ liệu ban đầu có thể thay đổi rất nhiều cho mỗi mẫu (hoặc đơn vị thời gian) bây giờ thay đổi chậm hơn.

ví dụ: thay vì sử dụng giá trị 10 6 7 11 7 10, bạn có thể tính trung bình các giá trị này theo nhiều cách. Ví dụ, chúng ta có thể tính toán giá trị tiếp theo từ trọng số bằng nhau của mức trung bình đang chạy (ví dụ, điểm dữ liệu được xử lý cuối cùng của bạn) với điểm dữ liệu thô tiếp theo. Sử dụng hỗn hợp 50-50 cho các con số trên, chúng tôi sẽ nhận được 10, 8, 7.5, 9.25, 8.125, 9.0675. Chuỗi mới này, dữ liệu được xử lý của chúng tôi, sẽ được sử dụng thay cho dữ liệu ồn ào. Và chúng tôi có thể sử dụng một hỗn hợp khác hơn 50-50 tất nhiên.

Tương tự, hãy tưởng tượng bạn đang báo cáo vị trí của một người nhất định chỉ sử dụng thị lực của bạn. Bạn có một cái nhìn tốt về cảnh quan rộng hơn, nhưng người đó bị chìm trong sương mù. Bạn sẽ thấy các phần của cơ thể bắt sự chú ý của bạn .. một bàn tay trái di chuyển, một chân phải, tỏa sáng kính mắt, vv, đó là jittery, NHƯNG mỗi giá trị là khá gần với trung tâm thực sự của khối lượng. Nếu chúng ta chạy một số kiểu chạy trung bình, chúng ta sẽ nhận được các giá trị tiếp cận trung tâm khối lượng của mục tiêu khi nó di chuyển trong sương mù và có hiệu lực chính xác hơn các giá trị mà chúng ta (cảm biến) báo cáo. sương mù.

Bây giờ có vẻ như chúng tôi đang mất dữ liệu có khả năng thú vị để có được một đường cong nhàm chán. Nó có ý nghĩa mặc dù. Nếu chúng ta đang cố gắng tái tạo một bức tranh chính xác về người trong sương mù, nhiệm vụ đầu tiên là có được một xấp xỉ gần đúng của trung tâm khối lượng. Để làm được điều này, chúng ta có thể thêm dữ liệu từ quá trình đo/cảm biến bổ sung. Ví dụ: một người khác có thể ở gần mục tiêu này. Người đó có thể cung cấp mô tả rất chính xác về chuyển động của cơ thể, nhưng có thể ở trong sương mù và không biết tổng thể nơi mục tiêu kết thúc. Đây là vị trí bổ sung cho những gì chúng tôi nhận được lần đầu tiên - dữ liệu thứ hai cung cấp chi tiết chính xác mà không có cảm giác về vị trí gần đúng. Hai phần dữ liệu sẽ được ghép lại với nhau. Chúng tôi sẽ thấp vượt qua tập đầu tiên (như vấn đề của bạn được trình bày ở đây) để có được một vị trí chung không có tiếng ồn. Chúng tôi đã vượt qua bộ dữ liệu thứ hai để có được chi tiết mà không có những đóng góp gây hiểu lầm không mong muốn đối với vị trí chung. Chúng tôi sử dụng dữ liệu toàn cầu chất lượng cao và dữ liệu cục bộ chất lượng cao, mỗi bộ được tối ưu hóa theo các cách bổ sung và tránh làm hỏng bộ khác (thông qua 2 bộ lọc).

Cụ thể, chúng tôi sẽ trộn dữ liệu con quay hồi chuyển - dữ liệu chính xác trong chi tiết địa phương của "cây" nhưng bị mất trong rừng (trôi) - vào dữ liệu được thảo luận ở đây (từ gia tốc kế) rừng tốt nhưng không phải là cây.

Để tóm tắt, chúng tôi chuyển dữ liệu thấp từ các cảm biến gây khó chịu nhưng vẫn ở gần "trung tâm khối lượng". Chúng tôi kết hợp giá trị cơ sở trơn tru này với dữ liệu chính xác ở chi tiết nhưng trôi đi, vì vậy tập thứ hai này được lọc cao. Chúng tôi nhận được kết quả tốt nhất của cả hai thế giới khi chúng tôi xử lý từng nhóm dữ liệu để xóa sạch các khía cạnh không chính xác.Đối với gia tốc kế, chúng tôi mịn/thấp truyền dữ liệu hiệu quả bằng cách chạy một số biến thể của giá trị trung bình đang chạy trên các giá trị đo được của nó. Nếu chúng ta đang xử lý dữ liệu con quay hồi chuyển, chúng ta sẽ làm toán có hiệu quả giữ chi tiết (chấp nhận deltas) trong khi từ chối lỗi tích lũy mà cuối cùng sẽ phát triển và làm hỏng đường cong trơn gia tốc. Làm sao? Về cơ bản, chúng tôi sử dụng các giá trị con quay hồi chuyển thực tế (không phải là giá trị trung bình), nhưng sử dụng một số lượng nhỏ các mẫu (của đồng bằng) khi nhận được tổng giá trị sạch cuối cùng của chúng tôi. Sử dụng một số ít các vùng đồng bằng giữ đường cong trung bình tổng thể chủ yếu dọc theo các đường trung bình được theo dõi bởi giai đoạn chuyển thấp (bởi dữ liệu gia tốc trung bình) tạo thành phần lớn của mỗi điểm dữ liệu cuối cùng.