Giter VIP home page Giter VIP logo

poke-controller-modified's Introduction

Poke-Controller MODIFIED

本質的な部分はそのままに、機能を一部追加します

変更点

~ver3.0の追加・変更点

  • ログ機能の追加
    ボタン入力をメインウィンドウに表示、加えて各関数のログをコンソール画面に表示&ファイル出力を行う
    ある程度確認しましたがボタン入力表示にはバグがあるかもしれないので注意
  • 画像認識時に該当部分を青枠で表示する機能を追加
    isContainTemplate関数にshow_position=Falseを引数で渡すと表示しない
  • サンプルスクリプトの追加
    • InputSwitchKeyboard.py

      Switchのキーボードの自動入力のサンプルコード

    • InputSerial.py

      シリアルコードの入力自動化サンプルコード

    • LoggingSample.py

      マクロプログラム中でのログのとり方のサンプルコード


~ver2.8の追加・変更点

  • 開発の都合でpythonの動作確認バージョンを3.7.xとしています(とはいえ3.6でも動くはずです。)

  • FPSの設定の追加

  • 画面表示サイズの変更オプションの追加

  • ログエリアはサイズの変更に応じて横方向に伸縮するように

  • スティック周りの機能追加

    スティックの傾きの強さの設定

    • スティックの移動可能な範囲を単位円の内部と考えて、
      傾き度合いを0以上1以下で設定可能にしました。
      例えばDirection(Stick.LEFT, θ, r)
      というコマンドは、左スティックのx,y座標が
      x=r*cosθ
      y=r*sinθ
      
      となるような入力をします。この場合は半径rの円となります。
    • r=1.0をデフォルト値としているので
      Direction(Stick.LEFT, θ) と書いた場合はr=1として認識されます。
      より詳しくはサンプルコードを同梱していますので
      そちらとSwitch内設定のスティックの補正画面を合わせて確認してください

    マウスでスティック操作機能

    • マウスで直感的な操作ができそうな感じにしています。ラグがあるので操作は結構難しいです。
      操作円の半径は変更可能なので、需要があればConfigファイルに載せます。 タッチパネル対応モニタ使用の際などの挙動は不明ですが、そちらのほうが向いているかもしれません。
      またこの機能の追加に伴い、'Ctrl+左クリック'がクリック点座標表示になっています。
  • 画面キャプチャ機能の追加

    • キャプチャしている画面部分を'Ctrl+Shift+左クリック'しながらドラッグした範囲をキャプチャすることができます。
  • メニュー機能の追加

    現状は以下の機能のみ

    • LINE連携機能のToken確認
      Python Commandの関数にLine通知コマンドを追加しています。その設定がちゃんとできているかの確認です
      Usage

      • LINE Notifyより通知用のTokenを取得 Tokenをline_token.iniのpaste_your_token_here部分に貼り付け テキスト通知をしたいときは
        self.LINE_text("通知したい内容")
        画像認識を用いるプログラム内では
        画像とテキストを同時に通知することが可能で
        self.LINE_image("通知したい内容")
        と書きます
      • アプリ起動時にLINE Token Check FAILED.と表示される間はtokenが間違っています。
      • Tokenが正しい場合、アプリ起動時にAPI制限までの回数・リセットされる時刻が表示されます。メニューのLINE Token checkから残数を確認できます。 頻繁に通知を行うと制限に達することがあるので気をつけましょう
      • 複数のトークンに対応しています。 tokenファイルに改行して別のトークン名を追記し、関数に引数として渡すことで使い分けてください。 詳しくはサンプルコードを参考にしてください
    • Pokémon Home連携

      そのうち大幅に変わるかもしれません
      フォルム別の名前があるポケモン(ロトムなど)については現在第7世代までしか対応していません
      SerialController/db/poke_form_name.csvに追記することで対応可能になります

    • キーコンフィグ追加

      主要なキーのコンフィグ機能を追加しています。
      注意点として、複数キーを同時に割り当てても、同時に入力されることはありません。少々不親切ですがお許しください
      また、これにともなって設定ファイルの書式が変わっています。手動で書き換え可能になっています。
      デフォルトに戻す機能はつけていないので、戻したいときは設定ファイルを消すか、Setting.pyを読んでください。

  • ボタン入力関数表示機能追加プログラム(作 KCT様)を組み込み ver3.0以降独自の入力表示機能実装に変更

  • その他GUIのブラッシュアップ

  • Codeのリファクタリング

    私の開発環境の関係で全体的にPEP8準拠寄りにしました

    • タブインデントからスペース4つインデントに変更
    • 不要なimportの削除、並び替えなど最適化

