Skip to content

Robots_UpdateRobotModel

PATCH
/v1/accounts/{account}/robots/{robot}/model
curl --request PATCH \
--url https://dev-api.qualiastudios.dev/v1/accounts/example/robots/example/model \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <X-API-Key>' \
--data '{ "name": "example", "arms": [ { "side": "SIDE_UNSPECIFIED", "handLink": "example", "tool": { "xyz": [ 1 ], "rpy": [ 1 ] }, "startPosture": [ 1 ], "startPostureConfigured": true } ], "solver": "SOLVER_UNSPECIFIED", "gripper": { "joint": "example", "openPosition": 1, "closedPosition": 1, "homePosition": 1 }, "etag": "example", "reachBase": [ 1 ], "minkParameters": { "posCost": 1, "oriCost": 1, "frameLmDamping": 1, "postureCost": 1, "postureTarget": "POSTURE_TARGET_UNSPECIFIED", "smoothnessCost": 1, "elbowDownCost": 1, "singularityThreshold": 1, "singularityDamping": 1, "dt": 1, "damping": 1, "maxIters": 1, "posTol": 1, "oriTol": 1, "stallTol": 1, "progressWindow": 1, "minProgress": 1, "checkedSteps": true, "maxJointVelocity": 1, "maxJointSpeedPerRow": 1, "selfCollision": true, "collisionPairs": "COLLISION_PAIRS_UNSPECIFIED", "collisionMinDistance": 1, "collisionDetectionDistance": 1, "collisionGain": 1, "collisionBoundRelaxation": 1, "shoulderLink": "example", "elbowLink": "example", "wristLink": "example" } }'

Edits arms, solver, gripper, reach_base or mink_parameters.

account
required
string

The account id.

robot
required
string

The robot id.

updateMask
string format: field-mask

Which fields to change: arms, solver, gripper, reach_base (naming it with none sent clears it), mink_parameters (a MINK model needs them whole; INVALID_ARGUMENT says which one a request gets wrong).

Media type application/json

A robot’s kinematic model and the config every consumer shares: reach checks, retargeting, forward kinematics for trajectories, and the 3D gripper (QUA-2338, QUA-2339). One per robot.

Served by fleet.

object
name

Accounts/{account}/robots/{robot}/model

string
urdfRobot

The URDF’s own robot name.

string
urdfUri

Signed URI of the browser-safe URDF: meshes point at the GLBs below.

string
meshes

The meshes.

Array<object>

One mesh, converted to GLB, at the path the served URDF references.

object
path

