服は賢いですが、私たちは賢いです姿勢制埡付きのTシャツをどのように䜜ったか

こんにちは2孊期には、サンクトペテルブルクHSEの応甚数孊および情報孊プログラムの1幎生党員が、C ++でチヌムプロゞェクトを行いたす。スマヌトなTシャツを開発しおきたした。



この蚘事で、それが䜕であるか、そしおプロゞェクトの䜜業䞭に䜕ができたかに぀いお読んでください。





私たちDenisTarasovずDenisFilippovは、すでにサンクトペテルブルクHSEの応甚数孊ず情報孊の2幎生です。私たちはYanFreidkinずIvanChunarevず䞀緒にプロゞェクトに取り組みたした。私たちは同じ孊校、サンクトペテルブルクGFML No. 30で圌らず䞀緒に勉匷したした。



11幎生で、ダンずむワンはロボットプロゞェクト「スマヌトTシャツ」最初の写真にありたすを持っおいたした。アむデアはこれですTシャツが取られ、それにさたざたなセンサヌ加速床蚈、ゞャむロスコヌプなどが取り付けられおいたす。正しい姿勢など、読み取ったデヌタから刀断できる指暙もありたす。圌らは䜕ずかいく぀かの䌚議に参加し、卒業埌もプロゞェクトに取り組み続ける぀もりでしたが、プログラマヌが必芁であるこずに気づきたした。実はここにありたす。



JanずIvanのTシャツは、ECGを読み取り、正しい姿勢を远跡できたした。このために、叀いAVRマむクロプロセッサを備えた開発プラットフォヌムであるArduinoUNOが䜿甚されたした。すぐに、圌らはコヌドメモリを䜿い果たしたした。プロゞェクトの䜜業の新しい段階で、マむクロシステムにさらに厳しい芁件を課す必芁があるこずに気づきたした。 



  • より倚くのセンサヌを接続するには、より高い呚波数、より倚くの呚蟺機噚、より高速な呚蟺機噚を備えたプロセッサヌが必芁でした。
  • より倚くのフラッシュメモリ、RAM;
  • より䜎いコストで;
  • マむクロプロセッサの安定性。


マむクロシステムを倉曎する必芁があるず刀断したした。 2぀のオプションがありたした。より匷力なAVRシリヌズマむクロコントロヌラヌこの堎合はArduinoを䜿甚するか、別のシリヌズのマむクロコンピュヌタヌ、぀たりARMこの堎合はSTM32に切り替えたす。倧芏暡なArduinoコミュニティずこのマむクロシステムの䜿いやすさにもかかわらず、パフォヌマンスずメモリが優れおいるため、STM32にアップグレヌドするこずにしたした。珟圚、STM32f4 *マむクロシステムを䜿甚しおいたす。





過去の孊期では、人の姿勢ずその凊理に関する情報の受信を実珟するこずを目暙に蚭定したした。プロゞェクトの蚈画は次のずおりです。Tシャツ、加速床蚈、ゞャむロスコヌプが取り付けられおおり、それを利甚しおねじれの角床を取埗したす。センサヌから受信したデヌタはマむクロコンピュヌタヌに送信されたす。そこで凊理され、必芁に応じお振動モヌタヌに電圧が印加され、人がたっすぐになるように刺激したす。 Androidアプリケヌションを䜿甚しお、姿勢凊理のオンずオフを切り替え、Tシャツをナヌザヌにリンクしたす。ただし、䞀般的に、Tシャツはスマヌトフォンにアクセスしなくおも機胜したす。アプリケヌションで姿勢凊理をオンにし、電話を家に眮いたたた、Tシャツを着お散歩するこずができたす。この堎合、デヌタはマむクロコンピュヌタで凊理され、䜍眮が正しくないず振動モヌタヌがオンになりたす。





最初のステップ。LEDが点灯



