Nothing
## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## ----setup, message = FALSE---------------------------------------------------
library(imuf)
library(purrr)
library(ggplot2)
## -----------------------------------------------------------------------------
head(walking_shin_1)
## -----------------------------------------------------------------------------
lst_ned_in <- as.list(as.data.frame(t(walking_shin_1))) %>% unname
head(lst_ned_in, 2)
## -----------------------------------------------------------------------------
myCompUpdate <- function(initQ, accgyr) {
acc <- accgyr[1:3]
gyr <- accgyr[4:6]
dt <- 1/50
gain <- 0.1
orientation <- compUpdate(acc, gyr, dt, initQ, gain)
orientation
}
## -----------------------------------------------------------------------------
(q1 <- myCompUpdate(c(1, 0, 0, 0), lst_ned_in[[1]]))
(q2 <- myCompUpdate(q1, lst_ned_in[[2]]))
## -----------------------------------------------------------------------------
orientations <- purrr::accumulate(lst_ned_in, myCompUpdate, .init = c(1, 0, 0, 0))
head(orientations, 5)
## -----------------------------------------------------------------------------
q <- c(cos(pi/4), sin(pi/4), 0, 0)
vin <- c(0, 1, 0)
rotV(q, vin)
## -----------------------------------------------------------------------------
getTurnAngle <- function(quat) {
# a function to rotate c(1, 0, 0) by quat
# and then compute the angle between (1, 0, 0) and the rotated vector
# projected onto the n-e plane and
# this construct is to detect turns
rotVec <- rotV(quat, c(1, 0, 0))
theta <- atan2(rotVec[2], rotVec[1]) * 180 / pi
theta
}
## -----------------------------------------------------------------------------
turnAngles <- orientations %>% purrr::map(getTurnAngle) %>% unlist()
head(turnAngles)
## -----------------------------------------------------------------------------
#
# create a vector of time stamps in minutes
# note that sampling frequency is 50 Hz
x <- 1:length(turnAngles) / 50 / 60
#
ggplot2::ggplot(mapping = aes(x = x, y = turnAngles)) + ggplot2::geom_line()
## -----------------------------------------------------------------------------
#
# a function to remove artificial jumps in turn angles
rmJumps <- function(theta) {
firstDiffs <- diff(theta)
bigDiffIdx <- which(abs(firstDiffs) > 100)
#
# fix #1
theta[(bigDiffIdx[1]+1):bigDiffIdx[2]] <- theta[(bigDiffIdx[1]+1):bigDiffIdx[2]] + 360
#
# fix #2
theta[(bigDiffIdx[3]+1):bigDiffIdx[4]] <- theta[(bigDiffIdx[3]+1):bigDiffIdx[4]] + 360
#
# fix #3
theta[(bigDiffIdx[4]+1):length(theta)] <- theta[(bigDiffIdx[4]+1):length(theta)] + 2*360
theta
}
#
# remove artificial jumps
turnAnglesNoJumps <- rmJumps(turnAngles)
#
# plot it
ggplot2::ggplot(mapping = aes(x = x, y = turnAnglesNoJumps)) + ggplot2::geom_line()
## -----------------------------------------------------------------------------
#
# zero in on +/- 10 sec around 5 minute mark
idx_5min <- c(14800:15750)
x_5min <- x[idx_5min]
turn_5min <- turnAnglesNoJumps[idx_5min]
#
# plot it
ggplot2::ggplot(mapping = aes(x = x_5min, y = turn_5min)) + ggplot2::geom_line()
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.