Evaluating Astra as a Zero-Shot Robot Policy for Mobile Manipulation with Hello Robot Stretch 4
In September 2026, OpenAI released GPT-6 Astra (OpenAI, 2026), a general-purpose multimodal model built for reasoning, software engineering, and task automation. Although not designed for robotics, Astra has been shown in evaluations to act as a capable robot policy with no task-specific training (Zhang et al., 2026; Yang et al., 2026, Jedlicki et al., 2026; Galbot Team, 2026; Robocurve, 2026).
Unlike established VLA- and VLM-based approaches, which rely on large-scale robot training data or hand-engineered interfaces, Astra issues actions directly from observations, with the action representation, horizon, and context specified in the prompt at inference time. VLA models such as RT-2 (Brohan et al., 2023), OpenVLA (Kim et al., 2025), and π0 (Black et al., 2024) fine-tune a pretrained backbone on robot demonstrations, fixing the action space and horizon at training time. VLM-based planners (Ahn et al., 2022; Driess et al., 2023; Chen et al., 2026) typically decompose tasks into subgoals executed by predefined skills or learned policies, enabling flexible task composition while remaining constrained by the capabilities of the underlying controllers. Code as Policies (Liang et al., 2023; Fu et al., 2026) generate executable programs that combine control logic with calls to perception and control APIs, but reliable execution can depend heavily on the human-designed abstractions provided by these interfaces. Astra thus combines the direct control of VLAs with the zero-shot generality of prompted models, but its reliability under real-world mobile manipulation settings is untested.
In this work, we evaluate Astra’s zero-shot performance on 24 household tasks using the Hello Robot Stretch 4 mobile manipulator, prompting the model to output relative joint and base movements directly. Through task evaluations and ablations, we characterize the capabilities and limitations of this approach and examine how design choices shape its control performance.
We use a Hello Robot Stretch 4, a mobile manipulator with 9 degrees of freedom. It has a three-wheel omnidirectional base, a lift that moves the arm along a vertical spine, a horizontally telescoping arm, a three-axis wrist, and a parallel-jaw gripper. Stretch has an RGB-D camera on its wrist, three cameras on its head (a center camera plus two fish-eye cameras on the left and right), and other lidar/ground sensors that were excluded from our experiments. A computer onboard the Stretch handles the lower level control logic while a seperate workstation sends relative movement commands across a wireless network.
The evaluation takes place in a mock apartment environment in our lab. The setup has a kitchen (counter, sink, toaster, fridge, a Keurig coffee maker, drawers, and cabinets), a dining table with chairs, a living area with a sofa, and a play area with toy bins next to a bedroom area with a dresser.
Figure 2 illustrates the main control loop. The system operates in a synchronous observe → reason & command → execute loop. At each turn, Astra receives sensory observations, robot joint states, and previous execution feedback. It may also choose to access wrist depth information via a provided API. Astra then outputs joint relative position commands, which the robot executes. After execution, updated observations and execution feedback are provided to Astra, and the loop continues.
Wrist depth API. We provide Astra an API that takes in a set of coordinates in wrist camera image space and returns the corresponding depths in centimeters in wrist camera frame. During each turn, Astra decides whether or not to use the API, and if so, what coordinates to query.
Model output. During each turn, Astra is asked to either output each joint’s relative position command or decide to finish the task. The complete action schema is provided in the appendix.
Execution feedback. Each joint can return one of four types of execution feedback:
completed: The joint reached its target position.stopped_short: The joint stopped moving before reaching its target position.timeout: The joint continued attempting to move but did not reach its target position within the allotted time.rejected: The target position was outside the joint’s limits.We access Astra (gpt-6-astra) through a Codex CLI instance. It retains no information across experiments, but within each episode, its context preserves the sequence of image and text inputs. This allows Astra to refer back to what it has seen or done earlier in that episode.
For every task, we use a uniform system prompt that specifies the overall objective (controlling a Stretch 4 robot to complete the user’s task) and outlines the control loop, including its inputs and the required JSON output format. The prompt also includes additional details that may be helpful, such as robot embodiment information and safety guidelines. At the end, the one-sentence task instruction is appended. Importantly, there is no task-specific information, hints, or human priors embedded in our prompt. See the appendix for the full prompt.
We also use the high reasoning level and provide the model with input from all cameras (head-left, head-center, head-right, and wrist).
Zero-shot claim. We regard this configuration as genuinely zero-shot: there is no robot-specific training, fine-tuning, demonstrations, in-context examples, or hand-written skills such as a grasp planner, navigation stack, or object detector. The prompt remains identical for every task and contains no task-specific hints; only the task instruction changes, except in cases where we explicitly test prompt variations.
Inspired by prior work “Evaluating
Example selection. We include illustrative examples of Astra’s Strengths and Weaknesses only when the relevant behaviors are observed multiple times across independent runs. This criterion helps distinguish recurring capabilities and limitations from isolated successes or failures that may arise by chance.
Starting conditions. Because we aim to test Astra in a real household environment, we varied the initial states of the robot and objects within the bounds of a reasonable test case, unless otherwise noted.
Stopping and interventions. An episode ends when Astra declares finished, the operator intervenes to prevent potential damage, the model produces an invalid output, or the time limit for the task is reached. We set different timeout thresholds for each task.
What stood out was not any single task Astra completed, but how much coherent robotic behavior emerged from using a general-purpose VLM zero-shot. Across unfamiliar household tasks, it could often infer what to do, translate that intent into a coordinated sequence of physical actions, and adapt when its first attempt fell short.
Deployed zero-shot in a household environment, Astra can complete a diverse range of tasks, suggesting that a powerful VLM can transfer its knowledge to the physical world and generalize across robotic tasks.
Pull out a tissue.; Astra made several attempts before ultimately succeeding in grasping a napkin.Help me open the jar.; Astra recognized the user holding a jar, tried a few rotate then lift motions, and finally opened the cap.Toast the bagel.; Astra put the bagel inside the toaster and then pushed the lever down to turn on the toaster.Turn on the lamp.; Astra attempted multiple times to grasp the pull chain and then pull downward to turn on the lamp.For some tasks, while Astra may not consistently achieve full completion, it reliably demonstrates the correct motion intention in nearly every case.
Pour ice cubes to another cup.; While a few ice cubes spilled, Astra clearly demonstrated the intended behavior of aligning the cups and executing the pour.Make bed.; Astra showed the intended motion of flattening the blanket, though the execution was not perfect.Even though VLMs are known for strong semantic understanding and are widely used for high-level task planning in robotics, we were impressed by how Astra grounds these capabilities in physical actions, enabling active perception, strong understanding of user intent, and robust planning and replanning.
Find the android phone in the living room.; The phone was deliberately placed beneath a pillow, and Astra located it by purposefully moving the pillow aside.Put an apple on the nightstand.; With both the bedroom and the apple initially out of view of any camera, Astra navigated the environment, moving the base to discover both, and complete the task.Bring me something to wipe the table.; With both napkins and a towel available, Astra correctly selected the towel, a better choice for wiping the table. It then located the human and handed it over. Notably, Astra waited until the human's hand was ready before releasing the towel.Set up the table.; Astra successfully interpreted this ambiguous instruction, transforming it into clear, concrete actions by arranging the plate, cup, and utensils appropriately.Put the ball in the drawer.; When a human intervened by closing the drawer, Astra did not simply drop the ball but instead placed it in a stable position before reopening the drawer. Observe how Astra adapts its actions as the human repeatedly closes and opens the drawer.Clean up the play area.; With four toys on the ground, Astra reliably planned and placed each toy into its designated location, and replanned when a toy was accidentally dropped.We found that Astra can adjust its whole-body pose by controlling the mobile base and arm together, enabling it to perform tasks that require coordinated movement.
Open the left door of the cabinet under the sink.; Astra simultaneously moved the base and swung the wrist to the right to smoothly open the door.Upright the cup and clean up the mess.; Astra wiped up the water by moving the base left and right, repositioning the wrist holding the towel without adjusting the arm or wrist joints.We found that Astra can generate motion commands that closely follow detailed natural-language instructions specifying exactly how the robot should move, such as precise arm positioning, gripper orientation, or base adjustments.
Open the dishwasher door.; Without additional guidance, Astra repeatedly attempted to grasp the handle in the most ordinary manner, but failed several times due to slippage.Open the dishwasher door. First, grasp the handle from above, positioning one finger
between the handle and the door. Slowly retract the arm while lowering the lift, continuously adjusting the wrist orientation to keep the finger aligned with the
door and prevent it from getting wedged between the handle and the door. Once the dishwasher door is halfway open, carefully release the gripper and retract the
arm without colliding with the door. Then, move to the left side of the dishwasher and finish opening the door by pushing against its inner surface.; With these detailed instructions, Astra closely followed each step and successfully opened the dishwasher.When Astra encounters difficulty completing a task, it autonomously attempts alternative strategies. This works particularly well when the source of the difficulty lies within the current step. Its recovery is less effective when the problem stems from an earlier step; see Fails to reason about dependencies across steps.
Close the dishwasher.; After several unsuccessful grasp attempts due to slippage, Astra switched the strategy by moving the gripper beneath the door and successfully closing it by tilting and pushing.Turn on the sink faucet.; After several failed attempts with a slippery horizontal grasp, Astra adapted its strategy: it switched to a vertical grasp and successfully turned on the faucet. Note that the water is not coming out by design.Although Astra demonstrated impressive capabilities, our experiments also revealed recurring limitations. Most of the failures we saw were not isolated or random. In the following sections, we group these failure modes by theme, describe the behaviors we observed, and discuss the factors that may have contributed to them.
We found that Astra struggles with fine-grained manipulation: contact-rich actions in which millimeter-scale errors in pose or small differences in grip force can determine success. It has particular difficulty in confined spaces, where limited clearance makes it easy for the gripper or the object being manipulated to become wedged against the surroundings. Three factors appear to contribute to this. First, Stretch has no force feedback, so Astra must infer contact from images alone. Second, the wrist camera is often the only view that provides enough detail for precise manipulation, yet its view of the relevant contact point or surrounding clearance is frequently occluded by the gripper or the object itself. Additionally, the telescopic arm frequently occludes the center head camera’s view of the workspace, further limiting the visual information available for precise manipulation. Third, Astra often fails to exhibit the “physical commonsense” described by Zeng and the Generalist Team (2026).: the reactive, closed-loop intuition for forces, friction, compliance, and uncertainty that supports small corrections during manipulation.
Make coffee.; While Astra understood the high-level steps and demonstrated the correct motion intentions, it struggled with this task. For example, Astra accidentally closed the lid again after opening it, and during the final step, pressed too hard, causing the coffee machine to tilt and the cup to fall. A human also helped inserting the pod inside the slot.Put the shapes in the box.; Due to the minimal clearance in each slot, Astra was unable to insert the toy.Astra struggles to reason about dependencies across steps. It often fails to anticipate how the execution of an earlier action will affect later ones. When a later step becomes difficult, it tends to treat the problem in isolation rather than trace it back to an earlier decision and revise that decision. As a result, it may repeatedly try alternative approaches to the current step even when the problem can only be resolved by revisiting a previous one. This differs from its ability to recover from failures within the current step, where trying a different approach can resolve the problem.
Load the mug in the dishwasher, facing down.; We deliberately placed the mug inside a bowl, requiring Astra to grasp it from above, which later made placing the mug upside down impossible. Astra did not recognize that its initial grasp would prevent the correct placement; ideally, it should have set the mug down and re-grasped it in a more suitable orientation.Stack the bottled water on top of the cup.; To keep the cup visible to the wrist camera during stacking, the robot must begin with a top-down grasp on the bottle. Astra repeatedly failed to foresee this necessity.Astra often lacked sufficient awareness of its surroundings and spatial context during task execution. As a result, it frequently made unintended contact with objects in the environment, especially those that were not the current target or directly involved in the immediate step. These collisions included bumping into nearby furniture, appliances, or other obstacles that were outside its main focus of attention. Sometimes operator interventions are required to prevent damage.
Open the fridge.; Astra proceeded directly to the fridge, disregarding obstacles on the ground.Pick up the cup.; While attempting to grasp the cup, the robot collided with the dishwasher.We conduct ablation studies to assess how different components affect Astra’s autonomous control in executing a representative household task: toasting a bagel.
Instruction: put the bread in the oven and rotate the top knob to 300 deg
Time limit: 13 minutes
Task Decomposition: To complete the instruction, Astra must accomplish the following five sub-goals in sequence:
Ablated Components and Variants: Table 1 shows all system components we evaluated. For each ablation, we varied a single system component while keeping all other settings at their default values.
| Setting | Default | Variants Tested |
|---|---|---|
| Reasoning effort | high |
low, ultra |
| Wrist depth | API for Astra to query depths from image coordinates | Color-mapped depth image; no depth |
Metrics. We record the metrics in Table 2 for each rollout. Per-run results for each ablation are tabulated in the appendix: reasoning effort (Table 6) and wrist depth (Table 8).
| Metric | Definition |
|---|---|
| Success rate | Fraction of episodes in which all sub-goals are achieved |
| Total episode time | Episode start to end, split into inference (sum of Codex latency over all turns), robot execution (sum over commands of the time from sending the command until the commanded joints stop), and other (the remainder) |
| Total tokens | Input tokens (including cached input) plus output tokens (including reasoning), from the Codex session log |
| Completion rate | Fraction of sub-goals achieved |
| Codex turns | Model calls in the episode |
| Inference time per turn | Codex latency for one turn, from request to reply |
We evaluated Astra’s performance at three reasoning levels: low, high (default), and ultra, comparing task metrics as shown in Figure 3. Our main findings are:
Lowering the reasoning level from high to low reduced both the success rate and completion rate. With low reasoning, Astra frequently forgot or omitted important steps, such as closing the lid before setting the oven temperature. In one instance, it dropped the bread onto the robot base, causing the human operator to end the episode.
Raising the reasoning level from high to ultra did not lead to better performance. Notably, in one high-level run, the robot was unable to properly pick up the bread, failed to place it inside the oven, and ultimately caused a severe collision that required human intervention. While such failures were rare, when they did occur, Astra often struggled to reason about dependencies across steps and could not recover. In practice, we found that high and ultra reasoning levels performed similarly.
Interestingly, adjusting the reasoning level had little impact on inference time or token usage.
In summary, we observed no systematic benefit to increasing reasoning above the default high setting, while lowering it degraded performance on this task.
low reasoning level performed worse and required more Codex turns compared to high and ultra. Increasing the reasoning level from high to ultra did not yield noticeable differences in any aspect.We evaluated three configurations for providing wrist depth information: (1) no depth input, (2) a color-mapped depth image, and (3) an API allowing Astra to query depth at specific image coordinates (the default setting). The task metrics are shown in Figure 4, and our main findings are as follows:
Omitting depth information resulted in similar overall performance but required more Codex turns, greater total time, and increased token usage. Without access to depth data, Astra had to estimate distances from RGB images alone, which led to wasted turns, time, and tokens on empty reaching and grasping. However, Astra consistently retried and recovered from these failures, resulting in comparable success and completion rates overall.
Providing a color-mapped depth image produced the weakest performance. Missed grasp and retries were as common as when no depth information was provided, so the duration of the task completion also suffered. We suspect this is because the colorized depth image is not perfectly aligned with the RGB image, unlike the API option where each pixel directly corresponds to a depth value. As a result, the additional information was not only unhelpful but may have distracted Astra and degraded its effectiveness.
We evaluated Astra’s zero-shot control of a mobile manipulator on diverse household tasks, without robot-specific training, demonstrations, or hand-written skills. We show that an off-the-shelf general-purpose vision-language model can translate household instructions into multi-step plans, coordinated movements, and adaptive behavior. We also identify key limitations in fine-grained, contact-rich manipulation, reasoning about dependencies between steps, collision avoidance, and efficiency. Our ablations further reveal how common system design choices affect performance. We hope these findings provide useful insights for the community and help advance the development of general-purpose robotic systems.
| Limit | Value | On expiry |
|---|---|---|
| Robot executor, per command | 10 s | Robot stops; joint reports timeout |
| Wait for motion result | 12 s | Episode ends |
| Wait for a fresh observation (all cameras + joint state) | 5 s | Episode ends |
| Codex turn | 180 s | Episode ends |
Identical for every task and sent once at the start of each Codex session. The task instruction is appended at the end as Task: <instruction>. Shown with the default configuration.
You control a Stretch 4 mobile manipulator to complete the task specified by the user.
Stretch 4 has 9 degrees of freedom: a three-wheel omnidirectional base that drives in any direction and turns in place, a lift that moves the arm up and down the mast, a telescoping arm that extends out to the robot's front, a three-axis wrist with yaw, pitch, and roll, and a parallel-jaw gripper.
The robot has the following cameras:
- The head left camera is a fish-eye camera mounted on the mast. Its image only changes when the base moves.
- The head center camera is mounted on the mast. Its image only changes when the base moves.
- The head right camera is a fish-eye camera mounted on the mast. Its image only changes when the base moves.
- The gripper camera is mounted on the wrist and looks out from the arm. Its image changes when the base, the arm or the wrist moves.
Call get_gripper_depth to read the wrist stereo depth for this turn's gripper image. Pass points [{x, y}, ...] of integer pixels (origin top-left, x right, y down; max 64) number of points. Each turn's text states the gripper image size. The tool returns Euclidean distance from the camera origin in centimetres, or null if that pixel has no reading or is outside the image. You may call it at most 32 times per turn. Calling is optional. The final output is still one JSON object.
The robot runs a synchronous observe-predict-execute loop: it observes, you predict an action, it executes that action to completion, then it observes again. The next observation is sent only after execution has finished (completed, stopped_short, timeout, or rejected) and every camera has published a frame newer than that result.
Input. Each turn you receive the latest gripper image, head-center image, head-left image, head-right image, and joint state. After the first turn you also receive the previous command result: completed, stopped_short, timeout, or rejected.
Head cameras are fixed on the mast and only move when the base moves. The gripper camera is on the wrist and moves with the arm and wrist.
Joint state is lift_cm and arm_cm in centimeters, wrist_swing_deg, wrist_tilt_deg, and wrist_twist_deg in degrees, and grip_pct in percent (0 closed, 100 fully open). It does not include base pose.
Output. Return one JSON object and nothing else. Write reasoning first, then kind and the motion.
{"reasoning":string,"kind":"move|done","joint_relative_position_commands":[{"drive","slide","lift","arm":{"direction":"hold","cm":0},"turn","wrist_swing","wrist_tilt","wrist_twist":{"direction":"hold","deg":0},"grip":{"direction":"hold","pct":0}}]}.
kind "move" outputs exactly 1 waypoint.
- drive: {direction:forward, backward, or hold, cm:number}. Motion is in the robot body frame at the observation. forward moves the base forward, backward moves it backward, hold with cm 0 leaves it.
- slide: {direction:left, right, or hold, cm:number}. Motion is in the robot body frame at the observation. left slides the base left, right slides it right, hold with cm 0 leaves it.
- turn: {direction:left, right, or hold, deg:number}. Motion is in the robot body frame at the observation. left rotates the base in place left, right rotates it right, hold with deg 0 leaves it.
- lift: {direction:up, down, or hold, cm:number}. up raises the arm, down lowers it, hold with cm 0 leaves it.
- arm: {direction:extend, retract, or hold, cm:number}. extend lengthens the telescoping arm, retract shortens it, hold with cm 0 leaves it.
- wrist_swing: {direction:left, right, or hold, deg:number}. Motion is in wrist frame. left swings the gripper left, right swings it right, hold with deg 0 leaves it.
- wrist_tilt: {direction:up, down, or hold, deg:number}. Motion is in wrist frame. up tilts the gripper up, down tilts it down, hold with deg 0 leaves it.
- wrist_twist: {direction:clockwise, counterclockwise, or hold, deg:number}. Motion is in wrist frame; clockwise is looking along the arm toward the fingertips, counterclockwise is the opposite way, hold with deg 0 leaves it.
- grip: {direction:open, close, or hold, pct:number}. pct is percent points on the same 0-100 scale as grip_pct in joint state (0 closed, 100 fully open). open increases the opening this turn, close decreases it, hold with pct 0 leaves it.
Each waypoint is a displacement from this observation's joint state. hold is only valid with 0; any other direction requires a positive amount.
A command that would take lift, arm, a wrist, or the gripper past a soft stop is rejected in full and nothing moves. The next observation includes the previous command result, one command status then a line per commanded joint:
completed: that joint became idle at the commanded target.
stopped_short: that joint became idle before the commanded target. For grip this usually means the fingers closed on an object (a grasp). For other joints this usually means a collision, and a safety guard stopped the joint.
timeout: that joint was still moving when the time limit expired; the executor stopped the robot.
rejected: the whole command was refused and nothing moved; the named joint is why.
kind "done" only when this observation shows the task is complete. The robot does not execute it. Still include exactly 1 waypoint, all hold 0.
Avoid collisions with obstacles, people, the environment, and the robot itself.
HINTS (YOU SHOULD PAY ATTENTION TO THESE):
- Prioritize base movements over arm movements. Extending the arm too much can cause the robot to be unstable.
- The gripper finger ends are 10cm away from the wrist camera, and the gripper finger tips are 20cm away from the wrist camera. Adjusting the gripper pose so that the target grasping points are around 15cm away from the wrist camera enables stable grasping.
Task: <instruction>
Sent with the camera images each turn. Previous command result is omitted on the first turn. Example:
Live observation.
Images follow in order: gripper, head_center, head_left, head_right.
Gripper image is <width>x<height> pixels (origin top-left, x right, y down).
Joint state:
{"lift_cm":90.0,"arm_cm":10.0,"wrist_swing_deg":0.0,"wrist_tilt_deg":0.0,"wrist_twist_deg":0.0,"grip_pct":0.0}
Previous command result:
completed
lift: completed
arm: completed
Astra returns one JSON object per turn. Example:
{
"reasoning":"Orient the fingers vertically for the horizontal drawer handle and lower toward it, staying in front of the drawer.",
"kind":"move",
"joint_relative_position_commands":[{
"drive":{"direction":"hold","cm":0},
"slide":{"direction":"hold","cm":0},
"turn":{"direction":"hold","deg":0},
"lift":{"direction":"down","cm":20},
"arm":{"direction":"hold","cm":0},
"wrist_swing":{"direction":"hold","deg":0},
"wrist_tilt":{"direction":"up","deg":30},
"wrist_twist":{"direction":"clockwise","deg":90},
"grip":{"direction":"hold","pct":0}}]
}
| Key | Directions | Unit | Robot joint |
|---|---|---|---|
reasoning |
free text | ||
kind |
move, done |
||
drive |
hold, forward, backward |
cm | Base, forward/back |
slide |
hold, left, right |
cm | Base, sideways |
turn |
hold, left, right |
deg | Base, rotation |
lift |
hold, up, down |
cm | Lift |
arm |
hold, extend, retract |
cm | Telescoping arm |
wrist_swing |
hold, left, right |
deg | Wrist yaw |
wrist_tilt |
hold, up, down |
deg | Wrist pitch |
wrist_twist |
hold, clockwise, counterclockwise |
deg | Wrist roll |
grip |
hold, open, close |
% points | Gripper |
hold is valid only with amount 0.drive, slide, turn are in the robot body frame. Wrist keys are in the wrist frame. Left and up are the robot’s, not the camera’s.grip changes the opening by percentage points (0 closed, 100 fully open).done must still include one waypoint with every key set to hold 0. It is not executed.{
"type": "object",
"additionalProperties": false,
"required": [
"reasoning",
"kind",
"joint_relative_position_commands"
],
"properties": {
"reasoning": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"move",
"done"
]
},
"joint_relative_position_commands": {
"type": "array",
"minItems": 1,
"maxItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"drive",
"slide",
"turn",
"lift",
"arm",
"wrist_swing",
"wrist_tilt",
"wrist_twist",
"grip"
],
"properties": {
"drive": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"cm"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"forward",
"backward"
]
},
"cm": {
"type": "number",
"minimum": 0
}
}
},
"slide": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"cm"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"left",
"right"
]
},
"cm": {
"type": "number",
"minimum": 0
}
}
},
"turn": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"deg"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"left",
"right"
]
},
"deg": {
"type": "number",
"minimum": 0
}
}
},
"lift": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"cm"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"up",
"down"
]
},
"cm": {
"type": "number",
"minimum": 0
}
}
},
"arm": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"cm"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"extend",
"retract"
]
},
"cm": {
"type": "number",
"minimum": 0
}
}
},
"wrist_swing": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"deg"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"left",
"right"
]
},
"deg": {
"type": "number",
"minimum": 0
}
}
},
"wrist_tilt": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"deg"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"up",
"down"
]
},
"deg": {
"type": "number",
"minimum": 0
}
}
},
"wrist_twist": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"deg"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"clockwise",
"counterclockwise"
]
},
"deg": {
"type": "number",
"minimum": 0
}
}
},
"grip": {
"type": "object",
"additionalProperties": false,
"required": [
"direction",
"pct"
],
"properties": {
"direction": {
"type": "string",
"enum": [
"hold",
"open",
"close"
]
},
"pct": {
"type": "number",
"minimum": 0
}
}
}
}
}
}
}
}
The get_gripper_depth tool returns wrist-camera depth values for specified image coordinates.
{
"name": "get_gripper_depth",
"description": "Look up wrist stereo depth on this turn's gripper image. Pass integer pixel coordinates (origin top-left, x right, y down). Returns Euclidean distance from the camera origin in centimetres, or null if that pixel has no reading or is outside the image. At most 64 points per call.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"required": [
"points"
],
"properties": {
"points": {
"type": "array",
"maxItems": 64,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "integer"
},
"y": {
"type": "integer"
}
}
}
}
}
}
}
We conducted 5 trials per reasoning level. All other settings at default.
| Effort | Success | Completion | False done |
Turns | Total time (min) | Inference share | s / turn | Tokens (M) |
|---|---|---|---|---|---|---|---|---|
high (default) |
3/5 | 92% | 0/5 | 49.6 | 10.3 | 82% | 10.3 | 7.52 |
low |
0/5 | 60% | 4/5 | 57.6 | 10.5 | 81% | 8.7 | 8.01 |
ultra |
1/5 | 76% | 3/5 | 54.2 | 10.1 | 80% | 9.0 | 7.69 |
| Effort | Trial | Ended by | Success | Completion | Turns | Total (min) | Inference (min) | Execution (min) | s / turn | Tokens (M) |
|---|---|---|---|---|---|---|---|---|---|---|
high |
1 | done |
✓ | 100% | 47 | 9.1 | 7.2 | 1.1 | 9.1 | 6.63 |
high |
2 | done |
✓ | 100% | 50 | 10.4 | 8.6 | 1.2 | 10.3 | 7.98 |
high |
3 | stop | ✗ | 80% | 51 | 10.9 | 9.1 | 1.3 | 10.8 | 7.77 |
high |
4 | stop | ✗ | 80% | 51 | 12.1 | 10.3 | 1.2 | 12.1 | 8.02 |
high |
5 | done |
✓ | 100% | 49 | 9.2 | 7.4 | 1.2 | 9.1 | 7.20 |
low |
1 | done |
✗ | 60% | 63 | 12.0 | 9.8 | 1.3 | 9.3 | 9.16 |
low |
2 | done |
✗ | 60% | 76 | 14.3 | 11.7 | 1.7 | 9.2 | 11.01 |
low |
3 | stop | ✗ | 40% | 29 | 4.2 | 3.3 | 0.5 | 6.9 | 2.52 |
low |
4 | done |
✗ | 80% | 53 | 9.5 | 7.6 | 1.3 | 8.6 | 7.78 |
low |
5 | done |
✗ | 60% | 67 | 12.7 | 10.3 | 1.6 | 9.3 | 9.60 |
ultra |
1 | done |
✓ | 100% | 63 | 11.2 | 9.0 | 1.6 | 8.5 | 9.01 |
ultra |
2 | done |
✗ | 80% | 51 | 10.2 | 8.2 | 1.4 | 9.6 | 7.22 |
ultra |
3 | done |
✗ | 80% | 62 | 11.3 | 9.2 | 1.4 | 8.9 | 8.94 |
ultra |
4 | stop | ✗ | 40% | 39 | 7.1 | 5.5 | 0.9 | 8.4 | 4.69 |
ultra |
5 | done |
✗ | 80% | 56 | 10.9 | 8.7 | 1.5 | 9.3 | 8.57 |
done = Astra declared completion; stop = operator stopped the episode.We conducted 5 trials per setting. All other settings at default. api = get_gripper_depth tool, image = color-mapped depth image, none = no depth…
| Depth | Success | Completion | False done |
Turns | Total time (min) | Inference share | s / turn | Tokens (M) |
|---|---|---|---|---|---|---|---|---|
api (default) |
3/5 | 92% | 0/5 | 49.6 | 10.3 | 82% | 10.3 | 7.52 |
image |
1/5 | 61% | 3/5 | 63.8 | 11.7 | 81% | 8.9 | 7.66 |
none |
2/5 | 84% | 2/5 | 66.6 | 14.6 | 84% | 11.1 | 7.97 |
| Depth | Trial | Ended by | Success | Completion | Turns | Total (min) | Inference (min) | s / turn | Tokens (M) |
|---|---|---|---|---|---|---|---|---|---|
api |
1 | done |
✓ | 100% | 47 | 9.1 | 7.2 | 9.1 | 6.63 |
api |
2 | done |
✓ | 100% | 50 | 10.4 | 8.6 | 10.3 | 7.98 |
api |
3 | stop | ✗ | 80% | 51 | 10.9 | 9.1 | 10.8 | 7.77 |
api |
4 | stop | ✗ | 80% | 51 | 12.1 | 10.3 | 12.1 | 8.02 |
api |
5 | done |
✓ | 100% | 49 | 9.2 | 7.4 | 9.1 | 7.20 |
image |
1 | done |
✗ | 60% | 71 | 14.8 | 12.2 | 10.3 | 8.50 |
image |
2 | done |
✓ | 100% | 67 | 11.8 | 9.5 | 8.5 | 7.94 |
image |
3 | done |
✗ | 60% | 64 | 13.3 | 11.1 | 10.4 | 7.49 |
image |
4 | stop | ✗ | 40% | 49 | 7.4 | 5.8 | 7.1 | 6.27 |
image |
5 | done |
✗ | 45% | 68 | 11.3 | 9.0 | 7.9 | 8.10 |
none |
1 | done |
✓ | 100% | 66 | 13.8 | 11.7 | 10.6 | 7.79 |
none |
2 | done |
✗ | 80% | 65 | 13.8 | 11.4 | 10.6 | 7.68 |
none |
3 | done |
✓ | 100% | 59 | 11.8 | 9.8 | 9.9 | 6.95 |
none |
4 | done |
✗ | 80% | 81 | 17.8 | 14.9 | 11.1 | 10.05 |
none |
5 | stop | ✗ | 60% | 62 | 16.0 | 14.0 | 13.6 | 7.38 |
done = Astra declared completion; stop = operator stopped the episode.@misc{zheng2026astra,
title={{Astra} Beyond Tabletop: Into the Home},
author={Zheng, Yuchen and Jadali, Nima and Mehta, Ankit and Nakashima, Rena and Srivatsa, Sumukha Suresh and Mahamane, Nadira and Muriki, Harsh and Spigarelli, Hannah and Chernova, Sonia},
year={2026},
note={Blog post, Georgia Institute of Technology}
}