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- Onshape でリンクごとに別パーツを作る
- Assembly でパーツを組み、回転 mate (revolute) を作る
- 自由度にしたい mate の名前を
dof_で始める (例:dof_shoulder)。_invサフィックスで軸反転 - https://dev-portal.onshape.com で API key (access key + secret key) を発行
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 化できる。手順:
- 元 CAD から STEP でエクスポート (Onshape は .ipt/.iam 等の直接アップロードも変換するが、STEP が確実)
- Onshape にアップロード。アセンブリ構造と部品位置は入るが、拘束 (mates) は入らない (STEP に拘束情報が無い。native 形式でもカーネルが異なり変換されない)
- Assembly でリンク単位にパーツをまとめ、revolute mate を作り直して
dof_命名 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"/>で正方向が一致する (右手則)
関連
- CAD から URDF への変換 (Fusion 360 / Inventor)
- Onshape FeatureScript の基本と落とし穴
- URDF の visual メッシュを Inventor の DAE で差し替える
最終更新: