VRML Preparation for Robot Simulation/jp

このチュートリアルではFreeCADと6軸のシリアルロボットの動作をシミュレートするためのロボットシミュレーションワークベンチの使い方を説明します. '''このチュートリアルでは可視化に使用されているVRMLファイルの作成にフォーカスをあわせています. '''VRMLファイルの基盤はFreeCADのモデルです. 使用しているFreeCADのバージョンはUbuntu32ビット版用の0.11.4252ppa1です.

FreeCADを使用してファイルを開く、または作成する
このチュートリアルではStäubli TX40のSTEPファイル（TX40-HB.stp）を使用しています. このファイルは https://secure.staubli.com/Intranet_Applications/Robotics/Group/RobDoc.nsf/ea05b3f4b301f597c1256d5f005665e8/bc3707ec036c9f6bc12576c700327958/$FILE/page.html からダウンロードすることができます. ただしチェックするための時間がなかったためチェックを行っていませんが、ここで説明する方法は完全にFreeCADで作成されたモデルに対しても適用できるはずです. ファイルを開くと次の様になります：



インポートするとこのロボットがドキュメントツリーのルートに直接置かれた8つの形状で構成されていることに気がついたかと思います. グループが使用されている場合、エクスポートされたVRMLファイルの構造は異なっていることがあります. 形状はベースからツールの順に並べられています. 最後の形状には全てのロボットの軸の回転軸が保持されています. 形状名とパーツ名の対応関係は以下の通りです（現在（2011年3月）の所、FreeCADはSTEPファイルに含まれている名前をインポートしません）：

このインポート時にTX40_HB007を除いた“Flat Lines”から“Shaded”までの各形状の“Display Mode”を変更してVRMLエクスポート時の見栄えが良くなる様にしておいて下さい. また色を[245, 196, 0]と[204, 204, 204] に変更してStäubliの黄色と対応させておくといいかもしれません. TX40_HB007に保持されているのは全ての関節の軸であり、分解することはできないのでTX40_HB007は非表示にしておいて下さい.

幾何特性の計測
Denavit-Hartenbergテーブル（ http://sourceforge.net/apps/mediawiki/free-cad/index.php?title=6-Axis_Robot を参照）とVRMLファイルの作成を行うにはロボットの特性を取得する必要があります. 今の所、FreeCADには計測ツールが用意されていませんがTX40_HB007に含まれている軸を使用するか（オブジェクトをマウスで指すと座標が左下に表示されます）、Pythonコンソールを使って幾何情報を取得することができます. DHテーブルが必要となるのはインバースキネマティクスを使用する場合だけであることに注意して下さい. つまりデカルト座標を取得するかロボットをデカルト座標で駆動する場合です. このロボットのDHテーブルは以下の様になります（単位はmm、deg、deg/s）：

CSVファイルは次の様になります：

a, alpha, d  , theta, rotDir, maxAngle, minAngle, AxisVelocity 0,   -90, 320,     0,      1,      180,     -180, 555 225,     0,  35,   -90,      1,      125,     -125, 475 0  ,    90,   0,    90,      1,      138,     -138, 585 0  ,   -90, 225,     0,      1,      270,     -270, 1035 0  ,    90,   0,     0,      1,    133.5,     -120, 1135 0  ,     0,  65,     0,      1,      270,     -270, 1575

VRMLへのエクスポート
ドキュメントをVRMLファイルへエクスポートします. VRMLファイルの構造は次の様になっています：

Group { children Group { children [ Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        } ]     } }
 * 1) VRML V2.0 utf8

8つの形状に対応する8つの独立したグループがあることに気がついたかと思います.

VRMLファイルの作成
VRMLファイル内の形状は全てベースフレームで表現され、それぞれ独立しています. ロボットシミュレーションワークベンチではある形状の動きが構造の以降の形状全ての動きに影響を与えるような構造を作成することになります. 形状の位置はそれに先行する形状に対して相対的なものになるので絶対基準系から相対基準系へのなんらかの変換を考慮する必要があるのです. この変換は以下の画像の様になります：



ここで各記号は以下の様になります
 * A=(0, 0, 168)
 * B=(0, 107.8, 320)
 * C=(0, 104.15, 545)
 * D=(0, 35, 601)
 * E=(0, 35, 770)
 * F=(0, 35, 835)

例としてELBOWとFOREARMの間にあり、D=(xd, yd, zd)に位置する軸4を見てみましょう. FreeCADでの軸のタグは以下の通りです. "DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children [" これはY軸周りの回転と対応します. CADモデルではこの回転はZ軸周りのものになります. 従ってFreeCADの軸を定義する前にX軸周りに$$\pi$$回転させ、定義後に$$-\pi$$回転させる必要があります. またFOREARMの定義と対応するグループの直前に(-xd, -yd, -zd)への平行移動が必要です. これはDの中心に位置する相対参照フレームでこのグループを表現するためです. これはつまり最初の回転の前に(xd, yd, zd)への平行移動が必要であるということです. s ELBOWからFOREARMまでの定義が行われたVRMLファイルは最終的に次の様になります：

