2015-07-03 35 views
6

Jestem zafascynowany danymi z czujników. Użyłem iPhone'a i aplikacji o nazwie SensorLog do przechwytywania danych akcelerometru , podczas gdy stoję i pcham nogi, aby skakać.Używanie danych przyspieszeniomierza R i czujnika do wykrycia skoku

Moim celem jest użycie R do stworzenia modelu, który może identyfikować skoki i jak długo jestem w powietrzu. Nie jestem pewien, jak postępować w takim wyzwaniu. Mam timeseries z danymi z akcelerometru.

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

Niektóre pytania:

  • Jak skok zostać wykryte w danych timeseries?
  • Jak rozpoznać część czasu antenowego?
  • Jak wyszkolić taki model?

enter image description here

Poniżej znajduje się kod R wykorzystywane do tworzenia wykresów powyżej, który jest mną stoi i robi prosty skok.

Dzięki!

# 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

Patrz odpowiedź tutaj. Może pomóc! http://stackoverflow.com/questions/31010553/what-is-to-right-algorithm-to-detect-segmentations-of-a-line-chart/31013066#31013066 – Shiva

Odpowiedz

1

To chyba nie jest doskonałe rozwiązanie, ale może wystarczyć. Pierwsza część polega na niewielkiej modyfikacji funkcji find_peaks z pakietu 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 
} 

W celu uzyskania funkcje find_maxima i find_minima dać nam to, czego szukasz będziemy potrzebować, aby wygładzić dane total_gravity jeszcze dalej:

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

Uwaga: I „wyzerowany z”całkowity ciężar właściwy (sample$total_gravity <- sample$total_gravity - 1)

Następnie wyjąć wygładzonych wartości x i y:

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

Następnie znaleźć nasze lokalne minimum i maksimum

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

A potem wykreślić dane, aby upewnić się, że wszystko wygląda 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

I wreszcie, możemy zobaczyć, jak długo byłeś z ziemi.

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

Można zmniejszyć progi, aby uzyskać dodatkowe punkty danych (zmiany przyspieszenia).

Mam nadzieję, że to pomoże!

0

chciałbym wziąć pod uwagę kilka rzeczy:

  1. Smooth danych poprzez gromadzenie wartości median co 100ms - dane z akcelerometru na iPhone nie jest idealnie dokładny, więc takie podejście pomoże.
  2. Zidentyfikuj turningpoints zgodnie z sugestią @scribbles.

W moim repozytorium github jest kod, który można zmodyfikować, aby pomóc w obu tych przypadkach. Plik PDF z jakimś wyjaśnieniem jest tu: https://github.com/MonteShaffer/mPowerEI/blob/master/mPowerEI/example/challenge-1a.pdf

szczególności przyjrzeć:

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

# data smoothing 
?scaleToTimeIncrement 

# turning points 
?pastecs::turnpoints