Installation

必要なライブラリ(+推奨するライブラリ)が増えています。 構築した環境にインストールしてください。

pygubu
requests
pandas
numpy
scipy

requirements.txtを使用して、必要なライブラリを一括でインストールできます。

pip install -r .\requirements.txt

おまけ

  • 好みの表示サイズがある場合は、Window.pyのそれっぽいところに自分好みのサイズを追記してください。fpsも同様です。

  • OpenCVで行う処理をNVIDIA GPU(CUDA)で動かすためのサンプルコードを同梱しています(TemplateMatchingTimeMeasure.py)。
    ただし、pip install でインストール可能なライブラリでは使用できません
    使用してみたい方は、各自で自分のGPUに対応したオプションでpython用のOpenCVをソースコードからビルドして貰う必要があります。
    それなりに難易度が高くかなり手間な処理になりますが、余裕がある方は試してみてください。
    OpenCV + CUDA (+ Windows) などと検索すればビルドの解説ページが出てきます。

  • SciPyは最短経路の算出に使用しています。
    具体的には、Switchのソフトウェアキーボードを有向グラフに見立てて、文字入力の最適化を試みています。
    サンプルコードを同梱しているので、興味のある方は試してみてください。

以下は本家様の説明になります。


Pythonで書く!Switchの自動化支援ソフトウェア

All Contributors

セットアップと使い方

分からないことや改善要望などがあれば遠慮なくIssueまで
Q&A解決済みIssueなども役に立つかもしれません

クイックビュー

簡単に機能を見てみましょう

コマンド作成用のライブラリの提供

通常のボタン押下
self.press(Button.A) # Aボタンを押して離す
self.press(Button.A, 0.1, 1) # Aボタンを0.1秒間押して離した後, 1秒待機

左右スティック & HAT(十字)キー
self.press(Direction.RIGHT, 5) # 左スティックを右に5秒間倒す
self.press(Hat.LEFT) # 十字キー左を押して離す

同時押し
self.press([Button.A, Button.B]) # AボタンとBボタンを同時に押して離す

ホールド
self.hold([Direction.UP, Direction.R_DOWN], wait=1) # 左スティックを上, 右スティックを下に倒して1秒待つ
self.press(Button.A) # スティックを倒した状態でAボタンを押して離す

リファレンスやデフォルトのコマンドなども参考にして中身を覗いてみましょう
作成したコマンドや便利な機能はプルリクIssueで頂けると非常に喜びます

Pythonファイル管理

作成したコマンドのclassは1つのPythonファイルの中にいくつも記述できます
またPythonCommandsのフォルダ内であればいくつもフォルダを作成可能です
自由に配置していきましょう

実行時のコマンド切替

配置したコマンド群はマウス操作で簡単に切り替えることができます

リロード機能

Poke-Controllerを動作しながらファイルの変更を再読込して反映することができます
こつこつデバグしたい方におすすめ!

画像認識

キャプチャボードでSwitchの画面を取り込めば, シリアル通信だけでは叶わない操作もできるかも
これらもライブラリとして機能を提供しています
self.isContainTemplate('status.png') # テンプレートマッチング

現在の機能(実装内容)は少ないがアップデート予定
リリース前GUI

キーボード操作

キーボードをスイッチのコントローラとして使用することができます

