gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

Millipede - Grasshopper plugin

Millipedeとは、Grasshopperのプラグインの1つで、構造解析や最適化を可能にします。数値解析や線形システムの解析解の算出、固有値計算、メッシュのベクトル表現化、メッシュの統合・フィルタリング、固有モード解析なども出来ます。出来ること一覧は、[https://rhino.github.io/addons/millipede.html:title=[3]]をご覧ください。商用目的には使えませんが、教育目的ならばフリーっていうのはすごいですね。ただ内容的に、デザイナーや建築家向けではなくエンジニア向けに見えます。おそらくGrasshopperや関連プラグインを使ってデザイナー・建築家が作成したデータを、同じ環境を使ってエンジニアが単体、またはデザイナー・建築家と一緒に調整するのに使うんだと思います。

ぼやっとした感じで恐縮ですが、本記事を見て何に使えるのかなんとなーくわかっていただけたら幸いです。

Firefly - Grasshopper plugin

Fireflyとは、Grasshopperプラグインの1つです。つまりは、Rhinocerosプラグインとも言えます。このプラグインを使うことで、GrasshopperとArduino, Arduinoと接続したデバイスの間でのデータの入出力が可能となります。またGrasshopperのVisual Programming Interfaceを使うことで、インタラクティブなコンテンツをソフト・ハードの両面から作れます。自分でプログラミング言語を使わずにプログラミングが出来るので、プログラミングが出来ない人でもハードウェアを使ったプロトタイプを作る上で大変便利です。Fireflyは、Arduinoと接続できる様々なデバイスに対応しています。例えばLEDやモーターの制御、通信、カメラ撮影などです。詳細については、お手数ですがご自身で検索をお願いいたします。

f:id:graziegrazie:20181026171335p:plain
Fig. Fireflyのアイコン[2]

Grasshopper - Rhinoceros plugin

本記事では、Grasshopperとはなんぞやについて記述します。どう使うのか等の実践的な話については、お手数ですが他サイトを確認くださいますようお願いいたします。

Grasshopperとは、3DモデリングソフトRhinocerosプラグインです。元々はプラグインでしたが、Rhinoceros6からは最初から組み込まれるようになりました。このプラグインを使うことで、アルゴリズムを使って3次元形状を作成したり、シミュレーションが出来たりします。3Dモデリングソフトのプラグインということで、元々デザイナーや建築家等のデザインを専門としている人向けに作られています。そのためプログラミング言語C/C++, Java, Pythonなど)やスクリプト言語シェルスクリプトなど)を学ばずとも、アルゴリズムの記述が出来るように作られています。

f:id:graziegrazie:20181026171759p:plain
Fig. Grasshopperのアイコン[12]

アルゴリズムの記述は、基本的に用意されている部品をキャンバス上にドラッグ&ドロップしていくことで行います。部品には、数値・テクスチャー・AV・触覚に関連するものがあります。これらを使い、構造物、照明環境やエネルギー消費量の解析などが出来ます。またこうしたビジュアルプログラミングだけでなく、C#Pythonを使って実際にプログラミングを行なうことも可能です。

Grasshopperでのビジュアルプログラミングや作成できるモデルの例は下記の通りです。

f:id:graziegrazie:20181026035427p:plainf:id:graziegrazie:20181026035434p:plain
出典: [4]

またGrasshopper介して、ロボットアームのプログラミングも可能です。GrasshopperのプラグインであるHAL Robotics Framework[6]やTACO[5]、KUKA|prc[10]をインストールすると、Grasshopperは対応するロボットのプログラムを出力できます。なおHAL Robotics Frameworkを使えば、RAPID(ABBのロボット用のプログラミング言語)[7]、KRL(KUKA Robot Language、KUKAのロボット用のプログラミング言語)[8]、UR script(Universal Robotのロボット用のプログラミング言語)[9]それぞれのプログラムを生成することが出来る[6]。もしもOSSとして自分のコードを公開したい場合は、使ったことはないですが、HAL Robotics Frameworkを使うのが一番よいと思われます。おそらくHAL Robotics Frameworkだけだと、その汎用性がアダとなり、痒いところに手が届かないという自体が発生しそうに思えます。そのため、チームとしてロボットを持っている場合は、TACOやKRLなどを使うのがよいと、私は考えます。実際に試したわけではないので、責任は持てません。ご自身で確認いただきたくお願いいたします。

余談ですが、Universal RobotだけGrasshopper用のプラグインを用意していないのが面白い。一応ScorpionというOSSのツールがUniversal RobotのTACO/KRL相当になりそうだが、Universal Robot社独自のツールではない。彼らが軽視をしている訳ではないと思うが、どの様な戦略が隠れているのか気になるところである。

k-d tree

k-d treeとは、K-Dimensional treeの略で、K次元のデータの最近傍点を探索するための手法です[1]。検索対象のデータ数をNとした時、データの次元数が大きすぎると線形探索と計算量が変わらないそうです[1]。なお線形探索とは、全探索の1種で一個ずつ検索対象をチェックするアルゴリズムを指します[2]。木の形成は、下記の2つの図にあるように、各ノードのデータを2つに分割していくことで行います。分割は、深さに対応した軸(例えば3次元のデータなら、1層目はX、2層目はY、3層目はZ、4層目はX)の値を比較することで行います。どの様な比較をするかは、実装に依ってことなります。これ以上分割できない/しない所までいったら、木の形成は完了です。

