Locked fields are fixed values you set. Unlock 1 or 2 inputs, then lock the same number of outputs as your targets — those outputs become editable and solve the unlocked inputs to hit whatever you type.
| ΔP rated | |
| − ΔP friction | |
| − ΔP elevation | |
| = ΔP effective |
| F_jet (ΔP_rated × SF=2) | |
| Hose mass (empty, suspended) | |
| Water in suspended hose | |
| Total suspended mass | |
| Hydraulic power (Q × ΔP_rated) |
| Status | |
| Footprint area A_footprint | |
| Local impact pressure P_local | |
| Cleaning ratio R |
Every value on this page comes from the chain below, computed in order top to bottom. Two steps are solved numerically (a root-finder) rather than a closed-form formula — marked where that happens.
Colebrook–White is implicit in f — solved numerically (bisection,
replacing what scipy.optimize.brentq does in the Python reference). The
Swamee–Jain explicit formula below is used only to bracket the initial guess, never
as the final answer:
f₀ = 0.25 / [ log₁₀( ε / (3.7·ID) + 5.74 / Re⁰⁵&sup9; ) ]²
Flagged infeasible when ΔPeffective ≤ 0 — the pump cannot overcome the losses at all.
The "structural reference" value uses the same formula with vexit evaluated at 2·ΔPrated (safety factor 2 on the rated pressure, not on ΔPeffective) — the worst-case number the hardware must survive, not the operating value.
Flagged red if below the team's SF = 2 convention.
w is a direct datasheet value, never computed from ID/OD/material density — real hose weight includes braid/reinforcement mass a wall-volume calculation would miss. Uses H (climb height), not L: the hose hangs straight from a ground-based reel up to the robot, so only the suspended, vertical portion loads the cables — any slack beyond H sits coiled at the base and isn't part of the carried load.
Same H-not-L reasoning as hose mass above. Kept separate from hose mass on purpose — "total suspended mass" below is the sum of both, relevant for what the robot's cable actually has to carry.
Fluid power the pump must deliver at its rated pressure and flow, shown in the stat card as both watts and horsepower. This is not shaft/motor power — a real drive motor needs more than this to cover the pump's mechanical and volumetric losses, which aren't modeled here. Other pump-spec numbers like RPM, displacement, or the motor's own rated HP don't enter any formula on this page: they determine Q (which you enter directly) but don't change the downstream hydraulics once Q and ΔPrated are known.
Standard CRC reference data, not a fitted curve.
When you lock one output as the target, the one unlocked input is varied by the same bisection root-finder until the target metric above matches what you typed — i.e. it numerically inverts steps 01–14 rather than using a separate formula.
With 2 inputs unlocked and 2 outputs locked, this becomes a 2×2 nonlinear system (2 unknowns, 2 equations). Rather than a multi-dimensional Newton solve, it's nested bisection: one variable is bisected on the outside; for each candidate value, the other variable is solved exactly (the same 1-target method above) to hit its own target; the outer bisection then drives its own target to zero too. Not every combination of 2 unlocked inputs and 2 target outputs has a solution — e.g. burst margin depends only on pump rated ΔP among the 5 lockable inputs, so targeting it while that input stays locked is genuinely infeasible, not a solver bug.
Standoff and spray angle both do the same job — spreading the jet's momentum over a bigger footprint before it hits the glass — via two independent, quantifiable mechanisms. Whichever predicts the larger footprint (smaller pressure) wins:
θ is the nozzle's full included spray angle. The cone/fan is not born from a mathematical point — a real nozzle exit has finite size, rnozzle (cone) or bnozzle (fan slot width), taken from continuity (Anozzle = Q/vexit, real geometry, not a tunable). A point-origin model breaks down at small standoff: as s → 0 it predicts a footprint smaller than the nozzle's own exit (fgeometric = Anozzle/Afootprint > 1), which is physically impossible — the footprint can never shrink below the exit producing it, no matter how close you get. At large standoff the nozzle-size term is negligible and the formulas reduce to the point-origin shape: a cone footprint's area grows as s², so Plocal decays as 1/s²; a fan footprint's width grows as s but the impact-strip length Lstrip stays roughly constant, so its area grows only ~linearly and Plocal decays as 1/s — the real physical reason a fan (curtain) nozzle holds pressure over distance better than a cone, not just a coincidence of motion path.
The geometric formula alone predicts a zero-area (infinite-pressure) footprint at θ = 0, which is unphysical — a "pencil" jet still spreads via turbulent entrainment even with no designed spray angle. This second formula is the equivalent footprint from classical free-jet centerline decay (Rajaratnam): round jets uc/u0 = 6.2·D/s, flat jets uc/u0 = 2.4·√(b/s). Since momentum flux (ρ·u²·A) is conserved along a free jet, the equivalent area is A0 / (uc/u0)² — and because A0 is defined by the orifice itself (π·D²/4 for round, b·Lstrip for fan), the orifice size cancels out algebraically, leaving a floor that depends only on standoff. This floor is what governs near θ = 0; the geometric term takes over and dominates once θ exceeds roughly 15° at typical operating standoffs (200mm+), matching the "DS Twist" nozzle's usable range.
R ≥ 2 → 🟢 Green (good clean). 1 ≤ R < 2 → 🟡 Yellow (marginal). R < 1 → 🔴 Red (fails — no amount of dwell time fixes it). Pthreshold is a user-adjustable slider from 8 bar (Kim et al.'s proven floor) to 150 bar (industry "glass ceiling," unvalidated for TARSA's actual grime); it defaults to 8 bar until a physical grime test is done.
Sizes a drum to hold a cable. Lock drum radius or drum length as the target and the other is solved. Unlock cable length to lock both instead and get how much cable the drum holds.
| Outer radius of wound cable | |
| Turns per layer | |
| Total turns | |
| Drum capacity |
Motor, gearbox and drum sizing for one CDPR cable. Uses the drum above at its top layer. Unlock 1 or 2 inputs, then lock the same number of outputs as targets to solve them. The motor holds the cable tension with current, so continuous torque must cover it even when stopped. Default values are placeholders.
| Drum radius at top layer reff |
| Holding at 0 RPM | |
| Speed at load | |
| Operating point | |
| Current |
Only whole turns count; leftover length at the flange holds no cable.
Each turn is measured along the cable's centerline. Layer k sits k·d further out than the first.
Infeasible if r ≤ 0: the drum is too long, or has too many layers, for this much cable.
Outer radius r + N·d is where the top layer ends. A real flange needs clearance above that.
n is the smallest whole number of turns with C ≥ L; both r and W follow from it.
Centerline of the top layer: the largest lever arm, so the most torque and the fastest line speed per RPM.
Taken hauling in, where η works against the motor. When paying out under tension, T = F·reff·η/G and the motor acts as a generator.
Each output is a product of powers of F, v and G, so taking logs turns every target into a linear equation. One or two unknowns are solved exactly. Some pairs have no solution (e.g. power doesn't depend on G), and the page says so.
The motor holds tension with current, so continuous torque must cover T even at 0 RPM. Peak torque stands in for stall torque on the torque-speed line, which underestimates available speed (conservative). Max power sits at T = ½ stall; beyond that, the operating point is flagged.