2015-07-03 3 views
6

Я очарован данными датчика. Я использовал свой iPhone и приложение под названием SensorLog для сбора данных акселерометра , пока я стою и толкаю ноги, чтобы прыгать.Использование данных акселерометра R и датчика для обнаружения прыжка

Моя цель - использовать R, чтобы создать модель, которая может идентифицировать прыжки и как долго я буду в воздухе. Я не уверен, как действовать в такой сложной ситуации. У меня есть таймер с данными акселерометра.

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

Некоторые вопросы:

  • Как прыжок обнаружить в данных таймсерий?
  • Как определить часть времени эфира?
  • Как подготовить такую ​​модель?

enter image description here

Ниже приведен код R используется для создания графиков выше, что я стою и делаю простой прыжок.

Спасибо!

# 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

Обратитесь к ответу здесь. Может помочь! http://stackoverflow.com/questions/31010553/what-is-the-right-algorithm-to-detect-segmentations-of-a-line-chart/31013066#31013066 – Shiva

ответ

1

Это, вероятно, не идеальное решение, но этого может быть достаточно, чтобы вы начали. Первая часть основана на небольшой модификации функции find_peaks из пакета 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 
} 

Для того, чтобы получить в find_maxima и find_minima функции, чтобы дать нам то, что мы ищем, мы будем нуждаться, чтобы сгладить данные total_gravity еще дальше:

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

Примечание: I «обнуляется из»общей тяжести (sample$total_gravity <- sample$total_gravity - 1)

Далее вытащить сглаженные х и у значения:

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

Тогда найти наши локальные максимумы и минимумы

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

А затем построить данные, чтобы убедиться, что все выглядит законно:

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

И, наконец, мы можем увидеть, как долго вы были с земли.

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

Вы можете уменьшить пороговые значения, чтобы получить дополнительные данные (изменения в ускорении).

Надеюсь, это поможет!

0

Я хотел бы рассмотреть несколько вещей:

  1. Smooth данные путем сбора медианные значения каждые 100 мс - данные акселерометра на айфонов не совсем точно, поэтому этот подход поможет.
  2. Определите turningpoints как предлагает @scribbles.

В моем репозитории github есть код, который может быть изменен, чтобы помочь справиться с обеими этими проблемами. PDF-с некоторым объяснением здесь: https://github.com/MonteShaffer/mPowerEI/blob/master/mPowerEI/example/challenge-1a.pdf

В частности, обратите внимание на:

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

# data smoothing 
?scaleToTimeIncrement 

# turning points 
?pastecs::turnpoints 
Смежные вопросы