制御コマンド

フィーダの CLI,GUI,制御パイプ,シナリオファイルはすべて同じテキストコマンドで動作する. 1 行 1 コマンド,空白区切り,# 以降はコメント.

デバイス名

名前 device_id
hmd 0
ctrl-l(left) 1
ctrl-r(right) 2
trk<n>(n は 0 始まり) 3 + n
数値 そのまま

コマンド

構文 動作
pos <dev> <x> <y> <z> 位置(m,SteamVR 座標系)を設定し,ポーズを有効にする
move <dev> <dx> <dy> <dz> 現在位置からの相対移動
rot <dev> <w> <x> <y> <z> 回転を四元数で設定(正規化される)
euler <dev> <yaw> <pitch> <roll> 回転をオイラー角(度)で設定.Y(yaw)→ X(pitch)→ Z(roll)の順
valid <dev> <0\|1> ポーズ有効 / 追跡外
input <dev> <component> <value> 入力コンポーネントを更新.value は数値または on/off
ipd <meters> IPD
proj <lL> <lR> <lT> <lB> <rL> <rR> <rT> <rB> 片目ごとの投影(正接値,GetProjectionRaw と同じ順)
swap <0\|1> 左右の映像を入れ替え
preset <stand\|tpose\|sit> [height_m] 体格に応じた姿勢プリセット(HMD,両手,トラッカー 0..2)
osc <address> [args...] OSC 送信.引数は i:<int>,f:<float>,s:<text>,T,F
sync 全ポーズ・入力・表示パラメータを再送
status 状態を 1 行で返す
status --json 全デバイス・入力・表示パラメータを JSON で返す
quit 終了

入力コンポーネント名

コントローラ: system/click,a/click,a/touch,b/click,b/touch,trigger/value, trigger/click,trigger/touch,grip/value,grip/click,grip/touch,joystick/x, joystick/y,joystick/click,joystick/touch.

HMD: system/click,proximity.

数値 id(docs/protocol.md 3.4.1)も使える.

応答

制御パイプでは 1 コマンドにつき 1 行返る.

GUI と AI Agent からの併用

GUI と vrdummy-cli run は同じ制御パイプ API を提供する.GUI が起動している場合は, 別の常駐フィーダを起動せず vrdummy-cli status / vrdummy-cli set でその GUI を操作する. GUI の編集欄と 3D 表示にも変更が反映される.独自の設定を使う場合は双方に同じ --config を渡す.同じ制御パイプ名で GUI と run を同時起動しない.

# GUI を起動しておき,別の端末または Agent から実行する
vrdummy-gui --config feeder/vrdummy.example.toml
vrdummy-cli --config feeder/vrdummy.example.toml status --json
vrdummy-cli --config feeder/vrdummy.example.toml set --json pos hmd 0 1.7 0
vrdummy-cli --config feeder/vrdummy.example.toml status --json --timeout-ms 3000

--json は status と set に対応する.標準出力は改行で終わる JSON オブジェクト 1 個, 診断ログは標準エラーに出力する.schema_version は 1.成功は {"schema_version":1,"ok":true,"result":...},失敗は {"schema_version":1,"ok":false,"error":{"kind":"...","message":"..."}}. 状態変更の成功時の result は null,quit は {"quit":true}.

status --json の result は次の状態を持つ.これはフィーダが保持する指令値であり, SteamVR の実測値やドライバ側の適用完了通知ではない.GUI と CLI フィーダのどちらでも同じ形式を返す.

フィールド 内容
schema_version 状態形式の版(1)
connected フィーダとドライバの接続状態
devices 存在する全デバイスの配列,ID 順
devices[].id 数値 ID.そのまま set pos <id> ... 等に使用できる
devices[].serial, class ハンドシェイクの情報.未取得時は null.class は docs/protocol.md の列挙値
devices[].pose_valid, connected, tracking_result 保持しているポーズのフラグと追跡状態の列挙値
devices[].position_m, rotation_wxyz 位置と四元数
devices[].linear_velocity_m_s, angular_velocity_rad_s 速度と角速度
devices[].inputs component_id と value の配列
display ipd_m, projection_left, projection_right, swap_eyes
interaction owner(null / gui / agent),mode,lease_ms,undo_count,rig(骨長・寸法・関節位置・FK 角)

JSON で表せない非有限数は null として返す.状態照会は録画しない.旧版の GUI/フィーダは JSON 状態取得に対応していないため,CLI と同じ版へ更新して再起動する.

終了コード JSON error.kind 意味
0 — 要求成功
1 command_error サーバがコマンドを拒否
2 argument_error CLI 引数・設定・ログ初期化エラー
3 transport_error パイプ接続・送受信エラー
4 timeout 通信期限超過(サーバ未起動・接続待ちも含む)
5 protocol_error 未対応または認識できない応答

--timeout-ms は接続・送信・応答受信を合わせた期限(既定 2000 ms,1〜3600000 ms). status / set の前にも指定できる.パイプの入出力は期限超過時にキャンセルする. 要求と応答はそれぞれ最大 1 MiB,1 要求につき 1 行.

タイムアウトしても,コマンドが未実行とは限らない. Agent は状態を再照会し, move やボタン操作などを無条件で再送しない.再試行が必要な処理では pos 等の絶対値指定を使う. ドライバ未接続でもフィーダの状態変更は成功し,再接続時に送信されるため, ドライバへの接続が必要な処理では result.connected も確認する.

