疲れたので電子工作しますスマートフォン用の表示で見るもう疲れたので電子工作しますくたびれ候この広告は、90日以上更新していないブログに表示しています。2019-08-25ディープラーニングを用いて約1.8万円の低コスト筋電義手を作りました前回掲載したディープラーニングを応用した筋電義手の記事を予想外に多くの方にご覧いただき、非常に驚いています。やって皆さんに反応をもらえると非常に励みになりますね、本当にありがとうございます!今回は開発した筋電動作推定システムを簡易的なロボットアームに適用することで、低コストの筋電義手を作成したので報告させていただきます。(といっても、快適に使用するには程遠いですが、、、、)また、前回の記事でいただいたコメントに対する捕捉情報についても述べていきたいと思います。ついて実際の動作とコストについて実際に動いているときの動画です。前回の記事と同様に、手を握った時・反った時・屈曲した時・無造作時の4種類の筋電位パターンをディープラーニングを用いて分類し、分類結果に応じてロボットアームを動かしています。ディープラーニングを用いて約1.8万円の低コスト筋電義手を作ってみました。・その他(圧着端子、ADコンバータ等):普通に買えば1500円くらい?となっており、概算して約1.8万円です。簡単に制御できるSainSmart社のロボットアームを購入してみました。5000円程度で3軸のロボットアームが買えるなんてお手軽ですね。・デフォルトの手首軸(真ん中の軸)回転方向が実際の手首の回転方向と異なることから、所望の軸構成となるように分解・組み換えを行いました。回路に関して、前回はモータの電源をラズパイから供給していました。今回は2軸構成となりさすがに電力不足となることが予想されたため、ACアダプタ→5Vレギュレータからモータの電源を供給することにしました。ソフトに関しては、推定した動作に応じて2軸のサーボをそれぞれ制御するだけの単純なものです。ハンドの開閉状態とパルス幅の関係性がわからなかったため、自分で動作させて確認しました(どこかで公開されてるんでしょうか)。結果として、0[deg]で完全に閉じた状態となり、角度をマイナスに変化させるほどハンドが開いていきました。そこで、今回は余裕を持たせて-15[deg]を閉じた状態、-50[deg]を開いた状態としました。●パッドの張り方、体調等によるゲイン調整についてこれに関しては、パッドが大体の位置に貼れていれば調整は必要ないです。体調に関しても今のところ影響なしです。ちなみに、今回の動画は前回から1カ月以上たってから撮影していますが、当時からディープラーニングに関するゲインは一切変えておらず、またパッド位置も前回の動画を参考に適当な位置に貼っただけで問題なく動作しました。●ネットワークの層数について今は中間2層でやってますが、コメントいただいた通り中間1層でも行けるかもしれません。時間とやる気があれば試してみたいと思います。●ラグについて手を動かしてから実際に動作するまでのラグタイムですが、ラズパイの処理能力よりも推定アルゴリズムそのものによるところが支配的です。前回の記事でも説明しましたが、現状の推定アルゴリズムは手を動かしてから2[s]の間の筋電データを用いるため、最低でも2[s]はラグが発生します。推定に用いるデータ区間を短くすることでラグは有意に減少しますが、各動作の波形の特徴も減少するために認識率が低下してしまいます。ちなみに、以前フォワードプロパゲーション部の処理時間を計測したときは、0.3[s]~0.5[s]程度だったと記憶しています。(大体の値を知りたかっただけなので、正確な値をメモし忘れてました、、、、)●推定する動作の種類についてコメントとは直接関係ないですが、前述のラグと関連して自分の中でメモしておきたいトピックです。今は4種類の動作を推定していますが、これを更に増やせるか?という問題です。試しに「手を開く」動作を追加して推定してみましたが、認識率が下がりました。動作の種類が増えるほど似たような特徴を持つ波形が増えるため、認識率が下がっているのだと考えられます。これを解決する手段としては、「パッドを貼る位置やセンサの増幅率を試行錯誤することで、各動作がより特徴的となる条件を見つける」、「推定に用いるデータ区間を長くすることで、各動作の特徴をより捉えやすくする」ことが考えられます。後者に関してはラグタイムの増加につながるため、あまり好ましくなさそうです。これも時間とやる気があれば、改善していきたいです。今後について今後の開発の余地は以下のような部分だと考えています。CPU変更と筋電位センサ自作をうまくできれば、コストも1万円以内に抑えられるのではと考えています。10:54ディープラーニングを用いて約1.8万円の低コスト筋電義手を作りましたTweet広告を非表示にするもっと読むコメントを書く2019-07-19ラズパイでディープラーニングと筋電位センサを用いた筋電義手(プロトタイプ)作りました最近、以前から興味のあった筋電位センサを触っています。ディープラーニングの勉強も始めたのですが、ディープラーニングの仕組みを理解する中で「ディープラーニングって筋電位センサに応用できるんじゃ?」と閃きました。そこで色々試してみたところ、簡単な動作推定を行うことに成功したので、まとめてみます。タイトルにある通り、ラズパイを使ってます。実際に動いているときの動画です。手を握った時、反った時、屈曲した時の3パターン(厳密には無動作時を併せて4パターン)における筋電位パターンをディープラーニングを用いて分類し、分類結果に応じてサーボモータを動かしています。ディープラーニングと筋電位センサで筋電義手(プロトタイプ)作ってみました。2019筋電位センサ(自作)※この項で紹介するセンサは最終的には使いませんでした。筋電位センサは全くのド素人なので、まずはコチラのサイトで紹介している筋電位センサを自作してみました。www.f.waseda.jp実際にPCのマイクアンプに入力すると、力を入れるごとに確かに筋電位波形が確認できました。力を入れた時と入れないときの違いが全く出ませんでした。この理由として、前述の自作筋電位センサは神経が発する表面電位を計装アンプ(LT1167)により増幅していますが、これを更にPCのアンプ・フィルタが増幅・フィルタリングしてくれているため、うまく波形を確認できたと考えられます。前述の自作筋電位センサ単体では筋電位をセンシングすることは難しく、PCありきのセンサになっている、という事です。実際に、ステレオプラグ→USB変換アダプタを用い、マイク端子を介さずにUSBを介することで自作筋電位センサをPCに接続したときの挙動を実験したところ、力を入れても波形を確認することができませんでした。よって、自作筋電位センサの使用は今回は見送ることにします。筋電位センサ(市販:MyoWare)自作の筋電位センサは諦めて、市販の筋電位センサMyoWareを使用することにしました。www.switch-science.com結果論になりますが、センサ値が上手く取れなければディープラーニングも意味をなさないため、この選択は正解だったと思います。併せてMyoWare専用のパッドも買ったのですが、こちらは自分的には買う必要はないかなという印象です。www.switch-science.com理由として、専用パッドの粘着性があまりに強いのか傷つきやすかったり、パッドを貼る箇所の自由度が低いことが挙げられます。実際、MyoWareの写真を見てもらえればわかるかと思いますが、デフォルトのパッドは基板直下の2つとケーブルでつながった1つの計3つです。実際に腕に着けてみると、基板自体にパッドがついているせいなのか何か違和感があり、パッドが腕からとれやすかったりします。実はMyoWareにはもう一つオプションがあり、デフォルトのパッド端子の他に、基板右下に設けられたR,E,M端子を用いることもできます。私は写真のように、R,E,M端子にピンソケットをはんだ付けして、オスピン端子を片側に圧着したワニ口クリップを差し込みました。この方法ならば、自分の好きな位置にパッドを貼れますし、パッドも自分が好きなものを選ぶことができます。今回のパッドは、前述の自作筋電位センサを作った時に使っていたオムロンのパッドが良い感じなのでこれを使うことにします。以下の回路図の写真の通り、AD変換モジュールにはMCP3208を用いました。ラズパイからMCP3208およびMyoWareに5Vを供給しています。疑似差動入力は用いず、MyoWareの信号端子をMCP3208のCH0に接続しています。私はディープラーニングについてもド素人です。勉強するかから考えたのですが、書店で色々探して吟味したところ、「はじめてのディープラーニング」が最も分かりやすく応用も効きやすそうな内容だったため、これで勉強することにしました。1週間もかからずに理解できる内容と思います。Kindle版この商品を含むブログを見るツール等に頼らずディープラーニングの仕組みを理解しながら学べる内容になっており、またソースコードも比較的短いものばかりのため、解説文が理解できなくともコードを読めば簡単に原理を理解できます。私もこれを読む前は「ディープラーニング」と聞くと難しく抽象的なことをやってるのかなと思っていたのですが、これを読んだ後はあくまで「多層ニューラルネットの出力誤差を最急降下法を用いて重みとバイアスにフィードバックする」アルゴリズムでしかないことがわかりました(間違ってたらごめんなさい)。ディープラーニング(データ解析)筋電位センサ特有の前処理で、ある意味一番重要な処理だと思います。実際の筋電位センサの出力波形は下図に示すような筋電位の強さに応じた電圧です(横軸[s],縦軸[V])。ちなみに、サンプリング周期は0.005[s]で2[s]の区間を切り取っています。同じ動作でも力の入れ方によって、筋電圧の強度は変わるため、これをそのままディープラーニングに学習させてもうまくいかないことは明白です。そこで、上図の筋電位波形を見てみると、動作によって波形の"感じ"が異なることがわかります。掲載は割愛しますが、同じ動作であれば毎回おなじ"感じ"になります。この"感じ"を数値として表現するために、FFT(高速フーリエ変換)を行います。フーリエ級数展開でググると色々出てきますが、この世の様々な波形は色々な周波数(早い・遅い振動の周期)の波が合成されたものになっています。そこで、周波数解析を行うことで、対象となる波形にどれくらいの周波数の波がそれぞれどれくらい含まれているのかを知ることができます。この周波数解析をコンピュータ上で行うために離散化させたものがFFTです。実際に前述の屈曲動作時における波形にFFTをかけると、下図のようになります(横軸[Hz]、縦軸[スペクトル強度])。このとき、FFTを施す前の波形は2[s]の区間をサンプリング周期0.005[s]で記録したものでした。これはデータ数400となります。この時系列データに対してFFTを施すと、200[Hz](=1/サンプリング周期=1/0.005)の区間を周波数間隔0.5[Hz](区間/データ数=200/400)で離散化した周波数データとなります。これもデータ数400となります。この事実はFFTをかけたときの図を見てもらえるとわかると思います。ディープラーニング(データ取得)今回は、10秒間隔でディスプレイに「力をいれてください」という文字列を表示させ、文字が表示されたら力を5秒入れるということを繰り返すことで、各動作における複数のデータを取得しました。この方法であれば、出力結果を10秒間隔で切り出せばそれぞれの動作を切り出せるのでお勧めです。実際は、10秒間隔の先頭2秒を切り出し、それぞれにFFTを施しました。一つのミソとして、AD変換の周期があります。サンプリング周期は極めて正確にしたいので、今回はsignal.setitimerを使いました(ググればいろいろ出てきます)。これを用いることで、signal.signalで設定した関数を定周期で起動することができます。今回はサンプリング周期0.005[s]で処理時間計測してみました(結果を残し忘れました、、、、)が、ほとんど誤差なく起動できていましたので、問題ないと思います。ディープラーニング(学習)前述したとおり、2[s]の区間をサンプリング周期0.005[s]で記録した時系列データにFFTをかけると、200[Hz]の区間を0.5[Hz]間隔で記録したデータ数400の周波数データとなります。これを1つの学習用データとして、更にそれぞれのデータの末尾に実際の動作(握り、反り、屈曲、動作無し)に応じた分類用の数値(0,1,2,3)を付与します。この手順で各動作につき5つのデータを用意し、計20個のデータを学習用データとして用意しました。今回実装したディープラーニングの構成は以下になります。・最適化アルゴリズム:AdaGrad・バッチサイズ:8・中間層のドロップアウト率:50%この学習によって得られた重みとバイアスはCSVファイルに記録しておきます。ディープラーニング(推定)CSVデータに記録した学習済みの重み・バイアスをロードし、リアルタイムに推定を行います。やり方としては、リアルタイムに最新の筋電位データ(今回はサンプリング周期0.005[s]で2[s]の区間の400個のデータ)を常にバッファしておき、任意の推定周期でバッファリングしている筋電位データをFFT→フォーワードプロパゲーションを行うことで、リアルタイムに動作を推定することができました。この推定結果に応じてサーボモータへのパルス幅を変更してあげれば、簡単な筋電義手のできあがりです。システムまとめ以上を簡単に図としてまとめました。今回強く感じたのは、ディープラーニングが非常に容易に実装できる技術であるにもかかわらず、想像以上の威力を発揮してくれたことです。今後はこれを様々なロボットや装置の操作用インタフェースとして応用していきたいと思います。18:09ラズパイでディープラーニングと筋電位センサを用いた筋電義手(プロトタイプ)作りましたTweet広告を非表示にするもっと読むコメントを書く2019-06-16スマホ操作ロボット~実動作確認~3DCADによるメカ設計に続き、スマホ操作ロボットの制作を行いました。メカ設計からパズドラをプレイするプログラム作成まで一通りを自作し、動作確認まで一通り完了いたしましたので、報告いたします。感想とまとめ実際の動作スマホ操作ロボットをつくったので、試しにパズドラをプレイさせてみました。2019パズドラのドロップをカメラ画像から認識し、ルート解析結果に従ってアクチュエータ制御を行ってドロップ操作してます。メカ設計Fusion360で設計を行いました。動作機構はコチラの動画を参考にさせていただきました。www.youtube.comざっくり書くと、ラックアンドピニオン動作のために2個のステッピングモーター、タップ用の直動動作のためにソレノイドを取り付けています。金属部品は全てボール盤で穴あけ加工、タップ切り、仕上げまで行っています。詳細は以前の記事で書いてます。今回加工時にタップを何本か折ってしまったのですが、ボール盤のチャックにタップを固定して、手で回しながらクレ556をいれつつ作業するととてもきれいに仕上がりました。仕上げには水やすり(240→400→600→1000→1500の順に使用)、ピカール剤を使いました。タップ部分にはソレノイドの先端にタッチペンの先を付けていたのですが、認識してくれませんでした。そこで、100均の吸振素材にアルミホイルを巻き付けたものを取り付け、更にクリップ付きのジャンパ線をソレノイドの鉄心に取り付けたところ、うまくいきました。シャフト、シャフトホルダ、スライドユニットはAmazonの激安品を使ってますが、動作させるだけなら問題なさそうです。今は少し振動が大きいですが、この辺の部品をもっと高価なものに変えたらよりスムーズに動くような気がします。以前の記事でステッピングモーターの駆動回路を紹介しましたが、これをもう一軸増やしてます。ソレノイドに関しては、5Vレギュレータから電源を供給し、ステッピングモータと同様にトランジスタ(2SD1415)で駆動してます。以前の記事では回転角度で制御してましたが、今回はパルス数(各層への電流の切り替え回数で制御してます。ステッピングモーターがある任意の位置にいるときを0パルス位置(原点位置)として、そこから何パルス動作させたかによって位置を相対的に制御しています。タップ時にはソレノイドの機械的な遅れがあるため、ソレノイドに電圧印加後少しスリープ待ちさせて位置決めしてます。画像処理あらかじめ各色ドロップがどれくらいのRGB値を持つのかを記録しておき、これを用いたしきい値判定により、ドロップ色の認識を行っています(実際はキャリブレーション用のプログラム・画像を用意して、自動でしきい値用のRGB値をcsvファイルに取得・記録するようにしてます)。パズドラ特有の問題として、ドロップの背景まで含めてしまうとキャリブレーションがうまくいかないため、ドロップの中心からある一定の幅の画素だけしか認識に使わないようにしています。ルート解析Pythonなので想像よりもかなり楽に実装できました(逆に思いもよらないバグもありましたが、、、)。解析アルゴリズムとしてはビームサーチというのを実装してみました。リファクタリングはかなりしましたが、ラズパイの限界なのか計算速度が遅く、現状演算に数秒~十数秒かかってしまってます。コンボ数ではなく消えるドロップ数を評価値にしてるため、コンボは少し少な目になってしまってます。言葉で説明するのがめんどくさいので、実装アルゴリズムの超概要を図で示します。同一の盤面状況を無駄に繰り返さないよう、ゾブリストハッシュで取り除いてます。具体的なアルゴリズムは、1オフラインでハッシュ値を用意する。ハッシュ値の種類としては、あるマスにあるドロップ色があった場合のハッシュ値(つまり30マス×6色=300通りのハッシュ)と、操作位置に対応するハッシュ値を用意する(30マス=30通り)。2ある盤面状況のハッシュ値は、全マスのドロップ色に対応する30個のハッシュ値と現在操作位置に対応するハッシュ値、計31個のハッシュ値をXORすることで得られる3ある盤面からある操作によって盤面が変化したときのハッシュ値は、移動先・移動元の2つのマスについて移動前後に存在するドロップ色のハッシュ値(計4個)を元の盤面ハッシュにXORし、さらに移動前後の操作位置のハッシュ値(計2個)をXORすることで得られる。感想とまとめ想像してたよりすんなり動いてくれました。確実に動くので作ってて楽しいです。10:30スマホ操作ロボット~実動作確認~Tweet広告を非表示にするもっと読むコメントを書く2019-06-05ラズパイへのOpenCV導入メモラズパイで画像処理をやろうと思って、書籍などを参考にしながらOpenCVを導入していたのですが、なかなかうまくいきませんでした(うまくいったと思ったらcv2.imshowでエラーがでたり、、、)結局、以下のサイト様の内容にたどり着き、うまくいきました。成功したときのターミナルへのコマンドを載せときます。変更点は、cmakeのオプションを追加してます。ちなみにSDカードフォーマットして、NOOBS再インストールしてからやりました(色々試行錯誤した後の状態でやったら、競合のせいかうまくいきませんでした)。Kyoto2019に出展者として参加してきました。非常に有意義な時間を過ごすことができました。皆さんにたくさんの温かい言葉をかけていただき、またアドバイスもいただいて、より一層創作意欲が高まりました。本当に参加してよかったと感じています。展示を見ていただいた方々、お話をしてくださった方々、本当にありがとうございました。今後も可能であれば、このような機会を通じて交流させていただければなと思っております。今はドローンとスマホ操作ロボットの開発を進めています。記事にまとめられるだけの成果をあげられていないので、キリが良いところまで進んだら記事にしたいと思います。自分の勉強もかねて少しずつ記事を書いたりしたいなと思っています。Kyoto2019と近況Tweet広告を非表示にするもっと読むコメントを書く2019-04-21スマホ操作ロボット~3Dモデルでのメカ設計とX軸の動作確認~ラズパイによるステッピングモータの動作確認が上手くいったため、真の目的であるスマホ操作ロボットの制作に取り掛かりました。今回は、3Dモデルによるメカの設計とX軸の動作確認まで実施したので紹介いたします。動作させたのが以下の動画になります。vimeo.com自分でモデリング・部品加工を行う必要があるのは以下の部品です。市販の部品は以下になります。X-Y軸用のステッピングモータ(秋月のST-42BYG020)とタッチ動作用の直動ソレノイド(ZHO-0420S-05A4)は3Dモデルが存在しないため、自分でモデリングを行いました(githubに上げています)。ステッピングモータの3Dモデルソレノイドの3Dモデルここからは、市販部品が必要な部分についてどのような部品選定を行ったかについて説明します。上下の板は市販のスライドレールによって接続しています。スライドレールは自分でモデリングするのが難しいので、モノタロウやMISUMIからモデルを入手できる商品を使うのがいいと思います。今回はこれを使ってます。www.monotaro.comX-Yの直動動作は、価格の面からステッピングモータによるラックアンドピニオン方式とします。ラックとピニオンギアに関しても、市販のものを使います。今回は3Dモデルを入手できるこれを使ってます。www.monotaro.comwww.monotaro.comY軸方向の機構には、リニアブッシュとシャフトホルダとシャフトに市販のものを使います。今回は3Dモデルを入手できるこれを使ってます。jp.misumi-ec.comjp.misumi-ec.com直動方向のソレノイドです。固定用の冶具は自作する必要があります。今回はこちらを使っています。実際にX軸の機構に必要な部品の加工・組み立てを行い、ラズベリーパイから制御を行って動作確認しました。制御プログラムは以前のステッピングモータの動作確認用に作った物を一部流用して反復動作するようにしています。vimeo.com動き的には問題ないですが、ちょっと音がうるさいですね(;^ω^)最後に以上のように、メカ設計は終了してX軸方向の動作確認も完了しました。今後も引き続き、Y軸方向の組み立て・動作確認を行っていく予定です。03:01スマホ操作ロボット~3Dモデルでのメカ設計とX軸の動作確認~Tweet広告を非表示にするもっと読むコメントを書く2019-03-11AIドアマンブラッシュアップ(電池ボックス(秋月のBH-441A150)&サーボモータ(SG-5010)をFusion360でモデル化する)以前の制御基板に続き、AIドアマンのブラッシュアップを行いました。今回は、電池ボックスとサーボモータと制御基板を1つにまとめることを考えました。構成部品をそれぞれモデル化します。電池ボックスもサーボモータも、ノギスによる実測値でモデル化しました。制御基板は前回作成した基板に合わせています。モデルファイルを公開したかったのですが、やり方がわからないので諦めました(笑)そのうち公開に挑戦するかもです。→githubで公開しましたー!電池ボックスのモデルサーボモーターのモデル構体のモデル化モデル化した構成部品を基にして、それぞれを1つにまとめられるような形状のモデルを作成します。今回は、サーボモータを中心にして、両サイドに電池ボックスと制御基板を配する形状にしました。モーターを壁に固定する方法として、構体と壁に取り付けたフックをワイヤで引っ張って固定することにしました。このため、背面にはワイヤを通すために穴を設けています。組み合わせたらこんな感じです。電池ボックス、モーター、制御基板を組み合わせてみました。実際のモデルと電池ボックス、制御基板が逆なのは寝ぼけていて取付方向を間違えたからです(笑)。モーターは前面から入れる設計だったのですが、何を勘違いしたのか背面から入れるものと思い、背面をカットしてしましました(笑)取り付け順は電池ボックス→サーボモータ→制御基板の順です。実際にドアに取り付けるとこんな感じになります。フックは100均の粘着型のもの、ワイヤも100均のテグスを使っています。これが実際にドアに取り付けて動作させたときの動画です。vimeo.com以前よりもだいぶブラッシュアップできたので、これでひとまず完成とします。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。