2013-05-06 21 views
15

Tôi đã viết một Hoạt động đơn giản là SensorEventListener cho Sensor.TYPE_ACCELEROMETER.Android Accelerometer Profiling

Trong onSensorChanged(SensorEvent event) tôi chỉ chọn giá trị ở định dạng X,Y,Z và ghi chúng vào tệp.

Đã thêm vào nhãn này X,Y,Z là nhãn, nhãn cụ thể cho hoạt động tôi đang thực hiện. để X,Y,Z,label

Giống như tôi có được hồ sơ hoạt động của tôi. Muốn có đề xuất về những hoạt động nào cần thực hiện sau khi thu thập dữ liệu để loại bỏ tiếng ồn và nhận dữ liệu tốt nhất cho một hoạt động.

Mục đích chính của việc thu thập dữ liệu này là xây dựng ứng dụng phát hiện hoạt động người dùng bằng thư viện mạng thần kinh (NeuroPh for Android) Link.

+0

Để hiểu rõ hơn về bối cảnh, bạn có thể xin đưa ra một số ví dụ về các "hoạt động". – Luqman

+0

@MMLuqman Hoạt động: 1 ----> Walking 2 ----> Văn phòng phẩm 3 ----> In-Hand – shridatt

+0

nhãn cuối cùng chứa một trong hai số nguyên này (1-3) trong đó là các hoạt động ! – shridatt

Trả lời

49

Chỉ để cho vui, tôi đã viết một máy đếm bước cách đây vài tuần, và nó đã có thể phát hiện ba hoạt động mà bạn đã đề cập. Tôi muốn thực hiện các quan sát sau:

  1. Ngoài Sensor.TYPE_ACCELEROMETER, Android cũng có Sensor.TYPE_GRAVITYSensor.TYPE_LINEAR_ACCELERATION. Nếu bạn ghi lại các giá trị của cả ba giá trị này, thì bạn nhận thấy rằng các giá trị của TYPE_ACCELEROMETER luôn bằng tổng của các giá trị của TYPE_GRAVITY và TYPE_LINEAR_ACCELERATION. Phương pháp onSensorChanged(…) trước tiên cung cấp cho bạn TYPE_ACCELEROMETER, tiếp theo là TYPE_GRAVITY và TYPE_LINEAR_ACCELERATION là kết quả của phương pháp nội bộ của nó trong việc chia các chỉ số gia tốc thành trọng lực và gia tốc không phải do trọng lực. Cho rằng bạn quan tâm đến việc tăng tốc do các hoạt động, thay vì tăng tốc do trọng lực, bạn có thể thấy TYPE_LINEAR_ACCELERATION là tốt hơn cho những gì bạn cần.
  2. Bất kỳ cảm biến nào bạn sử dụng, X, Y, Z mà bạn đang đo sẽ phụ thuộc vào hướng của thiết bị. Tuy nhiên, để phát hiện các hoạt động mà bạn đề cập, kết quả không thể phụ thuộc vào ví dụ: cho dù người dùng đang cầm thiết bị ở vị trí dọc hay ngang hay liệu thiết bị có phẳng hay thẳng đứng, do đó, các giá trị riêng lẻ của X, Y và Z sẽ không được sử dụng. Thay vào đó, bạn sẽ phải xem chiều dài của vectơ, ví dụ: sqrt (X X + Y Y + Z Z) độc lập với hướng thiết bị.
  3. Bạn chỉ cần làm mịn dữ liệu nếu bạn đang cho nó vào thứ gì đó nhạy cảm với tiếng ồn. Thay vào đó, tôi muốn nói rằng dữ liệu là dữ liệu và bạn sẽ nhận được kết quả tốt nhất nếu bạn sử dụng các cơ chế không nhạy cảm với tiếng ồn và do đó không cần dữ liệu được làm mịn. Theo định nghĩa, làm mịn là loại bỏ dữ liệu. Bạn muốn thiết kế một thuật toán lấy dữ liệu nhiễu ở một đầu và xuất ra hoạt động hiện tại ở đầu bên kia, do đó, không định trước xem nó có cần bao gồm làm mịn như là một phần của thuật toán đó không.
  4. Đây là đồ thị sqrt (X X + Y Y + Z Z) từ Sensor.TYPE_ ACCELEROMETER mà tôi đã ghi lại khi tôi đang xây dựng máy đếm bước đi của mình. Biểu đồ hiển thị số đo được đo khi tôi đi 100 bước. Đường màu xanh lá cây là sqrt (X X + Y Y + Z * Z), đường màu xanh là một số exponentially weighted moving average của đường màu xanh lá cây mang lại cho tôi mức trung bình của đường màu xanh lục và đường màu đỏ hiển thị các bước tính toán thuật toán của tôi. Tôi đã có thể đếm các bước chỉ bằng cách tìm kiếm tối đa và tối thiểu và khi đường màu xanh lá cây đi qua đường màu xanh lam. Tôi đã không sử dụng bất kỳ chuyển đổi mượt mà hoặc Fast Fourier. Theo kinh nghiệm của tôi, đối với loại điều này, các thuật toán đơn giản nhất thường hoạt động tốt nhất, bởi vì các thuật toán phức tạp có thể hoạt động trong một số trường hợp khó dự đoán cách chúng hoạt động trong mọi tình huống. Và mạnh mẽ là một đặc điểm quan trọng của bất kỳ thuật toán :-).