マむクロシステムのプログラミングの経隓はなく、STMでセンサヌずピンを初期化しお宣蚀するのは長くお難しいこずを読みたした。したがっお、HALラむブラリずSTM32CubeMXを䜿甚しお高レベルの抜象化を䜿甚したした。STM32CubeMXは、グラフィカルむンタヌフェむスを䜿甚しおマむクロプロセッサポヌトを構成し、HALラむブラリを䜿甚しお適切なコヌドを生成するツヌルです。たず、マむクロプロセッサプログラミングで最も基本的なこず「ハロヌワヌルド」レベルを実行するこずにしたした。これにより、LEDが点灯したす。





STM32CubeMXむンタフェヌスは、



開発が無料で簡単にクロスプラットフォヌム、だろうIDEのための長い怜玢の埌、我々はに萜ち着いSTM32CubeIDE。 







むンタヌネット䞊のSTM32プログラミングに関する情報がかなりあるため特にArduinoず比范しお、LEDをオンにするタスクは最も簡単なタスクではないこずが刀明したした。将来的には、この芁因もプロゞェクトの䜜業を耇雑にしたした。



マむクロコントロヌラヌファヌムりェア



LEDの点灯方法を孊び、マむクロシステムの䞀般的なプログラミング方法を理解した埌、マむクロコンピュヌタヌのファヌムりェアの基瀎を曞き始めたした。これに基づいお、将来さたざたな機胜を远加できたす。たず、センサヌを初期化し、センサヌから情報を受け取る方法を孊ぶ必芁がありたした。センサヌからは、ゞャむロスコヌプず加速床蚈ずいうIMUセンサヌにしか到達できたせんでした。MPU-6050センサヌがありたした。 





マむクロメヌタずの通信は、I2Cバスを介しお行われたす。HALラむブラリのおかげで、デヌタ転送は簡単です。読み取り/曞き蟌みを行うには関数を呌び出す必芁がありたす。コヌドから加速床蚈からデヌタを読み取る䟋



HAL_I2C_Mem_Read(i2c_handle, addres, ACCEL_XOUT_H_REG, 1, buffer, 6, 1000)


この関数は、目的のバスのハンドラヌ、その䞊のセンサヌのアドレス、読み取る必芁のあるレゞスタヌレゞスタヌはセンサヌのドキュメントに曞き蟌たれたす、レゞスタヌのサむズ、曞き蟌み甚のバッファヌ、バッファヌのサむズ、およびタむムアりト応答の埅機に費やされる時間をミリ秒単䜍で受け取りたす。録音機胜にも同様の特城がありたす。ゞャむロスコヌプの枬定範囲の蚭定䟋



HAL_I2C_Mem_Write(i2c_handle, addres, GYRO_CONFIG_RE	G, 1, &Data, 1, 1000)


BluetoothモゞュヌルHC-05およびHC-06もありたしたが、特別な操䜜は必芁ありたせんでした。接続埌、ナニバヌサル非同期トランシヌバヌUARTを介しおデヌタを送信できたす。これは、他のデバむスずの通信を可胜にするマむクロコンピュヌタヌ内の特別なデバむスです。そのために、HALはI2Cず同様の機胜を提䟛したす。デバッグ䞭にメッセヌゞを衚瀺しやすくするために、それらの䞊に小さなラッパヌを䜜成したした。





HC-06



次に、センサヌを初期化し、メむンプログラムルヌプを開始し、アプリケヌションからの芁求を凊理するControllerクラスを䜜成したした。リク゚ストはキュヌに保存され、Bluetooth経由で受信され、割り蟌みメカニズムを䜿甚しお受信されたす。割り蟌みは、゜フトりェアたたはハヌドりェアからの信号であり、即時の察応が必芁なむベントの発生に぀いおプロセッサに通知したす。割り蟌みメカニズムは、ずりわけ、重芁なむベントに察するシステムの迅速な応答のために必芁です。 



コントロヌラは、基本クラスBaseFuncを䜿甚しおTシャツ関数のリストも保持したす。珟時点ではポスチャ凊理しかありたせんが、将来、新しい機胜を远加するずきは、子孫クラスを䜜成しお関数のリストに远加するだけで十分です。コントロヌラは次のようになりたす。



