ゆるい鳥のためのゆるいボット

画像

クレイジーゲーム。 どのような若者がゆるい鳥について聞いていないのですか? 1日あたり約50,000ドルの収入ですか? ゲームは、財務報告書、面白い歌、黄色い記事、科学的研究に専念しています。 中国人は鳥を追いかける機械ロボットさえ発明しました。

ああ、2007年のお気に入りのiPhoneにアプリをインストールしました。 私の年齢では、ダウンロードスライダーを見て、 あなたの人生でダウンロードする最後のアプリケーションではないでしょうか?

はい 私は約20分間鳥を運転しました。10番目の塔より先に行くことはできませんでした。 さらに10分間プレイしました。 ああ、22塔-私の天井。 地獄への神経。

そして、私の友人であるキリルと私は、独自のロボットを作成することにしました。 Ostapが言ったように、中国の戦車を獲得してください。



それがどうだったかを読んで、何が起こったのかを見てください。

ボタンの下には3キロバイトのテキストと1分のビデオがあります。





ハーフフランコイン



まず、ロボットは機械的ではありません。 画面を押すことは、機械的なスティックではなく、電荷でシミュレートできます。 iPadの画面にコインを接着します。 青い電気テープでワイヤーをコインに取り付けます。 ワイヤーを介してコインに電流を送ります-iPadは押すことでトリガーされます。 この場所では、「 静電容量式スクリーン 」というスマートな言葉を言う必要があり、頭を振ることが重要です。

画像

もちろん、私から写真家はいません。



電流を制御するには、iPhoneが必要です。 彼はiPadで実行されているビデオゲームを撮影し、ゲーム画面をクリックする必要がある時点を認識し、コインに信号を送信します。 どうやって? オーディオワイヤ上。 周波数が20 KHz、期間が20ミリ秒の信号を生成します。 wavファイルを再生できますが、信号をプログラムで、より正確にシミュレートすることをお勧めします。 ただし、 PI and and and and and and and-and-の開始からプレスをシミュレートするコマンドまでの遅延は100-110ミリ秒です。 この番号を覚えておいてください。



コード例? 神様、これはORTのニュースよりも退屈です。今日はコードなしです。



そのため、iPhoneからの信号はコンデンサーへのオーディオ出力を通り、コンデンサーはコインに配線されます。



画像



計画を繰り返します







スキームによれば、半導体およびその他の電気技術装身具の仕様に従って、シリルは答えることができます。 しかし、彼は答えません、彼は謙虚です。 ボードには多くの装身具はありませんが、触れたいと思うと少しショックを受けることがあります。

電気工学に興味がある人のために
もちろん、これはコンデンサではありません。



画像

level> = 1V pnpのオーディオ信号が印加されると、トランジスタが開き、論理「1」を最初のインバータの入力に供給し、ダブルゲートFETトランジスタの極性を変更します。



FETを開くと、「空中」にあるコインが地面に接続され、画面で測定される容量がタッチと見なされるレベルまで増加します。 閉じた状態のゲート-ドレインチャネルの容量は5pFです。 トランジスタは、接続ワイヤの浮遊容量を減らすためにコインに直接取り付けられています。

このソリューションの前は、シールドケーブルでコインをトランジスタに接続する試みは失敗しました。



図には示されていません:ボードのグラウンドは、オーディオケーブルでタブレットのグラウンドに接続されています。





ゼロックスボックス



ロボットのミニスタジオは、使用済みの箱から作られました。 彼らは箱を半分にし、横に積み、下にあらかじめ接着したコインを置いてゲーム用iPadを注意深く置いた。 ボックスの天井に、iPhoneのビデオカメラ用の穴を開け、カメラを下のiPadのゲーム画面が見えるように携帯電話を上に置きました。 ちょっと待って、もう終わった。



iPadの下では、ゲーム画面がビデオフレームを完全に満たすように、 Bakhvalovの数値シミュレーションの本を置く必要がありました。

それだけです



競技場、鳥、ポールの認識



ここでは簡単です。

まず、ゲームのスクリーンショットを撮り、Photoshopで青い背景、鳥の赤いくちばし、アブサンとして緑の柱の色の濃さを測定しました。



フィールドの角度はほぼまっすぐなので、黒いフレームを捕まえるのは難しくありません。 ビデオバッファの720ポイントで1280アレイ全体を実行する必要はありません。 対角線を四隅から開始して、ゲーム画面の最初のポイントを見つけます。 これは、各角度で約5,000回の比較操作です。 ペニー。



