非表示とシークを再生するロボットを構築します


ゼロからロボットを構築することは、威圧的な仕事でありえます.しかし、我々は、あなたが隠すことができて、捜し求めることができるロボットを造る挑戦を受け入れました.プロジェクトは3つの重要な要素を持っています:プレーヤーのためのフロントエンド、ゲーム論理のためのバックエンドとロボット自身.この記事では、私たちは、ロボットのハードウェアとソフトウェアをカバーし、どのようにして、バックエンドとフロントエンドを高レベルで動作させることができました.

ゲーム。


ゲームの背後にあるアイデアは、非表示を再生し、ロボットとシークすることです.Webアプリケーションを使用して、ゲームマスターは他のプレイヤーが参加できる新しいゲームを始めることができます.その後、地域のロボットも自律的にこのゲームに参加します.次に、それはゲームに勝つためにすべての選手を見つける必要がありますロボットです.AI、センサーとカメラの助けを借りて、ロボットは、選手を見つけるために部屋を通って自分自身を移動します.ロボットが特定の時間内にすべてのプレーヤーを見つける彼の任務で成功していない場合、選手はロボットから獲得している.涼しい右?さあ、これを実現するためにどのようにしてどのビットとバイトを説明するかについて説明しましょう.

ビクターロボット


ビクター、我々の詳細について説明する3つの疲れたロボットを満たしてください.

ハードウェア


