Newer
Older
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])
// 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)}`)
// check size
if(pt - period < 2 * period){
bPositions.push(positions[i])
bSpeeds.push(speeds[i])
}
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
}