2018年1月21日日曜日

Autodesk Fusion 360 についてくるpythonに外部Packageを導入する

学生・教職員・スタートアップ企業は無料で使用できる3D CADCAMソフトであるAutodeskのFusion360 (ふとっぱら) ではビルトインのスクリプティング機能がついており、例としてpythonを利用することができます。

私の環境(macOS HIghSierra, Fusion 360 2.03800, Ultimate, 学生版)ではメニューバーのファイル→スクリプトとアドインからスクリプトの編集を押すとSpyder IDEが起動し、Fusionと紐付けられたpython 3.5 が使用可能です。


ここから

こうする

詳細はhttp://cad.vdlz.xyz/3dCad/Fusion360/Documents/API/CreatingAScriptOrAdd-In.htmlにて。

このpythonの環境はシステム固有のpythonとは別の環境になっているので、numpy、opencv、scikit-learnなどなど、鉄板のpackageをimportしても使用できません。

今回は、このFusionに固有のpython環境に外部パッケージを追加し、使用してみるところまでをやってみます。

さて突然ですが、これは何でしょうか。
棒ですか?
いえ、これはなんと二自由度を有するアームロボットです。
根本、それから、中間の関節にモーターが入っています。
(実際にはアセンブリ機能で回転ジョイントを入れています。)

Fusionでpythonプログラムを動かすサンプルとして、このアームを作成し、動かします。
まずは、それぞれの関節の角度をプログラム上で決定し、Animateさせてみます。


サンプル1 回転ジョイントの角度をプログラムで指定する

import math
import adsk.core, adsk.fusion, adsk.cam, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        
        des = adsk.fusion.Design.cast(app.activeProduct)
        root = des.rootComponent        
        
        arm = root.occurrences.itemByName('armtest v3:1')
        
        armComp = arm.component
        
        motorJoint1 = armComp.joints.itemByName('motor1')
        motorJoint2 = armComp.joints.itemByName('moter2')
        
        motor1 = motorJoint1.createForAssemblyContext(arm)
        motor2 = motorJoint2.createForAssemblyContext(arm)
        
        revJointMotion1 = motor1.jointMotion
        revJointMotion2 = motor2.jointMotion
        
        # Drive the joints.
        for k in range(0,2,1):
            for j in range(0,101,1):
                revJointMotion1.rotationValue = j*(math.pi/180.0)
                revJointMotion2.rotationValue = (90-j*2)* (math.pi/180.0)
                adsk.doEvents()
            if j>=100:               
                for j in reversed(range(0,101,1)):
                     revJointMotion1.rotationValue = j * (math.pi/180.0)
                     revJointMotion2.rotationValue = (90-j*2) * (math.pi/180.0)
                     adsk.doEvents()
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
}

このプログラムの動作を簡単に説明すると
まず、①現在開いているCADプロジェクトのファイルからオブジェクト(ボディ)を識別する情報を入力し②ボディの中に含まれるジョイントの情報を入力し、③ジョイントを回転させるためのインスタンスを生成します。その後、それぞれの軸のインスタンスを利用して回転角度をプログラムから操作します。

実行してみましょう。
わーお。動きました。でも単純な反復運動ですね。。。

せっかくプログラムで動かしているのだから、もっとランダム性を追加し、生き物のように動かしてみたいと思いませんか?

そういった要素に適しているのはパーリンノイズというノイズ生成アルゴリズムです。
パーリンノイズはCGエフェクトに使用されるプロシージャルテクスチャを生成するため、第一作目の映画Tronにも関わっているKen Perlinが開発しました。
Ref
The Book of Shaders: Noise
パーリンノイズを理解する | プログラミング | POSTD

pythonではpackageを使うだけでこのノイズ生成関数を使用することができます。
noise 1.2.2 : Python Package Index

今回は、このnoise packageをimportし、各軸の角度をパーリンノイズを利用してまるで生き物のような動きをさせてみます。


本題です。


なぜか(ふつうに?)Fusionに固有のpythonでは、pipをインストールしても使用できませんでした。pipが使用できるならば、 pip install noise で終わりです。

しかし、できないので手動でビルドしてインストールまで持っていきます。
まず、Fusionがどこにpythonの実体をおいているかを把握します。
私の環境では
/Users/USERNAME/Library/Application\ Support/Autodesk/webdeploy/shared/PYTHON/3.5.3c/MAC64/Python.framework/Versions/3.5/binにありました。

手順
1.先ほど示したURL or GitHubからnoiseのソースコード一式を入手する。
2.デスクトップ等に置いてみる。
3.pythonが実行できるターミナルを起動する。
4.noiseディレクトリ内部に移動。

その中で
sudo /Users/USERNAME/Library/Application\ Support/Autodesk/webdeploy/shared/PYTHON/3.5.3c/MAC64/Python.framework/Versions/3.5/bin/python setup.py build
次に




