ニザニヌノノゎロドでのマむクロ゜フトハッカ゜ン「IoT-モノのむンタヌネット」

開始する理由



Microsoft Developer Tour Technology Expeditionの䞀環ずしお、MicrosoftずIntelがニゞニノノゎロドで実斜したハッカ゜ンに぀いおお話したいず思いたす。 盎接話しおください。 メンバヌずしお。 䞀番面癜いず思いたす。



IoT-モノのむンタヌネットモノのむンタヌネット、ニゞニノノゎロドで開催される予定だったハッカ゜ンのテヌマ。 正盎なずころ、私にずっおこの甚語は新しく、基本原則を理解するためにグヌグルで怜玢する必芁がありたした。 それは非垞に簡単であるこずが刀明したした。いく぀かのセンサヌから情報を収集し、アクセスず凊理のためにむンタヌネットに送信するデバむスがありたす。



ハッカ゜ンがツアヌの䞀環ずしお開催されるずいう事実は、むベントから間もなく孊びたした。 ハッカ゜ンでは、Intel Galileoボヌドを䜿甚しお䜕かを䜜成する必芁があるず曞かれおいたした。



それは非垞によく䞀臎したので、玄1か月前にIntel GalileoずIntel Edisonに関するIntelカンファレンスに参加したした。 Intel Galileo Gen 2ボヌドはどこで入手したしたかありがずう しかし、圌女の手は圌女に党く届かず、圌女は単にテヌブルに暪になりたした。 もちろん、有名な䞭囜のサむトでセンサヌずシヌルドを泚文したしたが、ただ届きたせん。



Intel GalileoずIntel Edisonに぀いお䞀蚀。 これらは、Arduino Uno R3ずピン互換性のあるボヌドです。 暙準のセンサヌずシヌルドを挿入できたす。 arduinoからスケッチを実行する開発ツヌルがありたす。 そしお、ここで、これらのボヌドがより高䟡で消費量が倚い堎合、なぜこれらのボヌドが必芁なのかずいう疑問が生じるかもしれたせん。 告癜したすが、最初からそう思っおいたした。 しかし、熟考するず、これらのボヌドの目的は完党に異なるずいう結論に達したした。 Arduinoず16 MHz、およびIntel Galileo Gen 2ず400 MHzを比范しおください。 2 KB RAMメモリず256 MGB DDR3。 Intelには、組み蟌みの100 Mbpsネットワヌクむンタヌフェむスず動䜜するLinuxもありたす。 それらを比范する必芁はありたせん、それらは異なるタスクのためです。



詳现はこちら habrahabr.ru/company/intel/blog/248279



䞀般的に、Intel Galileo Gen 2ボヌドがあり、それは箱の䞭にありたした。 Arduinoのように、このボヌドの経隓はありたせんでした。 そしお、これはハッカ゜ンです。



ハッカ゜ンの数日前、この指瀺に埓っおボヌドにLinuxをむンストヌルするこずにしたした habrahabr.ru/company/intel/blog/248893



ロヌカルネットワヌク経由でSSHを介しおボヌドに接続したす。 普通のLinuxがありたす。 すべおがうたくいき、すべおが機胜したす。 私はむンタヌネットから簡単なC ++の䟋を䜜成したしたが、これは組み蟌みのLEDで点滅したす。 すぐには動䜜したせんでしたコンパむルオプションで-lmraaを指定するのを忘れおいたした。 やった すべおが機胜し、眠りに぀くこずができたす。



ボヌドが機胜したら、䜕かを接続しおみるこずができたす。 arduinoのために䜕かを買えるかどうかを確かめるためにラゞオ垂堎に行きたした。 ブレッドボヌド、ワむダヌを買いたした。 詳现の䞀郚、䞀郚のセンサヌ。 しかし、私は䜕もテストしたせんでした、再び私の手は届きたせんでした。



アむデア



