ラベル Autopilot の投稿を表示しています。 すべての投稿を表示
ラベル Autopilot の投稿を表示しています。 すべての投稿を表示

2021年5月30日日曜日

UWSCによるゲーム パックマン パーフェクトプレイ

 UWSCを利用して、アーケードパックマン(steam版)の1面をパーフェクトでプレイする動画です。微調整苦労しましたがようやく完成しましたので是非ご覧ください。

 方法としては、画像判定でパックマンの位置を識別し、ドットの2つ手前を目安にカーソルキーコードを送信する方法(UWSCのKBD関数)で移動させています。パワーエサを食べた時は点滅等で画像判定できなくなるためタイミングを見計らって同じようにキーコードを送信しています。タイミングがかなりシビアなため、タスクマネージャからパックマンとUWSCのプロセスの優先順位を上げています。

 パックマンで遊んだことが無い方向けに少しゲームの解説をしますと、パックマンには4色の敵キャラがいてこの敵キャラにつかまるとミスとなります。この敵キャラは、パックマンの位置と別の敵キャラの位置により動きが決まっています。例えば、赤い敵はパックマンをひたすら追いかける、ピンクの敵はパックマンの先回りするように動く、青い敵はパックマンと赤い敵の2点から移動先を決めます。この追跡パターンにより、自キャラであるパックマンが同じ動きをすれば敵キャラも同じ動きをします。そのため、同じ操作をすれば同じ動きになるため、敵の位置を判定せずともステージをクリアできるようになります。



2021年5月9日日曜日

Power Automate Desktop の 画像判定がゲームで使えるか?

  Power Automate Desktopの画像判定機能を実験してみました。用意した画像にマッチする画像が画面上に表示されているか判定するための機能です。RPAツールには画像を判定する機能たいてい実装があると思いますが、試行錯誤するときには特にPADは良くできていると感じました。

 他ツールは調べたい画像イメージは事前にキャプチャしてファイルに保存しておく必要がありますが、PADはWin+Shift+Sと同じような動きで、その場でデスクトップの一部を指定して抽出することができます。編集画面でキャプチャした画像を確認できるのはもちろんのこと、複数キャプチャした場合の選択、一度対象から外してもキャプチャ履歴が残っていますので試行錯誤がやりやすくなっています。

 実行してみた印象としては、パフォーマンスに難ありですね(何に使おうと思っているのかバレますが・・・)。画面全体やフォアグラウンドデスクトップ全体等ではなく、座標指定で範囲を絞ることができますので、可能な限り絞り込みましょう。

 1か所ハマったのが、「リストにある画像を全て検索する」のオプションです。オフにした場合は先頭だけ検索するのかと想像して実験していましたが、複数画像が指定されている場合はAND検出かOR検出かの違いでした。


ちなみに先日の背景が透けて見えるステータス表示が検出可能なのか実験もしてみました。下画像の例では、右端中段に「浮き」の拡大画像があります。アタリがあると浮きが動き、最終的にはこの拡大表示が消えるのですが、この部分を検出させることはできませんでした。ほぼ背景ということもあり検出は難しそうではありますが、明るさを調整して真っ暗な状態にしてみてもできなかったので、厳密に画像が一致しなければ検出されないように思います。



2021年5月8日土曜日

Power Automate Desktop : 画像検出の仕様を確認する

 Power Automate Desktopには、画像を検出するアクションがあります。コグニティブサービスの画像検索は難しそうなのでオンプレミスで実行できる「条件:画像が存在する場合」と「遅延:画像を待機」で、画面上の画像を検出するアクションがどのような仕様なのか確認しました。今回は特に詳細部分に隠れている「画像照合アルゴリズム」の「基本」と「詳細」の違いにフォーカスしています。下図の下部にある詳細:画面照合アルゴリズム:基本 or 詳細 の部分になります。

結論:

 結論としては、「画像照合アルゴリズム」が「詳細」の場合は、デフォルトの「基本」より厳密に照合させる仕様のようです。基本の場合は多少ノイズがあっても検出します。

実験方法:

 Chromeのアイコンを抽出対象の画像と設定し、同じ画像に対してラインを重ねる本数を増やし、どちらの設定の場合どのような結果になるのか確認を行いました。他のウィンドウで目隠しをすることで対象の画像のみを検査させるようにしています。

