2010-07-31 29 views
14

Có thể ai đó giúp loại bỏ yếu tố g khỏi các chỉ số gia tốc. Tôi đang sử dụng SensorEventListener với phương thức onSensorChanged() để nhận dữ liệu Sensor.TYPE_ACCELEROMETER. Tôi chỉ cần các giá trị gia tốc thuần túy theo mọi hướng. Vì vậy, ở bất kỳ trạng thái nào nếu thiết bị ổn định (hoặc ở tốc độ không đổi), nó sẽ cung cấp cho khoảng 0.0.0.0.0.0. Hiện tại, tùy thuộc vào độ cao và độ dốc của nó, nó mang lại cho tôi đầu ra biến tùy thuộc vào lực g tác dụng trên mỗi trục.Cách loại bỏ Hệ số trọng lực khỏi các chỉ số Gia tốc kế trong gia tốc kế 3 trục Android

Tôi hy vọng có một số công thức để loại bỏ điều này, vì tôi cũng nhận được giá trị định hướng (độ dốc và cuộn) từ trình nghe Sensor.TYPE_ORIENTATION. Tôi đã sử dụng một số nhưng không hoạt động.

Bất kỳ trợ giúp nào?

Trả lời

4

Phân biệt theo thời gian, một hàm thời gian sẽ cho bạn biết các hằng số.

Vì vậy, bằng cách lấy đạo hàm của tín hiệu gia tốc, bạn sẽ nhận được "Jerk", sau đó bạn có thể tích hợp lại để có được phần không đổi của gia tốc mà bạn đang tìm kiếm.

Trong thuật ngữ của Layman, lấy mẫu từ gia tốc kế sau mỗi 1 giây và trừ mẫu đó khỏi mẫu trước đó. Nếu câu trả lời là (rất gần), bạn không tăng tốc tương đối so với trái đất. Nếu kết quả khác 0, tích hợp nó (trong trường hợp này, nhân với một giây), bạn có gia tốc của bạn.

Hai điều, mặc dù: -Hãy tìm tiếng ồn trong tín hiệu, làm tròn đầu vào của bạn. -Không mong đợi kết quả siêu chính xác từ gia tốc trên chip. Bạn có thể sử dụng chúng để phát hiện sự rung lắc, thay đổi hướng, nhưng không thực sự biết bạn đang trải qua bao nhiêu G trong khi thực hiện các bước ngoặt trong xe hơi.

3

Một chiều (đối với thiết bị chỉ với gia tốc kế) là loại bỏ véc tơ trọng lực khỏi dữ liệu gia tốc bằng cách trừ đi các giá trị trong trường hợp tĩnh cho cùng một hướng. Nhưng khi định hướng lại được tính toán bằng cách đọc gia tốc và không độc lập, nó không chính xác lắm.

Con quay hồi chuyển có thể hữu ích trong trường hợp này. Nhưng vài android vẫn có một con quay hồi chuyển thực sự. Và sử dụng các bài đọc thô của nó không đơn giản như vậy.

9

Bạn có thể sử dụng bộ lọc thông thấp.

Làm điều này cho mỗi giá trị cảm biến của bạn:

g = 0.9 * g + 0.1 * v 

đâu v là giá trị cảm biến hiện tại của bạn và g là một biến toàn cục ban đầu thiết lập để không. Hãy nhớ rằng bạn sẽ cần nhiều biến g khi bạn có trục.

Với v = v - g bạn có thể loại bỏ yếu tố trọng lực khỏi giá trị cảm biến của bạn.

+0

Lưu ý rằng điều này có thể được viết lại dưới dạng 'g = (1-a) * g + a * v', trong đó' a' là một biến số giữa 0 và 1 điều khiển phần cắt của bộ lọc. –

+3

Tôi không hiểu điều này. Làm thế nào để thêm một bộ lọc low-pass * loại bỏ * một thiên vị liên tục? Bạn sẽ không muốn một đường chuyền cao? – matth

+1

Tính toán này không hoạt động, bởi vì nó giả định rằng hướng của thiết bị không thay đổi theo thời gian, cực kỳ hiếm. – fishinear

3

Chỉ cần trừ đi g (~ 9.8m/s^2) lần theo hướng z của ma trận xoay. Hoặc để được rõ ràng hơn về nó, chúng ta hãy

a = your accelerometer reading, 
R = your rotation matrix (as a 9-long vector). 

Sau đó, những gì bạn muốn là

(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]). 
+1

Điều này là đúng, nhưng tính toán ma trận xoay là một chút khó khăn cho một người mới. Tìm kiếm hướng Cosine Matrix nếu bạn muốn biết thêm chi tiết. – xryl669

+1

Bạn có trừ nó khỏi chỉ Z không? Còn X và Y thì sao? – rclai

+1

@rclai miễn là nó đang phải đối mặt với hướng Z xuống ở tất cả các thời gian, chỉ cần trừ nó từ Z là đủ. Khi thiết bị nghiêng, dữ liệu sẽ bị tắt, trọng lực sinec không kéo cho chỉ Z. –

7

Sử dụng Sensor.TYPE_LINEAR_ACCELERATION thay vì Sensor.TYPE_ACCELEROMETER

+1

Câu trả lời đúng duy nhất và cũng là cách dễ nhất ... – fishinear

+3

Lưu ý, không phải tất cả các thiết bị đều có cảm biến.TYPE_LINEAR_ACCELERATION – Lytic

+1

Đồng hồ thông minh không có TYPE_LINEAR_ACCELERATION nói chung –

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