この数日で、このボヌドに実装できるブレヌンストヌミングセッションがありたした。 LEDを点滅させたり、郚屋の枩床を枬定したりするような単玔なものは望たなかった。 これはすべお以前に既に行われおおり、Intel Galileoはそのようなタスクには匷力すぎたす。 倧きな蚈算、デヌタ凊理、さらに凊理たたは分析のためにサヌバヌに送信するものが必芁でした。



そしお、次のアむデアが埐々に思い浮かびたした。 䜕幎も前、Computerra誌に、ショットなどの倧音量の音源の䜍眮を特定するための実隓技術に関するニュヌスがありたした。 路䞊にはマむクがありたす。 圌らは音を知芚し、音がすべおのマむクに同時に到達するわけではないずいう事実のために、遅れお、音源の䜍眮を芋぀けるこずができたす。 そのようなシステムを䜜成するこずにしたした。



アむデアがありたす、あなたはセンサヌを買うためにラゞオ垂堎に行くこずができたす。 グヌグル、サりンドセンサヌには2皮類あるこずがわかりたした。 最初はデゞタル出力で、しきい倀を超えるこずに応答し、それぞれ3぀の接点グランド、+ 5、信号しきい倀を持っおいたす。 2番目のセンサヌには、さらにアナログ出力があり、それに応じお4぀の接点グランド、+ 5、信号しきい倀、アナログ信号がありたす。 アナログ信号を生成する2番目のものが必芁でした。 耇数のセンサヌから信号を受信するず、それらを重ね合わせお、䞀臎を芋぀けお遅延を正確に決定するこずができたす。 さお、トリガヌしきい倀を動的に怜玢したす。 センサヌにワむダヌが必芁です。 各10メヌトル。 念のため。 垂堎でサりンドセンサヌを芋぀けたしたが、リヌドは3぀しかありたせん。 他にはありたせんでした。 売り手は、圌らの出力がアナログであるこずを保蚌したした。 たあ、信じおください、なぜチュヌニング抵抗があるのですか 5぀のセンサヌを取りたした。 今、ワむダヌ。 50メヌトルの赀黒のサりンドワむダ0.25 mmず30メヌトルの光0.25 mm、ダブル。 私は各センサヌを頌りに、電源甚に赀黒を開始し、信号甚に光のペアの1぀を開始したした。



OK、すべおがそこにありたす。 それはすべお朚曜日で、土曜日にはすでに䌚議がありたした。



自宅でセンサヌを接続しようずしたした。 初めおボヌドに䜕かを貌り付けるのが怖いずき、それは突然燃え尜きたす。 しかし、䜕も、立ち埀生、煙がない、コン゜ヌルが動䜜しおいたす。 センサヌからアナログ倀を取埗しようずしおいたす。 驚いたこずに、センサヌはバむナリであるこずがわかりたした。 信号レベルの超過にのみ応答したす。 そしお、このレベルはボヌド䞊のチュヌニング抵抗によっお蚭定されたす。 ああ 金曜日の翌日は、垂堎にずっお意味がありたせん。 正しいセンサヌがそこにあるかどうかはわかりたせん。 はい、か぀お、あらゆる皮類のもの、たたラップトップを眮いおグリッドを構成するVisual Studioもありたす。 垂堎はさらに半日かかりたす。 そしお、土曜日の午前9時からのカンファレンスでは、ただ眠る時間がありたす。



金曜日の倜、10時に家に着いたずき、私はすべおを準備し始めたした。

ハッカ゜ンの堎合、必芁なものをすべお甚意するためだけに決めたした。 倚くの参加者がいるため、延長コヌド。十分な゜ケットがない可胜性がありたす。 ルヌタヌ ボヌドはネットワヌクケヌブルを介しお接続する必芁がありたす。 USBモデム経由でむンタヌネットに接続するには、ルヌタヌも必芁です。 䞀般的に、完党な自埋性。 数時間䌚うず思った。 Visual Studio 2013 Communityをむンストヌル甚にむンストヌルしたした。 VC 2015のむンストヌルを拒吊したした。 したがっお、ハッカ゜ンに持ち蟌む必芁があるすべおの腺の準備ず収集は、蚈画された数時間ではなく、午前4時たで続きたした。 はい、8時に起きたす。

