diff --git a/src/components/LabGuide.astro b/src/components/LabGuide.astro new file mode 100644 index 0000000..51bc453 --- /dev/null +++ b/src/components/LabGuide.astro @@ -0,0 +1,238 @@ +--- +// /series6(フィジカルAI研究室)の見出しの下に置く解説(2026-11-07) +// 1 研究室の構成:机の上・Mac・借りた GPU の3か所と、その間を行き来するもの(図は HTML で組む。AI も読めるように) +// 2 いま回している実験:お手本 → 学習 → 実機 → 人の直し → 直した成功を学習に足す、のループと各段の数字 +// 3 使っている技術:π0.5・追加学習(LoRA)・借りる GPU・推論サーバー・巻き戻しと人の直し +// 写真は public/site/lab/(desk.webp は 2026-10-29 の横からの録画 IMG_4215.MOV の80秒目、 +// top-camera.webp は corr_v5 のお手本 pi05_20261106_183926 の真ん中のコマ。元は iCloud の +// フィジカルAI研究室を作る/series6_guide_images/) +// 数字はどれも LOG の記録の値。新しい LOG で数字が変わったら、ここも書き換える +type Link = { log: string; slug: string; t: string }; + +const zones = [ + { key: 'desk', name: '机の上', img: true, items: [ + { h: 'mechArm 270', p: '6つの関節を持つ小型のロボットアーム。中の Raspberry Pi が指令を受けて関節を動かします。' }, + { h: '上のカメラ', p: 'スマホを真上に付けて、マットとブロックと箱を撮ります。π0.5 が見るのはこの画像だけです。' }, + { h: 'ゲームパッド', p: 'AI が失敗しかけたとき、人が関節を直すのに使います。3,198円の互換品です。' }, + ] }, + { key: 'mac', name: '手元の Mac', items: [ + { h: '記録と中継', p: 'カメラの画像と関節の角度を1秒10コマで記録し、借りた GPU に送り、返ってきた動きをアームへ渡します。' }, + { h: 'AI と組み立てる', p: '手順と分析は Claude、アームを動かすプログラムは Claude Code と一緒に書いています。' }, + ] }, + { key: 'gpu', name: '時間で借りる GPU', items: [ + { h: 'Runpod の A40', p: 'GPU のメモリは 48GB、1時間あたり約98円。π0.5 の学習と推論は、すべてここで行います。' }, + { h: 'Hugging Face', p: '学習済みのモデル(6.3GB)の置き場所。GPU を借りるたびに、ここから13秒で取ってきます。' }, + ] }, +]; + +const loop: { h: string; num: string; unit: string; p: string; links: Link[] }[] = [ + { h: 'お手本を集める', num: '19', unit: '本', + p: '要所の姿勢だけ手でアームに教え、間は再生でつないで録りました。ブロックの置き場所は5か所です。', + links: [ + { log: 'LOG349', slug: 'drag-teach-waypoint-replay', t: '手で教えた動きを再生' }, + { log: 'LOG352', slug: 'teach-replay-19-demos', t: 'お手本19本' }, + ] }, + { h: 'π0.5 に覚えさせる', num: '4,000', unit: 'ステップ', + p: '借りた A40 で追加学習し、学習の誤差(loss)は 0.0858 から 0.0037 に下がりました。', + links: [ + { log: 'LOG341', slug: 'pi05-mecharm-lora-2000-steps', t: '最初の学習' }, + { log: 'LOG355', slug: 'pi05-retrain-five-positions', t: '5か所で学習し直す' }, + { log: 'LOG358', slug: 'pi05-learned-the-pauses', t: '待ち時間まで覚えた' }, + ] }, + { h: '実機で動かす', num: '9/15', unit: '回', + p: '3か所に5回ずつブロックを置き、人が手を出さずに箱へ入れた回数です。腕を伸ばしきる位置は5回中1回でした。', + links: [ + { log: 'LOG361', slug: 'pi05-first-block-in-box', t: '初めて箱に入れた' }, + { log: 'LOG401', slug: 'pi05-weak-position-d', t: '回数で測る' }, + ] }, + { h: '失敗しかけたら人が直す', num: '13', unit: '秒', + p: '動きを巻き戻し、ゲームパッドで関節を直して AI に戻すまでの、1回あたりの中央の値です。キーで直していた頃は41〜51秒でした。', + links: [ + { log: 'LOG403', slug: 'rewind-and-correct-pi05', t: '巻き戻しの仕組み' }, + { log: 'LOG446', slug: 'gamepad-correction-mecharm-270-settled', t: 'ゲームパッドの形' }, + { log: 'LOG450', slug: 'gamepad-fixes-mecharm-270-ai-in-13-seconds', t: '1回13秒に' }, + ] }, + { h: '直した成功を学習に足す', num: '11', unit: '本', + p: '人が直して成功した記録をお手本に足し、前のモデルから1,500ステップ続けて学び直します。', + links: [ + { log: 'LOG417', slug: 'retrain-pi05-with-human-corrections', t: '直した5回で学び直す' }, + { log: 'LOG422', slug: 'retrained-pi05-still-needs-human-corrections', t: 'それでも直しが要った' }, + ] }, +]; + +const tech: { name: string; sub: string; p: string; fig?: boolean; links: Link[] }[] = [ + { name: 'π0.5', sub: 'Physical Intelligence', fig: true, + p: '米国の Physical Intelligence 社が公開している、ロボット用の AI のモデルです。上のカメラの画像、6つの関節と爪の角度、指示文(赤いブロックを白い箱に入れる)を受け取り、次の1秒ぶん(10コマ)の関節の角度を返します。どの順番で動くかを書いたプログラムはありません。', + links: [{ log: 'LOG337', slug: 'pi05-mecharm-demo-to-inference', t: 'mechArm 270 で動かすまでの流れ' }] }, + { name: '追加学習', sub: 'LoRA', + p: 'たくさんのロボットのデータで学習済みの π0.5 に、mechArm 270 のお手本だけを足して覚えさせます。モデル全体ではなく、足した小さな部品だけを学習するので、A40 を1枚借りれば足ります。', + links: [{ log: 'LOG341', slug: 'pi05-mecharm-lora-2000-steps', t: '予測がお手本とほぼ一致' }] }, + { name: '時間で借りる GPU', sub: 'Runpod', + p: 'π0.5 は NVIDIA の GPU を積んだ Linux のマシンでしか動かず、Mac では動きません。そこで GPU を時間単位で借ります。学習は自動で回し、終わるとモデルを持ち帰って、借りたマシンを消します。', + links: [{ log: 'LOG401', slug: 'pi05-weak-position-d', t: 'モデルを Hugging Face に置いた' }] }, + { name: '推論サーバー', sub: 'Remote inference', + p: '借りたマシンの上で π0.5 を起動し、Mac とは SSH の中継でつなぎます。π0.5 の計算は1回平均97ミリ秒、Mac から送って答えが返るまでの往復は391ミリ秒でした(A40)。', + links: [{ log: 'LOG326', slug: 'openpi-remote-inference-first-run', t: '借りた GPU で初めて動かした' }] }, + { name: '巻き戻しと人の直し', sub: 'Human correction', + p: '米国の MicroFactory の卓上ロボットを参考にしました。失敗しかけた区間をアームごと巻き戻し、人が関節を直してから AI に戻します。直す人の手はカメラに写らないので、直した動きをそのまま学習データにできます。', + links: [{ log: 'LOG403', slug: 'rewind-and-correct-pi05', t: '直した動きだけを学習データにする' }] }, +]; +--- +
+

