notes
Robotics

Onshape から URDF への変換

onshape-to-robot によるアセンブリからの自動生成と、プリミティブ形状の手書き URDF の 2 通り

要点#

Onshape から URDF を作る標準ツールは onshape-to-robot。リンクごとに別パーツ + Assembly + dof_ 命名の mate が前提。単純な形状ならプリミティブで URDF を手書きする方が速い。

前提: URDF に必要な構造#

URDF はリンク (剛体) をジョイントでつないだ木構造。CAD 側で次が必要:

  • リンク 1 個 = パーツ (ボディ) 1 個。融合された 1 体形状は分割が必要
  • 関節位置・軸の情報 (Assembly の mate、または既知の座標)

FeatureScript のカスタムフィーチャーで最後に opBoolean UNION していると 1 体になる。URDF 化するならリンク単位でボディを分けて出力する。

方法 1: onshape-to-robot (Rhoban 製)#

pip install onshape-to-robot
  1. Onshape でリンクごとに別パーツを作る
  2. Assembly でパーツを組み、回転 mate (revolute) を作る
  3. 自由度にしたい mate の名前を dof_ で始める (例: dof_shoulder)。_inv サフィックスで軸反転
  4. https://dev-portal.onshape.com で API key (access key + secret key) を発行
  5. config.json に document ID と出力形式 (urdf) を書き、onshape-to-robot <dir> を実行

出力: URDF + リンクごとの STL メッシュ。SDF・MuJoCo 形式も選べる。API key が必要な点と、mate の命名規則が動作の要。

方法 2: プリミティブで手書き#

box・cylinder だけで構成された形状は、メッシュ無しで URDF の <box> / <cylinder> に直接書ける。

  • CAD のパラメータ (リンク長・幅) をそのまま <geometry> の寸法にする (URDF は m 単位、CAD が mm なら 1/1000)
  • 慣性は一様密度を仮定してプリミティブの公式で計算する。box: 、cylinder 軸回り:
  • 検証: check_urdf robot.urdf (ROS 2 なら source /opt/ros/<distro>/setup.bash 後)

利点: API・メッシュ・アセンブリが不要で、寸法変更も数値の書き換えだけ。欠点: 形状が複雑になったら破綻するので、その時点で方法 1 に移行する。

Inventor など他 CAD からの持ち込み#

Onshape 経由で他 CAD のモデルも URDF 化できる。手順:

  1. 元 CAD から STEP でエクスポート (Onshape は .ipt/.iam 等の直接アップロードも変換するが、STEP が確実)
  2. Onshape にアップロード。アセンブリ構造と部品位置は入るが、拘束 (mates) は入らない (STEP に拘束情報が無い。native 形式でもカーネルが異なり変換されない)
  3. Assembly でリンク単位にパーツをまとめ、revolute mate を作り直して dof_ 命名
  4. onshape-to-robot を実行

Fusion 360 経路 (CAD から URDF への変換) との比較:

  • ジョイント再定義の手間は両経路とも同じ (拘束はどちらでも消える)
  • Fusion 360 経路は GUI スクリプトで 1 回きりの変換向き
  • Onshape 経路は CLI なので、CAD 修正 → URDF 再生成の反復が 1 コマンド
  • Onshape Free プランのドキュメントは public。非公開の設計データは有償プランが必要

座標の対応#

  • URDF は右手系・m・rad。ジョイントのゼロ姿勢はリンクの <origin> で決まる
  • FeatureScript で rotationAround の軸方向を (0, -1, 0) にした場合、URDF の <axis xyz="0 -1 0"/> で正方向が一致する (右手則)

関連#

最終更新:

On this page