その結果、圌は圌ず䞀緒に取りたした延長コヌド、粘着テヌプ、青い電気テヌプはい、同じもの、長いワむダヌ、ブレッドボヌドずセンサヌの接続ワむダヌ、はさみ、ルヌタヌ、5぀の音響センサヌ、USBモデム、振動センサヌ、巻尺。 すべお、寝る時間です、私たちはそこで理解したす。



魔法のミステリヌツアヌ







䌚議では倚くの報告がありたした。 倚様で興味深い。



WebGLずBabylon JSラむブラリに぀いおの講挔がありたした。これらを䜿甚するず、ブラりザで3Dで簡単に描画できたす。 アむデアは良いです。埌でハッカ゜ンでプロゞェクトに固定しおみおください。

䌚議は19:00に終了し、ハッカ゜ンはポリテクニックの建物で20:00に始たりたした。 歩くこずができたす。 途䞭、私はピザを買っおスナックを食べたした。



ハッカ゜ン



だから20:00、私はその堎にいたす。 ホヌルは広いです。 倧孊の最前列に座っおいたので、䞭倮の最初のテヌブルを占有したす。 私の鉄片には、テヌブル党䜓が必芁です。









hackathonペヌゞの写真events.techdays.ru/msdevtour/news#fe58625b-bcd9-498a-94e8-161ccc286f11



20:00から00:00たで、MicrosoftおよびIntelによるIoTおよびAzureに぀いおの講矩。







むンテルからガリレオず゚ゞ゜ンに぀いおの講矩がありたした。 1぀は、Azureの䜿甚に関するものです。 圌が知っおいるこずずその䜿い方。 これが最も重芁なこずでした。なぜなら、この瞬間たで私はAzureで働いたこずがないからです。



Dmitry Soshnikovは、MicrosoftがIoTをどのように芋おいるかを語った。 これは、センサヌから䞀郚のデヌタを収集しおクラりドに転送し、受信しお分析できる小さなデバむスです。 私のプロゞェクトはこれらの芁件をすべお満たしたばかりで、それを実装するために残りたした。



講矩は無駄に時間を無駄にしないように行っおいたしたが、信号源の䜍眮を決定するために必芁な匏を導き出すこずにしたした。



私たちのタスクは、センサヌから受信した遅延時間に最適な空間内のポむントを芋぀けるこずです。 ぀たり、未知数よりも倚くの倉数がある可胜性がある最適化問題です。 たぶん、最小二乗法のようなものでしょう。



䟝存関係を曞き蟌み、出力を開始したした。 圌は2ペヌゞを曞き留めお、私は4床の方皋匏を解くのが面倒で、すべおの時間を費やすこずができ、間違いがあるかもしれないこずに気付きたした。 そしお、それはなんずなく悲しくなりたした。







その結果、私は普遍的な方法、培底的な怜玢の方法で行動するこずにしたした。 芳客の倧きさは、10 x 10メヌトル、10 x 10 x 10立方䜓、10 cmの粟床で、100䞇ポむントを獲埗したした。 たくさんありたすが、おそらくプロセッサがそれを凊理できたす。 その堎合、粟床が䜎䞋する可胜性がありたす。



それで、講矩は終わりたした。誰もがプロゞェクトを考え出し、チヌムを線成する必芁がありたす。 ホヌルには60人がいたした。

チヌムのプレれンテヌションが始たりたした。 3番目に行きたした。 私のプロゞェクトが䜕であるかを簡単に説明し、すでに費甚がかかっおいるず蚀ったので、プロゞェクトを䞀人で行う぀もりです。 サりンドセンサヌは觊手のようなものであるため、名前はAudio sprutです。

すべおが圌らのプロゞェクトに぀いお語った。 人々は歩いおプロゞェクトに参加し始めたした。



さあ、始めたしょう。 最初のステップは、時間を正確に決定するこずでした。 最初のオプションは、サむクルが完了したステップの数をカりントするこずです。 ただし、ここでは、サむクルの各ステップにかかる時間を決定する必芁があり、これはあたり正確ではありたせん。 高粟床のタむマヌを芋぀ける必芁がありたした。 C ++ 11には䜕かがあるこずを思い出したした。 むンタヌネット怜玢が解決策を提䟛したした。



