ROS による開発で必要となる 3D モデルは STL や COLLADA データとして作成できます。FreeCAD と Blender を用いて直方体のデータを作成してみます。いずれの場合も、ROS 等で扱うために単位はメートルで出力します。
FreeCAD による直方体 STL の作成
STL はフェイスに三角形を利用した 3D モデルを表現するためのファイルフォーマットの一つです。多くのソフトでサポートされています。FreeCAD も STL をサポートしており、Debian9 の場合は apt でインストールできます。
sudo apt install freecad
File → New で初期状態にしてから View → Workbench → Part Design を選択します。
Create sketch をクリックします。
XY-Plane を選択して OK を押します。
Part Design → Sketcher geometries → Create rectangle を選択します。
2D 矩形を作成して Close を押します。
Pad をクリックします。
押し出す高さを入力して OK を押します。
Ctrl を押しながら右ドラッグでオブジェクトを平行移動できます。Shift を押しながら右ドラッグでオブジェクトを回転できます。
80mm x 80mm x 50mm の直方体が作成できました。STL ファイルとして出力します。
STL ファイルを作成するにあたって補足
STEP ファイルから変換して STL を作成する方法
市販されている部品の CAD データの STEP ファイルから STL に変換する場合も FreeCAD を利用できます。
STL の原点座標を変更したい場合
meshlab を利用すると、STL ファイル内のオブジェクトの AABB の中心が原点座標と一致するように平行移動できます。「Render → Show Axis」で XYZ 軸を表示します。
「Filters → Normals, Curvatures and Orientation → Transform: Move, Translate, Center」でポップアップされるウィンドウ内で「translate center of bbox to the origin」と「Preview」をクリックします。Apply で確定させます。
STL のフェイス数を少なくしたい場合 (Decimation)
meshlab でメッシュを開いて「Filters → Remeshing, Simplification and Reconstruction → Quadric Edge Collapse Decimation」をクリックします。Quality threshold を 0.9 などに設定して Apply をクリックすると Faces が少なくなってメッシュが荒くなったことが確認できます。Apply を複数回数適用したい場合は、meshlab の不具合で、Export して meshlab を一旦終了してから再度同じ処理を行う必要があります。
STL から COLLADA を作成
STL はテクスチャ情報等を格納できませんが、COLLADA ではその他に摩擦係数など様々な情報を格納できます。例えば Blender を利用すると STL にテクスチャ情報を付与して COLLADA として出力できます。テクスチャを付与しない場合でも OpenRAVE を利用する場合は STL を読み込めないため変換が必要になります。
インストールおよび STL ファイルの読み込み
Debian9 の場合は apt で COLLADA 対応のバージョンがインストールできます。
sudo apt install blender
Blender を起動したら初期状態で表示されている立方体を Delete キーで削除します。
File → Import → STL で作成したファイルを読み込みます。
以下のようなショートカットが利用できます。例えば n
でオブジェクトのサイズを確認すると確かに 80mm x 80mm x 50mm の直方体であることが分かります。
n
オブジェクトの情報を表示g
マウスで平行移動r
マウスで回転s
マウスで拡大縮小a
全選択- 右クリックでオブジェクトや辺を選択
ROS 等で扱うために単位をメートルに変更します。
テクスチャの読み込み
COLLADA への変換だけであれば不要なステップです。
UV 展開
テクスチャを適用するためにはまず 3D オブジェクトを UV 展開する必要があります。UV Editing のウィンドウ構成に切り換えます。
Edit Mode に切り換えます。
3D オブジェクトを展開するために切断する辺となるシームを選択します。Edge select ボタンを押します。
a
で全選択状態を解除してから Shift キーを押しながら右クリックで必要な辺を選択します。Shading/UVs → UVs → Mark Seam で切れ目として確定します。
a
で全選択状態にしてから Unwrap → Unwrap とクリックすると左側のウィンドウに展開されます。
テクスチャの位置を調整
Image → Open Image で適当に用意した画像を読み込みます。実際には UV 展開図をエクスポートして画像編集ソフトでテクスチャを作成して用意します。
マウスで UV 展開結果と画像の位置関係を調整します。3D オブジェクトの操作時と同じようなショートカットが利用できます。
a
全選択g
マウスで平行移動
調整が終わったら Default ウィンドウ構成に戻します。
Object Mode で Texture 表示にすると、調整したテクスチャが確認できます。
オブジェクトが大きすぎて既定で環境に設置されている光源がうまく利用できない場合は Create → Lamp → Sun 等を追加します。光源を含むオブジェクトを選択するためには右クリックを利用します。
テクスチャの適用
COLLADA への変換だけであれば不要なステップです。マテリアルを作成しておきます。Intensity と Emit を適当に変更します。
テクスチャアイコンをクリックします。
New をクリックしてから先程利用したテクスチャ画像を選択します。
Mapping の Coordinates が UV になっていることを確認します。更に Map を UVMap に変更します。
Rendered 表示で結果を確認できます。
以下のようになっていれば成功です。
COLLADA データとしてエクスポート
File → Export から COLLADA 出力します。
その際、テクスチャの出力オプションを適宜選択します。
meshlab 等で COLLADA ファイルの内容を確認すると以下のようになります。
sudo apt install meshlab
COLLADA はイメージ情報を内包していないことに注意します。テクスチャ画像を参照しています。
$ grep 'hoge\.png' sample.dae
<init_from>hoge.png</init_from>
関連記事
- ROS 環境構築および簡単な使い方 (Debian9)ロボットシステム開発のためのフレームワーク Robot Operating System (ROS) の環境構築および簡単な使い方について記載します。ここでは Debian9 を利用することにします。ROS は現行バージョン1 の Melodic Morenia ディストリビューションを扱います。 ROS 対応のロボット [TurtleBot3](http://emanual.robotis.co...
- ROS/tf による座標変換ロボットを制御する際に複数の座標系を扱う必要があります。これら複数の座標系間の変換等を行うためのライブラリに tf2 (transform2) があります。C++ と Python がサポートされていますが、ここでは Python を用いて簡単な使い方を把握します。 tf2 チュートリアルと同様に動作検証のためのパッケージを用意します。ROS ノードのスクリプトを格納
- ロボットシミュレータ Gazebo の簡単な使い方 (ROS)ロボットシミュレータ Gazebo を ROS開発で利用するための簡単な手順を記載します。ここでは Debian9 を利用します。個別にインストールすることもできますが、ROS を ros-melodic-desktop-full でインストールすれば gazebo もインストールされます。 [URDF モデルの作成](http://wiki.ro
- 輪郭に関連した画像処理 (OpenCV3 C++)cv::Canny などで検出したエッジをもとに cv::findContours で輪郭を計算できます。輪郭に関連した処理の例を記載します。 輪郭の描画 #include <opencv2/opencv.hpp> #in
- Qt for Python (PySide2) の基本的な使い方QT を Python から利用するためのライブラリには PyQt や PySide 等が存在します。PySide は元々 QT4 向けのライブラリでしたが、QT5 に対応するために新たに PySide2 が開発されました。PySide2 は Qt for Python ともよばれています。 Q: PySide? Qt for Python? what is the name?A: The nam...