sdf について
`sdf`は、シミュレーターのモデルやワールドを記述するSDFormat文書の作成・検査向けスキルです。XMLの直接編集、フレームとポーズの扱い、指定した利用先に合わせた検証を案内します。
主な機能
- 01SDFormat XMLの直接作成
- 02フレーム、ポーズ、ジョイント、形状の確認
- 03`cadgen sdf validate`による文書検証
- 04任意の`gz sdf --check`検証
- 05SDFファイルのスナップショット描画
活用シーン
- 01再利用可能なモデルレベルSDFの作成
- 02既存URDFからのSDF派生
- 03フレームとジョイント定義の確認
- 04ロボットやモデルのスナップショット確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ earthtojake/ text-to-cad --skill sdfインストール後、Claude Code で/sdfを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEagents/openai.yamlreferences/design-ledger.mdexamples.mdframe-semantics.mdinteroperability.mdllm-guardrails.mdsdf-workflow.mdsmoke-tests.mdvalidation.md詳細
SDF
由 earthtojake/text-to-cad で保守されています。 実行時の信頼できる情報源として、インストール済みのローカルスキルファイルを使用してください。 リポジトリへのリンクは、出所の確認とリリースレビューのみを目的としています。
成果物が SDFormat ドキュメントである場合に、このスキルを使用してください。SDFormat は、モデル、ワールド、フレーム、ポーズ、リンク、ジョイント、慣性、ビジュアル、衝突、センサー、ライト、物理、プラグイン、インクルード、シミュレーターのメタデータなど、シミュレーターとワールドの動作を記述します。
このスキルの対象は SDFormat であり、符号付き距離場のジオメトリではありません。
.sdf ファイルが信頼できる情報源です。XML を直接作成・編集してください。gen_sdf() の契約はありません。
セットアップ
cadgen は uv 経由で実行してください。これにより、このスキルのコマンドは CAD アプリのサーバーと同じインストール環境およびウォームビルドデーモンを共有します。
- 以下の
cadgenはuvx --no-config --managed-python --python 3.13 --from cadgen==0.7.26 cadgenを意味します。 - 以下の
pythonはuvx --no-config --managed-python --python 3.13 --from cadgen==0.7.26 pythonを意味します。
初回の実行時にインストール環境がダウンロードされ、初回のスナップショット時にヘッドレスブラウザーがダウンロードされます。以降の実行では、どちらも再利用されます。
基本ルール
.sdfXML を直接作成し、作成または変更したファイルはすべて、完了を報告する前にcadgen sdf validateで検証してください。- 編集前に対象の利用環境を特定してください。Gazebo/libsdformat のバージョン、別のシミュレーター、可視化専用ツール、モデルパッケージ、ワールドの受け渡しなどが該当します。
- ドキュメントの種類を決定してください。モデルレベルの SDF、ワールドレベルの SDF、またはワールド内のモデルのいずれかです。再利用可能なロボットやオブジェクトのエクスポートには、モデルレベルの SDF を優先してください。
- 対象が明示的に別の単位を要求しない限り、SI 単位を使用してください。メートル、キログラム、秒、ラジアンが該当します。
- 新しい出力では、対象の利用環境にバージョン上の制約がない限り、
version="1.12"を優先してください。 - ポーズ、フレーム、ジョイント軸、メッシュスケール、慣性、センサー、プラグインを記述する前に設計台帳を作成し、
.sdfの先頭にコメントブロックとして保持してください。references/design-ledger.mdとreferences/llm-guardrails.mdを参照してください。 - 重要なポーズと軸すべてに、
relative_to/expressed_inを明示してください。暗黙のフレーム既定値は、SDF で最もよくある失敗の原因です。references/frame-semantics.mdを参照してください。 - 見た目だけから空間変換を推測しないでください。ポーズ、軸、スケール、質量、慣性、フレーム名は、上流のソースデータ、図面、シミュレーターのドキュメント、測定値、または明示的な仮定に基づいて導出してください。計算値を手作業で見積もらないでください。公式や使い捨てのヘルパースクリプトを使用してください(慣性テンソル、単位変換など)。
- ロボットにすでに URDF がある場合は、ジオメトリを再記述するのではなく、そこから SDF を導出してください。
references/interoperability.mdを参照してください。 - SDF が参照するジオメトリ、メッシュ、ロボット記述、レンダリング、トポロジー、パッケージのアセットを編集する前に、それぞれを管理するワークフローで上流のアセットを再生成してください。
- 作成後、利用可能なチェックを実行してください。バンドルされた検証(
gzが PATH にある場合はgz sdf --checkも実行します)、シミュレーターへの読み込み、ジョイントの動作、プラグインとセンサーの起動を確認してください。 - 仮定、省略したチェック、未解決のリソースパス、対象固有の互換性リスクを報告してください。
対象範囲
SDFormat の出力には、このスキルを使用してください。明示的にシミュレーターのみを対象とするタスクでない限り、符号付き距離場のモデリング、生のジオメトリ生成、プランニングの意味論、誤った上流のロボットデータやソースデータの取り繕いには使用しないでください。
モデルの表示
作成または変更したすべてのファイルと、ユーザーから表示を求められたファイルを表示してください。スナップショットや検証では、この手順の代わりになりません。
-
ツールに
cad_showが含まれている場合(ホストによっては接頭辞が付くことがあります)、ファイルの絶対パスを指定して実行し、再度呼び出すタイミングについては、その説明に従ってください。cad_viewはユーザーが選択した内容を読み込み、cad_screenshotはユーザーに見えているものを表示します。どちらも、自分の作業のレビューには使えません。 -
それ以外の場合は、どのフォルダーからでも CAD Viewer を実行してください。
cadgen viewer --host 127.0.0.1 --json --detach--detachを指定すると、ビューアーはリクエストに応答した時点で戻り、バックグラウンドで実行を続けます。フォアグラウンドのビューアーは終了せず、出力をtailにパイプすると URL が完全に隠れてしまうことがあるため、必ず指定してください。実行すると、このマシンのビューアーを 1 つ起動するか、既存のビューアーを再利用します。1 行の JSON からurlを読み取り(ポート番号を推測しないでください)、各ファイルについてurl?file=<そのファイルの URL エンコードされた絶対パス>を返してください。起動に失敗した場合は、その旨を伝えてください。
配置、リソース、ジョイントを確認してください。ビューアーはシミュレーターのプラグインを実行せず、ダイナミクスも検証しません。シミュレーターのチェックは別途行ってください。
ワークフロー
- 対象の
.sdfと、それを使用するものを特定します。 - 設計台帳のコメントブロックを読み込むか、作成します。
<pose>、<frame>、ジョイント軸、relative_to、expressed_in、ネストされたスコープ、センサーフレーム、プラグインフレームのいずれかを編集する前に、references/frame-semantics.mdを読みます。references/examples.mdの実例に従って、XML を直接作成します。cadgen sdf validateで明示的に指定した対象を検証します。バンドルされた検証は安全策として扱い、シミュレーターでの検証とは見なさないでください。- 利用可能な場合は、対象を使用するものに対するスモークテストを実行します(
references/smoke-tests.md)。 - 結果を表示します(モデルの表示)。静的レンダリングでは、SDF プラグインは実行されず、ファイルに記述されたモーションメタデータも読み込まれません。
- 実行したチェック、省略したチェック、前提条件を報告します。
コマンド
Setup で定義されている方法で cadgen を実行します。cadgen doctor <skill-dir> は、使用中のインストールを報告し、それがこのスキルで指定されたものかどうかを確認します。別のインストールではドキュメントとの不整合が表面化しないためです。検証には Python 標準ライブラリ以外は必要ありません。ブラウザーが必要なのはスナップショットだけです。現在のインターフェース全体を確認するには、cadgen <verb> --help を使用します。
cadgen sdf validate path/to/model.sdf
cadgen sdf validate path/to/model.sdf --strict
cadgen sdf validate path/to/model.sdf --json
cadgen sdf snapshot path/to/model.sdf review.png
バリデーターは、ドキュメントの構造、名前のスコープ、ポーズ/フレームのグラフ、ジョイント、ジオメトリ、メッシュ URI、慣性、センサー、プラグインをチェックし、検出内容と概要を出力します。1 回の実行で検証できるファイルは 1 つです。--strict は警告を失敗として扱い、--json は {"ok", "path", "issues": [{"severity", "code", "message", "element", "hint"}], "summary"} の 1 行を出力します。element は XML パスです。対象が失敗すると、ゼロ以外の終了コードを返します。
外部チェックはデフォルトで有効です。
cadgen sdf validate path/to/model.sdf --gz-check required
cadgen sdf validate path/to/model.sdf --gz-check never
gz sdf --check は、対象を使用するものに対する検証です。--gz-check auto がデフォルトです。gz が PATH 上にあれば実行し、gz_check_passed を報告します。失敗した場合は、そのツールの出力をエラー gz_check_failed として報告します。gz がない場合は info: gz_check_unavailable と記録して処理を続行します。任意のツールがないことはファイルについて何も示さないため、問題のないドキュメントが失敗することはなく、--strict によっても挙動は変わりません。--gz-check required を指定すると、そのツールが必須になります。つまり、gz が見つからない場合はエラーになります。--gz-check never を指定すると、チェックを完全に省略します。
必須のレポート形式
SDF タスクを完了する際は、簡潔なレポートを含めてください。
Validated: path/to/model.sdf
Checks run:
- bundled SDF validation: passed
- gz sdf --check: skipped, gz not installed
- simulator load: skipped, target simulator unavailable
- viewer review: live link returned, or explicit launch failure
Assumptions:
- Assumed mesh units are meters.
- Assumed lidar frame is coincident with lidar_link.
Risks:
- Camera plugin filename was not verified in the target simulator environment.
Snapshot ツール
cadgen sdf snapshot は、各レンダリングスキルが使用する共通の CLI とヘッドレスブラウザーランタイムを使って、ロボットを PNG の静止画としてレンダリングします。そのため、スナップショットは CAD Viewer の表示と一致します。
cadgen sdf snapshot path/to/robot.sdf review.png
.sdf のみを受け付けます(フォーマットの入口であり、ほかと同じ TARGET [OUT] 文法です)。--joint-values — {joint: degrees} 形式の JSON — でロボットの姿勢を指定します。指定しないジョイントは、CAD Viewer でロボットを開いたときのデフォルト値のままになります(パケット内の "jointValues" ジョブフィールドも同じものです)。スナップショットは Viewer 独自のシーンでロボットを描画するため、Viewer と同じ表示になります。また、リンクメッシュを読み込めない場合は、そのリンクを表示から省くのではなく、処理が失敗します。ロボットはメートル単位で作成され、ロボットシーンのスケールに合わせて自動的にフレームに収められます。
通常のスナップショットでは Solid モードと Light 外観が使われます。表示モードは solid(デフォルト)または parts(各リンクを独自の色で表示)で、それぞれに個別のデフォルト値があります。--grid はロボットの下に計測グリッドを描画し、--preview は代わりに Preview 共通の写真風シーンを遠近法で描画します。インラインの表示 JSON と JSON ファイルには、Viewer の表示オブジェクトを指定します。項目は mode、grid、appearance(light がデフォルト、または dark)、camera(投影方式と焦点距離)、clip です。
最上位の --camera と --joint-values は、どの表示モードでも引き続き有効です。
display.clip は、Viewer の Clip と同じようにロボットを切断します({"clip":{"axis":"x","at":0.05}}。at はメートル単位です)。exploded、および shaded、xray、hidden-line、wireframe は STEP モデルの CAD エッジとパーツを指定するものであり、ここでは名前を挙げて拒否されます。Viewer の Quick Edit ジョブは、そのまま再現されます。jointValues、selection.hide(Links パネルで非表示にしたパーツの ID)、clip、annotation が対象です(cadgen snapshot --job <file>)。Quick Edit ではインライン JSON または .snapshot.json のパスを指定します。--job を使う前に、インライン JSON を一時ファイルに保存してください。編集前に、指定されている注釈を確認してください。注釈がない場合、キャプチャしたビューは任意のコンテキストです。依頼に役立つ場合はレンダリングしてください。
リンクメッシュは記述ファイルを基準に解決されるため、存在している必要があります。未展開の Git LFS ポインターは "No link mesh loaded for robot" エラーになります。先に git lfs checkout <mesh dir> を実行してください。
文法は cadgen sdf snapshot TARGET [OUT] [flags] で、各フォーマットの入口で共通です。現在のインターフェース全体については cadgen sdf snapshot --help を使用してください。ロボットで実行できないフラグは、拒否されるのではなく、インターフェースに表示されません。
参考資料
- SDF ワークフロー:
references/sdf-workflow.md - 作成例(基準となるスケルトン):
references/examples.md - LLM のガードレール:
references/llm-guardrails.md - 設計台帳:
references/design-ledger.md - フレームのセマンティクス:
references/frame-semantics.md - 検証範囲:
references/validation.md - スモークテスト:
references/smoke-tests.md - 相互運用性に関する注記(URDF 由来の SDF、メッシュ、Gazebo):
references/interoperability.md