2011-08-02 19 views
14

Tôi đang phát triển một ứng dụng cho Android, nơi tôi cần phải loại bỏ lực hấp dẫn khỏi các bài đọc gia tốc. Tôi đã đọc nhiều cuộc thảo luận về vấn đề này, tôi cũng đã tìm thấy một thuật toán here, nhưng tôi đã không thực sự hiểu nó.android loại bỏ trọng lực khỏi các bài đọc gia tốc

Tôi muốn lọc trọng lực từ mỗi trục, không phải từ tổng gia tốc.

Bạn có thể giúp tôi không? Mã của tôi phải giống như sau:

public void onSensorChanged(SensorEvent sensorEvent) { 
    float vals[] = sensorEvent.values; 
    float accelerationX = filterGravity(vals[0]); 
    float accelerationY = filterGravity(vals[1]); 
    float accelerationZ = filterGravity(vals[2]); 
} 

Tôi nên đặt mã nào vào phương pháp filterGravity()?

Trả lời

20

Để có giải pháp cơ bản, bạn cần một phương pháp tiếp cận khác như bộ lọc Kalman khá khó khăn đối với toán học phía sau. Một ví dụ đơn giản cho Android là một cú nhấp chuột từ liên kết của bạn tại http://developer.android.com/reference/android/hardware/SensorEvent.html#values.

Đơn giản chỉ cần nói một bộ lọc thông thấp xây dựng mức trung bình có trọng số từ tất cả các giá trị lịch sử của bạn. Ví dụ: nếu bạn có hệ số lọc là 0,1, nghĩa là 10% giá trị hiện tại của bạn được thêm vào giá trị trung bình trước đó: newMeanValue = 10% giá trị hiện tạiValue + 90% oldMeanValue. Điều đó có nghĩa là ngay cả khi có một đỉnh cao đột ngột nó sẽ chỉ đẩy giá trị trung bình của bạn từ từ vì 10%.

+0

Cảm ơn bạn. Nó rất hữu ích. – Gabriel

+0

@Kay Xin lỗi, tôi muốn UPvote câu trả lời của bạn. Vui lòng thêm một dấu chấm vào câu cuối cùng của bạn (hoặc thực hiện một số chỉnh sửa) để từ chối của tôi trở thành một câu trả lời. Xin lỗi ... – Ali

+0

@Ali: dấu chấm được thêm vào, không có vấn đề :-) – Kay

11

Tăng tốc tuyến tính là những gì bạn cần. Kiểm tra bộ cảm biến.TYPE_LINEAR_ACCELERATION here.

+0

Cảm ơn bạn rất nhiều. Điều này sẽ hoàn thành vấn đề của tôi. Tuy nhiên, điều này chỉ được hỗ trợ từ cấp API 9. Có cách nào để thực hiện điều này trong các phiên bản API trước đó không? – Gabriel

+0

@Gabriel Tôi không sợ.Có một số toán học nặng đằng sau này, nung chảy dữ liệu gia tốc, con quay hồi chuyển và la bàn. Đây là một video thú vị về cảm biến nhiệt hạch: http://www.youtube.com/watch?v=C7JQ7Rpwn2k – Ali

-1

Không quá chắc chắn những gì bạn đang cố gắng acomplish nhưng nếu bạn đang tìm cho độ richter (mà sẽ cho một kết quả giữa 0 và 1), sau đó tất cả các bạn cần làm là chia kết quả bằng 10

public void onSensorChanged(SensorEvent sensorEvent) { 
float vals[] = sensorEvent.values; 
float accelerationX = (vals[0]/10); 
float accelerationY = (vals[1]/10); 
float accelerationZ = (vals[2]/10); 

}

Trong một môi trường game khi bộ cảm biến là tại toàn nghiêng đối tượng của bạn sẽ được ở tốc độ tối đa của nó

7

Nếu bạn không có một chiếc điện thoại với TYPE_LINEAR_ACCELERATION, bạn đang bị mắc kẹt với TYPE_ACCELERATION, không thể tách trọng lực (độ nghiêng) khỏi gia tốc tuyến tính.

Một tùy chọn là áp dụng bộ lọc thông thấp. Một cách tiếp cận khác là sử dụng cảm biến nhiệt hạch nếu con quay hồi chuyển có sẵn. Cả hai cách tiếp cận đều có ưu điểm và nhược điểm.

Tôi có rất nhiều ví dụ hoạt động trong dự án mã nguồn mở Acceleration Explorer.

+0

Xin chào Kaleb, tôi hiện đang làm việc trên ứng dụng java tương tự như ứng dụng Android FusedLinearAcceleration của bạn với sự khác biệt, rằng tôi không thể sử dụng android cảm biến ảo để tính trọng lực. Tôi đã chuyển một số phương thức từ sensorManager, nhưng tôi không thể tìm thấy thuật toán để lấy vector trọng lực. Tôi thấy rằng điều này có thể đạt được bằng cách sử dụng quaternions, và thay đổi/đã viết một cái gì đó như thế này: https://gist.github.com/Bresiu/c0a69552881b8df34a2e. Nhưng nó cho kết quả xấu - trọng lực chỉ bù từ trục z (mã còn lại dựa trên ứng dụng của bạn). Bạn có một số gợi ý, điều gì có thể sai? Mã của tôi: http://goo.gl/5jmlvY – Bresiu

+0

@Bresiu: Cảm biến ảo duy nhất mà FusedLinearAcceleration sử dụng là Sensor.TYPE_GRAVITY và bạn có thể thay đổi nó thành Sensor.TYPE_ACCELERATION. Tuy nhiên, nếu bạn có một thiết bị có con quay hồi chuyển, Sensor.TYPE_GRAVITY sẽ được triển khai. Bạn có thể xem bài viết trên blog này (http://www.kircherelectronics.com/blog/index.php/11-android/sensors/17-gyroscope-linear-acceleration), công cụ này dựa trên mã bạn đã đăng (và mã của tôi). Nó có thể giúp đỡ khi nó bao phủ vector trọng lực. Hãy ghi nhớ rằng nếu bạn đang cố gắng để đo bất cứ điều gì trong khi tăng tốc năng động (như một chiếc xe hơi), nó sẽ cần sửa đổi. – Kaleb

+0

Tôi có một thiết bị có con quay hồi chuyển, gia tốc kế và từ kế, vì vậy tôi đang tìm kiếm một số phản ứng tổng hợp cho kết quả tốt nhất. Tôi thấy các ứng dụng khác của bạn và FusedLinear có vẻ chính xác nhất. Tôi sẽ tiếp tục tìm kiếm ... – Bresiu

Các vấn đề liên quan