Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
4005c8e
feat(tutorials): add SO-ARM101 workshop phase template
HipsterBrown Jul 11, 2026
ebea3ed
feat(tutorials): add SO-ARM101 palletizing workshop overview
HipsterBrown Jul 11, 2026
964910c
feat(tutorials): author SO-ARM101 workshop phase 1 (platform mental m…
HipsterBrown Jul 11, 2026
d209330
fix(tutorials): correct 5-DOF motion-planning explanation (position_o…
HipsterBrown Jul 11, 2026
fe8e073
feat(tutorials): author SO-ARM101 workshop phase 2 (configure the arm)
HipsterBrown Jul 11, 2026
32973ff
refactor(tutorials): place SO-ARM101 base at world origin so taught p…
HipsterBrown Jul 11, 2026
decf7d9
feat(tutorials): author SO-ARM101 workshop phase 3 (teach the cell by…
HipsterBrown Jul 11, 2026
b48c963
feat(tutorials): author SO-ARM101 workshop phase 4 (pack from Python,…
HipsterBrown Jul 11, 2026
7d9c50f
fix(tutorials): store taught poses in helpers.py for phase 4 to read
HipsterBrown Jul 11, 2026
807a9ac
feat(tutorials): add SO-ARM101 workshop stubs for phases 5 and 6
HipsterBrown Jul 11, 2026
ab733da
chore: ignore pending SO-ARM101 companion repo in htmltest
HipsterBrown Jul 11, 2026
84da53d
fix(tutorials): introduce companion repo once in phase 4 and fix plac…
HipsterBrown Jul 11, 2026
4c808e5
style(tutorials): consistent 'Phase N' capitalization and 'SO-ARM101 …
HipsterBrown Jul 11, 2026
2b0e566
fix(tutorials): shorten SO-ARM101 phase 1 title under the 70-char hea…
HipsterBrown Jul 11, 2026
eec8a2c
docs(tutorials): make SO-ARM101 workshop stand alone (remove Viam 101…
HipsterBrown Jul 11, 2026
50c1c46
fix(tutorials): configure the SO-ARM101 gripper frame (separate compo…
HipsterBrown Jul 11, 2026
db4dad9
docs(tutorials): add JSON snippet for SO-ARM101 calibration sensor co…
HipsterBrown Jul 11, 2026
168daf0
docs(tutorials): align SO-ARM101 workshop with pick-and-place format
HipsterBrown Jul 12, 2026
60e1f77
docs(tutorials): revise SO-ARM101 workshop from review feedback
HipsterBrown Jul 12, 2026
1f9240e
docs(tutorials): apply second round of review feedback
HipsterBrown Jul 12, 2026
e485a14
docs(tutorials): third round of review feedback
HipsterBrown Jul 12, 2026
00ff12d
feat(tutorials): author SO-ARM101 workshop phases 5 and 6
HipsterBrown Jul 12, 2026
14ea7f4
docs(tutorials): fix wrap-up claims and standardize frame-system link
HipsterBrown Jul 12, 2026
a2f382a
docs(tutorials): apply phase 5 and 6 review feedback
HipsterBrown Jul 12, 2026
67328c8
docs(tutorials): add asset placement comments across all phases
HipsterBrown Jul 12, 2026
5b122cc
docs(tutorials): publish the SO-ARM101 palletizing workshop (remove d…
HipsterBrown Jul 12, 2026
fb3eb0a
docs(tutorials): add the cell-layout diagram (SVG) to phase 1
HipsterBrown Jul 12, 2026
eb30ebe
docs(tutorials): draw a realistic articulated arm in the cell-layout …
HipsterBrown Jul 12, 2026
34364c8
docs(tutorials): fix label overlaps in the cell-layout diagram
HipsterBrown Jul 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .htmltest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ IgnoreURLs:
- "twitter.com"
- "github.com/viamrobotics/docs"
- "github.com/viam-devrel/pick-and-place"
- "github.com/viam-devrel/mini-palletizer"
- "openai.com"
- "espressif.com"
- "pinout.xyz"
Expand Down
104 changes: 104 additions & 0 deletions assets/tutorials/so-arm101-palletizing/diagram-cell-layout.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
79 changes: 79 additions & 0 deletions docs/tutorials/so-arm101-palletizing/01-platform-mental-model.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
---
title: "Phase 1: The platform and the cell"
linkTitle: "1. Platform mental model"
type: "docs"
slug: "platform-mental-model"
weight: 10
description: "How your computer and Viam fit together, and the three robotics concepts this workshop is built on."
workshop: "so-arm101-palletizing"
toc_hide: true
phase: 1
phase_total: 6
next: "/tutorials/so-arm101-palletizing/configure-the-arm/"
languages: ["python"]
---

Before you configure anything, this phase gives you a mental model of the cell you are about to build and the platform it runs on. Everything after this leans on the ideas introduced here.

## What you'll build

You are building a miniature palletizing cell. An SO-ARM101 arm picks cubes, one at a time, from a staging spot and stacks them on a small pallet: two layers of four, eight cubes total. The arm and its gripper are the hardware; a set of hand-taught poses and, later, your own Python code, are what turn that hardware into a working pack routine.

<!-- ASSET diagram-cell-layout (DIAGRAM): arm base, staging spot, 2x2 pallet grid, two layers -->

{{<imgproc src="/tutorials/so-arm101-palletizing/diagram-cell-layout.svg" declaredimensions=true class="aligncenter" style="max-width:720px" alt="Top-down layout of the cell: the arm base at the world origin reaches over a staging spot where you feed one cube and a two-by-two pallet grid at 30 mm pitch with the origin corner (cell 0) highlighted. A curved arrow shows the pick-then-place flow from staging to pallet, and an inset shows two cubes stacked, since each cell holds two layers.">}}

## The three layers

A Viam machine is made of three layers that each do one job:

```text
Viam cloud app
└─ machine configuration (the source of truth)
│ viam-server pulls config
Your personal computer
└─ viam-server drives the arm and gripper, exposes the control API
│ control API calls
Your Python script
```

- **The Viam cloud app** is the source of truth for configuration. When you add a component, change an attribute, or configure a service, you are editing a JSON document stored in the cloud. The app never controls your robot directly; it describes what should run.
- **viam-server** runs on your computer. It pulls the configuration from the cloud app, starts every component and service that configuration describes, and exposes them over a control API. This is the layer that talks to the arm: the SO-ARM101 connects to your computer over a USB serial cable, and `viam-server` drives the arm's motors through that connection.
- **Your Python script** connects to `viam-server` and calls that control API to move the arm and read its position. You write it later in the workshop.

Open your machine's page in the Viam app now and find the status indicator that shows the machine is live. That indicator confirms `viam-server` is running on your computer and connected to the cloud app.

## How your code connects

When a Python script imports the Viam SDK and connects to your machine, the connection goes to `viam-server`, not to the cloud app. The cloud app helps your script locate the machine and authenticate, but once the connection is established, every control API call, moving the arm and reading its position, goes directly to `viam-server`. You will write exactly this kind of script later in the workshop.

Open the **CONNECT** tab on your machine's page and look at the code sample it generates. It contains your machine's address and an API key and ID pair, the things any script needs to authenticate and reach `viam-server`.

## Components and services

Everything a Viam machine does is modeled as a resource, and resources split into components and services.

- The arm and the gripper are **components**: each one wraps a piece of physical hardware and exposes a standard API for it. An arm moves to a pose; a gripper opens and closes.
- The **motion service** is a service: software that plans how the arm should move, rather than hardware you can point at. It is a **builtin** service, so it ships with `viam-server` and needs no configuration; you just call its API. The arm and gripper components, by contrast, come from a module that `viam-server` downloads when you configure them in Phase 2.

## Three robotics concepts to learn

Three concepts carry the whole workshop. This section only previews them; you will work with each one directly in a later phase.

The **frame system** answers "where is everything around the robot, and how is it related?" It tracks the position of every component and object in the cell, and the parent-child relationships between them, all traced back to the world origin. You teach the two key positions to the arm by hand in Phase 3. See [Frame system](/motion-planning/frame-system/overview/) for the full picture.

**Motion planning** answers "how does the arm get there?" Given a target pose, the motion service works out a path of joint movements that reaches it without colliding with anything.

**WorldState** answers "what is in the world around the robot?" On each move, it tells the motion service what to account for: **obstacles**, the things to avoid, and **transforms**, the things that move with the arm, like the gripper and any cube it is holding. In this workshop, WorldState grows as you pack: each cube already on the pallet is an obstacle to route around, and the cube in the gripper rides along as a transform. See [Obstacles and WorldState](/motion-planning/obstacles/) for more.

{{< checkpoint >}}
Open your machine in the Viam app and confirm the green **Live** indicator, so you know `viam-server` is running and reachable before you configure anything. You should also be able to say, in your own words, what the frame system, the motion service, and WorldState each do, since every later phase builds on them. If the machine is not Live, start `viam-server` on your computer before continuing.
{{< /checkpoint >}}

With the mental model in place, [Phase 2](/tutorials/so-arm101-palletizing/configure-the-arm/) is where you add the arm and gripper, verify them, and place them in the frame system.

{{< workshop-nav >}}
Loading
Loading