実験結果:

 「画面照合アルゴリズム」が「基本」の場合、線が3本入っている状態でも検出してくれました。つまり下図では、一番右の線が4本重なっている図以外は、オリジナル画像と一致すると判定しました。

 「画面照合アルゴリズム」が「詳細」の場合は、オリジナル画像しか一致する画像として判定しませんでした。突き抜けているラインを半分程度重ねた時点で検出されなくなります。それ以外の「詳細」の特徴としては、「基本」と比較して検出処理に時間がかかるようです。目に見えて動作が遅くなりました。「検索モード」を指定されたサブ領域のみを検索するように設定して処理範囲を絞ったほうが良いように思います。

 また、画像の拡大・縮小を行った場合はアルゴリズムに関係なく一切検出しなくなります。一致度のようなパラメタが指定できるようになると利用シーンが増えるように思いました。

画面照合アルゴリズム基本と詳細






2021年5月7日金曜日

Power Automate DesktopのOCR機能でゲームのステータスをチェックできるか?

 Ultimate Fishing Simulatorに限らず、ゲーム中の状態やステータスが画面上に表示されています。釣りの場合だと、水深や距離、ドラグの強弱、浮きの状態等でしょうか。
 今回は画面上に表示されているステータスがPower Automate DesktopのOCR機能で読み取ることができるか実験してみました。ちなみにUltimate Fishing Simulatorでは、右下に表示されている距離の左が自分の位置からの距離、右が水深となっています。

 拡大するとこのようになります。プロポーショナルフォントであることと、数値が表示されている部分も背景が透けて見えている点がなんとなく読み取りにくそうです。

 やってみたらできました。水深が表示されている部分だけを座標指定して読み取らせていますが、小数点や単位のメートルも識別しています。想像よりも精度が高い印象です。


 ポイントとしては以下になります。結構すごいことが簡単にできてしまう、そんな印象です。
  • このゲームは、解像度に合わせて画面上の表示領域も解像度に合わせて変化します。そのため解像度を落とすと文字の解像度も落ちるため、解像度を下げすぎると全く読み取れなくなります。1280x1024は読み取ることができましたが、800x600は読み取ることができませんでした。800x600だと人間が見ても読みづらいですけどね。そこそこ解像度が必要です。
  • 背景が透けて見える仕様もやっかいです。背景の明るさは影響を受けないようで、昼間の空やボートの白い部分でも問題ありませんが、植物や水面のような濃淡さ混じっている背景だとうまく読み取れませんでした。
  • 画質、アンチエイリアスは影響がないようでした。








2021年5月5日水曜日

Power Automate Desktopのデバッグモード向け高速化手法

この記事を書き上げて公開する前に、1フローの実行時間を設定するメニューがあることが判明。無意味な記事となりました。Power Automateで釣りができるまでずいぶんチューニングしたのですが意味なかったです。でも、結構時間かけて書きましたのでいちを残しておきます。

-------------------------------------------
 みなさん、Power Automate Desktop使ってますか?先日PADで「Ultimate Fishing Simulator」のRPAをやってみましたが、PADでゲームのRPAをする場合に気を付けたいことをまとめておきたいと思います。端的にはデバッグモード向けの高速化手法です。なんでデバッグモードなの?って話ですが「映え」です。このサイバー感のあるデバッグモードを使わない手はないです。そもそもなんですが、ゲームを遊ぶためではなく自動化の実験をするために買ってますので。。。えっ?

全ての命令の実行に時間がかかる

 当たり前と言えば当たり前ですが、デバッグモードの場合は気になるレベルで時間がかかります。リアルタイムに何かをするフローのデバッグには使えないレベルですが、でも使います。どのぐらいかかるかというとループや判定でも1行につき0.1秒程度かかるようです。いくつかパターンを変えて測定してみたところ、0.12秒~0.14秒/命令となりました。マシンスペックは関係なく、このぐらいのスピードで実行されるよう調整されていると考えています。PADにはオプション等見当たりませんが、レジストリ変更でもいいので調整できるといいんですけどね。
 例として以下を見てください。このループ処理に何秒かかると思いますか?100秒ちょいであってほしいですが136秒かかります。3行の命令がありそれぞれ100回実行されるため、300行処理されますが、その300行の処理に36秒かかるということです。


 次に以下の処理は何秒かかるでしょうか?Loop行とEnd行が20回、Wait行が5×20回となり、140行処理されることになります。ロジック上やっていることは同じですが、実行される行数が半分になりました。結果実行に要する時間は118秒でした。

 ちなみにデバッグモードでなければ、どちらも103秒と普通のスピードで実行されます。

 判定文についても触れておきたいと思います。次の処理にはどれぐらい時間がかかるでしょうか?4行の命令が100回繰り返されるのでだいたいわかりますよね。実測では45秒でした。判定が真となる場合はElse行は処理されないのがポイントです。
 では、先頭行のflagを0以外の値にするとどうなるでしょうか?この場合、Else行が実行されるようになるため5行×100回処理され、実測では56秒でした。

 ポイントとしては、こだわる場所のループ回数は減らす、判定は真となる場合多くなるようにする、となります。

