# Move an arm

Viam exposes three ways to command an arm. Three questions sort them:

1. **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.
2. **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.
3. **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](https://docs.viam.com/motion-planning/move-an-arm/move-to-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](https://docs.viam.com/motion-planning/move-an-arm/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](https://docs.viam.com/motion-planning/move-an-arm/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](https://docs.viam.com/motion-planning/move-an-arm/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](https://docs.viam.com/motion-planning/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/)
