Longはプロジェクトのテーマを選択しました。 アイデアのうち、Guitar Heroに似たゲームがありましたが、コントローラーはあなたの手で、テーブルのドラムビートを叩きました。 また、アニメーションを作成するためのシンプルなスクリプト言語を使用して、コンピューターからBluetoothで制御されるLEDマトリックスを作成することも考えました。 アイデアは面白かったが、私はまだ何か間違っているように見えた。 その後、偶然このビデオを偶然見つけて、すぐに似たようなものを実装するというアイデアを得ました。 結果は次のとおりです。
パーツの設計からコンピュータービジョンの作成まで、このプラットフォームを作成するプロセスに興味のある方は、猫の下でお願いします。
回路図
数日間、私はこのデバイスがどのコンポーネントで構成され、どのように相互作用するかを考えていました。 最終的に私はこのスキームに来ました:
1.ウェブカメラは画像をラップトップに送信します
2.画像がボールの座標を決定します
3.座標はPIDコントローラー(XおよびYの2つの独立したコントローラー)の入力に送られ、コントローラーはサーボが回転する角度を計算します。
4.角度はArduinoに送信され、サーボに設定されます
次のように描くことができます。

エンジニアリングプラットフォームの仕組み
決定する必要がある最初のことは、プラットフォームがどのように見えて動くかということでした。 Youtubeでは、このプラットフォームの実装に関する多くのビデオを見つけることができます。 すべてをレビューし、このトピックに関するいくつかの出版物を読んだ後、プラットフォーム全体をボールベアリングに取り付け、構造全体が保持されるプレートに取り付けられた2つのサーボの助けを借りて傾斜させることにしました。 ビデオの冒頭で、プラットフォームの仕組みの実装を確認できます。
プラットフォームを傾けることができるように、できる限りサーボを使用することにしました。 9.4 kg / cmの瞬間にTOWER PRO MG996Rで停止しました。

プラットフォーム、トラクション、いくつかのファスナーをレーザーカッターで組織ガラスから切り取ることにしました(研究所にあるため)。 SolidWorksですべてを設計しました。 下から、クロスピースをプラットフォームに取り付けて、ボールジョイントとロッドのコーナーマウントの両方をプラットフォームに取り付けることにしました。 作成プロセスの写真を次に示します。


彼はボールベアリングを探し始めました。 適切なものを見つけることは非常に困難であり、高価でした。 彼らはボールの代わりに、鍵のようにカルダンを使うことができると私に言った。 カルダン、大きなボルト(すべてがその上にある)、ナットを買いました。 ジンバルにナットを溶接しました。 起こったことは次のとおりです。

プラットフォームアセンブリ
すべてをボルトで固定しました。 第一に、突然ミスをした場合、すぐにナットを緩めてエラーを修正できるためです。 第二に、最終的な設計はかなり面倒であることが判明しましたが、ボルトで固定されているため、たとえばキャビネットに分解してコンパクトに取り付けるのは非常に簡単です。

合板から正方形のプラットフォームを切り取り、その上にすべてを固定しました。 組み立てられたプラットフォームは次のとおりです。

カメラの高さを正確に把握するために、後でカメラのマウントを作成することにしました。
問題は、最大の偏向角を達成するために、サーボドライブを中心からどのくらいの距離に取り付ける必要があるかです。 タスクは純粋に幾何学的であり、鉛筆と紙でしばらく座った後、この距離を見つけることが判明しました。 サーボは合板に取り付けられ、金属板とボルトで合板に押し付けられました。
初めての体験
組み立て完了後、Arduinoの簡単なスケッチを作成し、プラットフォームをいくつかの角度に傾けました。
すべてが機能しているように見え、それを信じるのは困難でした。
デバイスで少し遊んだ後、角度を決定し、プラットフォームが床に平行になったときに最大角度と最小角度(±13度)を決定しました。 コードを書くときです。
コード記述
プログラムの構造について多くのことを考えた後、私はそれを4つのモジュールに分割しました。
1.コンピュータービジョン
2. PIDコントローラーの実装
3. Arduinoとのシリアル通信
4. Arduinoのスケッチ
私はすべてをC ++で書きました。 このリポジトリですべてのコードを表示できます 。
コンピュータービジョン
OpenCVを使用しました。 色によるオブジェクト検出を行うことにしました。 この記事は私を大いに助けた。 オブジェクト検出アルゴリズムは、いくつかのステップに分解できます。
1.カメラからフレームを取得する
2. RGBからHSVに変換する
3.マスクに特定の色を渡す(私の場合は白)
4.画像のモーメントの計算
5.瞬間のボールの座標の計算
PIDコントローラーの実装
ウィキペディアで PIDコントローラーについて読んで、githubでいくつかの既成の実装を確認した後、C ++で実装することは難しくありませんでした。 Habréでは、PIDレギュレーターに関する多くの記事を見たので、それには触れません。
Arduinoとのシリアル通信
OSXですべてのコードを書いて実行したので、シリアルポートでの通信に問題はありませんでした。 角度を「[ANGLE_X]:[ANGLE_Y] $」としてArduinoに送信しました。ANGLE_XとANGLE_Yは、それぞれ軸に沿った傾斜の原因であり、-100から100(パーセント単位の角度)まで変化しました。 この行を送信するには、「/ dev / tty.usbmodem1421」という形式のファイルに書き込むだけです。
Arduinoのスケッチ
接続図は次のようになりました。

Arduinoはシリアルポートでラインを受信して解析し、サーボに必要な角度を設定しました。
おわりに
BalanceBallの作成には約2か月かかりました。 最も難しかったのは、メカニズムの実装です。 PIDは実験的に調整されました。 計画には、プラットフォームの数学モデルの作成とPIDコントローラーの係数の理論計算が含まれます。
ご清聴ありがとうございました!
参照資料
プロジェクトリポジトリ: github.com/karfly/balanceball
マテリアルフォルダー: goo.gl/bmkexm
PIDコントローラー
離散PIDコントローラー
色検出とオブジェクト追跡