サブフローは使いどころに注意

 もう一度登場します基本形、この処理には136秒かかりました。


 では、1秒のウェイトをサブフロー先に移動させるとどうなるでしょうか?275秒となりました。サブフローの呼び出し1回で1秒以上かかることになります。画面を見ているとサブフローに処理が移る時にタブの切り替え操作的な動きをしているのと、見ていて単純に遅いです。今回のケースでは、ループの中からサブフローを呼び出すのではなく、サブフローの先でループさせると相当早くなりますね。

時間調整は「Wait」ではなく「キーの送信」

 遅延カテゴリにあるWaitは、秒単位でしか待ち時間を指定できません。ですが、1/10秒単位ぐらいで待ち合わせを挟みたいことってありますよね。そんなときはマウスとキーボードカテゴリにある、キーの送信を使います。パラメタに「キー入力の間隔の遅延」と分かりにくい説明ですが、1文字(1キー)入力後の待ち時間をミリ秒単位で指定できるようになっており、Waitよりも細かく調整できます。1文字入力するたびに指定した時間待ち合わせをしますので、n文字入力する場合は指定した遅延時間がn倍になります。「間隔」とありますが1文字の場合でも有効です。ゲームの実行に影響のない特殊キーを選ぶと良いと思います。



2021年5月2日日曜日

Autopilotを実装する上での厄介な話

 ゲームをAutopilotしようとすると、次の操作に進むための待ち合わせは画面上の変化になるかと思います。ステータス的な状態を色で表現してくれていれば、赤くなったら、赤っぽくなったら薬草を使うといったことになるかと思います。

 先日紹介したUltimate Fishing Simulatorでも、釣れた後の売る、リリースする、の選択ダイアログの表示により、釣れたことを判定しています。

 普通じゃん、と安易に考えてはいけません。極端な例ですが、2種類の釣れた場面の画像を並べてみました。釣れた魚のサイズで2パターンの見せ方がある?ということではありません。例えば釣り終わった判定で[Sell]の緑ボタンを検出しようとします。位置が2か所ある以外にもう一つ大きな違いがあります。それは背景の色(=明るさ)によってボタンの色も微妙に違ってくるということです。拡大して確認しないとわかりませんが、背景が透けているような演出になっています。画像では夜に釣れた時のほうが、緑色の[Sell]ボタンが明るい色に見えないでしょうか?実際には昼間に釣れたほうの[Sell]ボタンのほうが明るくなっています。昼間の[Sell]ボタンの緑要素(RGBの0~255の値)は179、夜の[Sell]ボタンの緑は175になります。ボタンの背景色である緑色が半透明になっていて、背景の明るさに影響を受けているということです。ゲーム的には視覚効果なのかと思います。

 じゃあ緑が175以上って判定すればいいじゃんと思うかもしれませんが、それだと空の色のほうがよっぽど緑要素が大きいので誤判定になってしまいます。ここが難しいところです。半透明ではないダイアログを表示してくれれば、色判定でもパターン検出でもできるのですが・・・ 


簡単な回避策としては以下2点。
  1. このゲームは、釣りをする時間帯を自由に変更できます。そのため、常に夜になるように操作することで問題を回避できます(どう夜にするかはまあおいといて)。
  2. もう1つ、最近のゲームにはよくある設定ですがこのUltimate Fishing Simulatorにもある、画質設定を暗めに設定するという方法があります。このゲームには、明るさ、明暗さ、ガンマの3点指定するオプションがありますので、ゲームの状況を判別できる程度に暗く設定しておくと、時間帯に関係なく夜っぽくなりボタンの色の濃さが安定するので、色判定が安定します。
とまあこんなことを考えてやっているといろいろノウハウが身について面白いですよって話です。


2021年5月1日土曜日