sudo /Users/USERNAME/Library/Application\ Support/Autodesk/webdeploy/shared/PYTHON/3.5.3c/MAC64/Python.framework/Versions/3.5/bin/python setup.py install
すると、



/Users/USERNAME/Library/Application\ Support/Autodesk/webdeploy/shared/PYTHON/3.5.3c/MAC64/Python.framework/Versions/3.5/lib/python3.5/site-packages/にnoise-1.2.2-py3.5-macosx-10.6-intel.egg
↑こんなようなのが生成されます。

これで良しです。
私は色々ハマってしまったので、
/Users/USERNAME/Library/Application\ Support/Autodesk/webdeploy/production/2a93884b46c5eedb87c1f008a9d77b138ef905db/Api/Python/packages/に入れなきゃいけないのではないかー。とかなんとかpipを使えるようにできないかー。
などやってしまったのですが、やり方がわかれば10分もかからずに終わるはずです。

それではおもむろにFusionを再起度しましょう。
そして、スクリプトとアドインからSpyderを起動しましょう。
先ほど示した、軸の角度をfor文で変えていくスクリプトにnoiseを追加すると




サンプル2 パーリンノイズでロボットを動かす

import math
import noise
import random
import adsk.core, adsk.fusion, adsk.cam, traceback

def run(context):
    ui = None
    try:    
        
        app = adsk.core.Application.get()
        ui  = app.userInterface
        
        des = adsk.fusion.Design.cast(app.activeProduct)
        root = des.rootComponent        
        
        arm = root.occurrences.itemByName('armtest v3:1')
        
        armComp = arm.component
        
        motorJoint1 = armComp.joints.itemByName('motor1')
        motorJoint2 = armComp.joints.itemByName('moter2')
        
        motor1 = motorJoint1.createForAssemblyContext(arm)
        motor2 = motorJoint2.createForAssemblyContext(arm)
        
        revJointMotion1 = motor1.jointMotion
        revJointMotion2 = motor2.jointMotion
        
        # Drive the joints.
        xt = random.random()*1000
        yt = 0
        for k in range(0,4,1):
            for j in range(0,101,1):
                i1 = noise.pnoise1(xt)
                i1 = (i1+1)*90
                i2 = noise.pnoise1(yt)
                i2 = (i2+1)*90
                xt += 0.01
                yt += 0.01
                revJointMotion1.rotationValue = i1*(math.pi/180.0)
                #revJointMotion2.rotationValue = (90-i2*2)* (math.pi/180.0)
                revJointMotion2.rotationValue = i2* (math.pi/180.0)
                adsk.doEvents()
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


上記のようにすると、パーリンノイズアルゴリズムで生成した乱数を基に各関節の角度を指定することができます。





これだけ簡単に3D Viewに反映させることができるなら、ものすごく役立ちますね。
pythonで運動学を解くプログラムを作って、Fusionで動かしてデバッグ→実機へ
みたいなのが便利そうです。

ほかのpackage、numpyなども追加することができています。
パッケージ同士の依存関係などあるので方法は少し複雑になりますが。

2017年1月7日土曜日

logicool K780 買った話

ここ一週間の価格の下降に加えて、Amazonから表示価格より10% offのクーポンが出されていたので買ってしまいました。Logicool K780

この機種はlogicoolの一般向けキーボードのなかではかなり高価格な方なんですが(ゲーミング除く)、スタンド一体型のデザインが可愛いので前から欲しいなーと思っていました。

Logicoolの他の製品を見る限り初値から25ー35% OFFしたあたりが通常の底値っぽいので買い時かと思われます。

初値 10607円 → 7824円 × 0.9 = 7048円  ∴ 0.66 (2017/1/6 時点)
(ヨドバシでも値下がりしていました。7820円−ポイント782円分で7038円、2017/1/7時点)

初めてiOSにつながるキーボードを使って見たのですが、感動しました…。
ソフトウエアキーボードとは一体何だったのか。
やっぱり物理で戦うしかないんだ…。

たぶん日本国内ではJIS日本語配列のものしかほぼ流通していません。
(AmazonでたっかいUS配列のを見た記憶がある)

iOS、macOS でつかうとUS配列になってしまう、という欠点はありますが、個人的にはUSとJISが入り乱れた入力環境でやってきたのであまり気にならない感じ。一応 iOS、macOSのためにUS配列での記号もキートップに印字されています。



自宅用と研究室用で二台体制を組みたい!
ちなみに安定感を出すためだと思いますが結構重たいので持ち運びは躊躇します。

ぜんぜん関係なく突然出てきて申し訳ないけれどPFUかLeopoldあたりからマルチデバイス切り替えできるBluetooth対応の静電容量式キーボードを出して欲しい…。