したがっお、センサヌを操䜜するためのアルゎリズムは次のずおりです。 いずれかのセンサヌに信号が衚瀺されるたで、すべおのセンサヌに問い合わせたす。 圌の時間をれロにしたす。 次に、残りのセンサヌに問い合わせお、いずれかのセンサヌに信号が衚瀺されるずすぐに、珟圚の時刻を蚘録したす。 すべおのセンサヌが信号を発するたで、この調査を実行したす。 各センサヌで取埗した時間に基づいお、距離のデルタを求め、音の速床に時間を掛けたす。



枬定により、デゞタルセンサヌは83 kHzの速床で尋問されるこずが瀺されたした。 これにより、5぀のセンサヌで玄2 cmの粟床が埗られたす。 興味のために、アナログ読み取りの速床を枬定したした。 箄4 kHz。



私が買ったセンサヌは、私が欲しかったものではないが、私の仕事を簡玠化しおいるようだ。 第䞀に、アナログ信号間の察応を探す必芁がなく、第二に、粟床が高くなりたす。



しかし、Linuxはリアルタむムオペレヌティングシステムではないこずにも留意する必芁がありたす。 したがっお、システムがコヌドだけで占有され、他のシステムに切り替わるこずは保蚌されたせん。 ここでは、もちろん、2぀のコアを持぀Intel Edisonが圹立ちたす。 しかし、それはそうです。



テストでは、玄15センチメヌトルずいう短い距離にある2぀のセンサヌを䜿甚し、䞀方のセンサヌの偎面から男性をクリックし、もう䞀方のセンサヌからクリックしたした。 同時に、信号が遅れ、距離の蚈算されたデルタが珟実ず䞀臎しおいるこずがはっきりず芋えたした。



自分のボヌドず構成枈みのルヌタヌがあるため、WiFiの動䜜に䟝存したせんでした。 しかし、倧きな問題がありたした。私のむンタヌネットは時々ひどいものでした。 時々、速床は100 kBit / sに䜎䞋したした。



今日は曇りのはず



したがっお、プログラムは音源の䜍眮を決定し、この情報をクラりドに送信したす。

最も簡単なオプションは、むベントを介しおデヌタを送信するこずであるず蚀われたした。 サヌバヌに䜕かを送信するためのPythonスクリプトを芋぀けようずしおいたす以前にpythonを実行したこずがありたせん。 最初に、スクリプトはサヌバヌからの応答で゚ラヌをスロヌしたす。 近隣のチヌムもデヌタを送信しようずしおおり、䜿甚できたせん。 長い間探し回ったら、答えは201なので、゚ラヌはなく、デヌタが転送されたした。 Azureにアクセスしたすが、デヌタは衚瀺されたせん。 申し立おはありたすが、デヌタは衚瀺されたせん。 私は長い間それを理解しようずしたす、私は䞻催者に尋ねたす、そしおそれはむベントが私に合わないこずがわかりたす。 削陀されるず考えられる堎合、それらは䜿い捚おです。 サプラむズ そしお、䜕を䜿うべきですか テヌブル。



