fix(PPO_Bot): state vector bearing uses game coords (north=0° CW)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -61,7 +61,7 @@ proc buildStateVector*(bot: BotStateData; enemy: EnemyTracker): Tensor[float32]
|
|||||||
# Relative bearing to enemy (signed, from bot perspective)
|
# Relative bearing to enemy (signed, from bot perspective)
|
||||||
let dx = enemy.current.x - bot.x
|
let dx = enemy.current.x - bot.x
|
||||||
let dy = enemy.current.y - bot.y
|
let dy = enemy.current.y - bot.y
|
||||||
let absDir = (180.0 * arctan2(dy, dx) / PI + 360.0) mod 360.0
|
let absDir = (180.0 * arctan2(dx, dy) / PI + 360.0) mod 360.0
|
||||||
let relBearing = ((absDir - bot.direction) + 540.0) mod 360.0 - 180.0
|
let relBearing = ((absDir - bot.direction) + 540.0) mod 360.0 - 180.0
|
||||||
result[16] = float32(relBearing / 180.0)
|
result[16] = float32(relBearing / 180.0)
|
||||||
# Distance to enemy
|
# Distance to enemy
|
||||||
|
|||||||
@@ -119,9 +119,9 @@ block testWallDistances:
|
|||||||
check abs(sv[21] - 0.875f32) < 0.001f32, "right wall = 0.875"
|
check abs(sv[21] - 0.875f32) < 0.001f32, "right wall = 0.875"
|
||||||
|
|
||||||
block testRelativeBearing:
|
block testRelativeBearing:
|
||||||
# Bot at (0,0) dir=0°. Enemy at (0,100) → arctan2(100,0)=90° absolute.
|
# Game convention: north=0°, CW. arctan2(dx,dy) used.
|
||||||
# relBearing = (90 - 0 + 540) mod 360 - 180 = 90°
|
# Bot at (0,0) dir=0°. Enemy at (0,100) → due north → absDir=0°.
|
||||||
# normalized = 90 / 180 = 0.5
|
# relBearing = (0 - 0 + 540) mod 360 - 180 = 0°. normalized = 0/180 = 0.0
|
||||||
var t = initEnemyTracker()
|
var t = initEnemyTracker()
|
||||||
t.update(0.0, 100.0, 0.0, 0.0, 100.0)
|
t.update(0.0, 100.0, 0.0, 0.0, 100.0)
|
||||||
let bot = BotStateData(
|
let bot = BotStateData(
|
||||||
@@ -130,7 +130,20 @@ block testRelativeBearing:
|
|||||||
arenaWidth: 800.0, arenaHeight: 600.0,
|
arenaWidth: 800.0, arenaHeight: 600.0,
|
||||||
)
|
)
|
||||||
let sv = buildStateVector(bot, t)
|
let sv = buildStateVector(bot, t)
|
||||||
check abs(sv[16] - 0.5f32) < 0.01f32, "relative bearing = 0.5, got " & $sv[16]
|
check abs(sv[16] - 0.0f32) < 0.01f32, "relative bearing = 0.0 (due north), got " & $sv[16]
|
||||||
|
|
||||||
|
block testRelativeBearingEast:
|
||||||
|
# Enemy at (100,0) → due east → absDir=90°.
|
||||||
|
# relBearing = (90 - 0 + 540) mod 360 - 180 = 90°. normalized = 90/180 = 0.5
|
||||||
|
var t = initEnemyTracker()
|
||||||
|
t.update(100.0, 0.0, 0.0, 0.0, 100.0)
|
||||||
|
let bot = BotStateData(
|
||||||
|
x: 0.0, y: 0.0, direction: 0.0, speed: 0.0, energy: 100.0,
|
||||||
|
gunDirection: 0.0, gunHeat: 0.0,
|
||||||
|
arenaWidth: 800.0, arenaHeight: 600.0,
|
||||||
|
)
|
||||||
|
let sv = buildStateVector(bot, t)
|
||||||
|
check abs(sv[16] - 0.5f32) < 0.01f32, "relative bearing east = 0.5, got " & $sv[16]
|
||||||
|
|
||||||
block testHistoryPaddedWhenEmpty:
|
block testHistoryPaddedWhenEmpty:
|
||||||
var t = initEnemyTracker()
|
var t = initEnemyTracker()
|
||||||
|
|||||||
Reference in New Issue
Block a user