プロダクトデザインを行ったところのポートフォリオで物欲を刺激されてしまってください → http://www.feizdesign.com/projects/view/k780/filter:all

US配列を買うならこれ。3倍近い価格。

MacでPS3 Eyeを使う方法 (Xcode 8)

PS3 eyeは安価ながら素晴らしいUSBCamで様々な改造を施され、使用されている実績があります。例えば、、、


などなどがあります。

個人的に所有しているものを久しぶりに取り出して使ってみることにしました。

最終的にOSX 10.11 El capitanにてXcode8 環境でOpenFrameWorks v0.8.4のAddon (ofxMacamPs3Eye) を使用することで映像を表示することができました。

まず、USBで接続してMacのPhoto BoothやSkypeでWebCamとして認識するかというのを初めに試しました。結果としてはDriverが無いために(?) イメージングデバイスとしては認識されていないようでした。

次に試したのはmacam (http://webcam-osx.sourceforge.net) という様々なWebCamをサポートするソフトウエアです。


PS3 Eyeを接続した状態でmacamを起動すると以下の様な画面が表示されます。初期設定では静止画モードになっていて、動画として表示されません。しかし、赤丸で示したボタンを押して、動画モードに移行するとソフトウエアがクラッシュしてしまいます。現状ではPS3 Eyeで気軽に映像を表示させることは困難なようです。

▲ Macam v0.9.2

調べてみるとどうやらOpenFrameWorksのadd-onとしてofxMacamPs3Eyeが公開されています。OFは本当になんでもあって便利です。add-onは https://github.com/paulobarcelos/ofxMacamPs3Eye よりダウンロードすることが可能です。

ダウンロードしたフォルダは所定のフォルダに収め、サンプルプロジェクトをビルドしてみることにします。

▲ example Debug か example Release を選択する

するとエラーが表示され、ビルドすることができませんでした。

調べてみると、macOS 10.12 SDKがターゲットになっていることによるエラーのようです。
大体↓の通りにやれば解消します。
http://morookamitsuo.com/wp/?p=1593

▲ Base SDK 設定箇所


これを解消するには、どうやらOSX 10.11 SDKを指定してあげなければいけないようです。
処置する前にはOSX 10.11 SDKが選択欄に表示されていなかったので、まずSDKをダウンロ度するところから行う必要が有りました。
幸いにも全バージョンのSDKはGithubにアップロードされているのでそこからダウンロードし、所定のフォルダに突っ込みます。

つぎにターゲットを変えてビルドすると以下のように新たなエラーが生じました(キャプチャを取るのを忘れた)。
この解決策としてはOSX 10.10 SDKを使えば良いという知見もあったのですが、私の環境においては10.10 SDKを所定のフォルダに突っ込んでも選択欄に表示されなかったため、ゴリ押しすることで解決しました。

エラー該当箇所をごっそりコメントアウトしたら動きました。気持ち悪い。

また、同梱されているexampleとexample-guiを試してみた所、ちょっと気持ち悪いことが置きています、exampleで使用する実装ファイルは ".mm"形式なのですが、example-guiでは".m"ファイルなので、複製してリネームしました。調べた所Objective-CかObjective-C++かの違いとのこと…。基本がわかってない。iOS開発の基本

以下動作デモと所感です。Vineはサービス終了ですね。。デモ撮りに重宝していました。。


リーン御身さん(@_kiitani)が投稿した動画 -



リーン御身さん(@_kiitani)が投稿した動画 -

exampleとexample-guiではキャプチャ時のフレームレートが2倍程異なるということが観察されています(example:約120 fps、  example-gui:約60 fps)。なぜここまでの差が生じるかは要検証です。

PS3Eye自体は生産完了品なのか新品は6000円台とプレミアがついているようですが、中古品であれば2000円台から買うことができるようです。今新品で変えるWebCamにどのようなものがあるかわかりませんが、ステレオビジョンなどをやる際の一つの選択肢ではなかろうかと思います。僕が高専に居た頃はC270というlogicoolのWebCamをよく使いましたが30fpsしか出せなかったはずなので、動きが早いものをTrackingするのは厳しいかもしれません。この頃では安価な Webカメラを使ってやるような研究ではどれを使うのがトレンドなのでしょうか。(PS4 Eyeもhackされているらしい。要改造。)

もちろん、お金を掛けられるのならば選択肢は無限大です。研究開発や業務用ではもっとスペックの良いカメラが売られています。

個人的に興味があるのはBlackMagicDesiginのintensity shutteleを使って一眼レフ等から取得した映像にリアルタイムで処理をしていくということです。ISO40万くらいに設定できる高感度なカメラも市販されているこの頃ではおもしろいシステムが構築できそうな予感が致します。