調べた限りは書いていないのですが、深さに対応した軸は自ら決めてよいのだと思います。これによっても、もちろん探索スピードは変化するかと思います。特にN次元のデータなんだけれども特定の軸方向にはデータが0 or 殆ど変わらない場合は、その軸を無視してもいいのだと思います。

f:id:graziegrazie:20181022172202p:plain
出展:[2]
f:id:graziegrazie:20181022172717p:plain
出展: [3]

ROSを使ったOrbbec Astra Proのキャリブレーション

Astra Proは手頃な価格でかつデプスの有効範囲が長め(8m)なRGB-Dカメラです。このカメラは専用のキャリブレーションツールや、工場出荷時にキャリブレーションが行われている訳ではありません。そのため自分でキャリブレーションツールを探し、キャリブレーションを行なう必要があります。ROSを使う方は、camera_calibrationパッケージ[6]を使うことでキャリブレーションができます。本記事ではAstra ProをROSのパッケージでキャリブレーションするまでの流れを説明します。

Astra Proのノードを立ち上げる

ただ一方で、Orbbec公式のROSパッケージastra_launchに含まれているPro用launchファイルastrapro.launchを立ち上げただけでは、RGB用のtopicが立ち上がらないという問題があります。これはAstra ProのHW上の問題で、depthとRGBが別々のデバイスとして認識されているためです。RGB画像用のノードを、別途usb_camパッケージ等を使って立ち上げる必要があります。ただし皆同じように不便を感じているため、Clearpth Roboticsがlibuvc_rosパッケージを使うことで、Depthノードと同時にRGB用ノードも起動してくれるlaunchファイルを提供しています[1]。なおgit cloneする際は、cloneすべき対象がmasterではなくupstreamブランチなので、"git clone -b upstream https://github.com/clearpathrobotics/ros_astra_launch.git"とする必要がありますのでご注意ください。また[1]のlaunchファイルを使って立ち上げるRGB用ノードは、libucv_cameraパッケージ[2]を使っています。このパッケージを使うにはlibuvcが必要なので、[3]からcloneしてmake & make installしてください。さらにそのまま[1]のastra_pro.launchを実行しても、permissionエラーが出るはずです(私は出ました)。[4]の4.1を参考にpermissionの設定をしてください。RGBカメラのVendor idとProduct idは、lsusbでも調べられますが、[5]に記載してありますので、参考にしてください。

Astra Proのキャリブレーションを行なう

ノードを立ち上げた後は、単純に[6]を参考にキャリブレーションを行ってください。キャリブレーション用のチェスボード画像は、[7]からダウンロードできます。

Astra Proのキャリブレーション結果を反映させる

キャリブレーション結果は、~/.ros/camera_infoに保存されます。ここに保存しただけでは、[1]のlaunchファイルを立ち上げても結果は反映されません。結果を反映させるには、[1]の中のcamera_info_urlの中にURL形式でキャリブレーション結果(Yamlファイル)のパスを記述する必要があります。ただastra_pro.launchの中には、Yamlファイルのパスを共通的に使うためのパラメータrgb_camera_info_urlがあるので、Yamlファイルのパスをの様に記述しましょう。そしてrgb_camera_info_urlの中身を、として反映させましょう。これでastra_pro.launchを立ち上げた時に、libuvc_rosノードがキャリブレーション結果を反映してくれます。正しくファイルが読み込まれた時は、launchファイルの出力に"camera calibration URL: file:///home/username/.ros/camera_info/depth_Astra_Orbbec.yaml"と表示されるはずです。

なおibuvc_rosノードがキャリブレーション結果を元に画像の歪補正をしたtopic(rgb/image_rect_color)を発行するためには、rgb_processingの値をtrueに変える必要があります。必要な場合は変更をお忘れなく。

Sparse Pose Adjustment(SPA)

SPAとは、Konoligeらによって提案された、2D Pose Graphの最適化を効率よく行うための手法です[1]。この手法は線形システムに対して使え、direct sparseコレスキー分解を使うことで効率化を図っています。SRIが開発したopen_karto[2][3]というSLAM向けのライブラリや、Google が開発したcartographer[4][5]というSLAMに使われています。詳細については、[1]をご覧ください。

コレスキー(Cholesky)分解

コレスキー分解は、LU分解QR分解と同様に線形方程式を解くのに使われる手法です。LU分解よりも高速かつ省メモリで解くことができます。これは[3]によると、正定値行列の全固有値は正の値を持つため、LU分解で言えばLを求めると勝手にUも求まることになるそうです。そのためLU分解に比べて計算量が半分近くになるそうです。また一方で、分解対象の行列が正定値行列[1]である必要があり、使用に制限があります。ただし[2]によると、コレスキー分解の計算中、計算に平方根が含まれている、0割の可能性があるといった理由から、修正コレスキー分解や不完全コレスキー分解といった、コレスキー分解の発展版を使うことが多い。