Switchコントローラ キーボード
A, B, X, Y, L, R 'a', 'b', ...キー
ZL 'k'キー
ZR 'e'キー
MINUS 'm'キー
PLUS 'p'キー
LCLICK 'q'キー
RCLICK 'w'キー
HOME 'h'キー
CAPTURE 'c'キー
左スティック 矢印キー

リリース

貢献

これらの貢献者に感謝します (emoji key):


KawaSwitch

💻 🚧 📖 💬

Moi-poke

💻 💬

xv13

🐛

vyPeony

💻

このプロジェクトは, all-contributors仕様に準拠しています. どんな貢献も歓迎します!

ライセンス

本プロジェクトはMITライセンスです
詳細は LISENCE を参照ください

また, 本プロジェクトではLGPLライセンスのDirectShowLib-2005.dllを同梱し使用しています
About DirectShowLib

poke-controller-modified's People

Contributors

kawaswitch avatar moi-poke avatar u-1f992 avatar rokkoku avatar futo030 avatar omret0602 avatar allcontributors[bot] avatar progmem avatar kyure-a avatar ap0sec avatar kagasu avatar vypeony avatar

Stargazers

 avatar  avatar yaYoi avatar しゅみる avatar TAKAFUJI Masaya avatar uni avatar K.Agata avatar ktkiyoshi avatar  avatar  avatar kotayan avatar Justus Chen avatar おがどら avatar Masanori Ogino avatar Hs_Yeah avatar  avatar Taylor Thomas avatar Curosiz avatar  avatar  avatar Junky(じゃんきー) avatar

poke-controller-modified's Issues

直接触るメソッドは補完が効くようにする

pressなど、コマンド作成者が直接触るメソッドには型ヒントとdocstringを書きましょう。

以下はサンプルです。

def press(self, buttons: Button | Hat | Direction | list[Button | Hat | Direction], duration: float = 0.1, wait: float = 0.1):
    """
    ボタンを押下する/スティックを操作する

    `buttons`を配列で指定すると同時押しになります。
    
    Args:
        buttons (Button | Hat | Direction | list[Button | Hat | Direction]): 実行する操作
        duration (float): 入力の継続時間
        wait (float): 入力後の待機時間
    """
    pass

画像認識コマンドについて

srcがNoneならreadframeする、という方式に変更予定です。
また、docstringも記載予定です。

def isContainTemplate(self, template_path, threshold=0.7, use_gray=True,
show_value=False, show_position=True, show_only_true_rect=True, ms=2000, crop=[], mask_path=None):
src = self.camera.readFrame()
src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) if use_gray else src
if len(crop) == 4:
src = src[crop[1]: crop[3], crop[0]: crop[2]]
template = cv2.imread(_get_template_filespec(template_path), cv2.IMREAD_GRAYSCALE if use_gray else cv2.IMREAD_COLOR)
# mask用画像読み込み
if mask_path == None:
mask = None
method = cv2.TM_CCOEFF_NORMED
else:
mask = cv2.imread(_get_template_filespec(mask_path), 0)
method = cv2.TM_CCORR_NORMED
w, h = template.shape[1], template.shape[0]
res = cv2.matchTemplate(src, template, method, mask)
_, max_val, _, max_loc = cv2.minMaxLoc(res)
if show_value:
print(template_path + ' ZNCC value: ' + str(max_val))
top_left = max_loc
bottom_right = (top_left[0] + w + 1, top_left[1] + h + 1)
tag = str(time.perf_counter()) + str(random.random())
if max_val >= threshold:
if self.gui is not None and show_position:
# self.gui.delete("ImageRecRect")
self.gui.ImgRect(*top_left,
*bottom_right,
outline='blue',
tag=tag,
ms=ms)
return True
else:
if self.gui is not None and show_position and not show_only_true_rect:
# self.gui.delete("ImageRecRect")
self.gui.ImgRect(*top_left,
*bottom_right,
outline='red',
tag=tag,
ms=ms)
return False

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.