|
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がペイロード内に現れる問題を解消しています。また、データの一貫性と通信の信頼性を高めるためにペイロードの長さを先頭に加えています。
Leave a Comment