| name | walk |
| description | Moves the character across the room by TRANSLATING the body to a destination via `moveTo`. Use whenever a command mentions walk, walk around, walk forward, go to, move to, head to, come here, step toward, approach, wander, march, pace, jog, run, or going somewhere by name. Walking ALWAYS travels — it must change the body's position, never lift the legs in place. |
| category | locomotion |
| disable-model-invocation | true |
walk
Atomic primitive for locomotion. Walking means the body translates across the
floor. You make that happen with ONE field: the Action's top-level moveTo.
The engine generates the entire step cycle (leg swing, knee bend, arm swing, body
bob, turning to face travel) automatically while it travels to moveTo. So you
NEVER author leg/knee keyframes for walking. Emitting a sequence of leg lifts
makes the legs flap in place without moving — that is the #1 walk bug. Don't.
ALWAYS use moveTo to walk
There are two ways to specify the destination. Pick exactly one.
A) Named place — moveTo.target (PREFERRED when a place is mentioned)
moveTo: { "target": "<locationName>", "faceDeg": <optional heading> }
- Choose
target from state.locations (the available named nav targets, e.g.
kitchen, couch, center). Use the bare key ("kitchen", not "the kitchen").
- If the named place isn't in the list, pick the closest listed match (the engine
also fuzzy-matches, so a near miss like
"kitchen counter" still resolves).
B) Bare / forward walk — moveTo.x + moveTo.z
For "walk", "walk around", "walk forward", "walk a few steps",
"keep walking", "pace", "wander" — i.e. no specific place — DON'T flap
the legs. Travel a few meters ahead in the current facing. Compute the point
from state.position {x,z} and state.faceDeg (heading: 0=+Z, 90=+X):
dist = ~2.5 (2–3 m; use 3–4 for "across the room")
x' = x + sin(faceDeg°) * dist
z' = z + cos(faceDeg°) * dist
moveTo: { "x": x', "z": z' }
(For "wander", you may instead pick any reachable named location as the target.)
- Give travel a realistic duration:
durationMs ~ 2000–3000 (farther = longer).
- Optionally end facing a direction with
moveTo.faceDeg (0=+Z, 90=+X; see
turn-and-face).
- Do NOT also send a
pose/sequence of leg motion with a walk — moveTo is
self-contained and the procedural gait would fight your keyframes.
Worked Actions
- "walk to the kitchen" →
{"durationMs":2500,"moveTo":{"target":"kitchen"},"say":"On my way to the kitchen."}
- "walk" / "walk around" / "walk forward" (state.position {x:0,z:0}, faceDeg:0) →
{"durationMs":2400,"moveTo":{"x":0,"z":2.5},"say":"Walking forward."}
- "walk forward" while at {x:1,z:2}, faceDeg:90 (facing +X) →
{"durationMs":2400,"moveTo":{"x":3.5,"z":2},"say":"Off I go."}
- "come to the center and face me" →
{"durationMs":2200,"moveTo":{"target":"center","faceDeg":180},"say":"Coming over."}
The ONE exception: marching in place (no travel)
ONLY when the command explicitly says to stay put — "march in place", "walk
in place", "on the spot", "without moving", "jog in place" — animate
a stationary leg cycle with a looping sequence (alternating knee raises; one foot
down at a time). For anything that should go somewhere, use moveTo.
sequence: { "loop": true, "frames": [
{ "t":0.0, "pose": { "LeftUpLeg":[55,0,0],"LeftLeg":[80,0,0],
"RightUpLeg":[0,0,180],"RightLeg":[0,0,0] } },
{ "t":0.5, "pose": { "RightUpLeg":[55,0,0],"RightLeg":[80,0,0],
"LeftUpLeg":[0,0,180],"LeftLeg":[0,0,0] } },
{ "t":1.0, "pose": { "LeftUpLeg":[55,0,0],"LeftLeg":[80,0,0],
"RightUpLeg":[0,0,180],"RightLeg":[0,0,0] } }
]}
- "march in place" →
{"durationMs":2400,"say":"Left, right, left!","sequence":{"loop":true,"frames":[{"t":0,"pose":{"LeftUpLeg":[55,0,0],"LeftLeg":[80,0,0],"RightUpLeg":[0,0,180],"RightLeg":[0,0,0]}},{"t":0.5,"pose":{"RightUpLeg":[55,0,0],"RightLeg":[80,0,0],"LeftUpLeg":[0,0,180],"LeftLeg":[0,0,0]}},{"t":1,"pose":{"LeftUpLeg":[55,0,0],"LeftLeg":[80,0,0],"RightUpLeg":[0,0,180],"RightLeg":[0,0,0]}}]}}
Notes
moveTo is the robust path for any "go somewhere" / "walk" request. Locations are
provided per request in state.locations; never invent a place that isn't there.
If you're unsure whether travel is wanted, prefer moveTo (translate) over an
in-place leg cycle — a request to "walk" should always change where the body is.