SSブログ

【Neural Network Console】まだ続くよLSTM、さらに OutputGate を追加してみた [AI]

LSTMに到達するまであと一息です。今回は "Output Gate" を追加します。


スライド1.PNG


"Output Gate" は、Sigmoidでゲーティングされた”結合入力"の迂回路と"積算出力"との積になっています。これによって過去の"積算出力"と"結合入力"の相関の強い結果が出力されます。


スライド2.PNG


その結果は次のラインに渡され、入力データと直前の結果をあわせることにより、それ以降の層、積算層、”Output Gate" は、より精度の高い結果が得られるようになることが期待されます。


スライド3.PNG


ということで学習をさせました。


2020-06-30 (8).png


評価結果はというと、、、


2020-06-30 (9).png


だいたい96% であまり変わらない…どころか、若干悪化しています。う~ん、これでは良いのかどうなのかよく分からないですね。

ということで例によって最終段を Convolution 層に変えて各時間軸での出力を画像化してみたいと思います。


2020-07-01.png


学習結果は収束しました。


2020-07-01 (1).png


結果はこのようになりました。


2020-07-01 (2).png


改善具合は明らかですね。各時間軸で入力をうまく選別し、より相関の強い出力だけを出力できるようになっているようです。

次は、いよいよLSTM完結編です!😉
( ̄ー ̄)





ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



はじめての「SonyNNC」 (I・O BOOKS)

はじめての「SonyNNC」 (I・O BOOKS)

  • 作者: 良一, 柴田
  • 出版社/メーカー: 工学社
  • 発売日: 2019/08/01
  • メディア: 単行本







nice!(19)  コメント(0) 

【Neural Network Console】LSTMを理解するため、さらに InputGate を追加してみた! [AI]

前回、過去の学習結果を記憶するための "Cell State" を追加しました。今回はそれにさらに "Input Gate" を追加しました。


スライド1.PNG


Input Gate は、入力を選択的に取り込む役割を担います。これによって、Cell State が相関度の低い入力でも書き換わってしまうのを防ぐことができます。


スライド2.PNG


学習結果は収束しました。


2020-06-28 (9).png


結果を見てみましょう。


2020-06-28 (10).png


認識率は 96% で前回とあまり変化はありません。どのような改善効果があったのか良くわからないので、前回と同じく、各時間軸での結果を画像化してみました。例によって最終段を コンボリューションレイヤーに置き換えます。


2020-06-28 (2).png


学習結果は収束しました。


2020-06-28 (3).png


それでは結果を見てみます。


2020-06-28 (4).png


前回に比べると、それらしい輪郭が出ています。入力を選択的に取り込んだ結果でしょう。こうやって、一つ一つ動かしてみるとそれぞれのレイヤーの作用がよく分かるのでいいですね!😃
(^^)





ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



はじめての「SonyNNC」 (I・O BOOKS)

はじめての「SonyNNC」 (I・O BOOKS)

  • 作者: 良一, 柴田
  • 出版社/メーカー: 工学社
  • 発売日: 2019/08/01
  • メディア: 単行本







nice!(18)  コメント(0) 

【Neural Network Console】LSTMを理解するため Elman_net に Cell State を追加してみた [AI]

Elman_net をこれから少しずつ LSTM に近づけていきたいと思います。今回は Elman_net に ”Cell State” を追加して、その振る舞いを調べてみたいと思います。

ソニー小林師匠によると、”Cell State” は「過去の出力を足しながら保持し、遠い過去の記憶の消失を防ぐ」役割をもっており各時間軸の出力を加算していくレイヤーです。

で早速、見よう見真似でネットワークを作ってみたのですが、エラーが出てしまいました。


2020-06-25 (2).png


いろいろと試行錯誤してみたところ、新しく追加した "Delay_2" の”Size”を (1, 28) と指定することで、解決しました。


2020-06-25 (4).png


さて、このネットワークを学習させてみます。


2020-06-26.png


うまく収束しました。評価結果を確認します。


2020-06-26 (1).png


認識率は 96% になりました。前回は 93% だったので 3% 向上しました。

前回と同じように、このネットワークの各時間軸の出力結果を画像で出力してみたいと思います。次のようなネットワークを作りました。


