自作CNCマシン・レーザーカッターについて自作CNCマシン・レーザーカッターについてMac+Arduino:自作CNCマシンの記録。CNCシールドV3.5+bCNCを使用中。BluetoothモジュールおよびbCNCのPendant機能でスマホからもワイヤレス操作可能。その他、電子工作・プログラミング、機械学習などもやっています。MacとUbuntuを使用。レーザーシールド制作・改良*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。Quaternion:立方体の回転操作(その3)前回までは単位球に対する一点の回転操作でしたが、今回はもう少し具体的にということで立方体の回転操作を試してみました(基本的なクォータニオン回転操作についてはこちらへ)。立方体の8個の頂点を個別に計算して回転操作しています。scale変数で立方体の縦横高さの比率を調整できるようにし、pos変数で位置の基準点を変えられるようにしています。・正規化されている8頂点(ベクトル)をスカラー倍してもとのスケールに戻すipywidgetsでインタラクティブに角度を変えられるようになっています。立方体の縦横高さの比率も変更可。オンライン上で実行するにはBinderで可能です(方法についてはこちらを参考に)。以下がコード(Gist):・回転角度と立方体の縦横高さ比が変更可能なバージョン・回転角度と回転軸(単位ベクトル)が変更可能なバージョンの二つがあります。Notebook(ipynbファイル)の実行ネット上で見かけるipynbファイルをブラウザに表示するにはnbviewerにアクセスして、ipynbファイルのURLを入力してGo!ボタン。Notebook形式でコードが表示されます。Binder」(以下の赤丸のアイコン)をクリック。Notebookが使用可能。必要なモジュール/requirements.txt:しかし、このプログラムに必要なモジュール(numpy、matplotlibなど)がこの環境にインストールされていなければエラーがでます。必要なモジュールについては、ipynbファイルとは別にrequirements.txtがアップロードされており、その中に記述されています。Binder内のディレクトリ。requirements.txtを開くと必要なモジュール名が書いてあります。requirements.txtがipynbファイルと同じディレクトリ内にあれば自動でモジュールがインストールされますが、もしrequirements.txtがなければ自力で必要そうなモジュールをインストールする必要があります。ターミナルでモジュールをインストール:ディレクトリのページに戻り、右上の「New」から「Terminal」を選択。画面が現れたら、pipなどで必要なモジュールをこの環境にインストール。必要なモジュールが揃えば、プログラム実行可能なります。「Binder」にアクセスして実行:また、nbviewerを使わずに、直接「Binder」から実行するには、Binderのトップページ。プルダウンメニューからipynbファイルの場所の種類(GitHubやGistなど)を選択。ipynbファイルのURLを入力し「launch」ボタンをクリックでファイルが開きます。requirements.txtがない場合はモジュールが自動インストールされないため、そのままプログラムを実行するとエラーがでるので、先ほど同様オンライン上のターミナルで自力で必要なモジュールをインストール。回転制御(その2):二点間から単位ベクトルと回転角度を求める前回に引き続きクォータニオン回転制御についてです。今回は任意の二点(ベクトルAとB)だけが与られていて、AからBへ回転移動する際に必要な単位ベクトルと回転角度を求めてみます。任意の二点(AとB)といっても、いくつかのケースがあります。(1)AとBが単位球面上に存在する(|A|=|B|=1のとき)(2)AとBのスカラー値は同じだけど、単位球面上に存在しない(|A|=|B|≠1のとき)(3)AとBのスカラー値が異なり、単位球面上に存在しない(|A|≠|B|≠1)(4)そもそもAもBも単位ベクトルには無関係な任意の2点の場合*(4)に関しては、AからBへの直線移動も含まれるし、単位ベクトル自体も任意に決定できるので今回は省略。このことから、任意の二点といってもあくまで単位球を設定しなければ逆算できないということがわかります。(1)と(2)の場合(AとBのスカラー値が等しい場合):(1)が一番簡単で、(2)も回転操作後に(1)の値を元のスカラー倍すればいいので、回転操作自体は同じ計算方法になります。以下はXZ平面において回転軸Yの場合。単純にAが回転するとBになったという状況。回転操作のためには一旦ベクトルAを正規化してAnにしなければならないので、AnからBnへの回転計算をしたのち、正規化されているBnを元のスカラー倍してBとなります。単位ベクトルを求める:この場合、単位ベクトル(UV)は正規化されたAnとBnがあればクロス積(外積)で求めることができます(単位ベクトル(UV)は、ベクトルAnとベクトルBnに対して垂直/法線ベクトルとなるため)。Aのスカラー値とBのスカラー値は等しいという前提です(|A|=|B|)。np.arccos(cos_AnBn)この二つの値(UV、theta)をクォータニオンの回転公式に代入し、Anを回転すれば計算結果がBnと一致します。正規化するまえの大きさに戻すため元のスカラー倍(Aのスカラー)します。B_new)(3)の場合(AとBのスカラー値が異なる場合):しかし(3)の場合は、単位球に対する任意の二点ABということから、Aを単純に回転させた結果がBになるとは限りません。Aを単純に回転させればA'(×印)にたどり着きますが、AとBのスカラー値(半径)が異なる場合はピンクの破線のような動きになります。Aは回転しつつ半径も縮まっていくという変化。この場合、回転操作は(1)と同様に正規化されたベクトルAnで行い、最終的にAn(Bnと同じ)をBのスカラー倍(Bs倍)すればいいことになります。回転軸となる単位ベクトルは(1)と同様にAnとBnのクロス積で求まります。求められた単位ベクトルAnとBnの回転角度に関しても(1)と同様にドット積とarccos()で求めます。np.arccos(cos_AnBn)求めた単位ベクトルUV(回転軸)とtheta_AnBn(回転角度)をクォータニオンの公式に代入すればBnが求まります。求めたBnに対して元のスカラー値Bsを掛ければBになります。これでは移動前と移動後の二つの場面しかないので、途中の軌跡を描いて滑らかに移動しているかどうか確かめてみる必要がありそうです。先程の図のAからBへの移り変わり(ピンクの破線)を描いてみるというわけです。AからBへの移動の中間補間:まず移動のステップ数を決め、ステップ数に応じた回転角度とAからBへのスカラー値の変化量を決めます。steps)これで、回転角度thetaは33ステップで0からtheta_AnBnまで変化します。同様にAB間のスカラー値ABsの変化も33ステップでAsからBsへ変化します。あとは公式に代入して33ステップ分の結果を得ます。theta]).T上式で求まるのはAn-Bn間の回転結果(角度は違うけれどもスカラー値はどれも1)なので、各ステップに応じたスカラー値の変化量ABsを掛け合わせます。ABsこれで、各ステップごとに正規化されたベクトルに対して段階的にスカラー倍することになります。URLを入力すればオンライン上でも動きます)。B(緑)へ向かって移動する状態(ピンク)。vector:単位ベクトル(赤)が回転軸。正規化されたAn-Bn間の回転移動は単位球面上にあります。AからBへの移動(ピンク破線)は単位球の同心円とずれているのがわかります。クォータニオンの回転では、比較的簡単なパラメーターの調整だけで回転操作できることがわかりました。このような移動途中の軌跡を描く際には便利なツールだと思います。掲載されているGrbl1.1対応ソフトの一つでもあります。2017年現在では、このページの内容はやや古いものとなっています(Grbl0.9以前のもの)。