2018年5月27日日曜日

ラズベリーの実!+2

 実がでたよ!ジャムができるよ!( ゚д゚ )

おまけ

サボテンの花 初めて見た( ゚д゚ )

春菊1本差し ちゃんと菊なんすね、春菊って。

blenderでクォータニオンをなんとなく理解する

なんとなく理解しよう!

Blenderのインストール

…は省略。まだの人はこちら→https://www.blender.org/

下準備

キューブを消し、サルを置く

  • キューブを右クリックして選択
  • Xキーを押して消す
  • SHIFT+A → mesh → monky

視点を変更とか

  • テンキーの5と1を押す
  • Nキーを押して、右側に情報パネルを出す

あとはマウスのホイールを回して適宜ズームするといいです

初期値を確認

右側の情報パネルの、Transform → Rotationに注目。
デフォルトでは
XYZ Euler
になってると思います。
このときの数値は、X,Y,Zすべて0です。
次に
Quaternion(WXYZ)
に変更してみましょう
W=1で、X,Y,Zは0です。

角度を変えてみる

XYZ Eulerにして、Y軸を30度にしてみます。
その後Quaternion(WXYZ)にして数値を見ると

W=0.966、Y=0.259になってます。Wから少しだけYに数値が移った感じ

一度XYZ Eulerに戻して、Y軸の角度を60度にしてから同様にQuaternion(WXYZ)の数値を確認してみます
同様に90度も。

このようにして、サルのアタマが元の位置に戻るまで全ての値をチェックしてみます。
Euler x,y,z    Quaternion WXYZ
0,0,0            1.000, 0, 0.000, 0
0, 30,0          0.966, 0, 0.259, 0
0, 60,0          0.866, 0, 0.500, 0
0, 90,0          0.707, 0, 0.707, 0
0,180,0         0.000, 0, 1.000, 0
0,270,0        -0.707, 0, -0.707, 0

Quaternionから回転軸を知る

上で求めたQuaternionの数値を見るとWとYだけ数値が変わっていることが分かります。

X,Y,Zは回転軸のベクトルを表していて、
 X=0、Z=0、Y=なんか数字
であることから、Y軸まわりの回転をやっていることが分かります。
実際、EularでY軸まわりだけ回転させてますので、正しいです。

Quaternionから回転角度を知る

重要な式は

  • W=COS(θ/2)
  • X=nx SIN(θ/2)
  • Y=ny SIN(θ/2)
  • Z=nz SIN(θ/2)
  • W*W + X*X + Y*Y + Z*Z = 1

nx, ny, nzは回転軸の向きを表す単位ベクトルです。
今回のケースではY軸にしか回していないので
{nx, ny, nz} = {0,1,0}
となります。

なので
  • W=COS(θ/2)
  • Y= SIN(θ/2)
この2つの式から回転角θを知ることができます。

θ=ArcCOS(0.707)*2 = 90[deg]
θ=ArcSIN(0.707)*2  = 90[deg]

大きさが1を確かめる

30度のとき
{W,X,Y,Z} = {0.966, 0, 0.259, 0}
なので、
0.966 * 0.966 + 0.259*0.259 =0.933 + 0.067 = 1.000
他についても同様なので省略

覚えるの面倒だけど‥

最初のEuler x,y,z to Quaternion WXYZの表を拡張して、全てのパターンの表を書き出して表にします。
その表をなんとかして記憶!そうすればQuaternionからなんとなくオブジェクトがどっちに向いているか分かるはず!

まとめ

  • WXYZのうちXYZの数値から、なんとなく回転軸の向きを知る
  • W=COS(θ/2)をつかって、なんとなくどのくらい回転してるかを知る
  • 気合いれてWXYZの表を覚える。(ちなみに私は覚えられませんでした)
なんとなく分かりました?私はさっぱりです







2018年5月26日土曜日

BlenderTutorialの翻訳 その2

BlenderGuruのAndrew Priceさんが配信しているBlenderTutorialの翻訳、
Part1からPart3まで終わりました。Part3の字幕の反映は数日かかると思います。

前回のブログはこちら→
https://pitslaboratory.blogspot.jp/2018/05/blendertutorial.html

Part1:
 
Part2:
 
Part3:
 