The path in the served URDF (package:// resolved to this relative path).

string
uri

Signed URI of the GLB.

string
digest

Content digest of the imported URDF and meshes.

string
arms

Its arms: guessed at import (the deepest link named for each side, else one right arm), then edited.

Array<object>

One arm.

object
side
required

Which side.

string format: enum
Allowed values: SIDE_UNSPECIFIED SIDE_LEFT SIDE_RIGHT
handLink
required

The link the arm ends at.

string
tool

The tool frame fixed in the hand link, where a handheld gripper root is held.

object
xyz

X, y, z in metres.

Array<number>
rpy

Roll, pitch, yaw in radians.

Array<number>
startPosture

The posture a replay starts from: one angle per turning joint of the chain, radians, clamped to the limits.

Array<number>
joints

The chain’s turning joints, base to hand, with their limits.

Array<object>

One turning joint, read off the URDF.

object
joint

Joint name.

string
lower

Lower limit, radians (or metres for prismatic).

number format: double
upper

Upper limit.

number format: double
tcp

The arm’s TCP in the hand link’s frame, the one every reader of a robot’s TCP uses (the reach solve at the TCP, the dashboard). A robot carrying a gripper (Robot.carried_gripper): the hand link to the mount’s parent link, then the mount, then the gripper’s own TCP; empty when the gripper has no TCP for this side or it is stale, or the mount’s parent link is not joined to the hand link by fixed joints. A robot carrying none: the TCP its URDF names, the first link called grasp_frame, hand_tcp or tcp (or ending _ and one of those) fixed below the hand link; empty where it names none.

object
m

M[0..3] is the first row, m[12..15] the last.

Array<number>
startPostureConfigured

Explicitly use this complete, in-limit start_posture as configured home for contact exclusions. Absent/false retains the replay rest seed without claiming imported, padded or clipped defaults are verified home.

boolean
solver

The IK solver.

string format: enum
Allowed values: SOLVER_UNSPECIFIED PYROKI DLS MINK
gripper

The gripper joint; unset when the robot has none.

object
joint
required

Joint name; {side} is replaced by “left” or “right”.

string
openPosition
required

Its position fully open.

number format: double
closedPosition
required

Its position shut.

number format: double
homePosition

Explicit jaw position at the configured arm home, mirrored with the open/closed range where the side’s URDF limits require it. Absence means unknown, including on legacy profiles; never infer open, closed or zero.

number format: double
capsuleState

Self-collision capsules.

string format: enum
Allowed values: CAPSULE_STATE_UNSPECIFIED FITTING FITTED UNAVAILABLE
capsulesUri

Signed URI of the capsules JSON (pyroki’s export), when fitted.

string
configDigest

Digest over digest, arms, solver, capsules, gripper and, for MINK, the Mink parameters. Reach results are keyed by it: after a change the stored results are for the old config, and nothing re-runs them until a reach check is asked for.

string
editor

Who last changed it.

object
kind

What kind of actor it is.

string format: enum
Allowed values: KIND_UNSPECIFIED PERSON VALIDATION RULE MODEL OPERATOR SYSTEM
user

The person’s user id when kind is PERSON; empty otherwise.

string
displayName

The person’s display name at the time, for rendering without a lookup.

string
agent

The rule code, or the model id (e.g. “gemini-robotics-er”), when not a person.

string
run

The run a model or rule finding came from, when it has one.

string
apiKey

The API key’s id when a person acted through one; empty for a session. Never the key itself.

string
attribution

Signed identity evidence recorded with the change, kept apart from the principal above. Unset on older records and wherever none was signed.

object
authentication

How the principal authenticated.

string format: enum
Allowed values: AUTHENTICATION_UNSPECIFIED SESSION API_KEY SERVICE
initiator

The user id of a person verified as starting the work: the person of a session, or the person a trusted service’s signed job record names. Empty when nobody was verified.

string
initiatorDisplayName

The initiator’s display name at the time, never their email.

string
credentialCreator

The user id of the key’s creator at the time. Not who used the key.

string
credentialOwner

Who owned the key at the time.

string format: enum
Allowed values: CREDENTIAL_OWNER_UNSPECIFIED PERSON SPACE
credentialOwnerSpace

The owning space’s id (a workspace or the organization) when credential_owner is SPACE.

string
updateTime

When it last changed.

string format: date-time
etag

Sent back on UpdateRobotModel.

string
importState

Where the latest import is. Until it is READY, the fields above describe the previous model (empty when there is none).

string format: enum
Allowed values: IMPORT_STATE_UNSPECIFIED PENDING CONVERTING READY FAILED
importFailureReason

Why the latest import FAILED, e.g. “no link is reached through three turning joints”.

string
reachBase

Where a dataset’s reach check starts when the dataset names no base of its own (ReachSettings.base_m): empty or exactly three numbers, metres in the robot’s base frame, each within 5 m either way. Not part of config_digest, so changing it makes no stored result stale; a dataset that follows it gets a new reach key on its next RunCheck. The reach op does not apply a base yet; see ReachSettings.base_m.

Array<number>
tcpDigest

Digest of every arm’s TCP (Arm.tcp), empty when no arm has one. Reach results walked at the TCP are keyed by it beside config_digest, so a change to the carried gripper, its mount, its TCP or either URDF makes them stale; results walked at the gripper root do not depend on it.

string
minkParameters

What Mink solves with: set exactly when the solver is MINK, and then whole (see MinkParameters). Set with UpdateRobotModel (update_mask mink_parameters) together with solver MINK; any other solver clears them. Part of config_digest, so changing them makes stored reach results stale.

object
posCost

Each arm’s frame task on its tool frame: its position cost, 0 or more. pos_cost and ori_cost are not both 0.

number format: double
oriCost

The frame task’s orientation cost, 0 or more.

number format: double
frameLmDamping

The frame task’s Levenberg-Marquardt damping, 0 or more.

number format: double
postureCost

The posture task’s cost on the arm joints, 0 or more.

number format: double
postureTarget

What the posture task pulls the arm joints toward.

string format: enum
Allowed values: POSTURE_TARGET_UNSPECIFIED ENGAGE ROW
smoothnessCost

The smoothness task’s cost, 0 or more; 0 turns it off.

number format: double
elbowDownCost

The elbow-down task’s cost, 0 or more; 0 turns it off.

number format: double
singularityThreshold

The singularity task’s threshold, 0 or more; 0 turns it off.

number format: double
singularityDamping

The singularity task’s damping, 0 or more; 0 turns it off.

number format: double
dt

The QP’s step, above 0.

number format: double
damping

The QP’s Levenberg-Marquardt damping, 0 or more.

number format: double
maxIters

The most QP steps a row takes, 1 to 1000.

integer format: int32
posTol

A row’s steps stop once every arm’s position error is within this and its orientation error within ori_tol; a 0 tolerance is never met.

number format: double
oriTol

The orientation tolerance that goes with pos_tol; 0 is never met.

number format: double
stallTol

A row’s steps stop once a step moves the joints less than this; 0 never stops one.

number format: double
progressWindow

A row’s steps stop once its error shrank by less than min_progress over this many steps, 0 to 1000; 0 never stops one.

integer format: int32
minProgress

The share of its error a row must lose over progress_window steps to keep stepping, 0 or more and below 1.

number format: double
checkedSteps

Q-research’s checked step (inference) instead of mink.solve_ik (teleop).

boolean
maxJointVelocity

The arm joints’ speed limit in the QP, 0 or more; 0 is no limit.

number format: double
maxJointSpeedPerRow

The arm joints’ speed limit from one row of the take to the next, 0 or more; 0 is no limit.

number format: double
selfCollision

Whether the collision limit, on the robot’s capsules, is on.

boolean
collisionPairs

The capsule pairs the collision limit watches.

string format: enum
Allowed values: COLLISION_PAIRS_UNSPECIFIED ALL AVOIDED
collisionMinDistance

The collision limit’s minimum distance, 0 or more.

number format: double
collisionDetectionDistance

The collision limit’s detection distance, above collision_min_distance.

number format: double
collisionGain

The collision limit’s gain, above 0 and at most 1.

number format: double
collisionBoundRelaxation

The collision limit’s bound relaxation, 0 or more.

number format: double
shoulderLink

The shoulder link’s name (“{side}” stands for left or right, at most 256 characters); empty is the arm chain’s 2nd joint’s child link.

string
elbowLink

The elbow link’s name, like shoulder_link; empty is the 4th joint’s child link.

string
wristLink

The wrist link’s name, like shoulder_link; empty is the 5th joint’s child link.

string

OK

Media type application/json

A robot’s kinematic model and the config every consumer shares: reach checks, retargeting, forward kinematics for trajectories, and the 3D gripper (QUA-2338, QUA-2339). One per robot.

Served by fleet.

object
name

Accounts/{account}/robots/{robot}/model

string
urdfRobot

The URDF’s own robot name.

string
urdfUri

Signed URI of the browser-safe URDF: meshes point at the GLBs below.

string
meshes

The meshes.

Array<object>

One mesh, converted to GLB, at the path the served URDF references.

object
path

The path in the served URDF (package:// resolved to this relative path).

string
uri

Signed URI of the GLB.

string
digest

Content digest of the imported URDF and meshes.

string
arms

Its arms: guessed at import (the deepest link named for each side, else one right arm), then edited.

Array<object>

One arm.

object
side
required

Which side.

string format: enum
Allowed values: SIDE_UNSPECIFIED SIDE_LEFT SIDE_RIGHT
handLink
required

The link the arm ends at.

string
tool

The tool frame fixed in the hand link, where a handheld gripper root is held.

object
xyz

X, y, z in metres.

Array<number>
rpy

Roll, pitch, yaw in radians.

Array<number>
startPosture

The posture a replay starts from: one angle per turning joint of the chain, radians, clamped to the limits.

Array<number>
joints

The chain’s turning joints, base to hand, with their limits.

Array<object>

One turning joint, read off the URDF.

object
joint

Joint name.

string
lower

Lower limit, radians (or metres for prismatic).

number format: double
upper

Upper limit.

number format: double
tcp

The arm’s TCP in the hand link’s frame, the one every reader of a robot’s TCP uses (the reach solve at the TCP, the dashboard). A robot carrying a gripper (Robot.carried_gripper): the hand link to the mount’s parent link, then the mount, then the gripper’s own TCP; empty when the gripper has no TCP for this side or it is stale, or the mount’s parent link is not joined to the hand link by fixed joints. A robot carrying none: the TCP its URDF names, the first link called grasp_frame, hand_tcp or tcp (or ending _ and one of those) fixed below the hand link; empty where it names none.

object
m

M[0..3] is the first row, m[12..15] the last.

Array<number>
startPostureConfigured

Explicitly use this complete, in-limit start_posture as configured home for contact exclusions. Absent/false retains the replay rest seed without claiming imported, padded or clipped defaults are verified home.

boolean
solver

The IK solver.

string format: enum
Allowed values: SOLVER_UNSPECIFIED PYROKI DLS MINK
gripper

The gripper joint; unset when the robot has none.

object
joint
required

Joint name; {side} is replaced by “left” or “right”.

string
openPosition
required

Its position fully open.

number format: double
closedPosition
required

Its position shut.

number format: double
homePosition

Explicit jaw position at the configured arm home, mirrored with the open/closed range where the side’s URDF limits require it. Absence means unknown, including on legacy profiles; never infer open, closed or zero.

number format: double
capsuleState

Self-collision capsules.

string format: enum
Allowed values: CAPSULE_STATE_UNSPECIFIED FITTING FITTED UNAVAILABLE
capsulesUri

Signed URI of the capsules JSON (pyroki’s export), when fitted.

string
configDigest

Digest over digest, arms, solver, capsules, gripper and, for MINK, the Mink parameters. Reach results are keyed by it: after a change the stored results are for the old config, and nothing re-runs them until a reach check is asked for.

string
editor

Who last changed it.

object
kind

What kind of actor it is.

string format: enum
Allowed values: KIND_UNSPECIFIED PERSON VALIDATION RULE MODEL OPERATOR SYSTEM
user

The person’s user id when kind is PERSON; empty otherwise.

string
displayName

The person’s display name at the time, for rendering without a lookup.

string
agent

The rule code, or the model id (e.g. “gemini-robotics-er”), when not a person.

string
run

The run a model or rule finding came from, when it has one.

string
apiKey

The API key’s id when a person acted through one; empty for a session. Never the key itself.

string
attribution

Signed identity evidence recorded with the change, kept apart from the principal above. Unset on older records and wherever none was signed.

object
authentication

How the principal authenticated.

string format: enum
Allowed values: AUTHENTICATION_UNSPECIFIED SESSION API_KEY SERVICE
initiator

The user id of a person verified as starting the work: the person of a session, or the person a trusted service’s signed job record names. Empty when nobody was verified.

string
initiatorDisplayName

The initiator’s display name at the time, never their email.

string
credentialCreator

The user id of the key’s creator at the time. Not who used the key.

string
credentialOwner

Who owned the key at the time.

string format: enum
Allowed values: CREDENTIAL_OWNER_UNSPECIFIED PERSON SPACE
credentialOwnerSpace

The owning space’s id (a workspace or the organization) when credential_owner is SPACE.

string
updateTime

When it last changed.

string format: date-time
etag

Sent back on UpdateRobotModel.

string
importState

Where the latest import is. Until it is READY, the fields above describe the previous model (empty when there is none).

string format: enum
Allowed values: IMPORT_STATE_UNSPECIFIED PENDING CONVERTING READY FAILED
importFailureReason

Why the latest import FAILED, e.g. “no link is reached through three turning joints”.

string
reachBase

Where a dataset’s reach check starts when the dataset names no base of its own (ReachSettings.base_m): empty or exactly three numbers, metres in the robot’s base frame, each within 5 m either way. Not part of config_digest, so changing it makes no stored result stale; a dataset that follows it gets a new reach key on its next RunCheck. The reach op does not apply a base yet; see ReachSettings.base_m.

Array<number>
tcpDigest

Digest of every arm’s TCP (Arm.tcp), empty when no arm has one. Reach results walked at the TCP are keyed by it beside config_digest, so a change to the carried gripper, its mount, its TCP or either URDF makes them stale; results walked at the gripper root do not depend on it.

string
minkParameters

What Mink solves with: set exactly when the solver is MINK, and then whole (see MinkParameters). Set with UpdateRobotModel (update_mask mink_parameters) together with solver MINK; any other solver clears them. Part of config_digest, so changing them makes stored reach results stale.

object
posCost

Each arm’s frame task on its tool frame: its position cost, 0 or more. pos_cost and ori_cost are not both 0.

number format: double
oriCost

The frame task’s orientation cost, 0 or more.

number format: double
frameLmDamping

The frame task’s Levenberg-Marquardt damping, 0 or more.

number format: double
postureCost

The posture task’s cost on the arm joints, 0 or more.

number format: double
postureTarget

What the posture task pulls the arm joints toward.

string format: enum
Allowed values: POSTURE_TARGET_UNSPECIFIED ENGAGE ROW
smoothnessCost

The smoothness task’s cost, 0 or more; 0 turns it off.

number format: double
elbowDownCost

The elbow-down task’s cost, 0 or more; 0 turns it off.

number format: double
singularityThreshold

The singularity task’s threshold, 0 or more; 0 turns it off.

number format: double
singularityDamping

The singularity task’s damping, 0 or more; 0 turns it off.

number format: double
dt

The QP’s step, above 0.

number format: double
damping

The QP’s Levenberg-Marquardt damping, 0 or more.

number format: double
maxIters

The most QP steps a row takes, 1 to 1000.

integer format: int32
posTol

A row’s steps stop once every arm’s position error is within this and its orientation error within ori_tol; a 0 tolerance is never met.

number format: double
oriTol

The orientation tolerance that goes with pos_tol; 0 is never met.

number format: double
stallTol

A row’s steps stop once a step moves the joints less than this; 0 never stops one.

number format: double
progressWindow

A row’s steps stop once its error shrank by less than min_progress over this many steps, 0 to 1000; 0 never stops one.

integer format: int32
minProgress

The share of its error a row must lose over progress_window steps to keep stepping, 0 or more and below 1.

number format: double
checkedSteps

Q-research’s checked step (inference) instead of mink.solve_ik (teleop).

boolean
maxJointVelocity

The arm joints’ speed limit in the QP, 0 or more; 0 is no limit.

number format: double
maxJointSpeedPerRow

The arm joints’ speed limit from one row of the take to the next, 0 or more; 0 is no limit.

number format: double
selfCollision

Whether the collision limit, on the robot’s capsules, is on.

boolean
collisionPairs

The capsule pairs the collision limit watches.

string format: enum
Allowed values: COLLISION_PAIRS_UNSPECIFIED ALL AVOIDED
collisionMinDistance

The collision limit’s minimum distance, 0 or more.

number format: double
collisionDetectionDistance

The collision limit’s detection distance, above collision_min_distance.

number format: double
collisionGain

The collision limit’s gain, above 0 and at most 1.

number format: double
collisionBoundRelaxation

The collision limit’s bound relaxation, 0 or more.

number format: double
shoulderLink

The shoulder link’s name (“{side}” stands for left or right, at most 256 characters); empty is the arm chain’s 2nd joint’s child link.

string
elbowLink

The elbow link’s name, like shoulder_link; empty is the 4th joint’s child link.

string
wristLink

The wrist link’s name, like shoulder_link; empty is the 5th joint’s child link.

string
Example
{
"arms": [
{
"side": "SIDE_UNSPECIFIED"
}
],
"solver": "SOLVER_UNSPECIFIED",
"capsuleState": "CAPSULE_STATE_UNSPECIFIED",
"editor": {
"kind": "KIND_UNSPECIFIED",
"attribution": {
"authentication": "AUTHENTICATION_UNSPECIFIED",
"credentialOwner": "CREDENTIAL_OWNER_UNSPECIFIED"
}
},
"importState": "IMPORT_STATE_UNSPECIFIED",
"minkParameters": {
"postureTarget": "POSTURE_TARGET_UNSPECIFIED",
"collisionPairs": "COLLISION_PAIRS_UNSPECIFIED"
}
}

Default error response

Media type application/json

The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

object
code

The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

integer format: int32
message

A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

string
details

A list of messages that carry the error details. There is a common set of message types for APIs to use.

Array<object>

Contains an arbitrary serialized message along with a @type that describes the type of the serialized message.

object
@type

The type of the serialized message.

string
key
additional properties
any
Example generated
{
"code": 1,
"message": "example",
"details": [
{
"@type": "example"
}
]
}