Move an arm | Move an arm
Move an arm
Viam exposes three ways to command an arm. Three questions sort them:
- What do you know about the destination? A Cartesian target (a pose in space) calls for the motion service. A specific joint configuration calls for direct joint commands.
- Does the shape of the motion matter, or only the endpoint? If you need a straight line, a fixed orientation, or any other rule about the path itself, you need constraints.
- Do you want obstacle avoidance and IK picked for you, or fine manual control? The motion service handles both; direct joint commands skip both.
| Pattern | Input | Obstacle avoidance | Path-shape control | When to pick |
|---|---|---|---|---|
| Move to a pose | Cartesian target | Yes | No | You know where the end effector needs to go and want the planner to figure out how. |
| Move with constraints | Cartesian target + rules | Yes | Yes | The shape of the motion matters (straight-line tool path, level end effector). |
| Move by joint positions | Joint angles | No | Direct | You know the joint angles, need predictable motion between known configurations, or want to avoid the planner picking an unexpected IK solution. |
For the four constraint types the planner enforces, see Configure motion constraints.
Pick and place
Pick-and-place is the point where motion planning, vision, and gripper control meet. Each service works on its own, but the failure modes that matter most (the gripper closing on air, a depth estimate that crashes the arm into the table) only appear when all three run together.
The workflow splits into two stages so each can be developed and debugged independently:
- Pick covers detection, approach, and grasp. The arm moves to a pre-grasp pose above the object, descends, closes the gripper on the object, and lifts.
- Place covers transport and release. The arm moves the grasped object to a target location, descends, opens the gripper, and retreats.
Both stages reuse the obstacle definitions and geometry-attachment patterns from Obstacles and the arm-motion patterns from the table above.
How-tos
[Configure constraints
Restrict how the arm moves between poses using linear, orientation, and collision constraints.](https://docs.viam.com/motion-planning/move-an-arm/constraints/)
[Move an arm to a pose
Use the motion service to move a robot arm to a position in 3D space.](https://docs.viam.com/motion-planning/move-an-arm/move-to-pose/)
[Move with constraints
Move an arm along a straight line or with a fixed orientation using motion constraints.](https://docs.viam.com/motion-planning/move-an-arm/move-with-constraints/)
[Move by joint positions
Command an arm directly in joint space using MoveToJointPositions and MoveThroughJointPositions, bypassing the motion planner.](https://docs.viam.com/motion-planning/move-an-arm/move-by-joint-positions/)
[Move through waypoints
Plan a single continuous trajectory through an ordered list of intermediate goals using armplanning.PlanMotion.](https://docs.viam.com/motion-planning/move-an-arm/multiple-waypoints/)
[Pose clouds
Give the planner a region of acceptable destinations instead of a single exact pose, so it can find a solution faster.](https://docs.viam.com/motion-planning/move-an-arm/pose-clouds/)
[Pick an object
Detect, localize, and grasp an object with a robot arm and gripper.](https://docs.viam.com/motion-planning/move-an-arm/pick-an-object/)
[Place an object
Move a grasped object to a target location and release it.](https://docs.viam.com/motion-planning/move-an-arm/place-an-object/)