enter image description here

+0

Woaahh ... Great feed ... Im ngạc nhiên:) ... Cảm ơn bạn đã trả lời! – shridatt

+0

Nhưng một điều mà tôi đặt câu hỏi trong câu trả lời của bạn là cách thuật toán có thể quyết định hoạt động đầu ra trên cơ sở chỉ một tham số sqrt (X^2 + y^2 + z^2)[email protected] – shridatt

+0

Việc đi bộ là thường xuyên lên/xuống với đỉnh và đáy như được hiển thị. Văn phòng phẩm là khi không có chuyển động nào ở mức trung bình, và tay nắm giữ là khi có những chuyển động bất thường không theo mô hình đi bộ. Trong mọi trường hợp, nếu bạn chỉ đo một cảm biến và bạn không muốn kết quả của mình nhạy cảm với cách thiết bị được giữ, sqrt (X^2 + Y^2 + Z^2) là đầu vào duy nhất mà bạn có thể làm việc với. Để biết thêm thông tin, bạn cần sử dụng các cảm biến khác. – Stochastically

3

Điều này nghe giống như một vấn đề thú vị!

Bạn đã vẽ dữ liệu của mình theo thời gian để cảm nhận nó, để xem bạn đang xử lý loại nhiễu nào và giúp quyết định cách bạn có thể xử lý dữ liệu của mình để nhập vào thiết bị dò tìm?

^
    | 
A | 
    | 
    | 
    | 
    |_________________> 
    |  time 
    | 
    v 

Tôi muốn bắt đầu với dòng cho từng hoạt động:

  • | Axe + Ay + Az |
  • | Vx + Vy + Vz | (Xấp xỉ bằng diện tích hình thang hình thành bởi các điểm dữ liệu của bạn tính) ... vv

lẽ bạn có thể xây dựng định hướng của điện thoại bằng cách cố gắng để phát hiện lực hấp dẫn, sau đó xoay vectơ của bạn đến một định hướng 'tiêu chuẩn' (ví dụ: trục Z dương = lên). Nếu bạn có thể làm điều đó, thì các trục khác nhau có thể trở nên có ý nghĩa hơn. Ví dụ, đi bộ (trong túi) sẽ có xu hướng có vận tốc trên mặt phẳng ngang, có thể được phân biệt với việc đi bộ (trong tay) bằng chuyển động trong mặt phẳng thẳng đứng.

Đối với bộ lọc, nếu dữ liệu xuất hiện ồn ào, một điểm khởi đầu đơn giản là áp dụng trung bình di chuyển để làm trơn nó. Đây là một kỹ thuật phổ biến cho các dữ liệu cảm biến nói chung:

https://en.wikipedia.org/wiki/Moving_average

Ngoài ra, bài này có vẻ liên quan đến câu hỏi của bạn:

How to remove Gravity factor from Accelerometer readings in Android 3-axis accelerometer

1

Những điều xác định bởi tôi:

  1. Dữ liệu phải được xử lý trước và như thế nào bạn cần nó, Trong trường hợp của tôi tôi chỉ muốn 3 đầu vào và một đầu ra
  2. Dữ liệu phải là phải được làm mịn (Làm mịn năm điểm hoặc bất kỳ kỹ thuật nào khác mà suite bạn là tốt nhất) Reference. Vì vậy, Noise được lọc ra (không hoàn toàn mặc dù).Moving Average là một trong những kỹ thuật
  3. dữ liệu tuyến tính sẽ là tốt, bởi vì bạn không có bất kỳ ý tưởng như thế nào dữ liệu được lấy mẫu, Sử dụng phép nội suy để giúp bạn trong Linearizing dữ liệu
  4. Cuối cùng sử dụng FFT (Fast Fourier Transform) để trích xuất các công thức ra khỏi món ăn, đó là để trích xuất các tính năng trong số liệu của bạn!
Các vấn đề liên quan