2020-06-26 (2).png


学習をさせるとうまく収束しました。


2020-06-26 (3).png


結果を見てみましょう。


2020-06-26 (4).png


前回と違って数字が崩れています。これは加算レイヤーに各時間軸の学習結果が蓄積したためだと思われます。画像をよく見ると、推論方向となる縦に白が多いところは、結果も白くなっていますので、加算レイヤーが大きく影響していることが見受けられます。


今回の実験では、加算レイヤー(Cell State)を追加すると各時間軸の結果に大きく影響することがわかりました

まぁ、画像をスリットで見せられて、最終的に ”これなんだ?” という予測の仕方なので、当然の結果と言えるでしょう。やはりLSTMを扱うには音などの時系列データを使う方がわかりやすいのかなぁ。もうちょっと進め方考えるか…🤨
(´・ω・`)





ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



はじめての「SonyNNC」 (I・O BOOKS)

はじめての「SonyNNC」 (I・O BOOKS)

  • 作者: 良一, 柴田
  • 出版社/メーカー: 工学社
  • 発売日: 2019/08/01
  • メディア: 単行本



詳解ディープラーニング 第2版 ~TensorFlow/Keras・PyTorchによる時系列データ処理~ (Compass Booksシリーズ)

詳解ディープラーニング 第2版 ~TensorFlow/Keras・PyTorchによる時系列データ処理~ (Compass Booksシリーズ)

  • 作者: 巣籠 悠輔
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2019/11/27
  • メディア: 単行本(ソフトカバー)




nice!(17)  コメント(0) 

【Neural Network Console】LSTMを理解するため Elman_net を理解する [AI]

組込AIだと、時系列データを処理することが多いので、時系列データを扱えるニューラルネット "LSTM" について、NNCのソニー小林師匠の動画を見て勉強しました。





NNCは動画が充実していて本当に助かります。NNL (Nnabla) はもう少しなんとかならんですかねぇ…

で、この動画で、 LSTM を理解するには、Elman_net を理解するのがよろし!と師匠が言っているので、Elman_net を試してみました。見よう見真似で組んでみたネットワークがこちら。


2020-06-24.png


ここで、"RecurrentInput", "Slice" といったレイヤーが新顔なのでちょっと戸惑います。

■ ReccurentInput の説明
ReccurentInput は、Reccurent Neural Network のループの開始位置を指定します。
Axisは Time ループの軸を指定し、Time ループは Axis で指定された軸の長さになります。


(1,28,28) の長さの画像は 各行 (1,28) の一次元データを28回ループする形になりますので、Axis は "1" を指定します。

■ Slice の説明
Slice は配列の一部を抜き出します。

Start抜き出す配列の開始位置を指定します。
Stop抜き出す配列の終了位置を指定します。
Step抜き出す配列の間隔を指定します。 例えば、"3, 48, 64" の画像の中心 "24 x 32" の縦横2ピクセル毎を抜き出す場合、 開始位置 "0, 12, 16" 、終了位置 "3, 36, 48" 、間隔"1, 2, 2" を指定します。


ここでは最終結果の一次元の28個の数列の結果、 "1, 1, 28" のデータが取り出せればよいので、開始位置は "0, 27, 0"、終了位置は ”1, 28, 28" を指定します。

テスト用のデータセットは、MNIST の ”4,9” 判別用のデータセットを使ってみました。学習の結果です。


2020-06-23 (1).png


多少ばらついていますが、収束しているようです。結果を見てみます。


2020-06-23 (2).png


だいたい93%といったところですね。
一通り動かすことができたので、なんとなく理解が深まりました。

と、ここまでは教えてもらったことを試してみただけなので、あまり面白くありません。

せっかくなら Elman_net の各時間軸の出力結果を画像にして出力してみたいと思います。試しに次のようなネットワークを組んでみました。


2020-06-23 (3).png


学習をさせてみると綺麗な曲線となりました。これは結果が期待できます。


2020-06-23 (4).png


こちらが出力結果です。


2020-06-23 (5).png


おお、なかなかよい感じで出力が得られました。NNCだとこのようなことも簡単に試せるのでいいですね。 😀
(^^)/~





ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



はじめての「SonyNNC」 (I・O BOOKS)

はじめての「SonyNNC」 (I・O BOOKS)

  • 作者: 良一, 柴田
  • 出版社/メーカー: 工学社
  • 発売日: 2019/08/01
  • メディア: 単行本



Excelでわかるディープラーニング超入門【RNN・DQN編】

Excelでわかるディープラーニング超入門【RNN・DQN編】

  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/10
  • メディア: 単行本(ソフトカバー)




nice!(26)  コメント(0) 

【悲報】新型コロナの抗体は長続きしない可能性… [徒然日記]

中国は前回のコロナ大流行を隠蔽したことで世界から大バッシングを受けたためか、最近は積極的に情報公開をするようになってきました。同じことを繰り返さないという意思を感じるのは良いことですね。

そんな中、中国医学会から気になる報告が…。



コロナ無症状感染、回復期の免疫レベル大きく低下か 研究
https://www.afpbb.com/articles/-/3289214


要約すると、コロナに罹患した患者の6割から8割は、2ヶ月後にはその抗体が減少していることが分かったという報告です。

だいぶ前からそのような指摘はありましたが、それが定量的に示された形になりました。


【解説】 新型ウイルスには2度感染する? 免疫についていま分かっていること
https://www.bbc.com/japanese/features-and-analysis-52451012


ワクチンが出来たとしても、それが果たして効果的なのか怪しくなってきました。来年のオリンピックは開催できるのかなぁ…。

しかも、今回、無症状の人はコロナに対する免疫応答が弱いことも分かったようです。つまり人によっては無害だが、別の人に対しては激しく反応するということですね。まるでアレルギーのようです。そう考えると喘息の薬が効いたというのも納得できます。

無症状だからと安心もできません。ウイルスは別のウイルスと交じると変異していくことを考えると、無症状コロナが型の違うコロナと混じったとたんに激しく反応することも考えられます。
(n;‘Д‘))η


世の中は次第に日常に戻りつつありますが、コロナ前の生活には完全に戻れないかも知れませんね。

グローバル化が叫ばれていた21世紀ですが、アフターコロナの世界は、身近なコミュニティで出来る限り充足する社会が理想となりそうです。手始めに菜園でもやろうかな…
(´・ω・`)