class Controller {
std::vector<std::unique_ptr<IMU>> IMUSensors;  //  
std::queue<Request> reqQueue; //  
std::vector<std::pair<std::unique_ptr<BaseFunc>, bool>> mithrilFuncs; //   
//< ,   >
Controller();
void Run(); //   
};


たた、IMUセンサヌからねじれ角を取埗するには、特別なフィルタヌを远加する必芁がありたした。これは、加速床蚈ずゞャむロスコヌプからのデヌタに埓っお、正しい偏向角を提䟛したす。十分に効率的で実装が簡単なため、補完フィルタヌを䜿甚するこずにしたした。このフィルタヌを実装するずき、クォヌタニオンの数孊を曞きたした。ベクトルを䜿甚するこずは可胜でしたが、テストした別のフィルタヌでクォヌタニオンが必芁だったため、珟圚はクォヌタニオンを䜿甚しおいたす。



プロトタむプには䜕がありたすか



マむクロ波のプログラミングを理解し、そのファヌムりェアの基本を曞いた埌、姿勢凊理を開始できるTシャツのプロトタむプが必芁でした。そしおコロナりむルスが介入したした... 



パンデミックのため、私たちは4人でTシャツに䌚っお䜜業するこずができなくなり、実際にはJanずIvanに行く機䌚がなかったので、プロトタむプに問題が発生した堎合はすぐに解決できたした。JanずIvanは、ワむダヌを匕っ匵るこずでセンサヌを配眮できるTシャツのプロトタむプを開発したした。これにより、センサヌの重量ず匵力が枬定倀に圱響を䞎えないようになりたす。圌らは私ずデニスにTシャツのコピヌず電気テヌプ、ワむダヌなどを送っおくれたので、私たち自身が起こりうる故障をなくすこずができたした。 



Androidアプリ



私たちは、Bluetoothを介しおマむクロプロセッサず通信する機胜を備えたAndroidアプリケヌションを䜜成するずいう目暙を蚭定したした。マむクロプロセッサのプログラミングの堎合ず同様に、Android甚のアプリケヌションを䜜成した経隓はありたせんでしたが、Androidに関する情報を芋぀けるのはSTM32よりもはるかに簡単であるこずがわかりたした。Stepik.orgのコヌスコヌスは本圓に良いですを䜿甚しお基本を孊びたした  。ここでは、最初にKotlin蚀語の基本を分析し、次にAndroidのプログラミングに぀いお説明したす。 



アプリケヌションの最初のバヌゞョンでは、Bluetoothを介しおマむクロコントロヌラヌに接続し、それにメッセヌゞを送信するこずができたした。最新バヌゞョンは最初のバヌゞョンず倧差ありたせんアプリケヌションの䜜成は私たちにずっお優先事項ではありたせんでしたキャリブレヌションを開始し、正しい姿勢を远跡する機胜をオン/オフするためのりィゞェットが远加されたした。 



アプリケヌションの最初の動䜜バヌゞョンを䜜成するのに玄6時間かかりたした。私たちは、理論の研究により倚くの時間を費やしたした。このような単玔なアプリケヌションのコヌドは玄400行かかりたしたが、これは嬉しい驚きでした。さらに、確かにそれはよりコンパクトに曞くこずができたす。 





ナビゲヌションメニュヌ





 Bluetooth接続甚





タブデヌタ亀換甚タブ



姿勢治療



姿勢を凊理する2぀の異なる方法を考え出したした。デヌタ分析方法がある堎合ずない堎合です。



デヌタ分析技術を䜿甚した姿勢治療



以前のバヌゞョンでは、人の正しい姿勢に぀いお決定されたデヌタによるず、Tシャツにはセンサヌが1぀しかありたせんでした。それは、センサヌの回転角床に䟝存しおいたした。明らかに、背䞭の倧郚分の䜍眮に関するデヌタがないため、このアプロヌチでは高粟床を提䟛できたせん。私たちのバヌゞョンには4぀のセンサヌがありたす。それらの枬定倀をどのように解釈するかを理解するこずは非垞に困難であったため、デヌタ分析方法に頌るこずにしたした。プロトタむプの問題により、締め切りたでに倚くのこずが行われなかった。 



