2015-07-03 13 views
6

Tôi bị cuốn hút bởi dữ liệu cảm biến. Tôi đã sử dụng iPhone của mình và một ứng dụng có tên SensorLog để chụp dữ liệu gia tốc trong khi tôi đứng và đẩy chân tôi để nhảy.Sử dụng dữ liệu gia tốc R và cảm biến để phát hiện một bước nhảy

Mục tiêu của tôi là sử dụng R để tạo mô hình có thể xác định số lần nhảy và thời gian tôi ở trong không khí. Tôi không chắc chắn cách tiến hành thử thách như vậy. Tôi có một bộ đếm thời gian với dữ liệu gia tốc kế.

https://drive.google.com/file/d/0ByWxsCBUWbqRcGlLVTVnTnZIVVk/view?usp=sharing

Một số câu hỏi:

  • Làm thế nào có thể một bước nhảy được phát hiện trong dữ liệu chuỗi thời gian?
  • Cách xác định phần thời gian phát sóng?
  • Làm thế nào để đào tạo một mô hình như vậy?

enter image description here

Dưới đây là mã R sử dụng để tạo ra các đồ thị trên, đó là tôi đứng và làm một bước nhảy đơn giản.

Cảm ơn!

# Training set 
sample <- read.csv("sample-data.csv") 

# Sum gravity 
sample$total_gravity <- sqrt(sample$accelerometerAccelerationX^2+sample$accelerometerAccelerationY^2+sample$accelerometerAccelerationZ^2) 

# Smooth our total gravity to remove noise 
f <- rep(1/4,4) 
sample$total_gravity_smooth <- filter(sample$total_gravity, f, sides=2) 

# Removes rows with NA from smoothing 
sample<-sample[!is.na(sample$total_gravity_smooth),] 

#sample$test<-rollmaxr(sample$total_gravity_smooth, 10, fill = NA, align = "right") 

# Plot gravity 
plot(sample$total_gravity, type="l", col=grey(.2), xlab="Series", ylab="Gravity", main="Accelerometer Gravitational Force") 
lines(sample$total_gravity_smooth, col="red") 
stdevs <- mean(sample$total_gravity_smooth)+c(-2,-1,+1,+2)*sd(sample$total_gravity_smooth) 
abline(h=stdevs) 
+0

Tham khảo các câu trả lời ở đây. Có thể giúp! http://stackoverflow.com/questions/31010553/what-is-the-right-algorithm-to-detect-segmentations-of-a-line-chart/31013066#31013066 – Shiva

Trả lời

1

Đây có lẽ là giải pháp hoàn hảo hơn nhưng có thể đủ để bạn bắt đầu. Phần đầu tiên dựa vào một sửa đổi nhỏ của hàm find_peaks từ gói gazetools.

find_maxima <- function(x, threshold) 
{ 
    ranges <- find_peak_ranges(x, threshold) 
    peaks <- NULL 
    if (!is.null(ranges)) { 
    for (i in 1:nrow(ranges)) { 
     rnge <- ranges[i, 1]:ranges[i, 2] 
     r <- x[rnge] 
     peaks <- c(peaks, rnge[which(r == max(r))]) 
    } 
    } 
    peaks 
} 


find_minima <- function(x, threshold) 
{ 
    ranges <- find_peak_ranges(x, threshold) 
    peaks <- NULL 
    if (!is.null(ranges)) { 
    for (i in 1:nrow(ranges)) { 
     rnge <- ranges[i, 1]:ranges[i, 2] 
     r <- x[rnge] 
     peaks <- c(peaks, rnge[which(r == min(r))]) 
    } 
    } 
    peaks 
} 

Để có được các chức năng find_maxima và find_minima để cung cấp cho chúng ta những gì chúng tôi đang tìm kiếm chúng ta sẽ cần phải mịn dữ liệu total_gravity hơn nữa:

spline <- smooth.spline(sample$loggingSample, y = sample$total_gravity, df = 30) 

Lưu ý: Tôi 'zeroed ra' tổng trọng lực (sample$total_gravity <- sample$total_gravity - 1)

Tiếp theo, kéo ra x mịn và các giá trị y:

out <- as.data.frame(cbind(spline$x,spline$y)) 
.210

Sau đó tìm maxima địa phương của chúng tôi và cực tiểu

max <- find_maxima(out$y, threshold = 0.4) 
min <- find_minima(out$y, threshold = -0.4) 

Và sau đó vẽ đồ thị dữ liệu để đảm bảo tất cả mọi thứ trông legit:

plot(out$y, type="l", col=grey(.2), xlab="Series", ylab="Gravity", main="Accelerometer Gravitational Force") 
lines(out$y, col="red") 
stdevs <- mean(out$y)+c(-2,-1,+1,+2)*sd(out$y) 
abline(h=stdevs) 
abline(v=max[1], col = 'green') 
abline(v=max[2], col = 'green') 
abline(v=min[1], col = 'blue') 

I want to be like Mike

Và cuối cùng, chúng ta có thể nhìn thấy bạn là bao lâu khỏi mặt đất.

print(hangtime <- min[1] - max[1]) 
[1] 20 

Bạn có thể giảm ngưỡng để nhận thêm điểm dữ liệu (thay đổi về tăng tốc).

Hy vọng điều này sẽ hữu ích!

0

tôi sẽ xem xét một vài điều:

  1. mịn dữ liệu bằng cách thu thập các giá trị trung bình mỗi 100ms - dữ liệu gia tốc kế trên iPhone không phải là hoàn toàn chính xác, vì vậy phương pháp này sẽ giúp.
  2. Xác định turningpoints khi @scribbles đề xuất.

Có mã sẵn có trong kho lưu trữ github của tôi có thể được sửa đổi để trợ giúp cả hai vấn đề này. Một PDF với một số giải thích là ở đây: https://github.com/MonteShaffer/mPowerEI/blob/master/mPowerEI/example/challenge-1a.pdf

Cụ thể, hãy xem tại địa chỉ:

library(devtools); 
install_github("MonteShaffer/mPowerEI", subdir="mPowerEI"); 
library(mPowerEI); 

# data smoothing 
?scaleToTimeIncrement 

# turning points 
?pastecs::turnpoints 
Các vấn đề liên quan