アフターコロナ 見えてきた7つのメガトレンド

アフターコロナ 見えてきた7つのメガトレンド

  • 出版社/メーカー: 日経BP
  • 発売日: 2020/06/02
  • メディア: Kindle版



「新型コロナ恐慌」後の世界

「新型コロナ恐慌」後の世界

  • 作者: 渡邉哲也
  • 出版社/メーカー: 徳間書店
  • 発売日: 2020/03/27
  • メディア: 単行本(ソフトカバー)



コロナショック・サバイバル 日本経済復興計画 (文春e-book)

コロナショック・サバイバル 日本経済復興計画 (文春e-book)

  • 作者: 冨山 和彦
  • 出版社/メーカー: 文藝春秋
  • 発売日: 2020/04/30
  • メディア: Kindle版




タグ:新型コロナ
nice!(24)  コメント(2) 

【技術書作成の強い味方!】「Re:VIEW starter」 に辿り着くまで [徒然日記]

仕事でちょっとした技術書を作らねばならず、”github でコンテンツを管理できて、印刷用に出力できる超見栄えのいいドキュメントツールはないかな” と探していたところ、「Re:VIEW」というツールを見つけました。


2020-06-19 (13).png
https://github.com/kmuto/review


早速、Rubyをインストールして Re:VIEW を入れてみました。確かに見栄えはいい。しかし、自分好みにレイアウトに少しだけ変更したいなと思っても、サンプルもほとんどなく手も足も出ません。

それならばと、「vivlostyle」という HTML+CSS で組版ができるツールを見つけたました。ブラウザベースで編集できて印刷レベルにも耐えられるということで、なんか良さそうです。


2020-06-19 (14).png
https://vivliostyle.org/ja/


が、実際に使ってみると、ソースがHTMLなので、変更管理が簡単ではありません。しかも、私がやりたいのは章の見出しにちょっとした飾りをつけるとかその程度。それでHTML+CSSは大げさです。