ロボットをビルドするには、次のようにします.
  • 「Camjam Edukit 3」は、車輪やモーターなどのロボットを構築するための最も基本的な部品を含んだキットですhere .
  • Raspberry Pi 4B 2GB RAM
  • Raspberry Pi Camera Module 2
  • CamJam Edukitの建物のおかげでロボットはとても簡単な仕事でした.すべての部品を一緒に置くのに数時間かかった.
    我々は、ロボットが困難な時間を検出し、人間を認識していないので、カメラが指摘されていることを確認しました.

    ソフトウェア


    一旦我々のロボットが一緒に置かれるならば、我々はそのソフトウェアを書いている次のステップに進みます.
    PythonコードをPythonで実行して、以下のようなことを行います.
  • 人間発見
  • 顔認識
  • 宇宙で自律的に運転すること
  • ゲームのAPIサービスとのコミュニケーション
  • すべての異なるタスクを調整する
  • 人間探知( MobileNet SSDモデル)
    我々は、限られたコンピューティングパワーを持っている私たちのPIでよく動作する迅速かつ正確な人間の検出モデルを見つけるのに長い間苦労した.
    さまざまなモデルの多くを試した後、我々は、リアルタイムのオブジェクト検出のために意図されている中古訓練MobileNet SSDモデルを使用することを決めた.私たちがこのアルゴリズムを選んだ理由の一つは、Yoloのような異なったモデルよりも速いことで良い検出精度を与えるからです.特に私たちのケースのように低計算デバイス上でリアルタイムで人間を検出しようとするとき.
    バックグラウンドでもオープンソースライブラリを使用しましたOpenCV カメラの出力を捕らえて、処理するために、それは必要です.
    顔認識
    ロボットは顔を認識できるはずです.これを可能にするために、我々はよく知られているface-recognition Python library .

    ソースface-recognition documentation
    これは、認識してから顔を操作するPythonを使用してdlib ’s最先端の顔認識は、深い学習で造られます.さらに、それは我々のPIによいライト級です.ついにそれは非常に良い正確なスコアを達成LFW benchmark ). それは、我々が顔認識モデルについて考えるとき、我々がまさに探していたものです.
    自律走行(超音波距離センサ)
    Pythonライブラリを自律駆動可能にするにはgpiozero を使用した.このライブラリは、CamJamロボットを操縦し、距離センサーを使用する簡単なコマンドが含まれています.
    運転中は,超音波距離センサを用いて障害物を回避する.
    😵‍💫 超音波距離?
    超音波距離センサは超音波のパルスを出して、音が近くのオブジェクトから跳ね返るとき、送り返されるエコーを見つけます.その後、オブジェクトからの距離を計算するために音の速度を使用します.
    人がカメラによって検出されると、より正確なステアリング機構が引き継ぐ.これは、ロボットを直接検出された人の方へ運転させるでしょう.この作業を行うために,ロボットがどの程度の位置にあるかを計算するアルゴリズムを実装した.このように、ロボットは運転することができて、部屋を通してautonoumouslyに旋回することができます.
    ここでは、我々は人間に向かって駆動する超音波距離センサーを使用する方法の例です
    def is_not_at_human():
        global distance_threshold_human
        distance = sensor.distance * 100
        return distance > distance_threshold_human
    
    def approach_human():
        logging.info('Approaching human.')
    
        while is_not_at_person():
            robot.forward(speed)
            time.sleep(0.1)
    
        logging.info('Human reached.')
    
      robot.stop()
    
    ゲームAPIとのコミュニケーション
    APIとのコミュニケーションは、ロボットが正しくゲームをすることを確認するために重要です、しかし、最初に、ロボットは開いたゲームに接続する必要があります.
    ロボットが遊ぶことができることを確認するために、我々はロボットとバックエンドサービスとの間でAPIでコミュニケーションを始めました.ロボットがオンになったら、ポーリングを開始します.ポーリングの使用で、ロボットは近くに開いたゲームがあるかどうか探し続けます.
    💡 EHM,ポーリングとは何か
    サーバーからの新しい情報を取得する最も簡単な方法は定期的なポーリングです.これはサーバーに定期的な要求を送信することを意味します.たとえば、10秒ごとに1回.
    ゲームが発見されると、ロボットはプレーヤー情報を取得し、ゲームが始まったかどうかを確認するポーリングを保持します.その場合、ロボットはポーリングを使用して停止し、選手を狩りを開始します.
    プレイヤーが発見されると、ロボットはこの情報をAPIに送ります.すべてのプレイヤーが発見されたとき、またはシーク時間が終わると、ロボットはゲームから自分自身を切断し、参加する別のゲームを探して起動します.
    全ての異なるタスクをスレッド化する
    つの最大の課題は、適切な方法でロボットのすべてのさまざまなタスクを調整することでした.ロボットのタスクは以下の通りです.
  • 距離センサ駆動
  • 人間に従う方法の計算
  • 人間発見
  • 顔認識
  • これを行うには、我々はthreading with Python . 各スレッドは、あるイベントが発火されると、そのタスクを実行し始める.たとえば、人間が検出されるならば、もう一つの糸は人間に近づくためにコードを実行します.それから、一旦人間が接近されるならば、もう一つの糸はその行動をします.
    流れの概要

    反応するユーザーフレンドリーなwebapp。


    プレイヤーは、ゲームと対話するためのWebインターフェイスが必要です.したがって、我々は、プレイヤーがゲームを開始することができますゲームアプリを構築し、ゲームに参加し、ゲームの進行状況に従ってください.
    ゲームに参加すると、プレイヤーは名前と最大6枚の写真を提供する必要があります.これらの写真は、ロボットの顔認識のために使用されます.
    アプリは反応してビルドし、FireBase上でホストされています.それは連続的にゲームや選手の情報を取得するバックエンドAPIを使用しています.ユーザーフレンドリーなUIを達成するために、我々はよく知られて反応のUIデザインフレームワークで動作するように選択しました.このすべては、一緒にプレーヤーのための使いやすい、高速で信頼性の高いフロントエンドになりました.


    Java Springbootを使用したAPIのビルド


    ロボットとフロントエンドは、ゲームを何らかの方法で取得し、操作する必要があります.これを可能にするために、我々はJava Springbootで単純なREST APIを作りました.
    バックエンドの主な責任は、ユーザーが提供するデータを格納し、ロボットがそれを取得できることを確認することです.これを行うには、バックエンドはFirestoreデータベースを使用します.
    バックエンドが行う別の重要なことは、着信イベントを処理することです.これらのイベントは、ゲームを作成し、開始し、ゲームを終了し、プレーヤーがロボットによって発見されます.
    クライアントのバックエンド( API )を利用するには、Dockerコンテナにドロップして、Ci/cdでGoogleクラウドRunで展開しました.

    そのことだ。


    あなたがここまでそれを作るならば、おめでとうしてください.我々はすでに非表示を再生しているとビクターとシーク、我々はまた、彼のためのキュートでスマート兄弟を構築することを願っています.
    R & Dと記事のためのクレジット
    このプロジェクトはKdG University College .
    KDG(Geert de Paepe、トニミニ)で私たちのメンターに感謝します.