玠晎らしい、最初からすべお。 テヌブルではそれほど単玔ではありたせん。 Azureのむンタヌフェむスはあたり盎感的ではありたせん。 詳现はもう芚えおいたせんが、サヌバヌがそれを䜜成し、テヌブルを䜜成したした。 次に、そこにデヌタを曞き蟌みたす。 そしお、刀明したように、これはそれほど些现な䜜業ではありたせん。 メッセヌゞに䌌たコヌドは機胜したせん。 驚くべきこずにチヌム間で実行しお党員を支揎したタチアナ・スメタニナず話をした埌、デヌタベヌスが暙準であり、䜕らかのMySQLず同様に䜜業できるこずが明らかになりたした。 デヌタベヌスに接続しおINSERTを実行したす。 少し残っおいたす。 接続方法 C ++から、私は欲求がありたせん。 Python私はあたり知りたせん。 しかし、Gagileoにはperlがありたす。 いいね 小さなテストスクリプトを䜜成しようずしおいたす。 ただし、DBIモゞュヌルはむンストヌルされおいたせん。 cpanを開始したす。 私のむンタヌネットは枛速しおいたすが、䜕かが揺れ動いおいたす。それはすでに玠晎らしいこずです。 しかし、玄20分埌のむンストヌルの最埌に、䞀郚のラむブラリたたはモゞュヌルが欠萜しおいるこずがわかりたした。 同様に、このラむブラリを配眮しようずしたす。 他のものを入れようずしおいたす。 時間がなくなり、䜕も機胜したせん。 それは残念です。 私が理解しおいるように、隣人は䌌おいたす。 すべおが䜕らかの圢で耇雑でしたが、プレれンテヌションは数行でシンプルでした。 そしお、RESTプロトコルを介しおデヌタベヌスにアクセスできるこずがわかりたした。そのためには、Azureでモバむルクラむアントを䜜成する必芁がありたす。 頑匵っお 繰り返しになりたすが、むンタヌネット䞊の怜玢の束。 pythonで䟋を芋぀けたした。 そしお、芋よ、圌は基地に曞いた Azure Webサむトには、Galileoが送信するデヌタが衚瀺されたす。 すばらしい、C ++からの呌び出しをシステム関数に远加したす。この関数は、パラメヌタヌを䜿甚しおpythonスクリプトを実行したす。 それだけです この郚分は忘れおください。 次に、JavaScriptを䜿甚しおデヌタベヌスからデヌタを読み取る方法を孊習する必芁がありたす。



ベヌス、デヌタを提䟛しおください



ブラりザの文字列にテヌブルのアドレスを入力するず、ブラりザはデヌタ付きのJSONを衚瀺したす。 すべおが玠晎らしいです。 デヌタを解析するために残りたす。 JavaScriptで小さなロヌカルhtml-kuを䜜成しおいたす。これにより、プレヌトが読み蟌たれ、ペヌゞに衚瀺されたす。 動䜜したせん。 利甚可胜なデヌタはありたせん。 䜕かが来るが、それは明確ではない。 私は理解し始めおいたす。 ブラりザのデバッガヌは、いく぀かの暩利に぀いお䜕かを曞きたす。 それず䜕の関係がありたすか 通垞のアドレスでは、すべおが衚瀺されたす。 突っ぀いお、探しお、突っ぀いお、探しお。 なぜ機胜しないのかは明確ではありたせん。 どのような詊みかわからなかったので、モバむルむンタヌフェむスを操䜜するために、Azureペヌゞに蚘茉されおいるこずをステップごずに実行するこずにしたした。 ロヌカルWebサヌバヌを起動するこずをお勧めしたす。 数行でDelovですが、どういうわけか私はロヌカルでサヌバヌが奜きではありたせん。 さお、他のすべおが倱敗した堎合、指瀺をお読みください。 曞かれおいるずおりにすべおを行い、すべおが機胜したす。 スクリプトを含むロヌカルペヌゞがデヌタを受信し、画面に衚瀺したす。 やった もちろん、むンタヌネット䞊のAzureにあるWebサヌバヌが必芁でしたが、すでに十分です。



バビロン、しかし5ではなくJS



デヌタがありたす。BabylonJSに基づいお3D芖芚化を固定する必芁がありたす。



座っおいるテヌブルのサむズを枬定しお、郚屋の正しい3Dモデルを䜜成したす。 長さ106センチの1セクション。 ぀たり、テヌブル党䜓は2メヌトルです。 玠晎らしい。 テヌブルず通路を備えた3぀のブロック、それは10メヌトルになりたす。 わかった 前壁、最初の列のテヌブル、オヌガナむザヌのテヌブルをステヌゞに远加したす。 郚門。 ブラりザではすべおが正垞に芋えたす。 センサヌをどこに眮くかを考えたす。 芋積もりをしおいる間、䜕かが収束しないこずがわかりたした。 テヌブルは、1メヌトルの2぀のセクションではなく、4぀のセクションで構成されおいたす。 たた、テヌブルの3぀のブロックは10メヌトルに収たりたせん。 倖の芳客のサむズを枬定しお、廊䞋に巻尺を取りたす。 16メヌトル。 すべおを再描画する必芁がありたす。



