Nothing
## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## -----------------------------------------------------------------------------
if (interactive()) {
library(shiny)
library(serial)
library(imuf)
library(stringr)
getCon <- function(port) {
#
# set up connection for serial port
con <- serial::serialConnection(name = "testcon", port = port,
mode = "115200,n,8,1", newline = 1, translation = "crlf"
)
if (serial::isOpen(con)) close(con)
con
}
readFromSerial <- function(con) {
#
# helper - function to convert sensor coord to NED
bmi2ned <- function(bmi) {
# convert bmi coord to ned coord
c(bmi[1], -bmi[2], -bmi[3])
}
#
# helper - function to convert deg to radian
toRad <- function(deg) {
deg * pi/180
}
#
# functions to process and validate data read from serial port
isValidLength <- function(x) {
minLength <- 32
if (x <= minLength) return(FALSE)
return(TRUE)
}
str2Vec <- function(x) {
#
# data from the IMU is a row of 6 comma-separated floats:
# accx, accy, accz, gyrx, gyry, gyrz
y <- stringr::str_split_1(x, ",") %>%
trimws() %>%
as.numeric() %>%
suppressWarnings()
y
}
isValidNumElements <- function(x) {
if (length(x) != 6) return(FALSE)
return(TRUE)
}
while (TRUE) {
nInQ <- serial::nBytesInQueue(con)["n_in"]
if(!isValidLength(nInQ)) next
#
a <- serial::read.serialConnection(con) %>% str2Vec()
if(!isValidNumElements(a)) next
#
# a is the IMU output we want, exit infinite loop
break
}
# gyr from bmi270 IMU is in deg/sec, need to convert to rad/sec
list(acc = bmi2ned(a[1:3]),
gyr = bmi2ned(a[4:6]) %>% toRad())
}
runshiny <- function(port) {
#
ui = fluidPage(
actionButton("do", "Start animation"),
imu_objectOutput("imu1")
)
server = function(input, output, session) {
# initial orientation
quat0 <- c(cos(pi/4), sin(pi/4), 0, 0)
observeEvent(input$do, {
con <- getCon(port)
open(con)
quat <- quat0
while (TRUE) {
accgyr <- readFromSerial(con)
quat <- compUpdate(accgyr$acc, accgyr$gyr, dt = 1/50, initQ = quat, gain = 0.1)
imu_proxy("imu1") %>%
imu_send_data(data = quat)
}
})
output$imu1 <- renderImu_object(
imu_object(quat0)
)
}
shinyApp(ui = ui, server = server)
}
}
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.