TeXをベースとしたRe:VIEWはコンテンツの管理には最適なので、Re:VIEW+CSS組版のものも試してみましたが、思うようなアウトプットができず…(私の使い方が悪いのだと思いますが)

で、途方に暮れWORDで作るか?と諦めかけていたところに、私のRe:VIEWに対するぼやきのツイートに @_kauplan さんから返信がありました。(なぜか返信が通知されず、気付くのが遅れました。失礼しました…)





それでは使ってみようということで早速試してみました。最初に次のサイトにアクセスしウィザード形式で質問に答えていきます。


2020-06-19.png
https://kauplan.org/reviewstarter/


このウィザードの中で所望していた簡単なレイアウトの変更もできます。


2020-06-19 (6).png


最後のページにReVIEWのファイルをコンパイルする方法が記述されています。


2020-06-19 (11).png


早速ドキュメントのプロジェクトをダウンロードし、ReVIEW文書を作ってみました。私のマシンには、Dockerがインストールされていますので、Dockerを使ってコンパイルしてみました。


$ cd taro-meets-review
$ docker run --rm -v $PWD:/work kauplan/review2.5 /bin/bash -c "cd /work; rake pdf"
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)
/var/lib/gems/2.5.0/gems/rake-13.0.1/exe/rake:27:in `'
(See full trace by running task with --trace)



が、”Rakefileがねぇ!”と言われて弾かれてしまいます。[涙]

そこで、docker ではなく、docker-compose を使ってみたらどうかなと思い、"taro-meets-review"ディレクトリに次の2つのファイルを追加しました。

Dockerfile
FROM kauplan/review2.5



docker-compose.yml
version: '3'
services:
  review:
    volumes:
      - .:/work
    build: .
    working_dir: /work
    ports:
      - "127.0.0.1:18000:18000"




上記の2つのファイルを保存し、docker-compose でコンパイルしてみました。メッセージが沢山出てくるので、うまく動いたようです。


$ cd taro-meets-review
$ docker-compose run --rm review rake pdf
compiling chap00-preface.tex
compiling chap01-starter.tex
WARN: warning: duplicate ID: tw-icon (#)
compiling chap02-faq.tex
compiling chap99-postscript.tex
... snip ...
[pdfmaker]$ /usr/bin/ruby2.5 /work/lib/hooks/beforetexcompile.rb /work/taro-meet
s-review-pdf /work

mktexpk: /root/.texlive2017/texmf-var/fonts/pk/ljfour/public/boisik/bskarr10.480
pk already exists.

1420345 bytes written




ディレクトリを見ると、”taro-meets-review.pdf” が出来上がっています。中身を見ると指定したデザインのドキュメントが出来ていました!ラクチンだぁ…


2020-06-19 (12).png


ここまで辿り着くのにだいたい2時間と少し(ほとんどDockerイメージのダウンロードの時間ですが)最初からこれに出会えていれば、時間を無駄にしなかったのになぁ… 

でも、これでようやくコンテンツ作りに集中できます!😅
(^^)/~





最強の電子書籍執筆ツール Re:VIEW解説: Amazon キンドル出版の極意 究極の技シリーズ (計算機屋さんの技)

最強の電子書籍執筆ツール Re:VIEW解説: Amazon キンドル出版の極意 究極の技シリーズ (計算機屋さんの技)

  • 作者: 高瀬 行夫
  • 出版社/メーカー: 私の計算機科学研究
  • 発売日: 2019/04/27
  • メディア: Kindle版



CSSページ組版入門

CSSページ組版入門

  • 作者: アンテナハウス株式会社
  • 出版社/メーカー: アンテナハウスCAS電子出版
  • 発売日: 2018/09/23
  • メディア: オンデマンド (ペーパーバック)



TEX(テック)ブック―コンピュータによる組版システム (アスキー・電子出版シリーズ)

TEX(テック)ブック―コンピュータによる組版システム (アスキー・電子出版シリーズ)

  • 出版社/メーカー: アスキー
  • 発売日: 2020/06/19
  • メディア: 単行本




nice!(28)  コメント(0) 

【コロナ禍】まだまだ続くよ在宅勤務 [4コマ漫画]

最近、なんだかんだで2週間に一回くらいに会社に出社しています。まだまだ出社が制限されていることもあり、普段にくらべると会社はガラガラなのですが、でも少しずつ日常に戻りつつあるなと感じます。

しかし、コロナが解決していないので、密にならないようオフィスをシェアリング化するという話がもちあがっていました。今日、久しぶりにマネージャーと顔をあわせたので、その様子を聞いてみました。


まだまだ続くよ在宅勤務.png


ということでオフィスのスペース不足のため、しばらく私の在宅勤務ライフは続きそうです。そのうち在宅で仕事できる人は基本在宅勤務って感じになりそうだなぁ。😉
( ̄ー ̄)b





できるテレワーク入門 在宅勤務の基本が身に付く本 できるシリーズ

できるテレワーク入門 在宅勤務の基本が身に付く本 できるシリーズ

  • 出版社/メーカー: インプレス
  • 発売日: 2020/05/29
  • メディア: Kindle版










タグ:日常 仕事
nice!(22)  コメント(0) 

【SPRESENSE】BMI160用のセンサーフュージョン・フィルターを検討する(2) [ロボット]

前回、SPRESENSEでセンサーフュージョン用のフィルターを検討しましたが、グラフでは効果がよく分からないので、今回は少し工夫をこらして Processing で表示しながら反応を見ることにしました。


DSC_1001.JPG


Processingで作ったプログラムのグラフィック画面を次のようにしてみました。


2020-06-14 (1).png


Spresense のスケッチは次のようなものです。前回のものと出力形式以外は全く変わっていません。


#include <Wire.h>
#include <math.h>
#include <BMI160Gen.h>
#include <Kalman.h>
#include <MadgwickAHRS.h>

#define PRINT_PROCESSING

#define BAUDRATE  115200
#define SENSE_RATE   100
#define GYRO_RANGE   250
#define ACCL_RANGE     2

#define deg_to_rad(a) (a/180*M_PI)
#define rad_to_deg(a) (a/M_PI*180)

Kalman kalmanRoll;
Kalman kalmanPitch;
Madgwick madgwick;

float convertRawGyro(int gRaw) {
  // ex) if the range is +/-500 deg/s: +/-32768/500 = +/-65.536 LSB/(deg/s)
  float lsb_omega = float(0x7FFF) / GYRO_RANGE;
  return gRaw / lsb_omega;  // deg/sec
}

float convertRawAccel(int aRaw) {
  // ex) if the range is +/-2g ; +/-32768/2 = +/-16384 LSB/g
  float lsb_g = float(0x7FFF) / ACCL_RANGE;
  return aRaw / lsb_g;
}

static float gyro_roll = 0, gyro_pitch = 0, gyro_yaw = 0;
static float comp_roll = 0, comp_pitch = 0;
static unsigned long last_mills = 0; 
void print_roll_pitch() 
{
     
  // read raw accl measurements from device
  int rawXAcc, rawYAcc, rawZAcc; // x, y, z
  BMI160.readAccelerometer(rawXAcc, rawYAcc, rawZAcc);
  float accX = convertRawAccel(rawXAcc);
  float accY = convertRawAccel(rawYAcc);
  float accZ = convertRawAccel(rawZAcc);

  float rad_a_roll = atan2(accY, accZ);
  float rad_a_pitch = atan2(-accX, sqrt(accY*accY + accZ*accZ));
  float accl_roll = rad_to_deg(rad_a_roll);
  float accl_pitch = rad_to_deg(rad_a_pitch);

  // read raw gyro measurements from device
  int rawRoll, rawPitch, rawYaw; // roll, pitch, yaw
  BMI160.readGyro(rawRoll, rawPitch, rawYaw);
  float omega_roll  = convertRawGyro(rawRoll);
  float omega_pitch = convertRawGyro(rawPitch);
  float omega_yaw   = convertRawGyro(rawYaw);
  
  unsigned long cur_mills = micros();
  unsigned long duration = cur_mills - last_mills;
  last_mills = cur_mills;
  double dt = duration / 1000000.0; // us->s  
  if (dt > 0.1) return;

  // Gyro data
  gyro_roll  += omega_roll  * dt; // (ms->s) omega x time = degree
  gyro_pitch += omega_pitch * dt;
  gyro_yaw   += omega_yaw   * dt;
  
  // Complementary filter data
  comp_roll  = 0.93 * (comp_roll  + omega_roll  * dt) + 0.07 * accl_roll; 
  comp_pitch = 0.93 * (comp_pitch + omega_pitch * dt) + 0.07 * accl_pitch; 

  // Kalman filter data
  float kalm_roll  = kalmanRoll.getAngle(accl_roll, omega_roll, dt);
  float kalm_pitch = kalmanPitch.getAngle(accl_pitch, omega_pitch, dt); 

  // Madgwick filter data
  madgwick.updateIMU2(omega_roll, omega_pitch, omega_yaw, accX, accY, accZ, dt);
  // madgwick.updateIMU(omega_roll, omega_pitch, omega_yaw, accX, accY, accZ);
  float madw_roll  = madgwick.getRoll();
  float madw_pitch = madgwick.getPitch();
  float madw_yaw   = madgwick.getYaw();

#ifdef PRINT_PROCESSING
  static int n = 0;
  if (n != 50) {
    ++n; return; 
  }
  n = 0;

  Serial.print(accl_roll);
  Serial.print(",");
  Serial.print(accl_pitch);
  Serial.print(",");
  Serial.print(madw_yaw);
  Serial.print(",");
  Serial.print(gyro_roll);
  Serial.print(",");
  Serial.print(gyro_pitch);
  Serial.print(",");
  Serial.print(madw_yaw);
  Serial.print(",");
  Serial.print(comp_roll);
  Serial.print(",");
  Serial.print(comp_pitch);
  Serial.print(",");
  Serial.print(madw_yaw);
  Serial.print(",");
  Serial.print(kalm_roll);
  Serial.print(",");
  Serial.print(kalm_pitch);
  Serial.print(",");
  Serial.print(madw_yaw);
  Serial.print(",");
  Serial.print(madw_roll);
  Serial.print(",");
  Serial.print(madw_pitch);
  Serial.print(",");
  Serial.print(madw_yaw);
  Serial.print(",");
#endif
  Serial.println();
}


void setup() {
  Serial.begin(115200);
  BMI160.begin(BMI160GenClass::I2C_MODE);
  madgwick.begin(SENSE_RATE);

  BMI160.setGyroRate(SENSE_RATE);
  BMI160.setAccelerometerRate(SENSE_RATE);
  BMI160.setGyroRange(GYRO_RANGE);
  BMI160.setAccelerometerRange(ACCL_RANGE);

  BMI160.autoCalibrateGyroOffset();
  BMI160.autoCalibrateAccelerometerOffset(X_AXIS, 0);
  BMI160.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
  BMI160.autoCalibrateAccelerometerOffset(Z_AXIS, 1);

  delay(100);

  /* Set kalman and gyro starting angle */
  int rawXAcc, rawYAcc, rawZAcc;
  BMI160.readAccelerometer(rawXAcc, rawYAcc, rawZAcc);
  float accX = convertRawAccel(rawXAcc);
  float accY = convertRawAccel(rawYAcc);
  float accZ = convertRawAccel(rawZAcc);
  
  float roll  = rad_to_deg(atan(accY / accZ));
  float pitch = rad_to_deg(atan(-accX / sqrt(accY * accY + accZ * accZ)));

  // Set starting angle
  kalmanRoll.setAngle(roll); 
  kalmanPitch.setAngle(pitch);
  gyro_roll  = comp_roll  = roll;
  gyro_pitch = gyro_pitch = pitch;
}

void loop() {
  print_roll_pitch();
}



Processing のスケッチは次のようになっています。

import processing.serial.*;
Serial myPort;  // Create object from Serial class

float [] Acc = new float[3];
float [] Gyr = new float[3];
float [] Cmp = new float[3];
float [] Klm = new float[3];
float [] Mdw = new float[3];

int lf = 10; // 10 is '\n' in ASCII
byte[] inBuffer = new byte[1024];

PFont font;
final int VIEW_SIZE_X = 1100, VIEW_SIZE_Y = 600;

void settings() {
  size(VIEW_SIZE_X, VIEW_SIZE_Y, P3D);
}  

void setup() {
  myPort = new Serial(this, "COM15", 115200); 
  font = loadFont("CourierNew36.vlw"); 
}


void readSensors() {
  if(myPort.available() > 0) {
    if (myPort.readBytesUntil(lf, inBuffer) > 0) {
      String inputString = new String(inBuffer);
      String [] inputStringArr = split(inputString, ',');
      
      Acc[0] = float(inputStringArr[0]);
      Acc[1] = float(inputStringArr[1]);
      Acc[2] = float(inputStringArr[2]);
      Gyr[0] = float(inputStringArr[3]);
      Gyr[1] = float(inputStringArr[4]);
      Gyr[2] = float(inputStringArr[5]);
      Cmp[0] = float(inputStringArr[6]);
      Cmp[1] = float(inputStringArr[7]);
      Cmp[2] = float(inputStringArr[8]);
      Klm[0] = float(inputStringArr[9]);
      Klm[1] = float(inputStringArr[10]);
      Klm[2] = float(inputStringArr[11]);
      Mdw[0] = float(inputStringArr[12]);
      Mdw[1] = float(inputStringArr[13]);
      Mdw[2] = float(inputStringArr[14]);
    }
  }
}


void normalize3DVec(float [] vector) {
  float R;
  R = sqrt(vector[0]*vector[0] + vector[1]*vector[1] + vector[2]*vector[2]);
  vector[0] /= R;
  vector[1] /= R;  
  vector[2] /= R;  
}


void buildBoxShape() {
  //box(60, 10, 40);
  noStroke();
  beginShape(QUADS);
  
  //Z+ (to the drawing area)
  fill(#00ff00);
  vertex(-30, -5, 20);
  vertex(30, -5, 20);
  vertex(30, 5, 20);
  vertex(-30, 5, 20);
  
  //Z-
  fill(#0000ff);
  vertex(-30, -5, -20);
  vertex(30, -5, -20);
  vertex(30, 5, -20);
  vertex(-30, 5, -20);
  
  //X-
  fill(#ff0000);
  vertex(-30, -5, -20);
  vertex(-30, -5, 20);
  vertex(-30, 5, 20);
  vertex(-30, 5, -20);
  
  //X+
  fill(#ffff00);
  vertex(30, -5, -20);
  vertex(30, -5, 20);
  vertex(30, 5, 20);
  vertex(30, 5, -20);
  
  //Y-
  fill(#ff00ff);
  vertex(-30, -5, -20);
  vertex(30, -5, -20);
  vertex(30, -5, 20);
  vertex(-30, -5, 20);
  
  //Y+
  fill(#00ffff);
  vertex(-30, 5, -20);
  vertex(30, 5, -20);
  vertex(30, 5, 20);
  vertex(-30, 5, 20);
  
  endShape();
}


void drawCube(int n, float vec[]) {  
  pushMatrix();
    translate(n, 450, 0);
    scale(3,3,3);
    
    rotateX(HALF_PI * vec[0]);
    rotateZ(HALF_PI * -vec[1]);
    
    buildBoxShape();
  popMatrix();
}

void draw() {  
  readSensors();
  normalize3DVec(Acc);
  normalize3DVec(Gyr);
  normalize3DVec(Cmp);
  normalize3DVec(Klm);
  normalize3DVec(Mdw);
  
  background(#000000);
  fill(#ffffff);

  textFont(font, 24);
  text("Sensor Fusion Test using Spresense with BMI160", 180, 100);
  
  textFont(font, 18);
  text("Accelerometer :\n" + Acc[0] + "\n" + Acc[1], 50, 180);
  drawCube(150, Acc);

  text("Gyroscope :\n" + Gyr[0] + "\n" + Gyr[1], 250, 180);
  drawCube(350, Gyr);
  
  text("Comp. Filter :\n" + Cmp[0] + "\n" + Cmp[1], 450, 180);
  drawCube(550, Cmp);

  text("Kalman Filter :\n" + Klm[0] + "\n" + Klm[1], 650, 180);
  drawCube(750, Klm);
  
  text("Madgwick Filter :\n" + Mdw[0] + "\n" + Mdw[1], 850, 180);
  drawCube(950, Mdw);
}



百聞は一見にしかず、ぜひ動画で見てみてください。どのフィルタがどのような性質を持っているかグラフィックで見てみるとひと目で分かります! 😀
(^^)/~







倒立振子で学ぶ制御工学

倒立振子で学ぶ制御工学

  • 出版社/メーカー: 森北出版
  • 発売日: 2017/03/03
  • メディア: 単行本(ソフトカバー)



SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware







nice!(21)  コメント(0) 

日本で「スターウォーズ計画」が復活か!? [徒然日記]

スカパーが「レーザーを使って宇宙ゴミを撃ち落とす衛星」の開発を行うという発表がありました。JAXAや理化学研究所も参加するそうです。


laser_sat.jpg
レーザーで宇宙ごみを撃ち落とす人工衛星、スカパーが開発へ
https://www.itmedia.co.jp/news/articles/2006/11/news146.html


この計画を聞いて真っ先に思い出したのは、80年代当時のレーガン大統領が発表した「スターウォーズ計画」。これを聞いたときに真っ先に思ったのは宇宙戦艦ヤマトに出てきた「反射衛星砲」。やっぱアメリカってすげー国だなぁと、子供心に思ったものです。


starwars.jpg
「戦略防衛構想」(「スターウォーズ計画」)
https://ameblo.jp/worldhistory-univ/entry-12111507102.html


しかし、ほどなくしてソ連が崩壊。結局「スターウォーズ計画」は日の目を見ることはありませんでした。

時は流れて三十年。まさか同じようなコンセプトの計画が日本から出てくるとは。当時の日本の宇宙開発レベルを考えると、”ここまで来たか!”と目頭が熱くなる思いです。しかも平和目的なのが日本らしいですね。





しかし、スカパーがこんなことするなんて驚きです。今やテレビもレガシーメディアになりつつあるので、新しい事業展開を考えているのですね。やっぱり2020年代最もアツいのは宇宙かなぁ。🤔
(。-`ω-)ン