# ELBOW Group { … ここに未変更のELBOWの定義 },      Transform { translation 0 35 601 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 -35 -601 children [ # FOREARM Group { … ここに未変更のFOREARMの定義 },

ドキュメントの末尾には6軸のそれぞれに対応する適切な括弧閉じ 記号 “ ]}}}},”の挿入が必要です. 最終的にドキュメントは次の様になります（著作権を考慮した場合にそのファイルをここにリンクしていいのか私にはわかりません）：

Group { children Group { children [ # HORIZONTAL BASE CABLE OUTLET Group { … ここに未変更のHORIZONTAL BASE CABLE OUTLETの定義 },      Transform { translation 0 0 168 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS1 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 0 -168 children [ # SHOULDER Group { … ここに未変更のSHOULDERの定義 },      Transform { translation 0 107.8 320 #rotation 0 0 1 0 children DEF FREECAD_AXIS2 Transform { rotation 0 1 0 0 children Transform { #rotation 0 0 1 0 children Transform { translation 0 -107.8 -320 children [ # ARM Group { … ここに未変更のARMの定義 },      Transform { translation 0 104.15 545 #rotation 0 0 1 0 children DEF FREECAD_AXIS3 Transform { rotation 0 1 0 0 children Transform { #rotation 0 0 1 0 children Transform { translation 0 -104.15 -545 children [ # ELBOW Group { … ここに未変更のELBOWの定義 },      Transform { translation 0 35 601 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 -35 -601 children [ # FOREARM Group { … ここに未変更のFOREARMの定義 },      Transform { translation 0 35 770 #rotation 0 0 1 0 children DEF FREECAD_AXIS5 Transform { rotation 0 1 0 0 children Transform { #rotation 0 0 1 0 children Transform { translation 0 -35 -770 children [ # WRIST Group { … ここに未変更のWRISTの定義 },      Transform { translation 0 35 835 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS6 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 -35 -835 children [ # TOOL FLANGE Group { … ここに未変更のTOOL FRAMEの定義 },      Group { … ここに未変更のTX40_HB007の定義 } # "]" はこの行から削除 ]}}}},    ]}}}},     ]}}}},     ]}}}},     ]}}}},     ]}}}},     ] # 上の行から削除された "]" } }
 * 1) VRML V2.0 utf8

以下はロボットシミュレーション用のVRMLファイルを取得するためのパッチです：

7a8 >        # HORIZONTAL BASE CABLE OUTLET 95968a95970,95981 >        Transform { >          translation 0 0 168 >          rotation 1 0 0 1.5707963 >          children >            DEF FREECAD_AXIS1 Transform { rotation 0 1 0 0 children >              Transform { >                rotation 1 0 0 -1.5707963 >                children >                  Transform { >                    translation 0 0 -168 >                    children [ >        # SHOULDER 128428a128442,128453 >        Transform { >          translation 0 107.8 320 >          #rotation 0 0 1 0 >          children >            DEF FREECAD_AXIS2 Transform { rotation 0 1 0 0 children >              Transform { >                #rotation 0 0 1 0 >                children >                  Transform { >                    translation 0 -107.8 -320 >                    children [ >        # ARM 206503a206529,206540 >        Transform { >          translation 0 104.15 545 >          #rotation 0 0 1 0 >          children >            DEF FREECAD_AXIS3 Transform { rotation 0 1 0 0 children >              Transform { >                #rotation 0 0 1 0 >                children >                  Transform { >                    translation 0 -104.15 -545 >                    children [ >        # ELBOW 267111a267149,267160 >        Transform { >          translation 0 35 601 >          rotation 1 0 0 1.5707963 >          children >            DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children >              Transform { >                rotation 1 0 0 -1.5707963 >                children >                  Transform { >                    translation 0 -35 -601 >                    children [ >        # FOREARM 417854a417904,417915 >        Transform { >          translation 0 35 770 >          #rotation 0 0 1 0 >          children >            DEF FREECAD_AXIS5 Transform { rotation 0 1 0 0 children >              Transform { >                #rotation 0 0 1 0 >                children >                  Transform { >                    translation 0 -35 -770 >                    children [ >        # WRIST 422053a422115,422126 >        Transform { >          translation 0 35 835 >          rotation 1 0 0 1.5707963 >          children >            DEF FREECAD_AXIS6 Transform { rotation 0 1 0 0 children >              Transform { >                rotation 1 0 0 -1.5707963 >                children >                  Transform { >                    translation 0 -35 -835 >                    children [ >        # TOOL FLANGE 435627c435700,435707 <        } ] --- >         }  >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]