見出し画像

【ポケモン剣盾】画像認識を使ってダイマックスアドベンチャーを完全自動化

こんにちは。こちゃてす です。

今回の内容は、一時期話題になった、ダイマックスアドベンチャーの自動化についてです。


制作の背景

僕のTwitterを見ている方はご存じかもしれませんが、結構前から画像認識を用いたプログラムの制作を行い、ダイマックスアドベンチャーの自動化には成功しておりました。
しかし、ダイマックスアドベンチャーを自動化させてもマックスこうせきがなくなると停止してしまうといった問題に直面し、どうにかしてマックスこうせき不足問題を解決できないか考えていました。
そのとき思いついたのがダイマックスアドベンチャー自動化以前に作った
こちらのプログラム。

そう昨年作った、自動レイド参加プログラムです。

このプログラムを用いてデリバードレイドに入りまくってマックスこうせきを貯める作戦を思いつきました。
しかし、またここで問題が。

デリバードレイドを探して参加するのがめんどい!!!

Twitterで検索すればすぐ出てくるのですが、やはりずっと配布してくれる方はいない上に、配布に参加となると手順を踏むのもめんどくさい。
そこで、こちゃてすは自分のSwitchを1台を生贄として、デリバードレイドを常時稼働させることにしたのが、今年の2月末。
※デリバードレイドの配布については、私のTwitterアカウントをご確認ください。 2023/1/10時点では、配布の再開予定はないです

自身でレイド配布をすることで、大幅な時間の削減を得られたのですが、マックスこうせきの不足によって、いつダイマックスアドベンチャーが停止するのかが把握できないので、寝ている間に止まってしまうと時間が無駄になってしまっていました。
2つのプログラムを単純に結合させようにも、マックスこうせきがなくなるタイミングというのは周回するルートによって大きく変わってしまうため、一筋縄ではいきませんでした。

そこで活用したのが文字認識という技術です。
これは、画像から文字を抜き取りができる技術のことです。この技術を使えば、マックスこうせきの数を把握できます。マックスこうせきの数を把握できれば、それをプログラム内で処理させてレイド参加プログラムへ移行することが可能になります。より技術的なお話はまた別記事にて.....(いつか作ります)

そして、長期間の調整や改良を重ね、レイド参加プログラムをダイマックスアドベンチャープログラムへ組み込むことに成功しました。
(開発期間中にモンハンライズの自動化関連のプログラムを制作していたためにこんなにも期間が空いてしまいました笑)
これで、ダイマックスアドベンチャーとマックスこうせき集めをすべて自動で行ってくれます。

プログラムの公開について

前置きが長くなってしまいましたが、プログラムを配布します!
画像認識用プログラムなので、PokeControllerでのみ動かせます。
もちろん、キャプチャーボードやその他機材が必要です。

ポケモン剣盾\PokeController用プログラム  に入っています。
※注意事項等は必ずお読みください。※

↓PokeControllerの導入についてはこちら↓

↓機材調達についてはこちら↓

プログラム導入前準備などはフォルダ内の説明書、プログラム内に記載しています。
ボールを変更する場合や画像認識の閾値はかならず調整が必要なので、
ご了承ください。

プログラムの解説

プログラム内や説明で使用する単語
DMA:ダイマックスアドベンチャーの略称です。
巣穴:ダイマックスアドベンチャーの行先のことです。
ボス:巣穴最終部にいる伝説や準伝説のポケモンのことです。
ルート:巣穴内の道のことです。ランダムで変化します。
変数:プログラムにおいて、数値や文字列がを入れることができる箱のことです。
関数:プログラムにおいて、操作を記録できる機能のことです。同じ動作を何回も呼び出したりするときに定義します。
コメント化:プログラムの行始めに # を追加する操作です。#を付けられた行はプログラムとして認識されません。

オシャボ厳選機能
本プログラムのメインテーマです。主な仕様は以下の通りです。
・DMAに失敗した場合
⇒色違い確認せず、リセットもせずにDMAを終える(倒せるまでのルート検索) ※道中の捕獲ポケモンも時短のため確認しません
⇒ルートが固定化されている場合は、失敗してもリセットをかける