昌食 いいえ、昌食なしで我慢できたす。 少なくずも30分ですが、圹立ちたす。



すべおが機胜したす。 ポむントの䜍眮を含むデヌタが読み取られたすが、ロヌカルペヌゞからではなく、サむトからデヌタを取埗するこずに苊劎する可胜性がありたす。 探しおいる、探しおいる、長い間探しおいる。 次に、セキュリティ蚭定のどこかで、サむトぞのアクセスがロヌカルホストでのみ蚱可されおいるこずに気付きたす。 はい、確かに、MySQLには䌌たようなものがあるこずを思い出したす。 蚱可されたホストにサむトアドレスを远加するず、すべおすぐに機胜したした。 やったヌ すべおを管理したした。 ただ1時間以䞊ありたす。



デヌタの远加ず受信の実隓䞭、アクセスはすべおのナヌザヌに察しお完党になるように構成されおいたこずに泚意する必芁がありたす。したがっお、デヌタ远加スクリプトでアクセスキヌが指定されおいたせん。



最終準備、䞀括での時間



すべおが機胜し、センサヌがデヌタを受信し、ボヌドが䜍眮を蚈算し、クラりドに送信し、サむトが芖芚化を行いたす。 長いワむダヌをセンサヌに取り付けお、芳客の䞭で互いから遠く離れお配眮し、蚭定ファむルで空間内の絶察䜍眮を蚭定するこずだけが残っおいたした。 デスクの端に2぀のセンサヌを配眮し、レポヌト甚に郚門に2぀のセンサヌを配眮し、1぀をメむンテヌブルの䞭倮に配眮する予定でした。 これには1時間かかりたした。 倧量の時間、私は考え、そしお二重線を匕き裂き始めたした。 最初の2぀のセンサヌぞの配線は3メヌトルでなければなりたせんでした。







ワむダヌが砎れた。 ペアワむダを3本にするために、ペアワむダを1本で折り畳む必芁がありたす。 私はそれらを䞀緒にねじり始め、半メヌトルごずにテヌプで固定したす。 これにはすべお10分かかりたした。 私はそのようなペヌスで間に合わないこずは明らかです。 ワむダの準備はできおいたすが、ギャップの新しいワむダを含めお、センサからワむダを䌞ばす必芁がありたす。 テヌプをきれいに、ねじっお、巻き䞊げたす。 ボヌドに接続するず、センサヌが動䜜したす。 OK、次の手順に進みたす。 すべおに十分な時間がないこずは間違いないので、センサヌを3぀だけ残すこずにしたす。 ワむダヌで3メヌトル、3メヌトル、8メヌトル。 最埌の8メヌトルはもうテヌプで固定されおおらず、少しねじれおいたす。 私は急いでいる、これは非垞に悪いです。 ワむダヌをきれいにするず、自然に壊れたす。 修正したした。 やった センサヌを接続したす。 LEDは点灯しおいたすが、点灯しおはいけたせん。 ワむダヌを芋お、センサヌ出力に+5を、すぐにLEDに適甚したした。 たあ、私はそれが燃えたかもしれないず思う。 ワむダヌを正しく倉曎しおも、センサヌはただ赀く光りたす。 正確に焌かれた 私はもう䞀぀取りたす。 予備がありたす。 接続したす。 たた、赀く光りたす。 チュヌニング抵抗は圹に立ちたせん。 元気 わかった。 ボヌドに正しく接続されおいないこずがわかりたす。 たあ、ボヌド䞊のポヌトを焌いたかもしれたせん。 これで終わりです。デモでは終わりたせん。 もう䞀床すべおを確認し、すべおを正しく接続したす。 そしお芋よ、すべおが機胜したす。 そしお、レポヌトの始たりである16:00に。 二番目。



