編集履歴一覧に戻る
airpocketのアイコン画像

airpocket が 2024年01月29日15時21分06秒 に編集

コメント無し

本文の変更

# はじめに

-

たまごをテーブル回してみる、ゆでたまだと回り続け、生たうま回りせんゆでたまごの場合は白身や黄身に運動エネルギーが伝わるため大きなエネルギー受け取ってまわり続けますが、生まご中身が流動してエネルギーが伝わらずエネルギー減衰も大きぐに停止します

+

SORA-Q(LEV-2)によるSLIM撮影ミッション大成功、おめざいす! このプロジェクトSORA-Qと同じ「世界初」を目指して立ち上げしたSPRESENSE使ってぶん)世界初のたまごの分類専用AI(役にない)の開発記録で

-

この象を利用しモーターを使ってたまごに回転加速度を与え消費電力を測定るこでたまご内部状態を推定ることを狙いました

+

この装置が実するのはたまごとゆでまご2クラス分類で。エクストラサクセスして、生たまご、ゆでたまご、温泉たまご3クラス分類にも挑戦しま

-

閾値を使っ判定も可能すが、自分だけしか持っていないAIモデル作ってみかったためNeural Network Consoleをつかって[生たまご][たまご]のクラス分類を行うモデ制作

+

# 実現のめの手法 テーブルの上たまごに回転運動与えるとゆでまごは回り続け、生たまごはすぐに停止します。 これは、たまごは白身や黄身に運動エネギーが伝わりやすく大きなエネルギー受け取ってまわり続けるのに対、生たごは中身が流動てエネルギーが伝わらず損失も大きいめです

+

この現象を利用し、モーターを使ってたまごに回転加速度を与えた際の消費電力を測定することで、たまごの内部状態を推定することを狙いました。 閾値を使った判定も可能ですが、「自分だけしか持っていないAIモデルを作ってみたかった!」ため、Neural Network Consoleをつかって[生たまご][ゆてたまご]のクラス分類を行うモデルを制作しました。

判定用のデータには、回転時の電流値を用いています。ステッピングモータでたまごを加減速しながら回転させた際の電流値を1024回サンプリングしてFFTし、512次元のベクトルデータとしてクラス分類を試みました。 # いきなり完成

-

実際にこ装置を使て10個の生たまごと10個のゆでたまごの分類を行ったところ正答率は100%でした。

+

学習済みモデルを使用して10個の生たまごと10個のゆでたまごの分類を行ったところ正答率は100%でした。