はい! 私は完全に忘れました。



iPhoneで選択するビデオモードは何ですか? 良い周波数が必要です。



低動画モードを試しました。 192 x 144ピクセル。 頻度は20フレーム/秒です。 良くない。

480 x 360ピクセルの標準ビデオキャプチャ。 毎秒30フレームの頻度を与えます。 より良いが、十分ではありません。

ただし、ビデオモードの直接列挙では、1280 x 720のビデオ解像度で毎秒60フレームが検出されます。列挙方法はstackoverflow.comから取得されます。



逆説的に言えば、解像度が高いほど、フレームの頻度が高くなります。 スティーブ・ジョブズに何を望みましたか? 彼はまた、そのような驚きを提示しました。



iOSで調べ物をする人向け
@implementation ViewController static AVCaptureDevice *cam; static AVCaptureSession *sess; const float requiredFps = 60.0f; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. sess = [AVCaptureSession new]; cam = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *err = nil; AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:cam error:&err]; if (err) { NSLog(@"Failed to create AVCaptureDeviceInput: %@", err.description); } [sess addInput:input]; AVCaptureDeviceFormat *bestFmt = nil; int64_t bestDim = 0; CMTime tfps = CMTimeMake(10, 10 * requiredFps); for (AVCaptureDeviceFormat *fmt in cam.formats) { NSLog(@"Format: %@", fmt); for (AVFrameRateRange *fps in fmt.videoSupportedFrameRateRanges) { if (fps.maxFrameRate >= requiredFps) { if (CMFormatDescriptionGetMediaSubType(fmt.formatDescription) == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) { CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(fmt.formatDescription); int64_t sq = dimensions.height * dimensions.width; if (sq > bestDim) { bestDim = sq; bestFmt = fmt; } } } } } if (bestFmt) { if ( [cam lockForConfiguration:&err] ) { NSLog(@"Selected format: %@", bestFmt); cam.activeFormat = bestFmt; cam.activeVideoMaxFrameDuration = tfps; [cam unlockForConfiguration]; } else { NSLog(@"Failed to lock camera config: %@", err.description); } } else { NSLog(@"Failed to find a %f FPS format", requiredFps); } AVCaptureVideoDataOutput *output = [AVCaptureVideoDataOutput new]; [sess addOutput:output]; dispatch_queue_t queue; queue = dispatch_queue_create("cameraQueue", NULL); [output setSampleBufferDelegate:self queue:queue]; [output setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; [self.view bringSubviewToFront:cameraReal]; cameraReal.transform =CGAffineTransformMakeRotation(M_PI_2); // [sess startRunning]; turn on/off when view appear/disappear } - (void)viewWillDisappear:(BOOL)animated { [sess stopRunning]; [super viewWillDisappear:animated]; } - (void)viewWillAppear:(BOOL)animated { [sess startRunning]; [super viewWillAppear:animated]; }
      
      









結論だ。 ビデオ上の白い十字は、競技場の境界の角を示しています。 毎回計算しますが、これは必要ではありません。 鳥は赤十字でマークされています、私はこれらのパラメータを測定ごとに計算しなければなりません。 時間と鳥の座標を知ることで、その速度を簡単に計算できます。 また、クリック後の鳥のジャンプ速度と重力加速度を計算するのも簡単です。 毎秒2000ピクセル、ベトナム人はラウンド数が大好き))



なぜ速度を知るのですか? クリックコマンドの遅延のため、110ミリ秒。 事前にピクルスにするために、鳥の動きの放物線を計算する必要があります。



このアルゴリズムは、今日の金曜日に作成されたため、まだ完全ではありません。

しかし、私たちの鳥は100本の柱を頻繁に使用します。 一晩に二回、鳥ではなく金でした。



この問題を1000にし、落ち着かせるのは簡単だと思います。



みんな見て楽しんでいます。







注意広告



もちろん、このゲームのクローンを書きました。 誰もゲームをダウンロードしません、それは秘密ですが、特にあなたにとって、親愛なる読者のために、 Winter Jumpingアプリケーションへのリンクを提供します。

彼女の誕生日を記念して、彼女は無料で広告なしです。



ありがとう



ご清聴ありがとうございました。



All Articles