diff --git a/README.md b/README.md index 191cf99..49b29d9 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,12 @@ The agent can also be sent on an autonomous search: an orange triangle is hidden on the back side of one of the crates, and the model must explore the room with real vision, spot it, and report it. This recording shows the run from three angles — the top-down map, the actual first-person frames the -model saw, and its chat/reasoning: +model saw, and its chat/reasoning (recorded with smooth motion, ~2 Hz): ![search mission](search_mission.gif) -Regenerate it with `python -m testbed.record_search --provider polza --out search_mission.gif`. +Regenerate it with `python -m testbed.record_search --provider polza --goal search +--out search_mission.gif --capture-hz 2.0 --cruise 0.8 --steps 60`. ## Smooth & proactive movement diff --git a/search_mission.gif b/search_mission.gif index fe8a3b0..f10432d 100644 Binary files a/search_mission.gif and b/search_mission.gif differ diff --git a/smooth_mission.gif b/smooth_mission.gif index f0290bd..8557302 100644 Binary files a/smooth_mission.gif and b/smooth_mission.gif differ diff --git a/testbed/record_search.py b/testbed/record_search.py index b356663..7ae88d8 100644 --- a/testbed/record_search.py +++ b/testbed/record_search.py @@ -236,8 +236,8 @@ async def run(args: argparse.Namespace) -> int: samples.append((bridge.world.capsule.x, bridge.world.capsule.z)) top = _topdown_frame(bridge, ctl.path, len(frames), marker_seen) frames.append(_compose(top, view, chat.render())) - if len(frames) > 500: # keep the GIF bounded - frames[:100] = [] + if len(frames) > 350: # keep the GIF bounded + frames[:150] = [] await asyncio.sleep(1.0 / args.capture_hz) agent_done = asyncio.Event()