15 |
Pongと強化学習 (113) |
FPGAとdqn_atari.pyとのインタフェースプロトコルをChatGPTと相談した結果、以下のプロトコルにまとまりました。ChatGPTは最初はjsonフォーマットを提案してきましたが、FPGAでデコードする都合上シンプルなフォーマットとしました。
通信プロトコル
PythonからFPGAへのコマンド
SOH
= 0x01EOT
= 0x04ACK
= 0x06NAK
= 0x15CMD_RESET
= 'R' = 0x52CMD_ACTION
= 'A' = 0x41
リセットコマンド:
- 目的: ゲームを初期状態にリセットし、新しいエピソードを開始する。
- フォーマット:
[SOH, CMD_RESET, データ長(0), EOT]
データ長
はこのコマンドにおいてペイロードがないため0。図997.1 リセットコマンド
ステップコマンド:
- 目的: 特定のアクションを実行し、その結果としての新しいゲーム状態を取得する。
- フォーマット:
[SOH, CMD_ACTION, データ長(1), アクションコード, EOT]
データ長
はアクションコード
1バイト。図997.2 ステップコマンド
FPGAからPythonへの応答
リセット応答:
- 目的: リセットが完了したことを確認し、新しいゲームフレームを提供する。
- フォーマット:
[SOH, ACK/NAK, データ長, フレームデータ, EOT]
- コマンドフォーマットが正常なら
ACK
、異常ならNAK
を返す。 データ長
はフレームデータ
のバイト数。図997.3 リセット応答
ステップ応答:
- 目的: アクションの結果としての新しいゲーム状態、報酬、およびゲームの継続状態を提供する。
- フォーマット:
[SOH, ACK/NAK, データ長, フレームデータ, 報酬, ゲーム終了フラグ, EOT]
- コマンドフォーマットが正常なら
ACK
、異常ならNAK
を返す。 データ長
は(フレームデータ
のバイト数 +報酬
1バイト +ゲーム終了フラグ
1バイト)のバイト数。図997.4 ステップ応答
このプロトコルでは、ペイロードの長さを明確にすることで、EOT
がペイロード内に現れる問題を解消しています。また、データの一貫性と通信の信頼性を高めるためにペイロードの長さを先頭に加えています。