Skip to content
Snippets Groups Projects
ramppass.js 1.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    
    let segPass = (speeds, debug) => {
      let bPositions = [positions[0]]
      let bSpeeds = [speeds[0]]
      // stretchy band ...
      for(let i = 0; i < positions.length - 2; i ++){
        let d = vDist(positions[i], positions[i + 1])
    
    Jake Read's avatar
    Jake Read committed
        let vi = speeds[i]
        let vf = speeds[i + 1]
    
        // if the plain-move time is close to the period, we ship it
        let pt = (2 * d) / (vi + vf)
        if(pt < (period - 0.001)){
          // do we have to ship start- and finish- velocities to the motors?
          // do if we turn around at junctions...
          // goddangit
          // ok, now that we can at least be sure we'll have a minimum time, maybe we can
          // engineer the stepper side to help us out ...
          console.error(`seg in pos ${i} violates plain move time with period ${pt.toFixed(3)}`)
          console.error(d.toFixed(3), vi.toFixed(3), vf.toFixed(3))
        } else {
          if(debug) console.log(`${i} pt ${pt.toFixed(3)}`)
    
    Jake Read's avatar
    Jake Read committed
        }
    
        // check size
        if(pt - period < 2 * period){
          bPositions.push(positions[i])
          bSpeeds.push(speeds[i])
    
    Jake Read's avatar
    Jake Read committed
        }
    
    Jake Read's avatar
    Jake Read committed
    }
    
    let blockPass = (ramps, debug) => {
      let blocks = []
      for (let i = 0; i < ramps.length; i++) {
        let r = ramps[i]
        let d = vDist(r.pi, r.pf)
        // how many blocks are we going to split it to?
        let count = r.t / period
        let integer = Math.round(count)
        if (integer < 1) {
          console.warn(`small ramp during blockPass at ${i}`)
          integer = 1
        }
        // the pos'ns to split to:
        let vu = vUnitBetween(r.pi, r.pf)
        // now just...
        for (let b = 0; b < integer; b++) {
          // percentage through,
          let start = b / integer
          let finish = (b + 1) / integer
          blocks.push([math.add(r.pi, vScalar(vu, start)), math.add(r.pi, vScalar(vu, finish))])
        }
      }
      return blocks
    }