研究室の構成 | Setup

+

机の上のアーム、手元の Mac、時間で借りる GPU の3か所でできています。AI の学習と推論は、すべて借りた GPU の上で行っています。

+
+ {zones.map((z, i) => ( + <> + {i > 0 && ( + + )} +
+

{z.name}

+ {z.img && マットの上の mechArm 270 が赤いブロックをつかみ、右に白い箱が置いてある} +
+ {z.items.map((it) => (
{it.h}
{it.p}
))} +
+
+ + ))} +
+

Mac は上のカメラの画像と関節の角度を、指示文と一緒に借りた GPU へ送ります。π0.5 は次の1秒ぶんの関節の角度を返し、Mac がそれをアームへ渡します。

+
+ +
+

いま回している実験 | Experiment

+

赤いブロックをつかんで、白い箱に入れる。この1つの作業を π0.5 に覚えさせ、失敗しかけた所を人が直し、直した動きをまた学習に回しています。人の直しが要らなくなるまで、このループを回します。

+
    + {loop.map((s, i) => ( +
  1. + {String(i + 1).padStart(2, '0')} +

    {s.h}

    +

    {s.num}{s.unit}

    +

    {s.p}

    + +
  2. + ))} +
+

05 のあとは 03 に戻り、学び直したモデルで実機をもう一度動かします

+

数字は 2026年11月6日(LOG450)までの記録の値です。

+
+ +
+

使っている技術 | Technology

+
+ {tech.map((t) => ( +
+
{t.name}{t.sub}
+
+
+
+

{t.p}

+ +
+ {t.fig && ( +
+ 真上のカメラの画像。mechArm 270 の爪が赤いブロックをつかみ、右に白い箱がある +
π0.5 に渡している、上のカメラの画像(384×216)
+
+ )} +
+
+
+ ))} +
+
+ + diff --git a/src/lib/records.ts b/src/lib/records.ts index 991477d..440d586 100644 --- a/src/lib/records.ts +++ b/src/lib/records.ts @@ -44,7 +44,7 @@ export type SimTab = { id: string; task: string; place: string; src: string; tit // シリーズのページ(URL → 記事のシリーズ名)。Studio の一覧の絞り込み条件と同じ // intro はシリーズのページの見出しの下に出す説明(ないシリーズは出さない) -export const SERIES_PAGES: Record = { +export const SERIES_PAGES: Record = { series1: { series: 'HRI', title: 'Drug Delivery Robot | 薬剤搬送ロボットハコブくん', pageTitle: 'Series1 | 薬剤搬送ロボット', limit: 12, intro: '病院で薬を運ぶロボット「ハコブくん」を題材に、人とロボットの関わり(HRI)を設計している記録です。病院で使う画面(UI)の設計、Unity での自律移動、Fusion での形づくり、分身ロボット(アバター)の考察までを、4コママンガと一緒に残しています。' }, series2: { series: 'R2R2R', title: 'R2R2R | デジタルツイン学習-R2R2R(Real to Render to Real)', pageTitle: 'Series2 | R2R2R', limit: 12, @@ -59,7 +59,7 @@ export const SERIES_PAGES: Record {conf.vision && } + {conf.lab && } {conf.sim && (

試算を試す | Simulator