FreeCADでモデル作成
An Open Software Platform for Robotic Technologies
Home RTC Software
FreeCADでモデル作成

FreeCADについて

FreeCADは、オープンソースで開発されているCADソフトウェアです。OpenCASCADEというライブラリとPyQt4を使って実装されています。
ダウンドード方法、詳細な使い方は、こちらのページを参照してください。
Ubuntuでは、FreeCADはapt-getでインストールすることができます。しかし、10.04の場合には、少し古いものがインストールされるために、Python Consoleが使用できません。上記のSourceForgeから最新のもの(0.11)をインストールすることをお勧めします。

FreeCADでパーツを作成する

FreeCADの基本的な使い方

3D Viewでのマウスの操作

FreeCADは、英語版ですが簡単なチュートリアルもありますので、そちらを参照して頂ければよいと思います。
ただ、FreeCADでのマウス操作には少し癖があるので、ここに記載しておきます。まず、左ボタンの動作は、CADのビューアー内のオブジェクトを選択するときに使います。ビューモードを変更すれば、自由にビューを変更できますが、CADモードで使った方がよいでしょう。中ボタンは、ビューを平行移動をすることができます。また、中ボタンのスクロールで拡大縮小も数ることができますので、これで見やすいビューを指定することができます。右ボタンは、ポップアップメニューが出るようになっていますので、予め用意された標準的なビューに変更することができます。
ビューを原点を中心に任意に回転させるには、まず、中ボタンを押して、その状態で左ボタンを同時に押します。そしてマウスを動かすと、原点周りの任意の角度のビューにすることができます。

オブジェクトの作成

FreeCADでパーツを作成する場合には、基本オブジェク卜を組み合わせや、集合演算等実行して作成していくことになります。基本パーツの作成は、ツールバーの黄色い基本形状をクリックすると 3D Viewにそのオブジェクが追加されます。すべての基本パーツは、原点に同じ形で出力されますので、Property Viewで適当に大きさ、場所、姿勢を変更するようにしてください。また、3D View内でオブジェクトをマウスを使って移動、回転を行いたい場合には、TreeViewで移動させたいオブジェクトダブルクリックすると、そのオブジェクトに2重の輪とクロスの矢印が出てきます。この輪を掴んで動かすとオブジェクトは回転し、クロスの矢印をクリックすると紫の大きなクロスになり平行移動させることができます。
集合演算に関しては、2つのオブジェクトを選択して、オブジェクト生成アイコンの横にある青色の集合演算アイコンをクリックすれば、押したアイコンに応じた集合演算を行います。1つまたは何も選択していない状態で、この集合演算アイコンをクリックすると、TreeViewにどのオペレーションを実行するかを選択することができます。

FreeCADで生成した部品の質量、重心、慣性マトリックスを求める

  1. FreeCADの基本パーツを使って部品を作成する。
  2. Python Consoleを開いてコマンドモードにする。
  3. doc = App.getDocument("Unnamed") でドキュメントを取得する。
  4. obj = doc.getObject("Cut") でドキュメント内のオブジェクを取得する。
    ドキュメントの中のオブジェクトを取得するには、findObjectsとうメソッドもある。
    また、FreeCADGuiクラスを使えば、上記のオブジェクトは、FreeCADGui.ActiveDocument.Cut.Objectでもアクセスできる。
  5. occ_obj = Part.__toPythonOCC_(obj.Shape)で obj を PythonOCCのオブジェクトに変換。
  6. 下記のgetVolumeProperties関数で、occ_objのVolumePropertiesを使ってvpropを取得
     from OCC.BRepGProp import *
     from OCC.GProp import *
     
     def getVolumeProperties(shape, tole=1e-5):
      gprop = BRepGProp()
      vprop = GProp_GProps()
      error = gprop.VolumeProperties(shape, vprop, tole)
      return vprop
    
  7. VolumePropertiesを取得出来れば、下記のメソッドを呼び出すことで、質量、重心、慣性マトリックスを取得することができます。
質量:  vprop.Mass()
重心:  vprop.CentreOfMass()
慣性マトリックス: vprop.MatrixOfInertia()
このとき気をつけなければいけないのは、密度が1で一定になっていることくらい。密度が異なれば、それに応じて上記の値は変わってきます。また、サイズが mmになっているので注意。(OpenHRP3はSI単位系です)
また、次のようなプログラムを書けば、重心、慣性マトリクスをリストで出力できます。
 def getCenter(vprop):
    center = vprop.CentreOfMass()
    res = [ center.X(), center.Y(), center.Z() ]
    return res
 
 def getMatrixOfInertia(vprop):
    m = vprop.MatrixOfInertia()
    res = [ m.Column(1).X(), m.Column(1).Y(), m.Column(1).Z(), m.Column(2).X(), m.Column(2).Y(), m.Column(2).Z(), m.Column(3).X(), m.Column(3).Y(), m.Column(3).Z() ]
    return res
参考までに、このページに重心、慣性マトリクスを求めるプログラムの例を添付しておきますのでご利用ください。

FreeCADで作ったパーツをOpenHRP3で読めるようなVRMLに変換する

FreeCADでもExportでVRMLに変換できるが、このフォーマットでは、ModelLoaderがエラーで落ちます。そのため、メッシュ型式に変換して、パーツをExportします。
  1. Exportするオブジェクトを選択
  2. 上部のメニューの Meshes -> Create mesh from geometry... でメッシュオブジェクトに変換
  3. これで、Meshから始まる新しいパーツが出来ているはず。そのパーツを選んでメニューの Meshes -> Export mesh... でファイルに書きだします。この時、VRML2.0型式を選んでおくことを忘れないようにしてください。
この時に出力されたパーツは、mm単位で記載されていますし、座標系が物体の中心にくるように変換されているようです。OpenHRP3ではSI単位を利用していますので、モデルファイルのスケールを 1/1000 にしなければいけません。出力されたファイルは、
 #VRML V2.0 utf8
 WorldInfo {
   title "Exported tringle mesh to VRML97"
   info ["Created by FreeCAD"
         "<http://free-cad.sourceforge.net>"]
 }
 Background
 {
   skyAngle    1.57
   skyColor    0.1 0.2 0.2
 }
 Transform
 {
 scale             1 1 1
 rotation          0 0 1 0
 scaleOrientation  0 0 1 0
 bboxCenter        0 0 0
 bboxSize      X.XXX X.XXX X.XXX
 center        0.000  0.000  0.000
 translation   X.XXX  X.XXX  X.XXX
 children
 [
 Shape
 {
   ......
 
というようになっているはずですので、上記のscaleの部分を0.001に変更して、translationを削除すればよいと思います。物体の色はすべての面が黒になっていますので、適当に修正すればよいと思います。また、bboxCenterとbbxSizeは、必要ないと思いますので削除してもよいと思います。
 #VRML V2.0 utf8
 WorldInfo {
   title "Exported tringle mesh to VRML97"
   info ["Created by FreeCAD"
         "<http://free-cad.sourceforge.net>"]
 }
 Background
 {
   skyAngle    1.57
   skyColor    0.1 0.2 0.2
 }
 Transform
 {
 scale             0.001 0.001 0.001
 rotation          0 0 1 0
 scaleOrientation  0 0 1 0
 #bboxCenter        0 0 0
 #bboxSize      X.XXX X.XXX X.XXX
 #center        0.000  0.000  0.000
 #translation   X.XXX  X.XXX  X.XXX
 children
 [
 Shape
 {
   ......
 

資料