使い方
基本操作
| 視点を回す | 3Dビューの何もないところをドラッグ |
|---|---|
| 視点を移動・拡大 | 右ドラッグ/ホイール(タッチでは2本指) |
| 物体を押す・引く | 物体をドラッグ。黄色の線の先に向かって力がかかります |
| 再生・一時停止 | スペース |
| 1ステップ進める | 一時停止中に → |
| 最初に戻す | R |
| ロボットを追いかける | 3Dビュー下の「追従」 |
| パネルを閉じる | パネル右上のボタン(3Dビューを広く使えます) |
右側のパネルの「操作」タブでは、各アクチュエーター(モーター)の指令値をスライダーで変えられます。「初期姿勢に戻す」を押すと、すべての指令値がモデルの初期姿勢に合わせて設定されます。
モデルを選ぶ・読み込む
上部の「モデル」から、サンプル、実在のロボット、このブラウザに保存したシーンを選べます。
実在のロボット
Google DeepMind の MuJoCo Menagerie からモデルを読み込みます。初回は数MB〜数十MBのダウンロードがあり、2回目以降はブラウザに保存されたものを使います。モデルの権利は配布元に帰属し、それぞれのライセンスに従います。
自分のモデル
「モデル」タブの「ファイルを読み込む」で、MJCF(.xml)とメッシュ(.stl / .obj)、テクスチャ(.png)をまとめて選びます。<include> で分けたファイルも一緒に選んでください。テキストを直接編集して「反映」(Ctrl+Enter)を押すこともできます。
URDF は、MuJoCo の compile ツールなどで MJCF に変換してから読み込んでください。
制御コード
「コード」タブに書いた JavaScript は、物理計算の1ステップごとに実行されます。使える変数は次のとおりです。
t | シミュレーション内の時刻(秒) |
|---|---|
data | MuJoCo の状態。data.qpos(位置)、data.qvel(速度)、data.sensordata(センサー)を読み、data.ctrl[i] に指令値を書きます |
model | MuJoCo のモデル。model.nu(アクチュエーター数)、model.opt.timestep など |
routh | 補助機能(下表) |
routh の補助機能
routh.hold(kp, kd) | すべての関節を初期姿勢に保ちます。位置制御のアクチュエーターには目標角度を、トルク制御のものにはPD制御のトルクを入れます |
|---|---|
routh.joint('名前') | 関節の { q, v }(角度または位置、速度) |
routh.setCtrl('名前', 値) | 名前でアクチュエーターに指令値を書きます |
routh.sensor('名前') | センサーの値(配列) |
routh.bodyPos('名前') | 物体の位置 [x, y, z] |
routh.keys | 押されているキー。例:routh.keys.has('ArrowUp')(3Dビューをクリックしてから操作) |
routh.axes | ゲームパッドのスティック [左X, 左Y, 右X, 右Y](−1〜1) |
routh.mem | ステップをまたいで値を残すための入れ物 |
routh.home | 初期姿勢の qpos |
例:倒立振子を立たせる
const x = data.qpos[0], th = data.qpos[1];
const v = data.qvel[0], w = data.qvel[1];
const u = 0.6 * x + 0.9 * v + 6.0 * th + 1.0 * w;
data.ctrl[0] = Math.max(-1, Math.min(1, u));
例:ゲームパッドで二つの関節を動かす
routh.hold();
const [lx, ly] = routh.axes;
data.ctrl[0] += 0.5 * lx;
data.ctrl[1] += 0.5 * ly;
コードでエラーが起きると自動で停止し、内容が表示されます。Ctrl+Enter で書き換えたコードをすぐ実行し直せます。
グラフ・データ・動画
- グラフ:「グラフ」タブで関節を最大4つ選ぶと、直近10秒の動きを表示します
- CSV:「操作」タブの「関節データの記録を開始」で、0.01秒ごとの全関節の値と指令値を記録し、CSVで保存できます。1列目は時刻、以降は
qposの順、最後に各アクチュエーターの指令値です - 動画:上部の録画ボタン(赤い丸)で3Dビューを動画(WebM)として保存します
保存・共有・埋め込み
- 保存:上部の保存ボタンで、このブラウザにシーン(モデルと制御コード)を保存します。「モデル」→「保存したシーン」から開けます
- 共有:「共有」で、モデルと制御コードを含むURLを作ります。共有リンクを開いた人の画面では、安全のため制御コードは自動実行されません
- 埋め込み:URLに
embed=1を付けると3Dビューだけを表示します
<iframe src="https://routh.ai/app/?embed=1&scene=cartpole"
width="640" height="480" style="border:0"></iframe>
サンプルは scene=(playground、arm、cartpole、quadruped、double-pendulum)、実在のロボットは robot=(例:unitree_go2、panda)で指定します。
プライバシー
Routh のシミュレーションは、すべてお使いのブラウザの中で計算されます。作成したモデル、制御コード、保存したシーン、書き出したデータや動画が当社のサーバーに送られることはありません。共有リンクは内容をURLに埋め込んでいるため、リンクを渡した相手には内容が見えます。
実在のロボットを選んだ場合、モデルのファイルを GitHub(raw.githubusercontent.com)から取得します。表示用の書体は Google Fonts から読み込みます。
お問い合わせ:[email protected](8-order technology, k.k.)