![](https://habrastorage.org/files/af5/8f8/ada/af58f8ada4d042709e9c7e7606f131ea.jpg)
Google Device Labコンテストの一部としてのSergey Melekhinによる記事。
タンゴを使用して宇宙空間で方向を決め、障害物との衝突を回避するロボットを作成することは、私にとって興味深いように思えました。
Tangoの3つの基本機能
モーショントラッキング
空間内のデバイスの位置の変化の決定。
![](https://habrastorage.org/getpro/habr/post_images/410/cca/03c/410cca03cedc71ddfecb7354103946f4.gif)
最新のスマートフォンにはすべて、加速度計とジャイロスコープが搭載されているため、デバイスの位置の変化を特定できますが、非常に不正確であり、デバイスの絶対位置を特定するのは問題です。
奥行き知覚
赤外線カメラと赤外線レーザーがデバイスの前の空間に2次元グリッドを投影する特別なセンサーの存在により、Tangoはポイントクラウド、つまりデバイスの前の空間の3次元画像を受け取ることができます。
![](https://habrastorage.org/getpro/habr/post_images/09f/b51/f36/09fb51f36b22a5d9b14b2d4d1fa53547.gif)
地域学習
モーショントラッキングと奥行き知覚を組み合わせ、リアルタイムでパノラマのように点群を組み合わせるブラックアルゴリズムマジックを追加することにより、デバイスのメモリ内の周囲の空間の完全なモデルを構築し、このモデル内の位置を正確に決定する機会を得ます。
![](https://habrastorage.org/getpro/habr/post_images/ae5/9e2/e7c/ae59e2e7c3d1387158921c66846b4d1b.gif)
主な用途
- 拡張現実(仮想オブジェクトは、タンゴなしで起こるように、実際の表面にホバリングしたり、内部に飛び込んだりするのではなく、実際の表面に実際に「付着」します)
- 正確な屋内ナビゲーション
- ゲーム
- ルームマッピング
- 3Dモデルの作成(まだかなりラフですが、それでも)
実際、デバイスがなくてもTangoで何ができるかを理解する最良の方法は、 Play Marketの既存のアプリケーションを調べることです。
![](https://habrastorage.org/files/7ce/cd6/2fa/7cecd62fab06465c9542c4e0846a89b5.png)
![](https://habrastorage.org/files/9a7/9fc/169/9a79fc169c4643d4a80f6e395731ec86.png)
タンゴボット
月曜日に、私は待望のデバイスを受け取りました。 もちろん、ゼロに排出されました。 100%まで充電してオンにしました。
![](https://habrastorage.org/files/05c/413/935/05c413935e96407ab11683172b99a609.png)
最初に、デバイスに既にインストールされているすべてのものを試し、次にPlay Marketですべてを連続してダウンロードしました。 タンゴコンストラクターは最大の熱意を引き起こし、周囲の空間をスキャンしてテクスチャ付き3Dモデルを保存できます。
しかし、彼らはプレイしました。それで十分です-私はロボットを作り、彼に宇宙での操縦方法を教えるのにたった3日しかありません。
最初のものはドキュメントです。 https://developers.google.com/tango/には、Tangoの開発をできるだけ早く開始するために必要なものがすべて揃っています。 ここで標準的な例を探索することから始めました 。
私のプロジェクトでは、Area Learningに深く入り込むのではなく、単にポイントクラウドをリアルタイムで分析することにしました。 もちろん、最初の選択肢の方がはるかに興味深いでしょうが、私は締め切りに間に合わないことを恐れていました。
ロボットの「死体」として、モーターシールドと2つのモーターを備えたArduino Megaを使用しました。 Arduinoは、シリアルポート(USBでエミュレートされる)で受信するコマンドをリッスンして実行するようにプログラムしました。 プラットフォームはレーザーで3mmの合板から切り取られ、それ自体が刺激的でした。
![](https://habrastorage.org/files/e2d/0d0/4d8/e2d0d04d86224914827b18ea0705870e.png)
arduinkiのスケッチはこちらから入手できます 。 Tangoデバイス自体にはAndroid 4.4が搭載されているため、制御プログラムはAndroidアプリケーションになります。 Arduinoと通信するために、 usb-serial-for-andoidライブラリを使用しました 。
Arduinoとの通信のプロトコルは、最も単純なもの(5つのシングルバイトコマンドのみ)によって選択されました。
- F-進む
- B-ドライブバック
- L-左折
- R-右折
- S-停止
タンゴ構成では、点群「KEY_BOOLEAN_DEPTH」が必要であることを指定します。
private TangoConfig setupTangoConfig(Tango tango) { // Create a new Tango Configuration and enable the Depth Sensing API. TangoConfig config = new TangoConfig(); config = tango.getConfig(config.CONFIG_TYPE_DEFAULT); config.putBoolean(TangoConfig.KEY_BOOLEAN_DEPTH, true); return config; }
Tangoは、ポイントクラウドを浮動小数点数の1次元配列として返します。 行の最初(およびインデックスのゼロ)配列要素は最初の点のx座標、2番目は最初の点、3番目は最初の点のz座標です。 4番目の要素は、すでに2番目のポイントのx座標です。 まあなど。
私はロボット工学と幾何学が得意ではないため、深度マップを分析するアルゴリズムは指から吸い出されます。 エヘム、まあ、つまり、経験的に推測されます。
障害物Iに対して、二次式で与えられる、デバイスの前の放物線領域に該当するポイント:
![](https://habrastorage.org/files/fa0/e6f/e30/fa0e6fe30d044823840aa1309d7766b2.png)
係数は、放物線の深さおよび幅(y)がわずかにシフト(10 cm)するように選択されます。
同時に、これらのポイントは50 cm未満である必要があります。これらのポイントが少なくとも5つあり、2つの「フレーム」が連続している場合(誤検知を回避するため)、ロボットを左に向けます。複雑な構成(オフィス内など)。
ロボットをリモートで制御できるようにするため、プロジェクトにFirebaseサポートを追加し、サーバーのstateStringパラメーターを変更するときに、対応するArduinoコマンドを送信します。
![](https://habrastorage.org/files/ddb/9ce/4f1/ddb9ce4f1f4741ea80b9411fd2512565.png)
ロボットに乗ったり、壁や家具をかわしたり、遠隔操作されたりするので、とても嬉しいです。
これが彼の乗り方です。
私は開発のシンプルさに満足していました-私はAndroidやJava開発者でもないにもかかわらず、ソフトウェアを使用するのに2日かかりました-私はgradleで戦争に時間を浪費し、イテレーターで反復することが不可能である理由を理解していませんでした。
だから私は未来が来たと言うことができます-タンゴベースの製品の開発に入るためのしきい値は非常に低いです。 Tango SDKは非常にシンプルで論理的であり、 Tangoをサポートする通常のユーザーデバイスはすでに市場に出回っています。
点群ではなく、エリア学習を使用して構築されたモデルを使用すると、プロジェクトをさらに面白くすることができます。 デバイス上の192個のCudaコアで許可されているため、TensorFlowを使用して周囲のオブジェクトの分類を試みることができます。
ご注意いただき、ご迷惑をおかけいただきありがとうございます!
ソースコード