Wrap-up and next steps

Congrats, you have finished the pick-and-place workshop! Starting from an empty machine, you configured every resource by hand and wrote the code that drives a vision-guided robot to detect a block, plan around obstacles, and place it in a bin.

What you built

  • Milestone one. You drove the arm through a fixed pick-and-place sequence from your own Python script, proving your connection, resources, and saved poses all hold up under real code.
  • Milestone two. You closed the loop with live perception: the vision service detects a block, and the motion service plans a collision-free pick from the block’s camera-frame position, all from a pose your code computes each cycle.

If you completed the optional Phase 6, you also packaged that same loop as a module that runs on the robot itself.

What you exercised on the platform

This workshop was small on purpose, but it touched most of the moving parts you will use on any Viam machine:

  • Configuration and runtime: the Viam app as the single source of truth (the CONFIGURE tab and its JSON view), viam-server running your resources while viam-agent keeps it alive, and the module system, including a discovery service that configured the camera for you.
  • Resources: components for the arm, gripper, depth camera, and pose-saving switches; obstacles configured as components so the planner sees the table and safety walls; and services for capability, a two-stage vision pipeline (a shape detector feeding a 3D segmenter) and the builtin motion service.
  • Motion and perception: the frame system letting the motion service plan a collision-free pick straight from a wrist-camera detection, no manual transform required; planning against your configured obstacles; and the wrist-camera rule of detecting from a known pose.
  • Code: the Python SDK (RobotClient, typed component and service clients, and motion.move), plus packaging that same script as an inline module.

Where to go next

Everything above is a foundation you can build on. A few directions, each with a starting point in the docs:

  • Extend the pick logic. Sort blocks by color or shape into separate bins, add more saved poses, or force a straight-line descent with a motion constraint.
  • Train your own detector. Replace the shape-finder with a custom ML model: capture and sync images, build a dataset and train a model, then deploy it through the ML model vision service.
  • Build an interface. Put a browser UI in front of the robot with a Viam application: stream the camera and trigger a pick from a dashboard instead of a script.
  • Operationalize it. Reuse this configuration across machines with a fragment and capture data from every run.
  • Run the module unattended. The optional Phase 6 module runs one cycle per do_command. Drive that on a cadence so the robot picks on its own: an internal loop that calls run_pick_cycle between sleeps, or a trigger that sends do_command on a schedule.
  • Explore the rest of the platform. The same patterns work from other SDKs (Go, TypeScript, C++, Flutter) and across the full component and service APIs.

When you are ready to build on your own hardware, the Viam documentation and the module registry are where to start.