・ボスを倒したが、色違いではない場合
⇒ボスだけ色違い確認を行い、ポケモンをリセットする
※一定数連続して倒すとルートが固定化される
 ⇒ルート固定後はルート保持のためDMA終了後は必ずリセットをする

・マックス鉱石がなくなった場合
⇒DMAを中断し、インターネットに接続。オンラインレイドに参加してマックス鉱石を貯める。(ローカルにも対応可能です)
⇒マックス鉱石が900個貯まるとDMAを再開する

ボール選択機能
ボスを捕まえて入れ替えるための消費用ボールを選択できます。
変数self.Oshabo_ballを変更します。

self.Oshabo_ball = 'ボール画像名.png'

ルート中のポケモンを捕獲するボールを設定する変数もありますが、こちらはほぼ機能していません。ボール自体がほぼ消費されないからです。

巣穴位置選択機能
巣穴の行先を選択できます。0~3の数値を入力させます。

self.Pokemon_positon = 0 ~ 3

巣穴位置変更機能
※ボス色違い停止機能を使用している場合はこの機能を利用できません。
(この機能については後ほど説明)
色違い回収後の巣穴位置を変更して選択します。
0~3の数値を入力させます。

self.Next_positon = 0 ~ 3

ボス色違い停止機能
ボスの色違いが出現すると停止する機能です。
使用する:1 使用しない:0 で設定します。

self.Shiny_Endmode = 0 or 1

ボス討伐停止機能
ボスを討伐後、捕獲前にプログラムが停止する機能です。
使用する:1 使用しない:0 で設定します。

self.BossEndmode = 0 or 1

ボス別オシャボ設定機能(ボスリストチェック機能)
ボスが変化すると設定したボールを投げて捕獲します。
ボスリストチェック機能とボス登録辞書の設定が必要です。
使用する:1 使用しない:0 で設定します。

self.Bosslist_checkmode = 0 or 1

ボス登録辞書は以下のように設定します。(辞書の中身は一部のみ記載しています)
'ボスの画像名' : 'ボールの画像名' となっています。
ボスの画像はDMAフォルダの中に入れます。

self.Boss_list = {     #シンオウ
                       'Agunomu.png':'Moonball.png',        #アグノム
                       'Emuritto.png':'Moonball.png',       #エムリット
                       'Yukushy.png':'Levelball.png',       #ユクシー
                       'Giratina.png':'Moonball.png',       #ギラティナ
                       'Hidoran.png':'Conpeball.png',       #ヒードラン
                       'Kureseria.png':'Moonball.png',      #クレセリア
                       }

自動ルート固定機能
倒せるルートが出るまでは自動でルートを探索し続けます。ルート固定後はそのルートで失敗しても強制的にリセットを行い、ルートを固定化させます。

マックスこうせき残量確認機能
OCR(文字認識)を使ってマックスこうせきの残量を測定します。レイド参加プログラムとの連携に使用します。

LINE通知機能
PokeControllerを動かしているPythonというプログラミング言語では、LINEを使った通知を行うことができます。本プログラムでは、トークンを入手すれば簡単に導入することができるようになっています。

   #LINE通知関数
   def LINE_Message(self,notification_message, Picture=False):
       '''
       他のプログラムにLINE通知を導入する場合
       1.この関数全体をプログラムの一番下に入れる。(インデント込み)
       2.以下の関数呼び出しをコピーし、プログラムの任意の位置に入れる

       #テキストのみ通知
       self.LINE_Message('テストモードON')
       #PokeConに映っている画面を画像として送信する
       self.LINE_Message('テストモードON',True)

       '''
       from PIL import Image
       import io
       try:
           import requests
       except:
           print('requestsがインストールされていません')		
       try:
           #           ↓ LINEトークン入力 ↓
           line_notify_token = 'ここにLINEトークン入力'
           line_notify_api = 'https://notify-api.line.me/api/notify'
           headers = {'Authorization': f'Bearer {line_notify_token}'}
           data = {'message': f'message: {notification_message}'}
           files = {}
           if Picture==True:
               image_bgr = self.camera.readFrame()
               image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
               image = Image.fromarray(image_rgb)
               png = io.BytesIO()  # 空のio.BytesIOオブジェクトを用意
               image.save(png, format='png')  # 空のio.BytesIOオブジェクトにpngファイルとして書き込み
               b_frame = png.getvalue()  # io.BytesIOオブジェクトをbytes形式で読みとり
               files = {'imageFile': b_frame}
           requests.post(line_notify_api, headers = headers, data = data, files=files)
       except:
           print('トークンが正しくありません')