Power Automate Desktopに釣りさせてみた

 UWSCで実現した自動の釣りを Power Automate Desktop (以降PAD)に移植してみました。ロジックは出来上がっているので簡単かと思いきや結構大変でした。まずは動画をご覧になってください。1匹釣り上げるのを見届けて頂けましたら十分です。


 コンセプトが全く違うものを比較するのはナンセンス、と分かっていても注目度抜群のPADですのでなんかすごいことになるのではと思いましたが、もう一声という感じでした。UWSCが凄すぎるだけなんですけどね。そんなことしようとする人はいないと思いますが、ゲームを自動化する場合に注意したい点をまとめましたのでご参考まで。

デバッグモードのパフォーマンス

 デバッグモードで動かさないと何で処理しているのかさっぱりわからなくなるため、今回はデバッグモードで動くことを条件としてロジックを組みました。デバッグモードで実行した場合、通常実行モードの1/100程度のスピードとなりますがそれがまた大変な制約でした。ステップ全てが目視でチェックできるようにしてあるからだとは思いますが、タイミングを調整するにはこのうえなくやりにくい状態です。今回はデバックモードでも継続して釣りができるように調整したため、早め早めのライン出しとなっているため1匹釣り上げるのに凄く時間がかかっています。画面を見ていると、処理以外の制御文も同じように時間がかかるようです。例えば、次の処理はどちらが時間がかかると思いますか?

if TRUE then
    NOP
else
    NOP
endif

if FALSE then
    NOP
else
    NOP
endif

同じであってほしいですが、FALSEの時のほうが時間がかかります。そう、「else」行を処理する分だけ時間がかかるのです。例えば危険回避とかの少しでも早く始めたい処理を真側で処理するようロジックを組んだほうがいいです。今回の例ではテンションのチェックになりますね。デバッグモードでなければ測定できるレベルでの差ではないようです。そもそも何にこだわっているのか?って話ですけどね。

色判定

 表現が難しいですが、PADはよくあるウィンドウアプリの制御を想定しています。ボタンやリスト等のコントロールで構成されるアプリケーションは制御が簡単です。コントロールの状態を判定することもできます。ゲームにはそういったコントロールパーツが存在しないため、特に状態をチェックする方法は画像判定に頼るしかありません。ですが、最近のゲームはメニューやステータスの背景もなんとなく透けてる状態なので画像判定が難しくなっています。そのため、特定座標の色の濃さ等で判定するしかなく今回もそのようにしています。一番の問題は、PADには座標の色をチェックする機能がありません。RPAで効率よくしたいと思っている人に必要ないんですけどね。PADは、Java,PowerShell,Python,VBScriptと思いつく限りの外部プログラムを呼び出せますので、今回はPowerShellで実現しています。引数を渡せないので必要な個所別にそれぞれ別のスクリプトになっています。

レスポンスと品質

 通常の文字列をコピー&ペーストするように制御文をコピーすることができますが、レスポンスが非常に悪く、思った場所にペーストするのがたいへんです。常に1テンポ遅れて反映される感じです。PADはローカルに情報を保持せず全てクラウド側に保存されるため、もしかすると1操作毎にOneDriveに一時ファイルを保存しているのかもしれません。作業中、不定期にエラーで編集画面が停止してしまうのはまいりました。

2021年4月30日金曜日

Autopilot for Ultimate Fishing Simulator mode lure action

Ultimate Fishing Simulatorでは、5種類のルアーアクションが設定されています。

Straight Slow:ゆっくりリールを巻く(スピード1) Straight:普通の速度で巻く(スピード3) Lift & Drop(巻きながらpumpする) Stop & Go (底で巻く、止めるを繰り返す) Twitching (pumpを繰り返す。巻かない)

この5つをAutopilotで再現してみました。動画をご覧になってください。


 上記のアクションを一定の間隔で繰り返していると、3段階あるレベルが徐々に上がっていき、最高Level3まで増えます。そうなるとより魚を誘うという設定ですが、実際プレイしている感じだと、どんな動きでも釣れる印象です。やったほうが楽しいと思いますが、Lift&DropやStop&Goのような操作をする必要はないかなと思います。
 Twitchingは操作の速さを2段階でしてみました。操作はマウス右ボタン(左じゃないんですね)を押す・離すを繰り返すだけです。押す操作と離す操作を1200msecで行っている操作と、続けて500msecでせわしく行っている映像があります。この範囲を超えるとTwitchingと認識されなくなるようです。
 ルアーアクションの実演なので魚に邪魔されないようこのステージには魚を入れてありませんが、魚を入れてみると当然ながら釣れます。特にTwitchingはマウス左ボタンではなくマウス右ボタンのみの操作となるためルアーが動かないわけですから釣れる気がしませんが、このゲームでは釣れてしまいます。そういうもの?