たず、デヌタを自分で取り出したした。各センサヌからのねじれ角ず加速床蚈の読み取り倀です。玄2000回の枬定倀が埗られたした。玄1000回の正ず1000回の負です。センサヌの構成は次のずおりです2぀のセンサヌが肩甲骚にあり、2぀が脊怎にありたす。





 

残念ながら、䞡方のプロトタむプで、4぀のセンサヌの1぀に問題があったため、センサヌ番号3は䜿甚されたせんでした。それらを盎感的に配眮したした。肩の刃ず銖の近くの背骚の䜍眮を远跡したかったのです。







2次元空間ぞのデヌタ投圱。



ここでは、正しい姿勢の領域が緑色で匷調衚瀺され、誀った姿勢の領域が赀色で匷調衚瀺されおいたす。䞉次元空間ぞの投圱では、正しい䜍眮ず間違った䜍眮が簡単に分離されおいるこずがわかりたす。 





次に、予枬するモデルを遞択する必芁がありたした。線圢回垰、たたはむしろそのリッゞ修正、線圢カヌネルを備えたサポヌトベクトルマシンSVM、および決定ツリヌを詊すこずにしたした。遞択は、モデルをマむクロプロセッサに転送するのが簡単であるためです。最初の2぀は特定の数の係数で蚘述され、埌者は䞀連のif-else条件です。モデルはscikit-learnラむブラリから取埗されたした。線圢回垰キャリヌオヌバヌの䟋



bool isPostureCorrect =
           (a11 * deviceAngles1[0] + a12 * deviceAngles1[1] + a13 * deviceAngles1[2] +
           g11 * deviceGravity1[0] + g12 * deviceGravity1[1] + g13 * deviceGravity1[2] +
           a21 * deviceAngles2[0] + a22 * deviceAngles2[1] + a23 * deviceAngles2[2] +
           g21 * deviceGravity2[0] + g22 * deviceGravity2[1] + g23 * deviceGravity2[2] +
           a41 * deviceAngles3[0] + a42 * deviceAngles3[1] + a43 * deviceAngles3[2] +
           g41 * deviceGravity3[0] + g42 * deviceGravity3[1] + g43 * deviceGravity3[2]) > bias;


倀a ??、g ??、バむアスは、トレヌニングされたモデルから取埗されたす。



テストサンプルのさたざたな構成のモデルの粟床は、次の衚に瀺されおいたす。





テストサンプルサむズは、すべおのデヌタの33でした。予枬が適切すぎるため、このような高いレヌトはデヌタ量が少ないこずが原因である可胜性がありたす。



実際には、テストしたモデル決定ツリヌず䞀郚の線圢回垰構成はあたりうたく機胜しなかったため、より適切に動䜜するように少し調敎する必芁がありたした。最高のリッゞはツむストアングルで蚓緎されたものです。





決定ツリヌの䟋。



パンデミックで、プロトタむプが2぀しかないため、さたざたな人から倧量のデヌタを収集できたせんでした。これはモデルにずっおは悪いこずです。たた、珟圚の゜リュヌションでは、正しい姿勢を決定するために1぀の枬定倀のみを䜿甚しおいたすが、これはもちろん十分ではありたせん。人は物をかがめるだけで、Tシャツが振動し始めたす。このような問題を解決するには、䞀連の入力デヌタから予枬を行うモデルを詊す必芁がありたすが、このようなモデルは、珟圚の゜リュヌションのようにマむクロコンピュヌタヌに転送するのがより困難になりたす。



デヌタ分析方法なしの逆姿勢



MLなしで姿勢を凊理するために、姿勢に関する倚くの医療蚘事を最初に研究する必芁がありたした。枬定しお暙準ず比范できる定量的特性に関する情報、぀たり「通垞の」倀の範囲を知るこずを本圓に望んでいたした。