プログラム内のLINE通知関数内にトークン入力箇所があります。
ちなみにLINE通知はこんな感じで送られてきます。

画像8

プログラムテスト機能
LINE通知のテストや色違い画面の判定テストができます。テストをした後は0の状態に戻してください。
使用しない:0
LINE通知テスト:1
色違い判定テスト:3

self.Testmode = 0 or 1 or 3

色違い判定テストでは、色違いをうまく判定できるかを確認します。
色違いの識別には以下の画像をテンプレートマッチングさせています。

画像7

例えば、公式から配布された色違いセレビィの画面をみてみましょう。こちらのマークがどこにあるかわかるでしょうか。
プログラムではこの画面のときに色違いの判定をするので、色違い判定テストをする際はこの画面で待機させておきます。

画像8

しかしながら、画面は同じでもキャプチャーボードや環境によって画面の表示が異なっていることが多いです。そこで、テンプレートマッチングの閾値を変更する必要があります。デフォルト設定では0.88になっています。

#色違い確認の閾値
self.shiny_ths = 0.88

色違い判定ができていない場合はこの少数を小さくしていきます。
(下げすぎにご注意ください。下げすぎると、通常色のポケモンも色違いだと判定してしまいます。)

よくある質問

Q.プログラムを入れると、PokeController(とくにModified)が開かない

原因:pyocrがうまく入っていないことが多いです。

まず、コマンドプロンプトを開きます。

pip install pyocr

pipコマンドでpyocrをインストールしてください。何かダウンロードされ始めたら、うまくインストールされている証拠です。

Q.画像が入っているのにデバッグ処理で終了してしまう

画像9

原因:画像認識関数の処理でエラー

PokeController(本家様)で起こっている現象です。
本家様のisuuesで解決内容が書かれています。

または、プログラム置き場に変更内容を適用したファイルがあります。そちらをご活用ください。
Poke-Controller導入補助フォルダ内に入っています。

使える小技

PokeControllerを再起動させず、かつUSB切り替え器を使用せずにマイコンから有線コントローラに操作を切り替える方法

①HOME画面を開き、コントローラーの項目を開く

画像1

②持ちかた/順番を変える 

コントローラの割り当て

③この画面の状態にしておく

コントローラ接続画面

・PokeControllerの操作に切り替える場合
Use Keyboardにチェックが入っている状態でキーボードのAキーなど対応しているキーを適当に押す

画像4

・有線コントローラの操作に切り替える場合
有線コントローラ接続後、適当にボタンを押す
※マイコンはさしたままでもOKです

終わりに

なんと当プログラムでは、ダイマックスアドベンチャープログラムとは別に自動レイド参加プログラムとしても使用ができます!ぜひそちらも活用してください!

プログラム内ではこのあたりに該当しています。

画像5

※Shio.png,Shio2.pngの画像は入っていないので、もしプログラム内にある場合は、プログラム内から削除しておいてください。

☆すぺしゃるさんくす
今回、プログラム制作や資料提供にご協力いただいた方々です。
moi様ろっこく様アキルノ様牛乳屋様じゃんきー様はんぺん様に感謝申し上げます。

☆参考記事
アキルノ様の記事
https://glaceonlove.hateblo.jp/entry/2020/11/29/145046
Moi様版PokeController(Modified)
https://github.com/Moi-poke/Poke-Controller-Modified

☆---------------------------------------------------------------------------------☆
最新情報はX(旧Twitter)で確認してください。
https://twitter.com/kochatece12

こちゃてすプログラム置き場

Amazonほしいものリスト

☆---------------------------------------------------------------------------------☆


この記事が気に入ったらサポートをしてみませんか?