Move an arm

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

  1. What do you know about the destination? A Cartesian target (a pose in space), a region of acceptable poses, an ordered list of goals, or a specific joint configuration each point to a different call.
  2. Does the path 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 inverse kinematics (IK) picked for you, or fine manual control? The motion service picks the IK solution and plans around obstacles for you; direct joint commands execute exactly the angles you send.
PatternInputObstacle avoidancePath-shape controlWhen to pick
Move to a poseCartesian targetYesNoYou know where the end effector needs to go and want the planner to choose the path.
Move with constraintsCartesian target + rulesYesYesThe shape of the motion matters (straight-line tool path, level end effector).
Relax a goal with a pose cloudCartesian target + tolerancesYesNoAny pose in a region will do, or an exact goal plans slowly or keeps failing.
Move through waypointsOrdered list of Cartesian and/or joint goalsYesPartialThe arm must pass through specific intermediate goals in one continuous trajectory.
Move by joint positionsJoint anglesNoDirectYou know the joint angles, need predictable motion between known configurations, or want to avoid the planner picking an unexpected IK solution.
Stream joint positionsJoint waypoints with times, sent while the arm movesNoDirectYou are computing the trajectory as the motion runs, from a teleoperation feed or a control loop.
Arm-level Cartesian moveCartesian targetNoNoYou have a pose and deliberately want the arm’s own IK, with no planner, frame system, or obstacle checking.

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