diff --git a/docs/claude/bedrock.md b/docs/claude/bedrock.md new file mode 100644 index 0000000..867f588 --- /dev/null +++ b/docs/claude/bedrock.md @@ -0,0 +1,84 @@ +# Bedrockの設定(Jetson側) + +## JetsonにログインしClaudeのVersionを確認 + +```bash +claude --version +``` + +```bash +2.1.220 (Claude Code) +``` + +## AWS CLIのVersion + + +AWS cliをインストール + +```bash +cd /tmp + +curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" \ + -o "awscliv2.zip" + +sudo apt-get update +sudo apt-get install -y unzip + +unzip awscliv2.zip +sudo ./aws/install +``` + +AWS cliのVersionを確認 + +```bash +aws --version +``` + +```bash +aws-cli/2.36.14 Python/3.14.6 Linux/6.8.12-1021-tegra exe/aarch64.ubuntu.24 +``` + +## AWS SSOの設定 + +```bssh +aws sso login --profile my-pak-profile --use-device-code +``` + +SSOのstart URL, リージョンなどを設定します。 + +```bash +SSO session name (Recommended): lerobot +SSO start URL [None]: https://d-xxxxxxxxxx.awsapps.com/start +SSO region [None]: ap-northeast-1 +SSO registration scopes [sso:account:access]: +``` + +URLが表示されるのと発行されたKeyを入力し設定します。 + +## BedrockのClaude Fable 5のprovider_data_shareの設定 + +AWSでCloud Shellを起動して、Fable5のprovider_data_shareの設定を有効化します。 + +``` +aws bedrock put-account-data-retention --mode provider_data_share --region ap-northeast-1 +``` +## Claude Codeの設定 + +Jetson上で、claudeを起動します。 + +画面モードを選択 + + + +3rd-party platformを選択 + + + +Amazon Bedrockを選択 + + + +先ほど設定したssoのProfileのmy-pak-profileを選択し、fable5が出てくれば連動成功です。fable5が有効にならない場合、rovider_data_shareの設定がおこなわれていない可能性があります。 + + + diff --git a/docs/claude/bedrock_local.md b/docs/claude/bedrock_local.md new file mode 100644 index 0000000..1fd6423 --- /dev/null +++ b/docs/claude/bedrock_local.md @@ -0,0 +1,96 @@ +# Bedrockの設定(PC側) + +## AWS cli + +AWS cliのVersionを確認 + +```bash +aws --version +``` + +```bash +aws-cli/2.36.14 Python/3.14.6 Linux/6.8.12-1021-tegra exe/aarch64.ubuntu.24 +``` + +## AWS SSOの設定 + +```bssh +aws configure sso --profile my-pak-profile --use-device-code +``` + +SSOのstart URL, リージョンなどを設定します。 + +```bash +SSO session name (Recommended): lerobot +SSO start URL [None]: https://d-xxxxxxxxxx.awsapps.com/start +SSO region [None]: ap-northeast-1 +SSO registration scopes [sso:account:access]: +``` + +URLが表示されるのと発行されたKeyを入力し設定します。 + +## BedrockのClaude Fable 5のprovider_data_shareの設定 + +AWSでCloud Shellを起動して、Fable5のprovider_data_shareの設定を有効化します。 + +``` +aws bedrock put-account-data-retention --mode provider_data_share --region ap-northeast-1 +``` +## Claude Code Desktopを終了 + +Claude Code Desktopを完全に終了します(OSXならCMD+Q)。 + +各環境に合わせて`~/.claude/settings.json`を設定します。 + +`~/.claude/settings.json` OSXでの例 + +```bash +{ + "env": { + "CLAUDE_CODE_USE_BEDROCK": "1", + "AWS_PROFILE": "my-pak-profile", + "AWS_REGION": "ap-northeast-1", + "ANTHROPIC_MODEL": "global.anthropic.claude-fable-5" + } +} +``` + +## Claude Code Desktopを再起動 + +再起動すると、`CLAUDE_CODE_USE_BEDROCK`が有効になり、Bedrockのfable5に接続可能になります。 + +## 他のモデルを使う場合 + +`ANTHROPIC_MODEL`の値を変更すると、他のモデルに切り替えられます。 + +| モデル | `ANTHROPIC_MODEL`の値 | +|---|---| +| Claude Fable 5 | `global.anthropic.claude-fable-5` | +| Claude Opus 5 | `global.anthropic.claude-opus-5` | +| Claude Sonnet 5 | `global.anthropic.claude-sonnet-5` | +| Claude Opus 4.8(日本国内リージョンで処理) | `jp.anthropic.claude-opus-4-8` | + +例えばOpus 5に切り替える場合、`~/.claude/settings.json`を次のように書き換えます。 + +```bash +{ + "env": { + "CLAUDE_CODE_USE_BEDROCK": "1", + "AWS_PROFILE": "my-pak-profile", + "AWS_REGION": "ap-northeast-1", + "ANTHROPIC_MODEL": "global.anthropic.claude-opus-5" + } +} +``` + +書き換え後、Claude Code Desktopを再起動すると反映されます。 + +利用可能なモデルIDの一覧は、次のコマンドで確認できます。 + +```bash +aws bedrock list-inference-profiles \ + --profile my-pak-profile \ + --region ap-northeast-1 \ + --query "inferenceProfileSummaries[?contains(inferenceProfileId, 'claude')].[inferenceProfileId,status]" \ + --output table +``` \ No newline at end of file diff --git a/docs/claude/desktop.md b/docs/claude/desktop.md new file mode 100644 index 0000000..9a3c273 --- /dev/null +++ b/docs/claude/desktop.md @@ -0,0 +1,16 @@ +# Claude Code Desktopとの連携 + +## Claude Code Desktopで新規プロジェクト + + + + + + + + + + + + + diff --git a/docs/claude/howto.md b/docs/claude/howto.md new file mode 100644 index 0000000..b2cabd6 --- /dev/null +++ b/docs/claude/howto.md @@ -0,0 +1,16 @@ +# Claude Codeとの連携方法 + +## Claude Code連携のメリット + +Physical Agent Kit(PAK)とClaude Codeを連携させることで、プラグインの自動作成や、学習等の各種コマンドのサポート、LeRobotで足りない機能の拡張などが可能となります。 + +## Claude Codeとの連携方法 + +Claude CodeをPAKに組み込むには2つの方法があります。1つ目はClaude Code DesktopからSSHでPAKに接続し連携する方法です。2つ目はVisual Studio RemoteSSHを用いてPAK接続しClaude Codeをコマンドで起動して連携する方法です。 + +|方法|Claude Codeの起動|Jetsonのインターネット接続| +|:--|:--|:--| +|Claude Code DesktopからSSHでPAKに接続|接続元のPC上のClaude Code Desktopで起動|必要| +|Visual Studio RemoteSSHを用いてPAK接続|Jetson上でClaude Codeが起動|必要| + + \ No newline at end of file diff --git a/docs/claude/img/claude001.png b/docs/claude/img/claude001.png new file mode 100644 index 0000000..f4d5e8b Binary files /dev/null and b/docs/claude/img/claude001.png differ diff --git a/docs/claude/img/claude002.png b/docs/claude/img/claude002.png new file mode 100644 index 0000000..62737fa Binary files /dev/null and b/docs/claude/img/claude002.png differ diff --git a/docs/claude/img/claude003.png b/docs/claude/img/claude003.png new file mode 100644 index 0000000..0d6599e Binary files /dev/null and b/docs/claude/img/claude003.png differ diff --git a/docs/claude/img/claude004.png b/docs/claude/img/claude004.png new file mode 100644 index 0000000..9ab430e Binary files /dev/null and b/docs/claude/img/claude004.png differ diff --git a/docs/claude/img/desktop001.png b/docs/claude/img/desktop001.png new file mode 100644 index 0000000..7403c39 Binary files /dev/null and b/docs/claude/img/desktop001.png differ diff --git a/docs/claude/img/desktop002.png b/docs/claude/img/desktop002.png new file mode 100644 index 0000000..72eb514 Binary files /dev/null and b/docs/claude/img/desktop002.png differ diff --git a/docs/claude/img/desktop003.png b/docs/claude/img/desktop003.png new file mode 100644 index 0000000..f3b7142 Binary files /dev/null and b/docs/claude/img/desktop003.png differ diff --git a/docs/claude/img/desktop004.png b/docs/claude/img/desktop004.png new file mode 100644 index 0000000..473cc55 Binary files /dev/null and b/docs/claude/img/desktop004.png differ diff --git a/docs/claude/img/desktop005.png b/docs/claude/img/desktop005.png new file mode 100644 index 0000000..caae0a4 Binary files /dev/null and b/docs/claude/img/desktop005.png differ diff --git a/docs/claude/img/vsc001.png b/docs/claude/img/vsc001.png new file mode 100644 index 0000000..389fa36 Binary files /dev/null and b/docs/claude/img/vsc001.png differ diff --git a/docs/claude/img/vsc002.png b/docs/claude/img/vsc002.png new file mode 100644 index 0000000..966a635 Binary files /dev/null and b/docs/claude/img/vsc002.png differ diff --git a/docs/claude/img/vsc003.png b/docs/claude/img/vsc003.png new file mode 100644 index 0000000..9db42ae Binary files /dev/null and b/docs/claude/img/vsc003.png differ diff --git a/docs/claude/img/vsc004.png b/docs/claude/img/vsc004.png new file mode 100644 index 0000000..c7e22fc Binary files /dev/null and b/docs/claude/img/vsc004.png differ diff --git a/docs/claude/img/vsc005.png b/docs/claude/img/vsc005.png new file mode 100644 index 0000000..ad178df Binary files /dev/null and b/docs/claude/img/vsc005.png differ diff --git a/docs/claude/img/vsc006.png b/docs/claude/img/vsc006.png new file mode 100644 index 0000000..679d26e Binary files /dev/null and b/docs/claude/img/vsc006.png differ diff --git a/docs/claude/img/vsc007.png b/docs/claude/img/vsc007.png new file mode 100644 index 0000000..85be429 Binary files /dev/null and b/docs/claude/img/vsc007.png differ diff --git a/docs/claude/img/vsc008.png b/docs/claude/img/vsc008.png new file mode 100644 index 0000000..5b201df Binary files /dev/null and b/docs/claude/img/vsc008.png differ diff --git a/docs/claude/img/vsc009.png b/docs/claude/img/vsc009.png new file mode 100644 index 0000000..b4460a7 Binary files /dev/null and b/docs/claude/img/vsc009.png differ diff --git a/docs/claude/img/vsc010.png b/docs/claude/img/vsc010.png new file mode 100644 index 0000000..3e7faf7 Binary files /dev/null and b/docs/claude/img/vsc010.png differ diff --git a/docs/claude/img/way001.png b/docs/claude/img/way001.png new file mode 100644 index 0000000..a05cfcd Binary files /dev/null and b/docs/claude/img/way001.png differ diff --git a/docs/claude/plugin.md b/docs/claude/plugin.md new file mode 100644 index 0000000..cc0ddb1 --- /dev/null +++ b/docs/claude/plugin.md @@ -0,0 +1,9 @@ +# LeRobotプラグイン構築 + +## LeRobotプラグイン構築 SKill + +LeRobotPluginSkillを用いることで、Claude Codeを用いてプラグインを構築する事も可能です。 + +|プロジェクく|Repo| +|:--|:--| +| LeRobotPluginSkills | [https://github.com/FaBoAI/LeRobotPluginSkills](https://github.com/FaBoAI/LeRobotPluginSkills) \ No newline at end of file diff --git a/docs/claude/vs_remote.md b/docs/claude/vs_remote.md new file mode 100644 index 0000000..3d468c7 --- /dev/null +++ b/docs/claude/vs_remote.md @@ -0,0 +1,5 @@ +# Visual Studio remoteSSH + +## Visual Studio remoteSSH + +現在作成中 diff --git a/docs/claude/vsc.md b/docs/claude/vsc.md new file mode 100644 index 0000000..4537df2 --- /dev/null +++ b/docs/claude/vsc.md @@ -0,0 +1,43 @@ +# Visual Studio Code + +## 1.VSCode インストール +以下より VSCode をインストールします。 + +Visual Studio Code + +## 2.VSCode 拡張機能インストール + +下記Extentionをインストールします。 + +- Remote SSH + +VSCodeを起動し、Remote SSH Extentionをインストールしてください。 + + + + +## 3.Remote SSHでJetsonへ接続 + + + + + + + +## 4.Projectフォルダを開きます + + + + + +## 5.Terminalを開く + + + +## 6.Claudeを起動 + + + + + + diff --git a/docs/javascripts/lerobot_wifi.js b/docs/javascripts/lerobot_wifi.js new file mode 100644 index 0000000..f72f334 --- /dev/null +++ b/docs/javascripts/lerobot_wifi.js @@ -0,0 +1,195 @@ +(() => { + "use strict"; + + // ========================================================== + // LeRobot WiFi Panel (MkDocs Material) + // ---------------------------------------------------------- + // -
にSSID/Passwordフォームを描画 + // - コード内の {{SSID}} / {{WIFI_PASS}}(別名 {{WIFI_SSID}} / {{WIFI_PASSWORD}})を置換 + // - 値はこのブラウザの localStorage にのみ保存(外部送信なし) + // - lerobot_ports.js とは独立して動作(テンプレートのキャッシュキーも別) + // ========================================================== + + const LS_KEY_SSID = "lerobot.wifi_ssid"; + const LS_KEY_PASS = "lerobot.wifi_pass"; + + const KEYS_SSID = ["SSID", "WIFI_SSID"]; + const KEYS_PASS = ["WIFI_PASS", "WIFI_PASSWORD"]; + + function safeGet(key) { + try { + return localStorage.getItem(key) || ""; + } catch { + return ""; + } + } + + function safeSet(key, value) { + try { + localStorage.setItem(key, value); + } catch { + /* ignore */ + } + } + + function safeDel(key) { + try { + localStorage.removeItem(key); + } catch { + /* ignore */ + } + } + + function qsa(sel, root = document) { + return Array.from(root.querySelectorAll(sel)); + } + + function collectCodeNodes(scope) { + const blocks = qsa("pre > code", scope); + const inline = qsa("code", scope).filter( + (el) => !el.closest("pre") && !el.closest(".lerobot-port-panel") + ); + return [...blocks, ...inline]; + } + + function escapeRegExp(s) { + return String(s).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + + function escapeHtmlAttr(s) { + return String(s) + .replaceAll("&", "&") + .replaceAll('"', """) + .replaceAll("<", "<") + .replaceAll(">", ">"); + } + + // {{KEY}} と {{ KEY }} の両形式を置換。値が空のキーは置換しない(プレースホルダーを残す)。 + function applyPlaceholders(text, map) { + let out = String(text || ""); + for (const key of Object.keys(map)) { + const val = map[key]; + if (val === undefined || val === null || String(val) === "") continue; + const re = new RegExp(String.raw`{{\s*${escapeRegExp(key)}\s*}}`, "g"); + out = out.replace(re, String(val)); + } + return out; + } + + function applyToCodeNodes(codeNodes, ssid, pass) { + const map = {}; + for (const k of KEYS_SSID) map[k] = ssid; + for (const k of KEYS_PASS) map[k] = pass; + + for (const code of codeNodes) { + if (!code.dataset.lerobotWifiTemplate) { + code.dataset.lerobotWifiTemplate = code.textContent || ""; + } + const out = applyPlaceholders(code.dataset.lerobotWifiTemplate, map); + // 置換が不要なブロックはシンタックスハイライトを維持 + if (code.textContent !== out) code.textContent = out; + } + } + + function renderPanel(panelEl, state, onChange) { + if (panelEl.dataset.lerobotInitialized === "true") return; + panelEl.dataset.lerobotInitialized = "true"; + panelEl.classList.add("lerobot-port-panel"); + + panelEl.innerHTML = ` + + `; + + const ssidInput = panelEl.querySelector("#lerobot-wifi-ssid"); + const passInput = panelEl.querySelector("#lerobot-wifi-pass"); + const showInput = panelEl.querySelector("#lerobot-wifi-show"); + + const fire = () => { + onChange({ ssid: (ssidInput.value || "").trim(), pass: passInput.value || "" }); + }; + + ssidInput.addEventListener("input", fire); + passInput.addEventListener("input", fire); + + showInput.addEventListener("change", () => { + passInput.type = showInput.checked ? "text" : "password"; + }); + + panelEl.querySelector('[data-action="clear"]').addEventListener("click", () => { + safeDel(LS_KEY_SSID); + safeDel(LS_KEY_PASS); + ssidInput.value = ""; + passInput.value = ""; + fire(); + }); + } + + function init(root = document) { + const panel = root.querySelector("[data-lerobot-wifi-panel]"); + + const scope = + (panel && (panel.closest("article") || panel.closest("main"))) || + root.querySelector("article") || + root.querySelector("main") || + root; + const codeNodes = collectCodeNodes(scope); + if (codeNodes.length === 0) return; + + const state = { + ssid: safeGet(LS_KEY_SSID), + pass: safeGet(LS_KEY_PASS) + }; + + if (panel) { + renderPanel(panel, state, ({ ssid, pass }) => { + safeSet(LS_KEY_SSID, ssid); + safeSet(LS_KEY_PASS, pass); + applyToCodeNodes(codeNodes, ssid, pass); + }); + } + + // 保存値がある場合はパネルの無いページでも置換(common.md方式と同じ挙動) + applyToCodeNodes(codeNodes, state.ssid, state.pass); + } + + // Material for MkDocs instant loading support + if (window.document$ && typeof window.document$.subscribe === "function") { + window.document$.subscribe(() => init(document)); + } else { + document.addEventListener("DOMContentLoaded", () => init(document)); + } +})(); diff --git a/docs/lerobot/camera.md b/docs/lerobot/camera.md index 3e8b070..51381d7 100644 --- a/docs/lerobot/camera.md +++ b/docs/lerobot/camera.md @@ -10,7 +10,7 @@ rm -rf "{{DATASET_DIR}}" `dataset.episode_time_s`は1エピソードの収集時間、`dataset.reset_time_s`は次のエピソードまでのリセット時間、`dataset.num_episodes`は収集するエピソード数です。 -=== "Jetson" +=== "カメラ1個" SSH接続時は、Rerun GUIを起動しないように`--display_data=false`を使用します。 @@ -41,9 +41,9 @@ rm -rf "{{DATASET_DIR}}" !!! note Jetsonのデスクトップ上のターミナルで実行し、`DISPLAY`または`WAYLAND_DISPLAY`が設定されている場合のみ、必要に応じて`--display_data=true`へ変更できます。SSHでは`false`のまま使用してください。 -=== "MacBook" +=== "カメラ2個" - Macのカメラ番号が`0`の場合の例です。AVFoundationで`MJPG`が表示されないカメラもあるため、Mac用コマンドでは`fourcc`を固定していません。 + SSH接続時は、Rerun GUIを起動しないように`--display_data=false`を使用します。 ```bash cd "{{PROJECT_DIR}}" @@ -55,7 +55,7 @@ rm -rf "{{DATASET_DIR}}" --teleop.type=so101_leader \ --teleop.port={{TELEOP_PORT}} \ --teleop.id=my_leader_arm \ - --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \ + --robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', backend: 200, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, side:{type: opencv, index_or_path: '/dev/video2', backend: 200, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ --dataset.repo_id={{DATASET_REPO_ID}} \ --dataset.root={{DATASET_DIR}} \ --dataset.push_to_hub=false \ @@ -65,14 +65,12 @@ rm -rf "{{DATASET_DIR}}" --dataset.reset_time_s=5 \ --dataset.num_episodes=1 \ --dataset.streaming_encoding=false \ - --display_data=true + --display_data=false \ + --play_sounds=true ``` - H.264を明示する場合、LeRobot 0.6.0では旧引数`--dataset.vcodec=h264`ではなく、次を追加します。 - - ```bash - --dataset.rgb_encoder.vcodec=h264 - ``` + !!! note + Jetsonのデスクトップ上のターミナルで実行し、`DISPLAY`または`WAYLAND_DISPLAY`が設定されている場合のみ、必要に応じて`--display_data=true`へ変更できます。SSHでは`false`のまま使用してください。 ## 2.Retunを起動 @@ -103,3 +101,10 @@ lerobot-dataset-viz \ ```bash rm -rf "{{DATASET_DIR}}" ``` + +## 4. うまく動かない場合 + +ブラウザでうまく動かない場合、Corsに関するバッチ処理が必要です。 + +[CORSの設定](./cors.md) + diff --git a/docs/lerobot/check.md b/docs/lerobot/check.md index 138da41..aef08cf 100644 --- a/docs/lerobot/check.md +++ b/docs/lerobot/check.md @@ -45,6 +45,7 @@ v4l2-ctl -d /dev/video0 --get-parm !!! note 以下のJetson用コマンドは`/dev/video0`、640×480、MJPG、30fpsを前提にしています。別のカメラを使用する場合は、`index_or_path`、`width`、`height`、`fps`、`fourcc`を検出結果に合わせて変更してください。 + ## リファレンス - [SO-101](https://huggingface.co/docs/lerobot/so101) diff --git a/docs/lerobot/collect.md b/docs/lerobot/collect.md index 5b455e0..4745deb 100644 --- a/docs/lerobot/collect.md +++ b/docs/lerobot/collect.md @@ -11,7 +11,7 @@ rm -rf "{{DATASET_DIR}}" `dataset.episode_time_s`は1エピソードの収集時間、`dataset.reset_time_s`は次のエピソードまでのリセット時間、`dataset.num_episodes`は収集するエピソード数です。 -=== "Jetson" +=== "カメラ1個" SSH接続時は、Rerun GUIを起動しないように`--display_data=false`を使用します。 @@ -33,7 +33,7 @@ rm -rf "{{DATASET_DIR}}" --dataset.fps=30 \ --dataset.episode_time_s=10 \ --dataset.reset_time_s=5 \ - --dataset.num_episodes=30 \ + --dataset.num_episodes=1 \ --dataset.streaming_encoding=false \ --display_data=false \ --play_sounds=true @@ -42,9 +42,9 @@ rm -rf "{{DATASET_DIR}}" !!! note Jetsonのデスクトップ上のターミナルで実行し、`DISPLAY`または`WAYLAND_DISPLAY`が設定されている場合のみ、必要に応じて`--display_data=true`へ変更できます。SSHでは`false`のまま使用してください。 -=== "MacBook" +=== "カメラ2個" - Macのカメラ番号が`0`の場合の例です。AVFoundationで`MJPG`が表示されないカメラもあるため、Mac用コマンドでは`fourcc`を固定していません。 + SSH接続時は、Rerun GUIを起動しないように`--display_data=false`を使用します。 ```bash cd "{{PROJECT_DIR}}" @@ -56,7 +56,7 @@ rm -rf "{{DATASET_DIR}}" --teleop.type=so101_leader \ --teleop.port={{TELEOP_PORT}} \ --teleop.id=my_leader_arm \ - --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \ + --robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', backend: 200, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, side:{type: opencv, index_or_path: '/dev/video2', backend: 200, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ --dataset.repo_id={{DATASET_REPO_ID}} \ --dataset.root={{DATASET_DIR}} \ --dataset.push_to_hub=false \ @@ -64,16 +64,14 @@ rm -rf "{{DATASET_DIR}}" --dataset.fps=30 \ --dataset.episode_time_s=10 \ --dataset.reset_time_s=5 \ - --dataset.num_episodes=30 \ + --dataset.num_episodes=1 \ --dataset.streaming_encoding=false \ - --display_data=true + --display_data=false \ + --play_sounds=true ``` - H.264を明示する場合、LeRobot 0.6.0では旧引数`--dataset.vcodec=h264`ではなく、次を追加します。 - - ```bash - --dataset.rgb_encoder.vcodec=h264 - ``` + !!! note + Jetsonのデスクトップ上のターミナルで実行し、`DISPLAY`または`WAYLAND_DISPLAY`が設定されている場合のみ、必要に応じて`--display_data=true`へ変更できます。SSHでは`false`のまま使用してください。 ## 2. データセット収集(追加) diff --git a/docs/lerobot/cors.md b/docs/lerobot/cors.md new file mode 100644 index 0000000..384a453 --- /dev/null +++ b/docs/lerobot/cors.md @@ -0,0 +1,70 @@ +# CORSの設定 + +## 1. rerunのダウングレード + +```bash +python -m pip install --force-reinstall "rerun-sdk==0.32.2" +``` + +## 2. LeRobotのスクリプト場所を取得 + +```bash +VIZ_FILE="$(python - <<'PY' +import importlib.util + +spec = importlib.util.find_spec( + "lerobot.scripts.lerobot_dataset_viz" +) + +if spec is None or spec.origin is None: + raise SystemExit("lerobot_dataset_viz.py が見つかりません") + +print(spec.origin) +PY +)" + +echo "$VIZ_FILE" +``` + +## 3. バックアップ + +```bash +cp -a \ + "$VIZ_FILE" \ + "${VIZ_FILE}.bak.$(date +%Y%m%d-%H%M%S)" +``` + +## 4. CORSの設定を追加 + +```bash +python - "$VIZ_FILE" <<'PY' +from pathlib import Path +import sys + +path = Path(sys.argv[1]) +text = path.read_text(encoding="utf-8") + +old = "server_uri = rr.serve_grpc(grpc_port=grpc_port)" + +new = '''server_uri = rr.serve_grpc( + grpc_port=grpc_port, + cors_allow_origin=[ + f"http://192.168.55.1:{web_port if web_port is not None else DEFAULT_RERUN_PORT}" + ], + )''' + +if old in text: + path.write_text( + text.replace(old, new, 1), + encoding="utf-8", + ) + print(f"Patched: {path}") +elif "cors_allow_origin" in text: + print(f"Already patched: {path}") +else: + raise SystemExit( + "修正対象のコードが見つかりませんでした。" + "ファイル内容を確認してください。" + ) +PY +``` diff --git a/docs/lerobot/img/so-101.png b/docs/lerobot/img/so-101.png new file mode 100644 index 0000000..071c8b9 Binary files /dev/null and b/docs/lerobot/img/so-101.png differ diff --git a/docs/lerobot/run.md b/docs/lerobot/run.md index 99bce2a..3f8b6c3 100644 --- a/docs/lerobot/run.md +++ b/docs/lerobot/run.md @@ -30,50 +30,29 @@ ls -lah "$POLICY_PATH" LeRobot 0.6.0では、学習済みPolicyの実機実行に`lerobot-rollout`を使用します。`lerobot-record`へ`--device`や`--policy.path`を渡さないでください。 -=== "Jetson" - ```bash - cd -- "{{PROJECT_DIR}}" - export HF_HUB_OFFLINE=1 - - lerobot-rollout \ - --strategy.type=base \ - --policy.path={{POLICY_PATH}} \ - --robot.type=so101_follower \ - --robot.port={{ROBOT_PORT}} \ - --robot.id=my_follower_arm \ - --robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', backend: 200, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ - --device=cuda \ - --fps=30 \ - --duration=60 \ - --task="Pick up the red cube" \ - --display_data=false \ - --play_sounds=true \ - --return_to_initial_position=true - ``` - - `base`戦略ではデータを記録しないため、`--dataset.*`引数を追加しません。 - -=== "MacBook" +```bash +cd -- "{{PROJECT_DIR}}" +export HF_HUB_OFFLINE=1 + +lerobot-rollout \ + --strategy.type=base \ + --policy.path={{POLICY_PATH}} \ + --robot.type=so101_follower \ + --robot.port={{ROBOT_PORT}} \ + --robot.id=my_follower_arm \ + --robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', backend: 200, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ + --device=cuda \ + --fps=30 \ + --duration=60 \ + --task="Pick up the red cube" \ + --display_data=false \ + --play_sounds=true \ + --return_to_initial_position=true +``` - ```bash - cd -- "{{PROJECT_DIR}}" - export HF_HUB_OFFLINE=1 +`base`戦略ではデータを記録しないため、`--dataset.*`引数を追加しません。 - lerobot-rollout \ - --strategy.type=base \ - --policy.path={{POLICY_PATH}} \ - --robot.type=so101_follower \ - --robot.port={{ROBOT_PORT}} \ - --robot.id=my_follower_arm \ - --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \ - --device=mps \ - --fps=30 \ - --duration=60 \ - --task="Pick up the red cube" \ - --display_data=true \ - --return_to_initial_position=true - ``` ## リファレンス diff --git a/docs/pak/arm.md b/docs/pak/arm.md new file mode 100644 index 0000000..dd6a9ee --- /dev/null +++ b/docs/pak/arm.md @@ -0,0 +1,9 @@ +# ARMの固定 + +## ARMの固定方法 + +Follower, Leaderアームは、グリッパーで固定します。 + + + + \ No newline at end of file diff --git a/docs/pak/img/connection.png b/docs/pak/img/connection.png new file mode 100644 index 0000000..3e4880a Binary files /dev/null and b/docs/pak/img/connection.png differ diff --git a/docs/pak/img/gui001.png b/docs/pak/img/gui001.png new file mode 100644 index 0000000..592ef2b Binary files /dev/null and b/docs/pak/img/gui001.png differ diff --git a/docs/pak/img/mac.png b/docs/pak/img/mac.png new file mode 100644 index 0000000..b3da44c Binary files /dev/null and b/docs/pak/img/mac.png differ diff --git a/docs/pak/img/mount001.png b/docs/pak/img/mount001.png new file mode 100644 index 0000000..564ff07 Binary files /dev/null and b/docs/pak/img/mount001.png differ diff --git a/docs/pak/img/mount002.png b/docs/pak/img/mount002.png new file mode 100644 index 0000000..3dfc15e Binary files /dev/null and b/docs/pak/img/mount002.png differ diff --git a/docs/pak/img/power_arm.png b/docs/pak/img/power_arm.png new file mode 100644 index 0000000..458b734 Binary files /dev/null and b/docs/pak/img/power_arm.png differ diff --git a/docs/pak/img/power_jetson.png b/docs/pak/img/power_jetson.png new file mode 100644 index 0000000..d2ef966 Binary files /dev/null and b/docs/pak/img/power_jetson.png differ diff --git a/docs/pak/img/so-101.png b/docs/pak/img/so-101.png new file mode 100644 index 0000000..071c8b9 Binary files /dev/null and b/docs/pak/img/so-101.png differ diff --git a/docs/pak/img/usb001.png b/docs/pak/img/usb001.png new file mode 100644 index 0000000..8435097 Binary files /dev/null and b/docs/pak/img/usb001.png differ diff --git a/docs/pak/img/usb_wire001.png b/docs/pak/img/usb_wire001.png new file mode 100644 index 0000000..04a7b80 Binary files /dev/null and b/docs/pak/img/usb_wire001.png differ diff --git a/docs/pak/img/win.png b/docs/pak/img/win.png new file mode 100644 index 0000000..6b214e6 Binary files /dev/null and b/docs/pak/img/win.png differ diff --git a/docs/pak/img/win_trouble_001.png b/docs/pak/img/win_trouble_001.png new file mode 100644 index 0000000..551aadd Binary files /dev/null and b/docs/pak/img/win_trouble_001.png differ diff --git a/docs/pak/img/win_trouble_002.png b/docs/pak/img/win_trouble_002.png new file mode 100644 index 0000000..dd01203 Binary files /dev/null and b/docs/pak/img/win_trouble_002.png differ diff --git a/docs/pak/img/win_trouble_003.png b/docs/pak/img/win_trouble_003.png new file mode 100644 index 0000000..dfe14d2 Binary files /dev/null and b/docs/pak/img/win_trouble_003.png differ diff --git a/docs/pak/internet.md b/docs/pak/internet.md new file mode 100644 index 0000000..3835722 --- /dev/null +++ b/docs/pak/internet.md @@ -0,0 +1,29 @@ +# インターネット接続 + +!!!Warning + インターネット接続は必須ではありません。 + +## WiFiの一覧 + +```bash +nmcli device wifi list +``` + +## WiFiの設定値 + + + +フォームに入力すると、下のコマンドのSSIDとパスワード部分が自動で置き換わります。入力した値はこのブラウザ内(localStorage)にのみ保存され、外部には送信されません。 + + +## WiFiの接続コマンド + +```bash +sudo nmcli device wifi connect "{{SSID}}" password "{{WIFI_PASS}}" +``` + +## コマンドではなくGUIで接続する場合 + +PD-HDMI変換コネクタにHDMIケーブルをさし、マウス、キーボードをUSBい差し込みGUIで操作し接続します。 + + \ No newline at end of file diff --git a/docs/pak/mac.md b/docs/pak/mac.md new file mode 100644 index 0000000..1c10a17 --- /dev/null +++ b/docs/pak/mac.md @@ -0,0 +1,39 @@ +# Mac + +## Macとの接続 + +Macとの接続は、Physical Agent Kit(PAK)とUSB TypeCケーブルで接続します。 + + + + +## 接続の確認 + +```bash +ifconfig -a +``` + +enXのネットワークデバイスに、下記記述が出てくれば接続可能な状態です。 + +```bash +en5: flags=8863