報告曞



Azure Webサむトでプロゞェクトを管理できたのは良いこずです。プレれンテヌションのためにラップトップを接続する必芁はありたせん。 たた、ルヌタヌを介しおボヌドに接続されおいるため、無効にするこずは困難です。 私はプロゞェクトに぀いお話したす。 ボヌル、信号゜ヌスの以前のデバッグ䜍眮を䜿甚しお、芳客の3Dモデルを瀺したす。 私は手をたたきたす。 コン゜ヌルからのログで、デヌタがなくなったこずを確認できたす。ブラりザを再起動したす。 新しいポむントが衚瀺されるはずでしたが、正盎なずころ、どのポむントがどのポむントで、どれがそうではなかったかを芚えおいたせん。 それだけです



最初の1人であるこずは非垞に玠晎らしいこずです。その埌、座っお他のレポヌトを静かに聞くこずができたす。 レポヌトは異なっおいたした。







それだけです。 そうそう、私はハッカ゜ンの勝者の䞀人になり、賞を受賞したした。



䞀般的な印象



気に入った。 興味のあるこのような倧勢の人々。 そのうちのいく぀かず話をしたした。

ハッカ゜ンのおかげで、そうでない堎合、Intel Galileoをい぀開始するかはわかりたせん。 そしお、Azureに到達するには、これは䞀般に䞍可胜です。 倚くのこずを孊びたした。

党䜓ずしお、MicrosoftずIntelに感謝したす。



そしお結論ずしお、ハッカ゜ンで持っおいたコヌドを倉曎せずに持ち蟌みたす。



ファむル



dist1.cpp
#include "mraa.h" #include <ctime> #include <ratio> #include <chrono> #include <vector> #include <iostream> #include <stdlib.h> #include "funcs.h" int main() { init(); int waitId = 0; const int numMics = NUM; // std::cout<<"Num sensors="<<numMics<<std::endl; // return 0; mraa_gpio_context gpio[numMics]; bool on[numMics]; int dist[numMics]; // std::chrono::high_resolution_clock::time_point times[numMics]; std::chrono::duration<double> times[numMics]; for( int k = 0; k < numMics; k++ ) { gpio[k] = mraa_gpio_init(k); mraa_gpio_dir(gpio[k],MRAA_GPIO_IN); } do { std::cout<<"Wait..."<<waitId<<std::endl; waitId++; for( int k = 0; k < numMics; k++ ) { on[k] = false; dist[k] = 0; } auto numOn = 0; int currStep = 0; std::chrono::high_resolution_clock::time_point startTime; do { for( int k = 0; k < numMics; k++ ) { if( ! on[k] ) { int v = mraa_gpio_read(gpio[k]); if( v == 0 ) { std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now(); if( numOn == 0 ) { currStep = 0; startTime = now; } on[k] = true; dist[k] = currStep; times[k] = std::chrono::duration_cast<std::chrono::duration<double> >(now-startTime); numOn++; } } } currStep++; } while (numOn < numMics && (currStep < 8000 || numOn < 1) ); if( currStep >= 8000 ) continue; for( int k = 0; k < numMics; k++ ) { printf("%d ",dist[k]); } printf(" === time(s): "); for( int k = 0; k < numMics; k++ ) { printf("%f ",times[k].count()); } printf(" === dist(m): "); std::vector<float> L; for( int k = 0; k < numMics; k++ ) { float d = 300*times[k].count(); L.push_back(d); printf("%f ",d); } Point3 event = getPosition(L); std::cout<<"Event=("<<event.x<<","<<event.y<<","<<event.z<<")"<<std::endl; char str[300]; sprintf(str,"./test_rest_add.py %f %f %f",event.x,event.y,event.z); std::cout<<"send data"<<std::endl; system(str); std::cout<<"send ok"<<std::endl; // create dists sleep(1); } while (true); for( int k = 0; k < numMics; k++ ) { mraa_gpio_close(gpio[k]); } return 0; }
      
      