2021年4月29日木曜日

Autopilot for Ultimate Fishing Simulator model float

 RPAツール(今回はUWSC)で、Ultimate Fishing Simulatorの完全自動化を実現しました。一晩中自動で釣りをしてくれることでしょう(やってないけど)。 まずはYoutubeにアップした動画をご覧になってください。


 キャストした後のドラグのピコピコっとした動きがサイバーな感じしませんか?特に意味はないのですが、カチカチ切り替えられるところを一定のリズムで切り替えるといい感じかなと思って切り替えています。
 そもそも何言ってんだ?という方向けに簡単に解説します。RPAとはRobotic Process Automationの略で、PC上での操作を自動化するための仕組みになるかと思います。簡単なところではExcelマクロがありますが、帳票の内容を別のシステムに入力する作業を自動化するといった機械的な作業を効率化するために利用するものです。
 そういったツールをゲームに適用するとどうなるかという話ですが、ゲームの状況に応じた操作をすることで自動でゲームを進めることができます。特にRPG的な同じ作業を繰り返すゲームには有効です。1点重要なところですが、オンラインゲームではこういった方法でゲームを進めることは禁止されていますので、絶対にしないでください。運営側での検出は簡単だと思いますので翌日にはBANされることでしょう。Ultimate Fishing Simulatorはオンラインゲームではありませんが、月間ランキングといった要素があるので、ご迷惑とならないよう自作ステージでの確認に留めています。


 次にどんな風にゲームに適用するかですが、方法は2種類。決まったタイミングでキーやマウス操作をして進める方法と、何等かの条件が満たされたら次に進む、です。画面遷移や何か操作した次の操作が確実であれば、決まったスピードでキー入力やマウスクリックをするだけで進みますね。アイテムの購入を例とすると、お店に入る→種類を選ぶ→商品を選ぶ→個数を入力→購入ボタンをクリックで購入できそうですよね。操作は固定なので画面を見なくてもできそうではないですか?こういうパターンはとても簡単です。操作した内容を再生するだけです。もう1つは何か条件を満たしたら次の操作を行うパターンで、今回は画面上の特定座標の色を見て想定する状態になったか判定しています。
 それでは、釣りゲームに必要となるポイントと、Ultimate Fishingどのように実現しているかご説明します。

キャスト:

キャストは簡単です。左クリックを押している時間で距離が変わりますので、適当に1秒、2秒押したままとするだけです。ゴルフゲームのようにタイミングが必要なければ、決まった時間ボタンを押したまま、または一定間隔で2度目を押すぐらいで良いと思います。

合わせ:

どの釣りゲームでも難しいと思います。今回はリールから糸を出す(スペースキー)、巻き上げる(左クリック)を一定間隔で行うことで、その時魚が餌に食らいついていたら自動的に合わせが行われるこのゲームの仕様を利用しています。浮き釣りであれば浮きの動きを見るべきかと思いますが、このゲーム、浮きの拡大画像が小さすぎて画像解析で判定することはできませんでした。

巻き上げ:

簡単そうに思われると思いますが、ここが一番難しいです。テンションを意識して巻き上げないとバレてしまうのでゲーム毎に工夫が必要です。Ultimate Fishingの場合、テンションに合わせてバーの長さと色が変わります。その色を判定して、リールを巻く、放置、糸を出す、テンションをゼロにするの4段階の対応をしています。かなり短い間隔で処理してますのでバレることは全くありません。

巻き上げ完了:

釣れたことをどう判定するか?という話です。このゲームでは、釣れた後、確保するかリリースするかを選択するボタンが出ます。その色がユニークであるため、ボタンの位置(座標)にその色が現れたかどうかで判定しています。釣れた魚の大きさで、ボタンの位置が2パターンに分かれますので2か所のポイントの色をチェックしています。小物が釣れた時は画面下部にボタンが出ますが、その時は「take screen shot1」と出ます。掬い上げるのに網が必要となる大物は画面上部にボタンが出ます。その時は「take screen shot2」と出ます。よろしければ今一度見直してみてください。
ということでこんな感じでプログラミングフィッシングが可能となります。「何が面白いの?」と思う方もいらっしゃると思いますが、技術的な好奇心とだけ言っておきましょう(笑)。