inertialNav.frink

Download or view inertialNav.frink in plain text format


/** This program contains routines to process, integrate, graph, and curve-fit
    data for inertial navigation.
*/


use Grid.frink
use LeastSquares.frink

headerRows = 2
timestep = 0.5 s
grid = new array
for line = readLines["file:inertialdata01.txt.csv"]
{
   line = split["\t",line]
   grid.push[line]
}


ax = mulvec[eval[rest[grid.getColumn[8], headerRows]], m/s^2]
ay = mulvec[eval[rest[grid.getColumn[9], headerRows]], m/s^2]
az = mulvec[eval[rest[grid.getColumn[10], headerRows]],m/s^2]

vx = sumAccel[ax, timestep]
vy = sumAccel[ay, timestep]
vz = sumAccel[az, timestep]

dx = sumVelocity[vx, timestep]
dy = sumVelocity[vy, timestep]
dz = sumVelocity[vz, timestep]


xvalues = makeTimes[dx, timestep, 0 s]

basisFuncs = noEval[[x]]
ls = new LeastSquares[zip[xvalues, vy], basisFuncs]
println[ls.toMatrix[].formatMatrix[]]
println[ls.toExpressionString["t"]]
println["Residual: " + ls.residual[]]
println["r-value: " + ls.rValue[]]
fitfunc = ls.toFunction[]

lsdy = new LeastSquares[zip[xvalues, dy], noEval[[x^2, x]]]
//graphVel[vx, timestep, "x"]
graphVel[vy, timestep, fitfunc]
graphDist[dx, timestep]
graphDist[dy, timestep, lsdy.toFunction[]]

graphVel[c, timestep, func=undef] :=
{
   g = new graphics
   t0 = 0 s
   p = new polyline
   pp = new polyline
   for i = rangeOf[c]
   {
      t = i*timestep
      p.addPoint[t, -(c@i)]
      if func != undef
         pp.addPoint[t, -func[t]]
   }

   g.add[p]
   g.color[0,0,1,.5]
   g.add[pp]
   g.color[0,0,0]

   grid = new Grid
   grid.setUnits[s, -m/s]
   grid.auto[g]
   g.add[grid.getGrid[]]
   g.show[]
}

graphDist[c, timestep, func = undef] :=
{
   g = new graphics
   t0 = 0 s
   p = new polyline
   pp = new polyline
   for i = rangeOf[c]
   {
      t = i*timestep
      d = c@i / m
      p.addPoint[t, -d]
      if func != undef
         pp.addPoint[t, -func[t]/m]
   }

   g.add[p]
   g.color[0,0,1,.5]
   g.add[pp]
   g.color[0,0,0,.5]

   grid = new Grid
   grid.setUnits[s, -1]
   grid.auto[g]
   g.add[grid.getGrid[]]
   g.show[]
}

sumAccel[a, timestep, v0 = 0 m/s] :=
{
   lastV = v0
   ret = new array
   for i = rangeOf[a]
   {
      lastV =  lastV + timestep * a@i
      ret.push[lastV]
   }

   return ret
}

sumVelocity[v, timestep, d0 = 0 m] :=
{
   lastD = d0
   ret = new array
   for i = rangeOf[v]
   {
      lastD =  lastD + timestep * v@i
      ret.push[lastD]
   }

   return ret
}

mulvec[vec, scalar] :=
{
   ret = new array
   for i = rangeOf[vec]
   {
      v = vec@i
      if isUnit[v]
         ret.push[vec@i * scalar]
   }
   return ret
}

makeTimes[vec, timestep, t0] :=
{
   lastT = t0
   ret = new array
   for i = rangeOf[vec]
   {
      lastT =  lastT + timestep
      ret.push[lastT]
   }

   return ret
}

/** Function to turn a spreadsheet column designator into a column index.
    For example, this turns column name "A" to 0 and column name "Z" to 25 and
    column name "AA" to 26.
*/

ssColumnToIndex[name] :=
{
   name = uc[trim[name]]
   ret = 0
   len = length[name]
   pow = 1
   for i = len-1 to 0 step -1
   {
      ret = ret + (char[substrLen[name, i, 1]] - char["A"] + 1) * pow
      pow = pow * 26
   }

   return ret-1  // We want zero-based column number.
}


Download or view inertialNav.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 20145 days, 12 hours, 47 minutes ago.