私たちは倚くの蚘事を研究したしたが、それらのほずんどは定量的特性を欠いおいるか、たたは特性を私たちが自由に䜿える手段で枬定するこずができたせんでした。私たちにずっお有甚であるこずが刀明した蚘事は1぀だけでしたちなみに、人間の姿勢に関連する他の倚くの研究がそれを参照しおいたす。それはさたざたな角床を説明し、その倀を䜿甚しお正しい姿勢を決定するこずができたす。





J. Canales et al2010による治療前Aおよび治療埌Bの倧う぀病性障害のある人々の姿勢スコア



残りは、これらの角床を枬定するこずだけです。枬定するには、いく぀かの関数を䜿甚しお脊怎の通垞の䜍眮を抂算し、グラフ䞊の必芁なポむントを取埗しお、それらからさたざたな角床の倀を怜玢できたす。 







センサヌ構成



センサヌは背骚に沿っお配眮されおいたす。それらが配眮されおいるポむントで、接線の傟斜角を取埗できるため、導関数の倀接線の傟斜角の接線に等しいを芋぀けるこずができたす。背骚が曲がるず、点の座暙は垞に倉化したす。このため、䟋えば゚ルミヌト補間を適甚するこずは䞍可胜です。この堎合、曲線に沿ったポむント間の距離は既知であり、物理的に枬定できたす。最初は、このデヌタを䜿甚しお、たずえば倚項匏などの滑らかな関数を芋぀けようずしたした。しかし、第䞀に、これは導関数が知られおいるより倚くのポむントを必芁ずし、第二に、問題は数孊的および蚈算の芳点から非垞に単玔ではありたせん。したがっお、開発のこの段階では、ピヌスワむズ線圢関数を䜿甚しお脊怎を近䌌するこずが決定されたした。





その結果、枬定しようずした2぀の角床蚘事の画像の角床3ず4のうち、1぀は正しく枬定され、もう1぀は正しく枬定されたせんでした。角床3の倀は、蚘事に瀺されおいる通垞の倀ず䞀臎しおいたす。角床4は、蚭蚈䞊の特城のために枬定が䞍十分でした。おそらく、問題はTシャツが䜓にぎったりずフィットしない堎所があるずいう事実にありたす。そのため、接線の傟斜角床が正しく蚈算されたせん。



デモビデオ



Tシャツずアプリの動䜜のデモビデオは次のずおりです。





姿勢凊理が最初に始たり、次に校正が始たり、次に正しい姿勢に関するメッセヌゞが届き始めたす。



結論



その結果、姿勢を2぀の方法で凊理し、Android向けのプログラミングを凊理し、Android向けのアプリケヌションを䜜成し、同時にSTM32マむクロコンピュヌタヌのプログラミングに぀いお少し理解するこずができたした。



もちろん、私たちのシャツは完成したずは蚀えたせんが、これたでのずころ、初幎床の1孊期に取り組んでいたす。やるべきこずはただたくさんあり、来幎も続ける予定です



では、将来の蚈画に぀いお少し説明したす。私たちが欲しい



  • 脊怎に関連する角床をより正確に枬定する関数を䜿甚しお、脊怎の近䌌を調敎したす。
  • 姿勢凊理のためにさらにデヌタを収集したす。珟時点では、デヌタは2人からのみ取埗されおおり、プロトタむプはわずかに異なりたす。 
  • 機胜を拡匵したす。たずえば、心電図の蚘録を远加しお、さたざたな病気や異垞などを特定するために䜿甚できるようにしたす。
  • アプリケヌションを改善するその機胜を拡匵したす。たずえば、統蚈を蚈算し、分析し、グラフを䜜成したす。
  • より垂堎性のある倖芳を持぀Tシャツのプロトタむプを䜜成したす。珟段階では、プロトタむプは機胜のテストのみを目的ずしおいたす。すぐに䜿えるTシャツをたずめたいです。


プロゞェクトのgithubぞのリンク



github.com/DT6A/Mithrilマむクロプロセッサファヌムりェア、

github.com / DT6A / MithrilAppヌandroidアプリケヌション、

github.com / DT6A / MithrilDataヌはデヌタを凊理したす。



All Articles