initial commit

This commit is contained in:
2026-10-22 09:07:39 +08:00
commit 265f11aa38
15 changed files with 2924 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""test_session.py — 端到端测试:板子端算 / 电脑端算 / 会话隔离。"""
import time
import numpy as np
import _mock_server
import session_client as sc
def main():
srv = _mock_server.MockServer(port=5599)
srv.start()
time.sleep(0.4)
try:
# ---------------- 会话 1:板子端算(点云不出板)
c1 = sc.BoardClient('127.0.0.1', 5599)
h, _ = c1.request('hello')
assert h['ok'] and h['board_can_compute'], h
h, img = c1.request('capture')
assert h['ok'] and len(img) > 1000, h
r, _ = c1.request('click', u=800.0, v=648.0, radius=10, fit_plane=True)
assert r['ok'] and r['found'], r
pm_board = np.asarray(r['p_map'], dtype=np.float64)
print('board-mode p_map =', np.round(pm_board, 4))
# 合成点放在 3 m 处
assert abs(np.linalg.norm(pm_board) - 3.0) < 0.06, pm_board
st, _ = c1.request('status')
assert st['ok'] and st['has_target'] and st['delta'], st
print('board-mode status =', st['delta'])
assert abs(st['delta'][0] - (0.2507 - pm_board[0])) < 1e-6
# ---------------- 会话 2:电脑端算(拉点云 + 回传 p_map)
c2 = sc.BoardClient('127.0.0.1', 5599)
c2.request('hello')
h2, _ = c2.request('capture')
hc, cblob = c2.request('cloud')
xyz = sc.decode_cloud(hc, cblob)
idx = sc.target_math.TargetIndex(xyz)
res, pm_pc = sc.compute_target(xyz, h2['odom'], 800.0, 648.0,
10.0, True, index=idx)
assert res['found'], res
print('pc-mode p_map =', np.round(pm_pc, 4))
assert np.allclose(pm_pc, pm_board, atol=1e-6)
r2, _ = c2.request('set_target', u=800, v=648,
p_cam=res['p_cam'].tolist(),
p_lidar=res['p_lidar'].tolist(),
p_map=pm_pc.tolist())
assert r2['ok'], r2
st2, _ = c2.request('status')
assert st2['has_target'], st2
# ---------------- 会话隔离:c1 的目标还在,c2 的 reset 不影响 c1
st1, _ = c1.request('status')
assert st1['has_target'], st1
c2.request('reset')
st2b, _ = c2.request('status')
assert not st2b['has_target'], st2b
st1b, _ = c1.request('status')
assert st1b['has_target'], st1b
print('session isolation: OK')
# ---------------- 同一帧覆盖点选(索引复用)
t0 = time.perf_counter()
for du in (-8, -4, 0, 4, 8):
rr, _ = c1.request('click', u=800.0 + du, v=648.0, radius=10, fit_plane=True)
assert rr['ok']
print('5 clicks on same frame: %.1f ms total' % ((time.perf_counter() - t0) * 1000))
c1.close()
c2.close()
print('PASS')
finally:
srv.stop()
if __name__ == '__main__':
main()