@[twitter](https://twitter.com/AirpocketRobot/status/1751607371452010956)

-

2次目標として温泉たまごの検出をこころみましたが、これには失敗しています。採取したデータを見ると分類可能な情報は内包しているように見えるため、AIの学習を工夫すれば分類できる可能性も十分あるのではないかと考えています。

+

エクストラサクセスとして温泉たまごの検出をこころみましたが、これには失敗しています。 採取したデータを見ると分類可能な情報は内包しているように見えるため、AIの学習を工夫すれば分類できる可能性も十分あるのではないかと考えています。

+

また冒頭に書いた通りたまごに加速度を与えた際の回転トルクの減衰や位相のずれを見る予定でしたが、実査にはたまご内部の硬さ変化による固有振動数のシフトを観測しているように見受けられます。(もう少しデータを精査して考察が必要です) 最後の「おまけ」に詳述しますが、たまごの内部状態を把握するにはたまごとモーターをリジットに固定しS/N比の高い信号伝達ルートを確保することがもっとも大切なポイントでした。 開発の過程においては、モーターとたまごホルダー間、たまごホルダーとたまご間のそれぞれの固定が甘く、情報の多くが失われているという問題に気付くのが遅れて大いに悩まされました。 IoTシステムへのAIの実装にも同様の課題は重要なポイントであると思われ、今回の開発はとても良い経験になりました。

## 構成

-

![ハードウェア構成](https://camo.elchika.com/f3cefdd4489d0ad041d3ac9c2d703d2bbf79fde6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f63366136303564652d356366302d346661622d613364342d333136333832346538666138/) 装置の構成は図の通りです。 ステッピングモーターで卵を回し、その際の電流変化を電流センサで読み取っています。 タイマーを使用せずそれなりに一定タイミングで動作させるため、メインコアでセンシング、サブ1コアでモーター制御しています。

+

装置の構成は下図の通りです。 ![ハードウェア構成](https://camo.elchika.com/3c95b61ba870d090de6f47302067c2891f22b5ba/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f33643331623761642d383664342d343365662d613737662d333939646138616435336365/)

-

## 装置外観 装置はディプレイを含む本体の上にたまごホルダーが載ってい構造です。 たまごホルダーはnema17 ステッピングモーターで転させています。 装置の筐体とたまごホルダは3Dプリ制作しまし。当初の設計は保護用のクッを介してたまごをホルドしていましたが、クッションの弾性がデータ測定のノイズとなったためリジットな固定に変更しました

+

テッピングモーターで卵をし、その際の電流変化を読み取っています。 タイマを使用せずそれなりに一定タイミ測定するめ、メインコアセング、サブ1コアでモター制御していま

+

装置はディスプレイを含む本体の上にたまごホルダーが載っている構造です。 [装置外観] たまごホルダーはNema17 ステッピングモーターに直結して回転させています。 自作基板は、市販のDC-DCコンバータ、モータードライバ、電流センサを載せ、ディスプレイやSPRESENSEと接続するだけのシンプルな構成です。 [基板外観] 電源は12V ACアダプタから供給し、モータードライバへ供給。SPRESENSEへはDC-DCコンバータで5Vに降圧して供給しました。

## 動作している様子

-

モーターは、加速度が任意の周期の正弦波に一致する様加減速制御を行っています。一方で今回使用したステッピングモーターは、1stepごとにも短周期の加減速を繰り返しています。

@[twitter](https://twitter.com/AirpocketRobot/status/1751607371452010956) この動画では生たまごを使ってたまごの状態を推定しています。

-

グラフには、測定した電流値をFFT解析した結果を表示しています。

+

ディスプレイには、測定した電流値をFFT解析したグラフを表示しています。

# 学習用データ

-

この装置にはデータ採取用モードと推論実行用モードがあり、現状でそれぞれ別コードに書き換えて実行します。 データ採取モードでは規定の周波数でモーターを回転させつつ電流値を測定します。得られた電流データはFFT処理を行いmicroSDに保存します。

+

データ採取規定の周波数でモーターを回転させつつ電流値を測定し得られた電流データはFFT処理を行いmicroSDに保存します。 測定はゆでたまご10個、生卵10個、温泉たまご10個を用い、それぞれ100回ずつ合計3000回行いました。

-

データ測定はゆでたまご10個、生卵10個、温泉たまご4個を用い、それぞれ100回ずつ合計2400回行いました。 次の図は、実際に測定した電流の変化をグラフ化したもです。正規化しています。

+

次の図は、実際に測定した電流の変化です。電流正規化してグラフ表示しています。

![電流測定結果](https://camo.elchika.com/d3cdeacdb4e2b7ad6e959291d4afcf4c3ffee8af/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f37306365373961632d636665642d343131342d393035362d633138383337613433336639/)

-

大きな正弦波にステッピングモータのステップ動作小さな波が重畳しているのが見えます。

+

加速度が任意の周期の正弦波に一致する様、モーターを速度制御しています。また、ステッピングモーターはその構造上、1stepごとに短周期の加減速を繰り返しています。 大きな周期の正弦波にステッピングモータのステップ動作に由来する小さな周期の波が重畳しています。

-

次にゆでたまご、生たまご、温泉たまごそれぞれ測定した電流値FFT処理し周波数特性を可視化た。

+

ゆでたまご、生たまご、温泉たまごそれぞれについて同様の測定行いFFT処理し周波数特性を比較たところ、小さな周期の波がたごの状態に伴う特長を多く保持ていました。

![電流値のFFT](https://camo.elchika.com/31b1308b1fc7f7758914857e30ddb977baad53cf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f66646336303264342d616132622d343366342d623731612d343266343533663963393837/)

-

大きな特徴としては、生たまごは120Hz付近に存在する特徴的なピークがゆでたまごでは100Hz付近にシフトし、温泉たまごでは100~120Hzに幅広く存在しつつ全体的にピークが小さくなっています。 詳しく調査できていませんが、生白身がめ硬い卵殻を中心とする固有振動数が120Hz付近に存在共鳴、ゆで卵は固まった白身の弾性により低周波側にピークシフト、温泉たまごはゲル状の白身が緩衝材となって共鳴振動自体を緩和させた、、、のかもしれません。

+

生たまごは120Hz付近に特徴的なピークがありますが、ゆでたまごでは100Hz付近にシフトし、温泉たまごでは100~120Hzに幅広く存在しつつ全体的にピークがくなっています。 詳しく調査できていませんが、生たまご液状の白身が内部の運動態と絶縁層となり、リジットに締結され卵殻+たまごホルダー+モーターのローター」の一体物が120Hz付近に固有振動数を保有共鳴、ゆで卵は固まった白身の弾性により低周波側にシフト、温泉たまごはゲル状の白身が緩衝材となって共鳴振動自体を緩和させた、、、のかもしれません。

# 学習について

-

得られたデータはSony Neural Network Consoleで512次元のベクトルデータとして学習させました。初期のモデルは様な構造でしたが、自動探索機能を使用してより精度の高いモデルへ変更しています。

+

得られたデータは512次元のベクトルデータとして扱い、Sony Neural Network Consoleで学習させました。初期のモデルは図左構造でしたが、自動探索機能を使用して精度の高い下図右のモデルへ変更しています。 ![自動探索前後のネットワークモデル](https://camo.elchika.com/0a8b8c5648a4a51f4508d54e9aad9078bf92e167/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f37373563373138322d343864312d343666612d393264352d333965633830353535636262/)

データの6割を学習用、残りをバリデーション用に用いています。

-

データサイズが小さいため、200世代の学習に必要な時間はCPUで10秒程度でした。

+

データサイズが小さいため、200世代の学習に必要な時間はCPUで10秒以下でした。

-

初期最終的に生成されたモデル次の通りです。 ![自動探索前](https://camo.elchika.com/b27262655383d5e6dee09ee1c1f2ed5b5b420c54/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f36343532343063352d396161612d343333622d613937612d323863313636346139383134/) ![自動探索後](https://camo.elchika.com/bf33efc18901f636bb068587c494bed2d6770cbf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f35323164666338322d396436372d346636392d616133342d353937373635306238666234/)

+

# 部品コード 詳細[Git hub](https://github.com/airpocket-soundman/egg-analyzer)に(まだ整理できてませんが)公開しています。

+

## 部品表 |名前|数量|備考| |-|-|-| |SPRESENSE メインボード|1|(switch science)[https://www.switch-science.com/products/3900]| |SPRESENSE 拡張ボード|1|(switch science)[https://www.switch-science.com/products/3901]| |ILI9341 2.2" TFT LCD|1|amazonなどから| |A4988 ドライバボード|1|amazonなどから| |Nema17 HS4023|1|[秋月電子](https://akizukidenshi.com/catalog/g/g105372/)| |M5Stack用電流計ユニット|1|(switch science)[https://www.switch-science.com/products/6739]| |60mmx80mm ユニバーサル基板|1|| |M2x10 ボルト|8|基板固定用| |M3x5 皿ボルト|4|ステッピングモーター固定用| |M3x10 ボルト|6|トップパネル固定用| |タクトスイッチ|1|[秋月電子](https://akizukidenshi.com/catalog/g/g115660/)| |φ2.1×φ5.5電源ジャック|1|[秋月電子](https://akizukidenshi.com/catalog/g/g106568/)| |XHコネクタメス|適量|ケーブル側| |XHコネクタオス|適量|ユニバーサル基板側| |QIコネクタオス|適量|SPRESENSE接続用| |CASING BASE|1|3Dプリンタ出力| |CASING TOP MOTOR|1|3Dプリンタ出力| |CASING TOP DISPLAY|1|3Dプリンタ出力| |EGG HOLDER BASE|1|3Dプリンタ出力| |EGG HOLDER TOP|1|3Dプリンタ出力| ## コード 長いので割愛します。必要な方は[Git Hub](https://github.com/airpocket-soundman/egg-analyzer)をご覧ください。 [subcore1用コード]()では、maincoreからのパケットを待ってモーターを制御します。 maincore用コードは、[学習データ採取用]()と[推論用]()があります。subcoreコードは共通です。 学習データ採取用コードでは、指定した回数の測定を繰り返し、rawデータとFFTデータをmicroSDに保存します。 推論用は測定後FFT解析して推論を実行、測定データをmicroSDに保存します。

# 最後に

-

生たまごとゆでたまごの分類は成功しましたが、残念ながら温泉たまごの分類できません。 人並み判断はできけれど人以上にはなれなかった、というも人間っぽさの様面白います。

+

生たまごとゆでたまごの分類は成功しましたが、エクストラサクセスとした温泉たまごの分類には成功していません。可能あれば温泉まご硬さをポイント評価できる温泉まごスケール開発ま進めた考えています。

データ採取の過程でモーターの回転数を高くした方が内部の情報が多く抽出できている様に見受けられたのですが、温泉卵を高速回転すると半生状態の白身構造が破壊されてしまい生たまごとの差が見えなくなってしまうという現象も発生しました。 データ採取行為自体が測定対象の状態を変化させてしまうというのはありがちなことでもあり、面白く感じました。

-

自分オリジナルAIを作ってみたくて立ち上げたプロジェクトですが、なんとか基本機能は満足できました。生たまごとゆでたまごを判別するAIを持っているのは世界でも私ひとりだけかもしれないと思うと愉快な気分です。

+

世界にただ一つの自分オリジナルAIを作ってみたくて立ち上げたプロジェクトですが、基本機能は満足できました。生たまごとゆでたまごを判別するAIを持っているのは世界でも私ひとりだけかもしれないと思うと愉快な気分です。

-

# おまけの苦労話 今回の開発では、ゆでたまごと生たまご特徴を含んだ学習用データを採取するのにもっとも苦労しました。初期実験ではどの周波数帯に特徴が現れのかわかず条件出しに苦労し、得られたデータに含まれる特徴が少ない、また、実験開始直後に明らかに判別可能なデータが得られていにも関わらずデータ連続採取時になると特徴が消えるなどの減少に悩まされました。

+

# おまけ 開発余話 今回の開発では、たまご内部情報を含んだ学習用データを採取するのにもっとも苦労しました。テスト装置を作成し、データ測定を開始したところ ①再現性データれない ②得られたデータに含まれる特徴が少ない(S/N比が低い) ③テスト測定で良好なデータが得られ数百~数千本測定時に特徴が消える などの事象に悩まされました。

+

開発が進むに従い断片的に集まった情報をもとに原因をつぶしていったところ、ここに挙げた問題はすべてたまごホルダーに起因する問題であり、ホルダーの進化に開発の歴史を見ることが出来ます。

![たまごホルダーの進化](https://camo.elchika.com/a6ca27b09a51ce2a2248b800d7473617ef07c74d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f39636361643934662d306230352d343231302d383665392d633366366637356635373235/)

+

上写真は左の第一世代から右端の第五世代までの進化の様子です。 理想的なデータを取得できるまで、仮説を重ねてたまごホルダーの改良を続けました。

+

## 第一世代 たまごの保護を念頭に置き、硬めのゴムフォームにたまごを圧入して固定。 一見多くの特長を抽出できたように見えたが、ゴムフォームが振動を吸収/発振してしまい一体何の情報が見えているのか判らないゴミデータばかり。

+

## 第二世代 たまごをベースの上に直接置き、ソケットをネジ締めして固定。たまごの固定、芯出しを同時に行える基本設計が決定。ホルダーの重量が重すぎるとたまごの特長が埋没する可能性を考慮し、軽量化した第三世代を開発。 ## 第三世代 ネジピッチを小さくしつつ、ぎりぎりまでソケットの肉厚を削減。たまごホルダーの軽量化/回転トルク低減を狙った。 当初良好かと思われたが繰り返し測定するとS/N比が不足する事例が発生。 ## 第四世代 S/N比向上をねらい、ベース部品を剛性の許す限り肉抜きして軽量化。 とても良好なS/N比を得られたが、繰り返し測定すると急速にS/N比が悪化。よく観察すると圧入固定していたモーター軸とホルダーの締結部にガタが発生。繰り返し応力により樹脂がへたり、モーターとホルダーの締結が甘くなっていることが確認できた。 ## 第五世代 モーター軸に対してネジ締めできる構造を追加して、 「モーター」⇔「ホルダー」⇔「たまご」 間の締結をすべて確実に固定することで十分な情報を得られる様になった。