funcs.h
 #include <vector> struct Point3 { float x,y,z; }; struct DistPos { Point3 p; float dist; }; struct Box { Point3 p1,p2; float step; }; void init(); Point3 getPosition(std::vector<float> &dists); extern int NUM;
      
      







funcs.cpp
 #include <vector> #include <fstream> #include <iostream> #include "funcs.h" #include <math.h> std::vector<Point3> sensorPos; int NUM = 0; void readSensorPos() { if( sensorPos.size() > 0 ) { return; } std::ifstream file("positions.txt"); if( ! file ) { return; } int num = 0; file>>num; std::cout<<"Num="<<num<<std::endl; for( int k = 0; k < num; k++ ) { float x,y,z; file>>x>>y>>z; Point3 point; point.x = x; point.y = y; point.z = z; sensorPos.push_back( point ); std::cout<<"x="<<x<<" "; std::cout<<"y="<<y<<" "; std::cout<<"z="<<z<<std::endl; } NUM = num; } void init() { readSensorPos(); } Point3 getPosition( std::vector<DistPos> dists, Box box) { std::cout<<"Box=("; std::cout<<box.p1.x<<","<<box.p1.y<<","<<box.p1.z<<")-("; std::cout<<box.p2.x<<","<<box.p2.y<<","<<box.p2.z<<")"<<std::endl; std::cout<<"dists.size="<<dists.size()<<std::endl; Point3 bestPoint; bestPoint.x = 0; bestPoint.y = 0; bestPoint.z = 0; float minErr = 10e20; float normDist[NUM]; for( float tx = box.p1.x; tx <= box.p2.x; tx+= box.step ) { for( float ty = box.p1.y; ty <= box.p2.y; ty+= box.step ) { for( float tz = box.p1.z; tz <= box.p2.z; tz+= box.step ) { float currErr = 0; //std::vector<float> normDist(dists.size()); int kk = 0; for( auto iter = dists.begin(); iter != dists.end(); iter++, kk++ ) { float dx = iter->px - tx; float dy = iter->py - ty; float dz = iter->pz - tz; float d = sqrt(dx*dx + dy*dy + dz*dz); normDist[kk] = d; // float err = d - (iter->dist * iter->dist); // currErr += err*err; } float minVal = normDist[0]; for( int k = 1; k < NUM; k++ ) { if( normDist[k] < minVal ) minVal = normDist[k]; } for( int k = 0; k < NUM; k++ ) { normDist[k] -= minVal; } currErr = 0; for( int k = 0; k < NUM; k++ ) { float delta = normDist[k] - dists[k].dist; currErr = delta*delta; } if( currErr < minErr ) { minErr = currErr; Point3 p; px = tx; py = ty; pz = tz; bestPoint = p; } } } } return bestPoint; } Point3 getPosition(std::vector<float> &dists) { Point3 p1,p2; p1.x = -5; p1.y = 0; p1.z = -5; p2.x = 5; p2.y = 3; p2.z = 5; float step = 0.1; Box box; box.p1 = p1; box.p2 = p2; box.step = step; std::cout<<"DistPos="<<std::endl; std::vector<DistPos> distPos; for( int k = 0; k < dists.size(); k++ ) { DistPos dp; dp.p = sensorPos[k]; dp.dist = dists[k]; distPos.push_back(dp); std::cout<<"("<<dp.px<<","<<dp.py<<","<<dp.pz<<") d="<<dp.dist<<std::endl; } Point3 bestPoint = getPosition( distPos, box); return bestPoint; } //const int NUM = 3; //float dist[NUM];
      
      







position.txt
 3 2 1 3 -2 1 3 0 1 5
      
      







test_rest_add.py
 #!/usr/bin/python import urllib import urllib2 import sys x = sys.argv[1] y = sys.argv[2] z = sys.argv[3] #print x," ",y," ",z,"\n" url = 'https://audiosprut.azure-mobile.net/tables/pos' params = urllib.urlencode({ "x": x, "y": y, "z": z, "present" : "true" }) response = urllib2.urlopen(url, params).read()
      
      









リンク audiosprut.azurewebsites.net



All Articles