Previous
Frame System
This is the most common manipulation setup: a table-mounted arm with a gripper on the end effector and a camera mounted on the arm near the gripper. The camera moves with the arm, giving you a consistent view of whatever the arm is reaching for. This guide walks you through configuring the frame system for this hardware arrangement.
world
├── my-arm
│ ├── my-gripper (attached to arm)
│ └── my-camera (mounted on arm)
└── table-surface
The arm is a direct child of the world frame. The gripper and camera are both children of the arm, so they move with the arm automatically as it changes position.
Pick a fixed point in your workspace that is easy to measure from. For a table-mounted arm, the arm base or a table corner are good choices.
If you choose the arm base as the world frame origin, the arm’s translation offset will be (0, 0, 0).
If you choose a table corner, you will need to measure the distance from that corner to the arm base.
Mark your chosen origin physically so you can take consistent measurements.
In the Viam app, navigate to your machine and click the CONFIGURE tab. Find your arm component and click + Add frame.
If the arm base is your world frame origin:
{
"parent": "world",
"translation": { "x": 0, "y": 0, "z": 0 },
"orientation": {
"type": "ov_degrees",
"value": { "x": 0, "y": 0, "z": 1, "th": 0 }
}
}
If the world frame origin is at a table corner and the arm base is 300 mm to the right and 250 mm forward from that corner:
{
"parent": "world",
"translation": { "x": 300, "y": 250, "z": 0 },
"orientation": {
"type": "ov_degrees",
"value": { "x": 0, "y": 0, "z": 1, "th": 0 }
}
}
Click Save after adding the frame.
Before adding more frames, confirm that the arm’s coordinate axes match your expectations.
If an axis points the wrong way, adjust the orientation field in the arm’s frame.
For example, if the arm’s +x points opposite to your intended +x, rotate 180 degrees around the z axis:
{
"orientation": {
"type": "ov_degrees",
"value": { "x": 0, "y": 0, "z": 1, "th": 180 }
}
}
Find your gripper component in the CONFIGURE tab and click + Add frame.
If the gripper attaches directly to the arm’s end effector with no adapter plate, use a zero offset:
{
"parent": "my-arm",
"translation": { "x": 0, "y": 0, "z": 0 },
"orientation": {
"type": "ov_degrees",
"value": { "x": 0, "y": 0, "z": 1, "th": 0 }
}
}
If the gripper is mounted through an adapter plate or flange that adds height, set the z translation to the adapter height in millimeters. For example, with a 50 mm adapter plate:
{
"parent": "my-arm",
"translation": { "x": 0, "y": 0, "z": 50 },
"orientation": {
"type": "ov_degrees",
"value": { "x": 0, "y": 0, "z": 1, "th": 0 }
}
}
Click Save.
Find your camera component in the CONFIGURE tab and click + Add frame.
The camera’s parent is the arm, not the world frame. Measure the offset from the arm’s end effector to the camera’s optical center. For a camera mounted 30 mm to the side and 60 mm above the end effector:
{
"parent": "my-arm",
"translation": { "x": 0, "y": 30, "z": 60 },
"orientation": {
"type": "ov_degrees",
"value": { "x": 0, "y": 0, "z": 1, "th": 0 }
}
}
If the camera is tilted downward (for example, angled 30 degrees toward the gripper), add a rotation around the x axis:
{
"parent": "my-arm",
"translation": { "x": 0, "y": 30, "z": 60 },
"orientation": {
"type": "ov_degrees",
"value": { "x": 1, "y": 0, "z": 0, "th": -30 }
}
}
Click Save.
If a frame appears in the wrong position, return to the CONFIGURE tab and adjust the translation or orientation values.
Use the TransformPose API to confirm that the frame system computes correct transforms between frames.
Express the camera’s origin (0, 0, 0) in the camera frame and transform it to the world frame.
The result should match the physical position of the camera.
For details on the TransformPose API, see Frame System Concepts.
Was this page helpful?
Glad to hear it! If you have any other feedback please let us know:
We're sorry about that. To help us improve, please tell us what we can do better:
Thank you!