ドライバの登録管理

vrdummy-cli driver <status|register|unregister> [--path <dir>] [--steamvr-dir <dir>] [--json] [--timeout-ms <ms>] は常駐フィーダを必要としない.GUI の Driver registration も同じ処理を使用する.

GUI ではパスを入力して Register / Unregister を押す.状態は約 3 秒ごとに更新される. 外部操作の処理中もデバイス編集を継続できる.SteamVR の再起動は利用者が行う.

PC 操作と編集

以下は常駐フィーダへ vrdummy-cli set --json <コマンド> で送る.GUI も同じコマンドを使用する. 新しい操作の数値は有限値かつ絶対値 1000000 以下とし,各項目の範囲をさらに適用する.

コマンド 動作
control begin <gui\|agent> <walk\|rig> 操作権を取得.既存の所有者がいれば拒否
control frame <gui\|agent> <x> <forward> <up> <yaw> <pitch> <turn> <jump> <use> <grip> <dt> 操作権を更新して入力を適用
control stop 所有者を問わず操作を解除
rig translate <x> <y> <z> 存在する全デバイスを追跡座標で相対移動(m)
rig yaw <degrees> HMD 位置を中心に全デバイスを +Y 軸回転
ik <ctrl-l\|ctrl-r\|trk1\|trk2> <x> <y> <z> 到達範囲に制限した手・足の位置(m).先端の向きは保持
fk <device> <yaw> <pitch> <bend> 同じ手・足の上腕/大腿 yaw・pitch と肘/膝の曲げ角(度,各 -180..180)
rig lengths <arm\|leg> <upper> <lower> 骨長(各 0.05..2 m)
rig proportions <shoulder-width> <hip-width> <shoulder-height> 肩幅・腰幅・腰から肩の高さ(各 0.05..2 m)
edit checkpoint ポーズとリグ設定を保存(最大 32 件)
edit undo 直前の保存へ戻す.入力値や表示設定は戻さない

frame の x/forward/up/turn は -1..1,yaw/pitch は今回の差分角 -90..90 度, jump/use/grip は 0..1,dt は 0..0.1 秒.水平の斜め入力は長さ 1 以下に正規化する. マウス相当の回転は HMD のみへ適用し,pitch は ±85 度に制限する.

GUI の入力キャプチャは GUI がフォーカスを持つ間だけ有効.ワールド表示は Headset Window で確認する.Agent は同じ制御パイプへ接続でき,status --json の interaction で操作権を確認できる. 継続操作ではプロセス起動時間の影響を避けるため,名前付きパイプへ接続を保ち, 1 行送信・1 行応答を繰り返す.GUI のキャプチャを Agent から開始することはできない. control begin gui ... は GUI 内部用の所有者名であり,OS の入力キャプチャを行わない.

Headset Window

コマンド 動作
window status 実ウィンドウの位置,モニタ一覧,保存位置を取得
window move <x> <y> 起動済み Headset Window を物理ピクセル座標へ移動
window monitor <index> status.monitors の 0 始まりインデックスのモニタ左上へ移動
window save <x> <y> 位置を保存し,存在するウィンドウへ適用.以後は新規ウィンドウを約 1 秒間隔で検出
window forget フィーダの保存位置を削除(現在位置は変えない)

Windows 専用.vrcompositor.exe が所有する Headset Window のみを対象とする. 移動時にフォーカスを奪わず,全モニタの外に出る要求や複数の対象ウィンドウは拒否する. 座標は負値も許容する.モニタ番号は Windows の表示デバイス名順で,接続構成により変化する.

set --json window ... の result は全操作で同じオブジェクト形式:schema_version, windows(handle/process_id/bounds),monitors(name/bounds/primary), saved_position,last_error.bounds は [左, 上, 幅, 高さ].この座標は OS からの実測値. 保存が成功しても自動適用できなければ last_error に理由を返す.

保存先は %LOCALAPPDATA%/vrdummy/headset-window.json.VRDUMMY_STATE_DIR で親フォルダを変更できる. SteamVR 設定ファイルは書き換えない.保存位置の適用にはフィーダの実行が必要. 既に動作中の別フィーダへ保存設定を共有する用途ではなく,GUI または CLI の常駐プロセスを 1 個使う.

シナリオファイル

先頭に開始からの秒数を付ける.時刻は単調非減少.

0.0  preset stand
1.0  pos hmd 0 1.7 0
1.5  input ctrl-r a/click 1
1.6  input ctrl-r a/click 0

vrdummy-cli run --record <file> で実行したコマンドが同じ形式で記録され, vrdummy-cli scenario <file> で再生できる.

例

# フィーダを常駐させ,標準入力と制御パイプからコマンドを受ける
vrdummy-cli run

# 別の端末から
vrdummy-cli set pos hmd 0 1.7 0
vrdummy-cli set input ctrl-r a/click on
vrdummy-cli set proj -1.2 0.8 -1 1 -0.8 1.2 -1 1
vrdummy-cli set osc /input/Jump i:1

# シナリオを流して終了
vrdummy-cli scenario .\tests\scenarios\walk.txt