CanSat―超小型模擬人工衛星―

CanSat―超小型模擬人工衛星―

  • 出版社/メーカー: オーム社
  • 発売日: 2014/08/23
  • メディア: 単行本(ソフトカバー)



人工衛星をつくる−設計から打ち上げまで−

人工衛星をつくる−設計から打ち上げまで−

  • 作者: 宮崎 康行
  • 出版社/メーカー: オーム社
  • 発売日: 2011/11/25
  • メディア: 単行本(ソフトカバー)







タグ:衛星 宇宙
nice!(27)  コメント(0) 

【緊急事態宣言終了も】仕事やべぇ終わらねぇ【個人的緊急事態】 [徒然日記]

緊急事態宣言が終了とともに、6月から仕事が増えてきました。(まだ在宅勤務は続いているのですけど)趣味に避ける時間もいよいよなくなってきて、締め切りに追われる毎日が戻ってきたみたいです。

というより調子のいい返事ばっかりして、仕事が溜まるまで放っておいた私が悪いんですけどね。


仕事ではまる2.png


しかし、今週中にこの仕事量こなせるかなぁ。しかも町内会の会長とかやるはめになってしまったので、その仕事もこなさないといけないし。いよいよ、ここに個人的緊急事態を宣言させていただきます!😤
(`・ω・´)っ





なぜ、あなたの仕事は終わらないのか スピードは最強の武器である

なぜ、あなたの仕事は終わらないのか スピードは最強の武器である

  • 作者: 中島聡
  • 出版社/メーカー: 文響社
  • 発売日: 2016/06/08
  • メディア: Kindle版



やめるだけで成果が上がる 仕事のムダとり図鑑

やめるだけで成果が上がる 仕事のムダとり図鑑

  • 作者: 岡田 充弘
  • 出版社/メーカー: かんき出版
  • 発売日: 2020/02/19
  • メディア: 単行本(ソフトカバー)



フィンランド人はなぜ午後4時に仕事が終わるのか (ポプラ新書)

フィンランド人はなぜ午後4時に仕事が終わるのか (ポプラ新書)

  • 作者: 堀内都喜子
  • 出版社/メーカー: ポプラ社
  • 発売日: 2020/03/20
  • メディア: Kindle版




タグ:日常 仕事
nice!(24)  コメント(2) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。