Crease Lab
Fold paper in a simulator, teach it to crawl, then build the real robot. A bar-and-hinge model of origami you can fold by hand, a design search, folding-only gaits for a Kresling crawler, and a printable template with Arduino code. First time? Follow the tutorial.
Design a crease pattern, fold it with a bar-and-hinge simulator, and let an optimizer search the geometry.
Pattern
Geometry
Actuation
Material
Bars resist stretching. Hinges resist bending at creases and across facets (panels).
Robot body
A Kresling tube lying on its side. Rigid plates separate the cells, four cables run the full length through an eyelet in every plate, and each end plate stands on a foot pad. Nothing rolls and nothing spins: all motion comes from folding.
Robot to build
Get the files
The kit holds both template pages, the Arduino sketch, the parts list, the gait and a README with every step.
Feet
Crease pattern
Click a crease to select it.
Optimize the design
CMA-ESCharacterize
FOLD file
FOLD is the plain-JSON format most origami tools share (Origami Simulator, Rabbit Ear, ORIPA exports). Import one to simulate it, or export this pattern.
Motion primitives
gait runningEvery gait on this bench is a sequence of a few primitives. Drive them by hand here. The gait pauses while you do.
Gait
Learn a gait
CMA-ESKeeps the phase order and anchors of the gait above and searches every phase's timing, contraction and bend. Each candidate is crawled for three cycles in the simulator.
From simulation to robot
Servo plan
Servos hold positions, not forces, so the simulator's job is to say how far each cable pair must shorten in each phase of the gait.
Wiring
Parts
Controller code
Generated from the current gait. Open it in the Arduino IDE, pick your board and upload.
Build steps
Use it from code
Everything on this page is exposed as window.CreaseLab (source in web/). Open the browser console to drive the simulator from your own learning loop.
const { CrawlerEnv } = CreaseLab;
const env = new CrawlerEnv({ cells: 4 }, { feet: 'anchors' });
let obs = env.reset(); // plate positions, cable levels, anchors
for (let t = 0; t < 400; t++) {
// 4 cable levels in 0..1, then head and tail anchors (0/1)
const action = t % 60 < 30 ? [1, 1, 1, 1, 1, 0] : [0, 0, 0, 0, 0, 1];
const { obs: o, reward, done } = env.step(action); // reward = forward speed
if (done) break;
}
const { OrigamiEnv } = CreaseLab;
const env = new OrigamiEnv('kresling', { phi: 30 },
{ target: 0.4 }); // aim for 40% stroke
let obs = env.reset(); // hinge angles + height + strain
for (let t = 0; t < 200; t++) {
const action = [0.5]; // tendon force, 0..1
const { obs: o, reward, done } = env.step(action);
if (done) break;
}
What else is in there
CreaseLab.buildPattern(key, params) // crease pattern
CreaseLab.buildMesh(pattern, stiffness) // -> Sim
sim.setFold(0.6); sim.step(500) // drive creases
sim.maxStrain(); sim.energy() // measurements
CreaseLab.makeProblem(key, params, 'compact', { fold: 0.6 })
new CreaseLab.CMAES(x0, 0.25) // ask() / tell()
CreaseLab.toFOLD(pattern); CreaseLab.fromFOLD(json)
CreaseLab.evaluateGait(robotParams, CreaseLab.GAITS.inchworm)
CreaseLab.makeGaitProblem(robotParams, gait, 'speed')
The model, the gaits, what the numbers mean and where it falls short: How it works →