Part1とPart2はおよそ15分くらいのビデオでしたが、Part3はおよそ30分。長い。長いよアンドリュー('A`)

翻訳が完成するまでに、セリフを1つあたり平均10回くらいリピートしています。なので1本10分の動画だと最低100分、Part3ではおよそ300分はかかるわけです。しかも直訳するだけでなく、茶番部分を日本人向けにカスタマイズしたり、”あー”とか”うー”とか、意味のない部分をどう繋ぐかとか、元の動画のクオリティを落とさないためにどうするか?とか、実際にBlenderを起動して操作を確認しながらやっているので、まぁ‥

何が言いたいかというと、動画の長さに対し指数関数的に作業時間が延びるわけです。
なのでPart3は諦めかけましたが、無事投稿できました。

というわけでモチベーション維持のため、Part4以降はしばらく休憩します。
誰かコーヒーでも奢ってくれ!( ゚д゚ )



2018年5月19日土曜日

私的Blenderの使い道

電気工事の配線図。
立体的にどこをどう配線するか考えられるので、無駄がない。(ないとは言ってない

2018年5月15日火曜日

2018年5月11日金曜日

RaspberryPiでラズベリー栽培 I2CをCで使う

3年ぶりのRaspbery栽培ネタですが、皆様いかがお過ごしでしょうか。私は元気です。

ラズベリーはどうなったか

結局のところ、気象とか水分とか測定しても天気を変えられるわけでもなく、あまり意味がないことに気が付きました。また我が家の場合、近所の田畑で石灰を撒いている影響もあったようで、なかなかうまく育ちませんでした。3年前のラズベリーは見事に枯れてしまいましたが、3代目ラズベリーは順調に育っていて、実が付き始めました。本来山間部に生息する植物を、平野部で育てようとしてるのだから、それはまぁ苦労しますね。今年はまだ枝が短いのでジャムを作るほど実がなってはくれないと思いますが、来年に期待です。


さて本題。前回、GPIOをShellでコントロールする方法を紹介しましたが、今回はI2CをCのソースコードからコントロールします。

使用する材料

使用するセンサは、前回購入していたBoschのBME280を搭載したモジュールです。気温、湿度、気圧が測定できてお値段もお安いです。
秋月電子→http://akizukidenshi.com/catalog/g/gK-09421/
RaspberryPi2。前回使用したRaspberryPi1でも大丈夫ですが、シングルコアのくせに消費電流が多いので、Pi2に変更しました。(Pi1:Typ500mA Pi2:Typ350mA wikiより)
電源は5V2A出力できるものを使用。普通のスマホ充電器です。今回のケースでは1Aでも動くと思います。(実測で250mAでした)

接続

まずはBME280モジュールのジャンパを設定します。I2CのプルアップはRaspberryPi側でされているので、J3のみ半田を盛ってください。

RaspberryPiとの接続は以下の通り
BME280モジュールのSDO(5ピン)はモジュール基板上でGNDまたはVDDに接続しておくと、RaspberryPiとの接続線を減らせて綺麗に見えます

WiringPiのダウンロードとインストール

始めにGitをインストールします。既にインストールしてる方は不要です
$ sudo apt-get install git-core

WiringPiをクローンして、buildします

$ git clone git://git.drogon.net/wiringPi
$ cd ~/wiringPi
$ ./build

途中だいぶ省略しましたが、詳しくはwiringPiのHPを参照してください。

WiringPiを使ってセンサを読む

ここではWiringPiライブラリのなかの、WiringPiI2Cのみ使用します。他にもGIPOやSPIなどのライブラリも含まれていますので、必要な方はIncludeしてください。
メイン関数で BME280Interfaceのインスタンスを作成してmeasurement()を呼ぶと、humidity, temperature, pressureの数値が更新されます。

コンパイル

$ gcc -Wall getTempHumPres.cpp -l wiringPi -o getTempHumPres
これでBME280から気温、湿度、気圧を読み取ることができました。
あとはシェルから呼ぶなりPythonから呼ぶなり、
ソースコードを改造して全てCで書くなりお好きなように調理してください。

おまけ1 ソースコードの解説


メイン関数で BME280Interfaceのインスタンスを作成してmeasurement()を呼ぶと、humidity, temperature, pressureの数値が更新されます。bme280Interface.cppのほうはデバイスIDなどを変更したい場合以外、基本的に修正する必要はありません。
キャリブレーションは本来なら固定小数点で計算すべきなのですが、めんどくさ(ry
doubleにそのまま代入しております。
固定小数点が必要な場合は、Arduino用のソースコードを参考にしてみてください。
↓スイッチサイエンスさんのBME280 Arduinoスケッチのサンプル
http://trac.switch-science.com/wiki/BME280

おまけ2 wiringPiI2Cの関数について

int wiringPiI2CSetup(int deviceID)
  • deviceID : デバイスIDは、I2Cデバイスのマニュアルに書かれています。BME280の場合、デフォルトで0x76です。
  • 戻り値 : 通常はstandard Linux filehandleが戻ってきます。-1が出たら接続エラーです。

int wiringPiI2CRead(int fd)
int wiringPiI2CReadReg8(int fd, int reg)
int wiringPiI2CReadReg16(int fd, int reg)
  • fd : setupで取得したファイルハンドル
  • reg : I2Cデバイスのレジスタアドレス
  • 戻り値 : I2Cデバイスのレジスタの内容。Reg8は8ビット、Reg16は16bit

一番目のwiringPiI2CReadは、こちらはSMBUSプロトコルを使わないI2Cデバイスとの通信に利用する関数なので今回は使いません。 Reg8,Reg16はそれぞれ8bitのデータ読み込み、16bitのデータ読み込みが実行されます。
int wiringPiI2CWrite(int fd, int data)
int wiringPiI2CWriteReg8(int fd, int reg, int data)
int wiringPiI2CWriteReg16(int fd, int reg, int data)
  • fd : setupで取得したファイルハンドル
  • reg : I2Cデバイスのレジスタアドレス
  • data : 書き込むデータ
  • 戻り値 : 不明。本家マニュアルに記載なし。

おまけ3 細かいこと

WireingPiI2CのReadWriteは8bitと16bitしか用意されていません。ブロック転送、バースト転送が出来ないので、直接I2Cをコントロールする場合よりバス占有時間が長くなります。(ほんの数十uSecですが)

参照

WiringPi http://wiringpi.com/
スイッチサイエンス http://trac.switch-science.com/wiki/BME280
秋月電子 http://akizukidenshi.com/catalog/g/gK-09421/