diff --git a/.gitignore b/.gitignore index 649b20d..b001efe 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,10 @@ wheels/ # Sim Jammers*/ tmp/ + +# MATLAB 出图日志 +scripts/matlab/*.log + # LaTeX build artifacts docs/paper/build/ docs/paper/*.aux diff --git a/README.md b/README.md index 11155c6..337a733 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - [总体思路与流程图(四问主线、端到端流程图、执行时间速查)](docs/总体思路与流程图.md) - [执行时间与执行步骤(计时模型、状态机、附件示例推演、实测分解)](docs/执行时间与执行步骤.md) - [几何计算示意图册(逐图说明:角域交会、覆盖、最小命中集)](docs/几何计算示意图册.md) -- [论文插图清单与复现方式](docs/figures/README.md)(`uv run python scripts/make_figures.py`) +- [论文插图清单与复现方式](docs/figures/README.md)(`uv run python scripts/build_figure_data.py`) - [四问建模分析与 P0–P7 实施计划](docs/B题建模分析与实施计划.md) - [协议规则表、字段表与状态机(P0 交付)](docs/协议规则表与状态机.md) - [问题一完整解答](docs/问题一解答.md) @@ -42,7 +42,7 @@ project/ # 1-4 问"最优实现 / 基线实现"对比框架:逐问 o # +独立参考,冻结基准集配对出数;见 project/README.md scripts/ # 采集、基准、可视化与校核脚本(含问题四批量仿真 benchmark_q4.py、 # 运行历史计时分解 analyze_run_timing.py、第四问覆盖证书 verify_q4_cover.py、 - # 论文插图 make_figures.py、日志归档 archive_replay_logs.py) + # 论文插图 build_figure_data.py + scripts/matlab、日志归档 archive_replay_logs.py) docs/figures/ # 论文插图(PNG)+ manifest.json(数据来源与 sha256)+ 图清单 output/ examples/ # 演练证据、算例与生成产物 ``` diff --git a/docs/figures/.data/flow_overall.mat b/docs/figures/.data/flow_overall.mat new file mode 100644 index 0000000..0438c8b Binary files /dev/null and b/docs/figures/.data/flow_overall.mat differ diff --git a/docs/figures/.data/geo_q1_counterexample.mat b/docs/figures/.data/geo_q1_counterexample.mat new file mode 100644 index 0000000..549ffb7 Binary files /dev/null and b/docs/figures/.data/geo_q1_counterexample.mat differ diff --git a/docs/figures/.data/geo_q1_meetup.mat b/docs/figures/.data/geo_q1_meetup.mat new file mode 100644 index 0000000..2df4282 Binary files /dev/null and b/docs/figures/.data/geo_q1_meetup.mat differ diff --git a/docs/figures/.data/geo_q2.mat b/docs/figures/.data/geo_q2.mat new file mode 100644 index 0000000..339cd1f Binary files /dev/null and b/docs/figures/.data/geo_q2.mat differ diff --git a/docs/figures/.data/geo_q3.mat b/docs/figures/.data/geo_q3.mat new file mode 100644 index 0000000..54ff0f3 Binary files /dev/null and b/docs/figures/.data/geo_q3.mat differ diff --git a/docs/figures/.data/geo_q4.mat b/docs/figures/.data/geo_q4.mat new file mode 100644 index 0000000..ae7907c Binary files /dev/null and b/docs/figures/.data/geo_q4.mat differ diff --git a/docs/figures/.data/replay_q3.mat b/docs/figures/.data/replay_q3.mat new file mode 100644 index 0000000..3ba29cd Binary files /dev/null and b/docs/figures/.data/replay_q3.mat differ diff --git a/docs/figures/.data/replay_q4.mat b/docs/figures/.data/replay_q4.mat new file mode 100644 index 0000000..c67aafd Binary files /dev/null and b/docs/figures/.data/replay_q4.mat differ diff --git a/docs/figures/.data/steps_state_machine.mat b/docs/figures/.data/steps_state_machine.mat new file mode 100644 index 0000000..db88546 Binary files /dev/null and b/docs/figures/.data/steps_state_machine.mat differ diff --git a/docs/figures/.data/timing_attachment.mat b/docs/figures/.data/timing_attachment.mat new file mode 100644 index 0000000..5677bc3 Binary files /dev/null and b/docs/figures/.data/timing_attachment.mat differ diff --git a/docs/figures/.data/timing_measured.mat b/docs/figures/.data/timing_measured.mat new file mode 100644 index 0000000..e31cf8b Binary files /dev/null and b/docs/figures/.data/timing_measured.mat differ diff --git a/docs/figures/README.md b/docs/figures/README.md index 7bc435a..df5c335 100644 --- a/docs/figures/README.md +++ b/docs/figures/README.md @@ -1,48 +1,54 @@ # docs/figures —— 论文插图 -每张图只输出 PNG,由 `scripts/make_figures.py` 用 matplotlib 生成。 +每张图只输出 PNG。数据由 `scripts/build_figure_data.py` 从行为日志、覆盖计划与生产求解器 +算好写入 `docs/figures/.data/*.mat`,再由 MATLAB(`scripts/matlab/*.m`)排版出图; `manifest.json` 记录每张图的数据来源(路径 + sha256 前 12 位 + 行数)与生成命令。 ```bash -uv run python scripts/make_figures.py # 全部 11 张 -uv run python scripts/make_figures.py --list # 图名 -uv run python scripts/make_figures.py --only geo-q3-seven-point-coverage -uv run python scripts/make_figures.py --scale 1.5 # 整体放大(尺寸倍率) +uv run python scripts/build_figure_data.py # 全部 11 张(数据 + 出图) +uv run python scripts/build_figure_data.py --prepare # 只写 .mat 数据 +uv run python scripts/build_figure_data.py --list # 图名 +uv run python scripts/build_figure_data.py --only geo-q3-seven-point-coverage ``` -依赖:`matplotlib`、`Pillow`、`docs/paper/fonts/` 下的字体。 -`matplotlib` 缓存写入仓库内 `.mpl-cache/`,不污染用户目录。 +MATLAB 内手动出图:`cd scripts/matlab` 后执行 `run_all_figures`(每张图单独一个会话, +本机图形子系统连续渲染多张会崩)。 + +依赖:`numpy`、`scipy`(写 `.mat`)与 MATLAB R2025a。 ## 约定 -- 图内不放标题、图注与解释性文字,只保留坐标轴、图例与数据标注; +- **除回放画布(点运动图 `replay-webui-*`)外,全部使用 MATLAB 默认图形样式**: + 默认配色(`defaultAxesColorOrder`)、默认字体与字号、默认坐标轴与图例; + 不引入自定义调色板,不手绘图例色块。 +- 图内不放标题、图注与解释性文字,只保留坐标轴、图例与必要的元素标注; 图的含义由文件名与下表承担,解释写在论文正文。 -- 配色(`scripts/make_figures.py::C`):深蓝 `#1f4e79` 主流程与协议, - 砖红 `#b03a2e` 真值源与关键结论,墨绿 `#1e7a5f` 清除与通过项, - 土黄 `#b8860b` 后备与警示,灰色只用于网格与次要文字。 -- 字体:中文宋体 `SongtiSC-Regular/Bold`,标题黑体 `HeitiSC-Light/Medium`, - 数字与西文 Times New Roman,均取自 `docs/paper/fonts/`,与 `main.tex` 一致。 -- 输出为 PNG(`savefig.dpi = 200`,另有 `--scale` 倍率),按 160 mm 宽排版时 - 与正文同字号。 +- 图例一律用 MATLAB `legend` 放在坐标区外(`southoutside`),不压数据; + 散点标签按候选方位自动避让,保证互不重叠。 +- 输出 PNG(`exportgraphics`,300 dpi、白底),导出前关闭坐标轴工具条。 ## 图清单 | 文件 | 内容 | 数据来源 | | --- | --- | --- | -| `flow-overall-architecture.png` | 总体思路:题面抽象、在线三层、四问主线、三条闭环 | `src/mcm26b/config.py`、`docs/B题建模分析与实施计划.md` | +| `flow-overall-architecture.png` | 四层主线:题面抽象(L0)、在线三层(L1)、四问主线(L2)、三条闭环(L3) | `src/mcm26b/config.py`、`docs/B题建模分析与实施计划.md` | | `steps-state-machine.png` | 会话状态机(IDLE / 倒计时 / OPEN / CLOSED) | `docs/协议规则表与状态机.md`、`src/mcm26b/protocol/client.py` | -| `timing-attachment-example-105-111-194-199.png` | 附件计时示例逐步推演 | `docs/协议规则表与状态机.md` | -| `timing-measured-q3-10-sources.png` | 实测一局的虚拟时间分解(累计曲线 + 构成) | `referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl` | -| `geo-q1-convex-intersection-zoom.png` | 问题一:角域交会总览 + 定位区域放大(直径圆与 MEC) | `output/q1/practice/U5ZW-P9KN-TCAG-R7ST_observations.json` | -| `geo-q1-diameter-circle-counterexample.png` | 问题一:直径圆不覆盖的反例(等边三角形布站) | `examples/q1/triangle.json` | -| `geo-q2-guaranteed-reception-disk.png` | 问题二:候选盘、截断角域外接圆、安全盘 `B(c, 1000−a)` | `src/mcm26b/config.py`、`docs/algo-2.md` | -| `geo-q3-seven-point-coverage.png` | 问题三:七点覆盖(7 个 1000 m 接收盘的并集覆盖 Ω)与三套计划对比 | `src/mcm26b/planner/seven.py`、`docs/algo-3.md` | -| `geo-q4-minimum-cover-31-points.png` | 问题四:31 点最小命中集与 `forward_half_disk` 语义 | `src/mcm26b/guarantee/plans/q4_mincover_v2.json` | -| `replay-webui-q3-omnidirectional.png` | WebUI 回放画布复现(全向局,10 源全清) | `referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl` | -| `replay-webui-q4-directional.png` | WebUI 回放画布复现(定向源局) | `referee-data/sessions/GM56-DFXZ-XKDM-XYV7/log.jsonl` | +| `timing-attachment-example-105-111-194-199.png` | 附件计时示例:逐动作耗时构成与单步合计 | `docs/协议规则表与状态机.md` | +| `timing-measured-q3-10-sources.png` | 实测一局:累计虚拟时间按动作类型的堆叠构成 | `referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl` | +| `geo-q1-convex-intersection-zoom.png` | 问题一:角域交会总览 + 定位区域放大(直径圆与最小包围圆) | `output/q1/practice/U5ZW-P9KN-TCAG-R7ST_observations.json` | +| `geo-q1-diameter-circle-counterexample.png` | 问题一:直径圆不覆盖定位区域的反例(等边三角形布站) | `examples/q1/triangle.json` | +| `geo-q2-guaranteed-reception-disk.png` | 问题二:截断角域外接圆 `B(c, a)` 与安全候选盘 `B(c, 1000 − a)`,右侧为半径分解 | `src/mcm26b/config.py`、`docs/algo-2.md` | +| `geo-q3-seven-point-coverage.png` | 问题三:七个 1000 m 接收盘覆盖 Ω,标出最差点 | `src/mcm26b/planner/seven.py`、`docs/algo-3.md` | +| `geo-q4-minimum-cover-31-points.png` | 问题四:31 点最小命中集与 ±90° 前向半盘语义 | `src/mcm26b/guarantee/plans/q4_mincover_v2.json` | +| `replay-webui-q3-omnidirectional.png` | 回放画布(点运动图,全向局):世界视图 + 事件流水 + 虚拟时间轴 | `referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl` | +| `replay-webui-q4-directional.png` | 回放画布(点运动图,定向源局):世界视图(含定向源 ±90° 前向半盘)+ 事件流水 + 虚拟时间轴 | `referee-data/sessions/GHSN-M38E-74GD-YLUD/log.jsonl` | -后两张对应 WebUI 的预览功能:把回放器画布上的 Ω 与真值源、运动轨迹、 -检测示向度射线、清除标记,以及右侧事件流水与底部虚拟时间轴一起导出。 +后两张是唯一保留自定义画布的图:把回放器画布上的 Ω 与真值源、移动轨迹、 +检测示向度射线、定向源朝向与清除标记,连同右侧事件流水与底部虚拟时间轴一起导出; +定向源局额外画出每个定向源的 **±90° 前向半盘**(半径取该源 `r_eff_m`,朝向箭头即半盘半径)。 + +q4 回放固定用演练局 `GHSN-M38E-74GD-YLUD`(`build_figure_data.py::Q4_REPLAY_CASE`); +本机没有该局留档时回退到自动挑选,因此 `examples/replay/` 里归档了这一局。 ## 数据来源与复现 diff --git a/docs/figures/flow-overall-architecture.png b/docs/figures/flow-overall-architecture.png index be9c164..3f6621e 100644 Binary files a/docs/figures/flow-overall-architecture.png and b/docs/figures/flow-overall-architecture.png differ diff --git a/docs/figures/geo-q1-convex-intersection-zoom.png b/docs/figures/geo-q1-convex-intersection-zoom.png index a2ad12e..1969789 100644 Binary files a/docs/figures/geo-q1-convex-intersection-zoom.png and b/docs/figures/geo-q1-convex-intersection-zoom.png differ diff --git a/docs/figures/geo-q1-diameter-circle-counterexample.png b/docs/figures/geo-q1-diameter-circle-counterexample.png index 5a6d05e..df4f953 100644 Binary files a/docs/figures/geo-q1-diameter-circle-counterexample.png and b/docs/figures/geo-q1-diameter-circle-counterexample.png differ diff --git a/docs/figures/geo-q2-guaranteed-reception-disk.png b/docs/figures/geo-q2-guaranteed-reception-disk.png index 6de6f06..518c8c8 100644 Binary files a/docs/figures/geo-q2-guaranteed-reception-disk.png and b/docs/figures/geo-q2-guaranteed-reception-disk.png differ diff --git a/docs/figures/geo-q3-seven-point-coverage.png b/docs/figures/geo-q3-seven-point-coverage.png index 8e9bc37..e626c65 100644 Binary files a/docs/figures/geo-q3-seven-point-coverage.png and b/docs/figures/geo-q3-seven-point-coverage.png differ diff --git a/docs/figures/geo-q4-minimum-cover-31-points.png b/docs/figures/geo-q4-minimum-cover-31-points.png index 27cdaee..1d0ddbb 100644 Binary files a/docs/figures/geo-q4-minimum-cover-31-points.png and b/docs/figures/geo-q4-minimum-cover-31-points.png differ diff --git a/docs/figures/manifest.json b/docs/figures/manifest.json index e04e598..bfb9d8d 100644 --- a/docs/figures/manifest.json +++ b/docs/figures/manifest.json @@ -1,36 +1,12 @@ { - "generator": "scripts/make_figures.py", - "command": "uv run python scripts/make_figures.py", - "palette": { - "ink": "#1c2430", - "muted": "#5c6673", - "grid": "#e4e9ee", - "primary": "#1f4e79", - "primary_fill": "#dce6f1", - "accent": "#b03a2e", - "accent_fill": "#f6dcd8", - "success": "#1e7a5f", - "success_fill": "#d8ece5", - "warn": "#b8860b", - "warn_fill": "#f6ecd2", - "violet": "#5b4b8a" - }, - "fonts": { - "dir": "docs/paper/fonts", - "map": { - "song": "SongtiSC-Regular.ttf", - "song_bold": "SongtiSC-Bold.ttf", - "hei": "HeitiSC-Light.ttf", - "hei_bold": "HeitiSC-Medium.ttf", - "times": "Times New Roman.ttf", - "times_bold": "Times New Roman Bold.ttf" - } - }, + "generator": "scripts/build_figure_data.py(数据)+ scripts/matlab/*.m(MATLAB 出图)", + "command": "uv run python scripts/build_figure_data.py", + "manual": "MATLAB 中 cd scripts/matlab 后执行 run_all_figures", "figures": [ { "stem": "flow-overall-architecture", "png": "docs/figures/flow-overall-architecture.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_flow_overall.m", "sources": [ { "path": "src/mcm26b/config.py", @@ -47,7 +23,7 @@ { "stem": "steps-state-machine", "png": "docs/figures/steps-state-machine.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_steps_state_machine.m", "sources": [ { "path": "docs/协议规则表与状态机.md", @@ -64,7 +40,7 @@ { "stem": "timing-attachment-example-105-111-194-199", "png": "docs/figures/timing-attachment-example-105-111-194-199.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_timing_attachment.m", "sources": [ { "path": "docs/协议规则表与状态机.md", @@ -73,10 +49,24 @@ } ] }, + { + "stem": "timing-measured-q3-10-sources", + "png": "docs/figures/timing-measured-q3-10-sources.png", + "matlab": "scripts/matlab/fig_timing_measured.m", + "sources": [ + { + "path": "referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl", + "sha256_12": "5a308e53ed09", + "lines": 133, + "case_code": "BBM9-HZG2-77N5-NKKC", + "module": "q3_practice" + } + ] + }, { "stem": "geo-q1-convex-intersection-zoom", "png": "docs/figures/geo-q1-convex-intersection-zoom.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_geo_q1_meetup.m", "sources": [ { "path": "output/q1/practice/U5ZW-P9KN-TCAG-R7ST_observations.json", @@ -88,7 +78,7 @@ { "stem": "geo-q1-diameter-circle-counterexample", "png": "docs/figures/geo-q1-diameter-circle-counterexample.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_geo_q1_counterexample.m", "sources": [ { "path": "examples/q1/triangle.json", @@ -100,7 +90,7 @@ { "stem": "geo-q2-guaranteed-reception-disk", "png": "docs/figures/geo-q2-guaranteed-reception-disk.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_geo_q2_safe_disk.m", "sources": [ { "path": "src/mcm26b/config.py", @@ -117,7 +107,7 @@ { "stem": "geo-q3-seven-point-coverage", "png": "docs/figures/geo-q3-seven-point-coverage.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_geo_q3_coverage.m", "sources": [ { "path": "src/mcm26b/planner/seven.py", @@ -134,7 +124,7 @@ { "stem": "geo-q4-minimum-cover-31-points", "png": "docs/figures/geo-q4-minimum-cover-31-points.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_geo_q4_mincover.m", "sources": [ { "path": "src/mcm26b/guarantee/plans/q4_mincover_v2.json", @@ -148,24 +138,10 @@ } ] }, - { - "stem": "timing-measured-q3-10-sources", - "png": "docs/figures/timing-measured-q3-10-sources.png", - "scale": 1.0, - "sources": [ - { - "path": "referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl", - "sha256_12": "5a308e53ed09", - "lines": 133, - "case_code": "BBM9-HZG2-77N5-NKKC", - "module": "q3_practice" - } - ] - }, { "stem": "replay-webui-q3-omnidirectional", "png": "docs/figures/replay-webui-q3-omnidirectional.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_replay.m", "sources": [ { "path": "referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl", @@ -178,13 +154,13 @@ { "stem": "replay-webui-q4-directional", "png": "docs/figures/replay-webui-q4-directional.png", - "scale": 1.0, + "matlab": "scripts/matlab/fig_replay.m", "sources": [ { - "path": "referee-data/sessions/GM56-DFXZ-XKDM-XYV7/log.jsonl", - "sha256_12": "f498b2073cdf", - "lines": 421, - "case_code": "GM56-DFXZ-XKDM-XYV7" + "path": "referee-data/sessions/GHSN-M38E-74GD-YLUD/log.jsonl", + "sha256_12": "280696d901b4", + "lines": 429, + "case_code": "GHSN-M38E-74GD-YLUD" } ] } diff --git a/docs/figures/replay-webui-q3-omnidirectional.png b/docs/figures/replay-webui-q3-omnidirectional.png index 57c53dc..3fc54b5 100644 Binary files a/docs/figures/replay-webui-q3-omnidirectional.png and b/docs/figures/replay-webui-q3-omnidirectional.png differ diff --git a/docs/figures/replay-webui-q4-directional.png b/docs/figures/replay-webui-q4-directional.png index 22c7876..1724c99 100644 Binary files a/docs/figures/replay-webui-q4-directional.png and b/docs/figures/replay-webui-q4-directional.png differ diff --git a/docs/figures/steps-state-machine.png b/docs/figures/steps-state-machine.png index 1a04ddd..801628b 100644 Binary files a/docs/figures/steps-state-machine.png and b/docs/figures/steps-state-machine.png differ diff --git a/docs/figures/timing-attachment-example-105-111-194-199.png b/docs/figures/timing-attachment-example-105-111-194-199.png index d201426..28a2b7c 100644 Binary files a/docs/figures/timing-attachment-example-105-111-194-199.png and b/docs/figures/timing-attachment-example-105-111-194-199.png differ diff --git a/docs/figures/timing-measured-q3-10-sources.png b/docs/figures/timing-measured-q3-10-sources.png index decb079..defebda 100644 Binary files a/docs/figures/timing-measured-q3-10-sources.png and b/docs/figures/timing-measured-q3-10-sources.png differ diff --git a/docs/几何计算示意图册.md b/docs/几何计算示意图册.md index d9cd843..5c9b116 100644 --- a/docs/几何计算示意图册.md +++ b/docs/几何计算示意图册.md @@ -3,7 +3,7 @@ > 本册逐图给出坐标口径、关键量与图中各元素的含义。插图位于 [`figures/`](figures/),复现命令: > > ```bash -> uv run python scripts/make_figures.py --only geo-q1-convex-intersection-zoom,\ +> uv run python scripts/build_figure_data.py --only geo-q1-convex-intersection-zoom,\ > geo-q1-diameter-circle-counterexample,geo-q2-guaranteed-reception-disk,\ > geo-q3-seven-point-coverage,geo-q4-minimum-cover-31-points > ``` @@ -30,14 +30,14 @@ (2° 宽,图中放大成可见宽度);三者交集就是定位区域 $P$。检测点相距 600~900 m, 而 $P$ 的直径只有 24 m,所以左图里 $P$ 缩成一个点——这是**必须做局部放大**的原因。 -**右(放大,视野 ±31.4 m)**:以最小包围圆圆心为中心: +**右(放大,视野 ±20.6 m)**:以定位区域为中心: -- 浅蓝扇形 = 三个角域在放大框内的可见部分;三者**重叠成白色区域**= $P$; -- 红色实线多边形 = $P$ 的顶点边界(与左图同一个集合); +- 浅蓝扇形 = 三个角域在放大框内的可见部分;**橙色多边形** = 三者交集,即定位区域 $P$; +- 左图里 $P$ 的直径只有 24 m,缩成一个红色方块,放大后才看得到形状; - 蓝色虚线圆 = **直径圆**,半径 $D/2=11.9984$ m,圆心是中点 $(-450.634,\ 508.944)$; - 绿色实线圆 = **最小包围圆(MEC)**,$\rho=12.0686$ m,圆心 $(-449.977,\ 507.953)$。 -**关键量(图 (c) 栏)** +**关键量** | 量 | 值 | 判定 | | --- | ---: | --- | @@ -64,7 +64,7 @@ $P$:顶点 $(0,0)$、$(40,0)$、$(20,34.641)$。 - 直径 $D=40.0000$ m,最远点对是底边两端 ⇒ 直径圆圆心 $(20,0)$、半径 20 m; - 到第三个顶点 $(20,34.641)$ 的距离是 $20\sqrt3\approx34.6410$ m > 20 m, - 故**直径圆不覆盖**:$E=+14.6410$ m(图中箭头所指); + 故**直径圆不覆盖**:$E=+14.6410$ m; - 该反例的最小包围圆半径 $\rho=40/\sqrt3\approx23.0940$ m **> 20 m**, 属于"覆盖失败且无法保证清除"的更坏情形。 @@ -136,7 +136,7 @@ D(a)=984.5391\ \text{m}<1000\ \text{m} \quad(\text{几何余量 }15.46\ \text{m}). $$ -**图上看到的就是这个证明**:7 个半径 1000 m 的接收盘(浅绿,裁剪在 Ω 内)的 +**图上看到的就是这个证明**:7 个半径 1000 m 的接收盘(浅绿)的 并集**完全覆盖** Ω,最坏点出现在 $(0,-1800)$(Ω 正下方边界,图中圈出), 到最近站点 $1159.7$ m(正下方环站)的距离恰为 984.54 m。 diff --git a/docs/总体思路与流程图.md b/docs/总体思路与流程图.md index bd203e1..f68a2a3 100644 --- a/docs/总体思路与流程图.md +++ b/docs/总体思路与流程图.md @@ -3,7 +3,7 @@ > 插图:[`figures/flow-overall-architecture.png`](figures/flow-overall-architecture.png)(总体思路与算法主线)、 > [`figures/steps-state-machine.png`](figures/steps-state-machine.png)(执行步骤)、 > [`figures/timing-attachment-example-105-111-194-199.png`](figures/timing-attachment-example-105-111-194-199.png)(附件计时示例)。 -> 复现:`uv run python scripts/make_figures.py --only flow-overall-architecture,steps-state-machine,timing-attachment-example-105-111-194-199` +> 复现:`uv run python scripts/build_figure_data.py --only flow-overall-architecture,steps-state-machine,timing-attachment-example-105-111-194-199` 本文给出四问的思路、端到端流程图、执行步骤与执行时间。 算法细节指向 [`algo-1.md`](algo-1.md)~[`algo-4.md`](algo-4.md), diff --git a/docs/执行时间与执行步骤.md b/docs/执行时间与执行步骤.md index fa23cb3..dd35a1c 100644 --- a/docs/执行时间与执行步骤.md +++ b/docs/执行时间与执行步骤.md @@ -3,7 +3,7 @@ > 配套插图:[`figures/steps-state-machine.png`](figures/steps-state-machine.png)(状态机与动作回合)、 > [`figures/timing-attachment-example-105-111-194-199.png`](figures/timing-attachment-example-105-111-194-199.png)(附件示例逐步推演)、 > [`figures/timing-measured-q3-10-sources.png`](figures/timing-measured-q3-10-sources.png)(实测一局的时序分解)。 -> 复现:`uv run python scripts/make_figures.py --only steps-state-machine,timing-attachment-example-105-111-194-199,timing-measured-q3-10-sources` +> 复现:`uv run python scripts/build_figure_data.py --only steps-state-machine,timing-attachment-example-105-111-194-199,timing-measured-q3-10-sources` 本文说明每一步做什么、每步花多少虚拟时间、这些数字如何验证。 规则原文见 `issue/` 下附件1 表1、表2 与附件2 第 4、10 节; @@ -108,7 +108,7 @@ uv run pytest tests/test_protocol_timing.py -q # 逐步断言移动、换频 ## 4. 实测时序分解 -对评测机留档的每一局,`scripts/make_figures.py` 按与 `referee.simulator` +对评测机留档的每一局,`scripts/build_figure_data.py` 按与 `referee.simulator` 同源的规则逐动作复算,并检查分项之和是否等于响应中的 `virtual_time_s`。 ### 4.1 问题三演练局 `BBM9-HZG2-77N5-NKKC`(10 源全清) @@ -145,7 +145,7 @@ uv run pytest tests/test_protocol_timing.py -q # 逐步断言移动、换频 ```bash # 用评测机留档重画(含真值) -uv run python scripts/make_figures.py --only timing-measured-q3-10-sources,\ +uv run python scripts/build_figure_data.py --only timing-measured-q3-10-sources,\ replay-webui-q3-omnidirectional,replay-webui-q4-directional # 归档新日志,评测机数据被清理后仍可复现插图 diff --git a/examples/replay/GHSN-M38E-74GD-YLUD.q4_practice.jsonl b/examples/replay/GHSN-M38E-74GD-YLUD.q4_practice.jsonl new file mode 100644 index 0000000..167f801 --- /dev/null +++ b/examples/replay/GHSN-M38E-74GD-YLUD.q4_practice.jsonl @@ -0,0 +1,429 @@ +{"event":"session_start","case_code":"GHSN-M38E-74GD-YLUD","module":"q4_practice","robot_id":"1","seed":1907688398,"countdown_s":5.0,"window_s":1500.0,"max_real_duration_s":1200.0,"truth":[{"channel":6,"x":-168.78031525275804,"y":1684.875239455932,"r_eff_m":1233.1529913973563,"directional":true,"heading_deg":351.84275431652014},{"channel":15,"x":411.7975180678083,"y":1548.040304144621,"r_eff_m":1336.3045523445826,"directional":true,"heading_deg":72.47781232458263},{"channel":8,"x":978.6674582823607,"y":-996.1121301869524,"r_eff_m":1336.1370990332562,"directional":true,"heading_deg":246.14394851382335},{"channel":16,"x":124.00340756473021,"y":-860.3622285357711,"r_eff_m":1345.578791332298,"directional":false,"heading_deg":0.0},{"channel":10,"x":729.8914456683548,"y":714.3629430529361,"r_eff_m":1127.494833936053,"directional":false,"heading_deg":0.0},{"channel":2,"x":478.441266630241,"y":449.08113076378316,"r_eff_m":1040.6068154097852,"directional":false,"heading_deg":0.0},{"channel":20,"x":-945.2003883886779,"y":638.5311986666989,"r_eff_m":1295.456469667405,"directional":false,"heading_deg":0.0},{"channel":4,"x":99.04602689897295,"y":1744.5260335974826,"r_eff_m":1032.9094604449615,"directional":false,"heading_deg":0.0},{"channel":5,"x":-1507.0542438070167,"y":761.3723575581047,"r_eff_m":1448.7977020579874,"directional":false,"heading_deg":0.0},{"channel":12,"x":-1188.1583136013294,"y":963.0220608398997,"r_eff_m":1226.2619264983982,"directional":false,"heading_deg":0.0},{"channel":19,"x":-177.4461437404443,"y":343.49207176417394,"r_eff_m":1277.3413627947266,"directional":false,"heading_deg":0.0}]} +{"event":"action","seq":1,"wall_ts_ms":1789265737816,"method":"POST","path":"/enter","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0001"},"response":{"accepted":true,"real_timestamp_ms":1789265737816,"virtual_time_s":0.0,"max_virtual_duration_s":360000.0,"max_real_duration_s":1200,"remaining_real_duration_s":1200}} +{"event":"action","seq":2,"wall_ts_ms":1789265737826,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0002","position":{"x":0.0,"y":0.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265737826,"virtual_time_s":5.0,"measure_result":"no_signal"}} +{"event":"action","seq":3,"wall_ts_ms":1789265737827,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0003","position":{"x":0.0,"y":0.0},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789265737827,"virtual_time_s":11.0,"measure_result":"direction","svd_deg":43.2}} +{"event":"action","seq":4,"wall_ts_ms":1789265737865,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0004","position":{"x":0.0,"y":0.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265737865,"virtual_time_s":17.0,"measure_result":"no_signal"}} +{"event":"action","seq":5,"wall_ts_ms":1789265737866,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0005","position":{"x":0.0,"y":0.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265737866,"virtual_time_s":23.0,"measure_result":"no_signal"}} +{"event":"action","seq":6,"wall_ts_ms":1789265737867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0006","position":{"x":0.0,"y":0.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265737867,"virtual_time_s":29.0,"measure_result":"no_signal"}} +{"event":"action","seq":7,"wall_ts_ms":1789265737867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0007","position":{"x":0.0,"y":0.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265737867,"virtual_time_s":35.0,"measure_result":"no_signal"}} +{"event":"action","seq":8,"wall_ts_ms":1789265737868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0008","position":{"x":0.0,"y":0.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265737868,"virtual_time_s":41.0,"measure_result":"no_signal"}} +{"event":"action","seq":9,"wall_ts_ms":1789265737869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0009","position":{"x":0.0,"y":0.0},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265737869,"virtual_time_s":47.0,"measure_result":"no_signal"}} +{"event":"action","seq":10,"wall_ts_ms":1789265737869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0010","position":{"x":0.0,"y":0.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265737869,"virtual_time_s":53.0,"measure_result":"no_signal"}} +{"event":"action","seq":11,"wall_ts_ms":1789265737870,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0011","position":{"x":0.0,"y":0.0},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265737870,"virtual_time_s":59.0,"measure_result":"direction","svd_deg":45.09}} +{"event":"action","seq":12,"wall_ts_ms":1789265737905,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0012","position":{"x":0.0,"y":0.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265737905,"virtual_time_s":65.0,"measure_result":"no_signal"}} +{"event":"action","seq":13,"wall_ts_ms":1789265737906,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0013","position":{"x":0.0,"y":0.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265737906,"virtual_time_s":71.0,"measure_result":"no_signal"}} +{"event":"action","seq":14,"wall_ts_ms":1789265737907,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0014","position":{"x":0.0,"y":0.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265737907,"virtual_time_s":77.0,"measure_result":"no_signal"}} +{"event":"action","seq":15,"wall_ts_ms":1789265737908,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0015","position":{"x":0.0,"y":0.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265737908,"virtual_time_s":83.0,"measure_result":"no_signal"}} +{"event":"action","seq":16,"wall_ts_ms":1789265737908,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0016","position":{"x":0.0,"y":0.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265737908,"virtual_time_s":89.0,"measure_result":"no_signal"}} +{"event":"action","seq":17,"wall_ts_ms":1789265737909,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0017","position":{"x":0.0,"y":0.0},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265737909,"virtual_time_s":95.0,"measure_result":"direction","svd_deg":279.14}} +{"event":"action","seq":18,"wall_ts_ms":1789265737945,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0018","position":{"x":0.0,"y":0.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265737945,"virtual_time_s":101.0,"measure_result":"no_signal"}} +{"event":"action","seq":19,"wall_ts_ms":1789265737946,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0019","position":{"x":0.0,"y":0.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265737946,"virtual_time_s":107.0,"measure_result":"no_signal"}} +{"event":"action","seq":20,"wall_ts_ms":1789265737947,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0020","position":{"x":0.0,"y":0.0},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789265737947,"virtual_time_s":113.0,"measure_result":"direction","svd_deg":117.36}} +{"event":"action","seq":21,"wall_ts_ms":1789265737983,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0021","position":{"x":0.0,"y":0.0},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265737983,"virtual_time_s":119.0,"measure_result":"direction","svd_deg":145.55}} +{"event":"action","seq":22,"wall_ts_ms":1789265738125,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0022","position":{"x":-79.66719841213751,"y":400.9313670917169},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789265738125,"virtual_time_s":206.753978,"measure_result":"direction","svd_deg":210.37}} +{"event":"action","seq":23,"wall_ts_ms":1789265738127,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0023","position":{"x":-177.64052160825486,"y":343.3794788045638},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789265738127,"virtual_time_s":234.479287,"clear_result":"success"}} +{"event":"action","seq":24,"wall_ts_ms":1789265738245,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0024","position":{"x":-243.62294879732218,"y":424.1621461926654},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738245,"virtual_time_s":261.340275,"measure_result":"direction","svd_deg":162.22}} +{"event":"action","seq":25,"wall_ts_ms":1789265738273,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0025","position":{"x":-901.7130728821326,"y":655.9084449749266},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738273,"virtual_time_s":405.880801,"measure_result":"direction","svd_deg":202.15}} +{"event":"action","seq":26,"wall_ts_ms":1789265738284,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0026","position":{"x":-922.0070945081434,"y":643.9441735456403},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738284,"virtual_time_s":415.592451,"measure_result":"direction","svd_deg":193.27}} +{"event":"action","seq":27,"wall_ts_ms":1789265738286,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0027","position":{"x":-943.9158056887892,"y":638.8511609168044},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738286,"virtual_time_s":425.09103,"clear_result":"success"}} +{"event":"action","seq":28,"wall_ts_ms":1789265738445,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0028","position":{"x":155.06480714962538,"y":530.7765221920923},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738445,"virtual_time_s":651.94741,"measure_result":"direction","svd_deg":18.62}} +{"event":"action","seq":29,"wall_ts_ms":1789265738475,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0029","position":{"x":691.0981141562518,"y":722.9949655036279},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738475,"virtual_time_s":770.838522,"measure_result":"direction","svd_deg":348.1}} +{"event":"action","seq":30,"wall_ts_ms":1789265738490,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0030","position":{"x":704.6480025466224,"y":718.3903941183868},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738490,"virtual_time_s":778.7007,"measure_result":"direction","svd_deg":350.26}} +{"event":"action","seq":31,"wall_ts_ms":1789265738492,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0031","position":{"x":728.5054559976093,"y":714.7247743974735},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738492,"virtual_time_s":788.528183,"clear_result":"success"}} +{"event":"action","seq":32,"wall_ts_ms":1789265738690,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0032","position":{"x":282.155927735649,"y":778.2311705887862},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789265738690,"virtual_time_s":884.697127,"measure_result":"direction","svd_deg":301.58}} +{"event":"action","seq":33,"wall_ts_ms":1789265738692,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0033","position":{"x":481.9384520825037,"y":452.79231376594635},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789265738692,"virtual_time_s":966.070815,"clear_result":"success"}} +{"event":"action","seq":34,"wall_ts_ms":1789265738822,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0034","position":{"x":119.77278770558408,"y":-365.4630725746676},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738822,"virtual_time_s":1151.035152,"measure_result":"direction","svd_deg":270.43}} +{"event":"action","seq":35,"wall_ts_ms":1789265738857,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0035","position":{"x":125.50362627876382,"y":-724.3528216084252},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738857,"virtual_time_s":1227.822252,"measure_result":"direction","svd_deg":268.9}} +{"event":"action","seq":36,"wall_ts_ms":1789265738877,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0036","position":{"x":125.3777171626325,"y":-762.3214764994508},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738877,"virtual_time_s":1240.416025,"measure_result":"direction","svd_deg":269.25}} +{"event":"action","seq":37,"wall_ts_ms":1789265738893,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0037","position":{"x":125.31476260456685,"y":-790.7980024619326},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738893,"virtual_time_s":1251.111344,"measure_result":"direction","svd_deg":269.45}} +{"event":"action","seq":38,"wall_ts_ms":1789265738907,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0038","position":{"x":125.28328532553402,"y":-812.1554085318639},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738907,"virtual_time_s":1260.38283,"measure_result":"direction","svd_deg":269.15999999999997}} +{"event":"action","seq":39,"wall_ts_ms":1789265738919,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0039","position":{"x":125.2675466860176,"y":-828.1734669503353},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738919,"virtual_time_s":1268.586443,"measure_result":"direction","svd_deg":268.21}} +{"event":"action","seq":40,"wall_ts_ms":1789265738931,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0040","position":{"x":124.96644242180939,"y":-839.1602852992372},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738931,"virtual_time_s":1275.784632,"measure_result":"direction","svd_deg":266.93}} +{"event":"action","seq":41,"wall_ts_ms":1789265738933,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0041","position":{"x":124.4615306510994,"y":-853.1635717026913},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738933,"virtual_time_s":1283.587109,"clear_result":"success"}} +{"event":"action","seq":42,"wall_ts_ms":1789265738934,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0042","position":{"x":200.0,"y":-900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265738934,"virtual_time_s":1307.363173,"measure_result":"no_signal"}} +{"event":"action","seq":43,"wall_ts_ms":1789265738935,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0043","position":{"x":200.0,"y":-900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265738935,"virtual_time_s":1313.363173,"measure_result":"no_signal"}} +{"event":"action","seq":44,"wall_ts_ms":1789265738936,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0044","position":{"x":200.0,"y":-900.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265738936,"virtual_time_s":1319.363173,"measure_result":"no_signal"}} +{"event":"action","seq":45,"wall_ts_ms":1789265738936,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0045","position":{"x":200.0,"y":-900.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265738936,"virtual_time_s":1325.363173,"measure_result":"no_signal"}} +{"event":"action","seq":46,"wall_ts_ms":1789265738937,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0046","position":{"x":200.0,"y":-900.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265738937,"virtual_time_s":1331.363173,"measure_result":"no_signal"}} +{"event":"action","seq":47,"wall_ts_ms":1789265738938,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0047","position":{"x":200.0,"y":-900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265738938,"virtual_time_s":1337.363173,"measure_result":"no_signal"}} +{"event":"action","seq":48,"wall_ts_ms":1789265738939,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0048","position":{"x":200.0,"y":-900.0},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265738939,"virtual_time_s":1343.363173,"measure_result":"direction","svd_deg":352.99}} +{"event":"action","seq":49,"wall_ts_ms":1789265738972,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0049","position":{"x":200.0,"y":-900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265738972,"virtual_time_s":1349.363173,"measure_result":"no_signal"}} +{"event":"action","seq":50,"wall_ts_ms":1789265738973,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0050","position":{"x":200.0,"y":-900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265738973,"virtual_time_s":1355.363173,"measure_result":"no_signal"}} +{"event":"action","seq":51,"wall_ts_ms":1789265738974,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0051","position":{"x":200.0,"y":-900.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265738974,"virtual_time_s":1361.363173,"measure_result":"no_signal"}} +{"event":"action","seq":52,"wall_ts_ms":1789265738975,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0052","position":{"x":200.0,"y":-900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265738975,"virtual_time_s":1367.363173,"measure_result":"no_signal"}} +{"event":"action","seq":53,"wall_ts_ms":1789265738977,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0053","position":{"x":200.0,"y":-900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265738977,"virtual_time_s":1373.363173,"measure_result":"no_signal"}} +{"event":"action","seq":54,"wall_ts_ms":1789265738978,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0054","position":{"x":200.0,"y":-900.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265738978,"virtual_time_s":1379.363173,"measure_result":"no_signal"}} +{"event":"action","seq":55,"wall_ts_ms":1789265738978,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0055","position":{"x":200.0,"y":-900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265738978,"virtual_time_s":1385.363173,"measure_result":"no_signal"}} +{"event":"action","seq":56,"wall_ts_ms":1789265738979,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0056","position":{"x":200.0,"y":-900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265738979,"virtual_time_s":1391.363173,"measure_result":"no_signal"}} +{"event":"action","seq":57,"wall_ts_ms":1789265739081,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0057","position":{"x":516.6212801392332,"y":-966.9819199979597},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739081,"virtual_time_s":1462.088937,"measure_result":"direction","svd_deg":357.38}} +{"event":"action","seq":58,"wall_ts_ms":1789265739136,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0058","position":{"x":866.5933228570544,"y":-995.2814295412376},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739136,"virtual_time_s":1537.311809,"measure_result":"direction","svd_deg":358.73}} +{"event":"action","seq":59,"wall_ts_ms":1789265739167,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0059","position":{"x":1040.8377161691203,"y":-1003.1570563336973},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739167,"virtual_time_s":1577.196266,"measure_result":"no_signal"}} +{"event":"action","seq":60,"wall_ts_ms":1789265739202,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0060","position":{"x":970.7414216957415,"y":-1003.1570563336973},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739202,"virtual_time_s":1596.215525,"measure_result":"direction","svd_deg":41.87}} +{"event":"action","seq":61,"wall_ts_ms":1789265739204,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0061","position":{"x":978.7251752457973,"y":-996.0135773020329},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739204,"virtual_time_s":1603.358137,"clear_result":"success"}} +{"event":"action","seq":62,"wall_ts_ms":1789265739205,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0062","position":{"x":900.0,"y":-700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739205,"virtual_time_s":1670.61879,"measure_result":"no_signal"}} +{"event":"action","seq":63,"wall_ts_ms":1789265739206,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0063","position":{"x":900.0,"y":-700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739206,"virtual_time_s":1676.61879,"measure_result":"no_signal"}} +{"event":"action","seq":64,"wall_ts_ms":1789265739207,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0064","position":{"x":900.0,"y":-700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739207,"virtual_time_s":1682.61879,"measure_result":"no_signal"}} +{"event":"action","seq":65,"wall_ts_ms":1789265739207,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0065","position":{"x":900.0,"y":-700.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739207,"virtual_time_s":1688.61879,"measure_result":"no_signal"}} +{"event":"action","seq":66,"wall_ts_ms":1789265739208,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0066","position":{"x":900.0,"y":-700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739208,"virtual_time_s":1694.61879,"measure_result":"no_signal"}} +{"event":"action","seq":67,"wall_ts_ms":1789265739211,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0067","position":{"x":900.0,"y":-700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739211,"virtual_time_s":1700.61879,"measure_result":"no_signal"}} +{"event":"action","seq":68,"wall_ts_ms":1789265739212,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0068","position":{"x":900.0,"y":-700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739212,"virtual_time_s":1706.61879,"measure_result":"no_signal"}} +{"event":"action","seq":69,"wall_ts_ms":1789265739212,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0069","position":{"x":900.0,"y":-700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739212,"virtual_time_s":1712.61879,"measure_result":"no_signal"}} +{"event":"action","seq":70,"wall_ts_ms":1789265739213,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0070","position":{"x":900.0,"y":-700.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739213,"virtual_time_s":1718.61879,"measure_result":"no_signal"}} +{"event":"action","seq":71,"wall_ts_ms":1789265739214,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0071","position":{"x":900.0,"y":-700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739214,"virtual_time_s":1724.61879,"measure_result":"no_signal"}} +{"event":"action","seq":72,"wall_ts_ms":1789265739216,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0072","position":{"x":900.0,"y":-700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739216,"virtual_time_s":1730.61879,"measure_result":"no_signal"}} +{"event":"action","seq":73,"wall_ts_ms":1789265739217,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0073","position":{"x":900.0,"y":-700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739217,"virtual_time_s":1736.61879,"measure_result":"no_signal"}} +{"event":"action","seq":74,"wall_ts_ms":1789265739218,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0074","position":{"x":900.0,"y":-700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739218,"virtual_time_s":1742.61879,"measure_result":"no_signal"}} +{"event":"action","seq":75,"wall_ts_ms":1789265739219,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0075","position":{"x":900.0,"y":-700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739219,"virtual_time_s":1748.61879,"measure_result":"no_signal"}} +{"event":"action","seq":76,"wall_ts_ms":1789265739219,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0076","position":{"x":1200.0,"y":-700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739219,"virtual_time_s":1813.61879,"measure_result":"no_signal"}} +{"event":"action","seq":77,"wall_ts_ms":1789265739220,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0077","position":{"x":1200.0,"y":-700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739220,"virtual_time_s":1819.61879,"measure_result":"no_signal"}} +{"event":"action","seq":78,"wall_ts_ms":1789265739221,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0078","position":{"x":1200.0,"y":-700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739221,"virtual_time_s":1825.61879,"measure_result":"no_signal"}} +{"event":"action","seq":79,"wall_ts_ms":1789265739221,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0079","position":{"x":1200.0,"y":-700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739221,"virtual_time_s":1831.61879,"measure_result":"no_signal"}} +{"event":"action","seq":80,"wall_ts_ms":1789265739222,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0080","position":{"x":1200.0,"y":-700.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739222,"virtual_time_s":1837.61879,"measure_result":"no_signal"}} +{"event":"action","seq":81,"wall_ts_ms":1789265739223,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0081","position":{"x":1200.0,"y":-700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739223,"virtual_time_s":1843.61879,"measure_result":"no_signal"}} +{"event":"action","seq":82,"wall_ts_ms":1789265739223,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0082","position":{"x":1200.0,"y":-700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739223,"virtual_time_s":1849.61879,"measure_result":"no_signal"}} +{"event":"action","seq":83,"wall_ts_ms":1789265739224,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0083","position":{"x":1200.0,"y":-700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739224,"virtual_time_s":1855.61879,"measure_result":"no_signal"}} +{"event":"action","seq":84,"wall_ts_ms":1789265739225,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0084","position":{"x":1200.0,"y":-700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739225,"virtual_time_s":1861.61879,"measure_result":"no_signal"}} +{"event":"action","seq":85,"wall_ts_ms":1789265739226,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0085","position":{"x":1200.0,"y":-700.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739226,"virtual_time_s":1867.61879,"measure_result":"no_signal"}} +{"event":"action","seq":86,"wall_ts_ms":1789265739226,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0086","position":{"x":1200.0,"y":-700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739226,"virtual_time_s":1873.61879,"measure_result":"no_signal"}} +{"event":"action","seq":87,"wall_ts_ms":1789265739227,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0087","position":{"x":1200.0,"y":-700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739227,"virtual_time_s":1879.61879,"measure_result":"no_signal"}} +{"event":"action","seq":88,"wall_ts_ms":1789265739228,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0088","position":{"x":1200.0,"y":-700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739228,"virtual_time_s":1885.61879,"measure_result":"no_signal"}} +{"event":"action","seq":89,"wall_ts_ms":1789265739228,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0089","position":{"x":1200.0,"y":-700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739228,"virtual_time_s":1891.61879,"measure_result":"no_signal"}} +{"event":"action","seq":90,"wall_ts_ms":1789265739229,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0090","position":{"x":1800.0,"y":-400.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739229,"virtual_time_s":2030.782869,"measure_result":"no_signal"}} +{"event":"action","seq":91,"wall_ts_ms":1789265739230,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0091","position":{"x":1800.0,"y":-400.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739230,"virtual_time_s":2036.782869,"measure_result":"no_signal"}} +{"event":"action","seq":92,"wall_ts_ms":1789265739230,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0092","position":{"x":1800.0,"y":-400.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739230,"virtual_time_s":2042.782869,"measure_result":"no_signal"}} +{"event":"action","seq":93,"wall_ts_ms":1789265739231,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0093","position":{"x":1800.0,"y":-400.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739231,"virtual_time_s":2048.782869,"measure_result":"no_signal"}} +{"event":"action","seq":94,"wall_ts_ms":1789265739232,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0094","position":{"x":1800.0,"y":-400.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739232,"virtual_time_s":2054.782869,"measure_result":"no_signal"}} +{"event":"action","seq":95,"wall_ts_ms":1789265739233,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0095","position":{"x":1800.0,"y":-400.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739233,"virtual_time_s":2060.782869,"measure_result":"no_signal"}} +{"event":"action","seq":96,"wall_ts_ms":1789265739233,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0096","position":{"x":1800.0,"y":-400.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739233,"virtual_time_s":2066.782869,"measure_result":"no_signal"}} +{"event":"action","seq":97,"wall_ts_ms":1789265739234,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0097","position":{"x":1800.0,"y":-400.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739234,"virtual_time_s":2072.782869,"measure_result":"no_signal"}} +{"event":"action","seq":98,"wall_ts_ms":1789265739234,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0098","position":{"x":1800.0,"y":-400.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739234,"virtual_time_s":2078.782869,"measure_result":"no_signal"}} +{"event":"action","seq":99,"wall_ts_ms":1789265739235,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0099","position":{"x":1800.0,"y":-400.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739235,"virtual_time_s":2084.782869,"measure_result":"no_signal"}} +{"event":"action","seq":100,"wall_ts_ms":1789265739236,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0100","position":{"x":1800.0,"y":-400.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739236,"virtual_time_s":2090.782869,"measure_result":"no_signal"}} +{"event":"action","seq":101,"wall_ts_ms":1789265739236,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0101","position":{"x":1800.0,"y":-400.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739236,"virtual_time_s":2096.782869,"measure_result":"no_signal"}} +{"event":"action","seq":102,"wall_ts_ms":1789265739237,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0102","position":{"x":1800.0,"y":-400.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739237,"virtual_time_s":2102.782869,"measure_result":"no_signal"}} +{"event":"action","seq":103,"wall_ts_ms":1789265739238,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0103","position":{"x":1800.0,"y":-400.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739238,"virtual_time_s":2108.782869,"measure_result":"no_signal"}} +{"event":"action","seq":104,"wall_ts_ms":1789265739238,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0104","position":{"x":1900.0,"y":-900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739238,"virtual_time_s":2215.763259,"measure_result":"no_signal"}} +{"event":"action","seq":105,"wall_ts_ms":1789265739239,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0105","position":{"x":1900.0,"y":-900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739239,"virtual_time_s":2221.763259,"measure_result":"no_signal"}} +{"event":"action","seq":106,"wall_ts_ms":1789265739240,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0106","position":{"x":1900.0,"y":-900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739240,"virtual_time_s":2227.763259,"measure_result":"no_signal"}} +{"event":"action","seq":107,"wall_ts_ms":1789265739240,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0107","position":{"x":1900.0,"y":-900.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739240,"virtual_time_s":2233.763259,"measure_result":"no_signal"}} +{"event":"action","seq":108,"wall_ts_ms":1789265739241,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0108","position":{"x":1900.0,"y":-900.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739241,"virtual_time_s":2239.763259,"measure_result":"no_signal"}} +{"event":"action","seq":109,"wall_ts_ms":1789265739241,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0109","position":{"x":1900.0,"y":-900.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739241,"virtual_time_s":2245.763259,"measure_result":"no_signal"}} +{"event":"action","seq":110,"wall_ts_ms":1789265739242,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0110","position":{"x":1900.0,"y":-900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739242,"virtual_time_s":2251.763259,"measure_result":"no_signal"}} +{"event":"action","seq":111,"wall_ts_ms":1789265739242,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0111","position":{"x":1900.0,"y":-900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739242,"virtual_time_s":2257.763259,"measure_result":"no_signal"}} +{"event":"action","seq":112,"wall_ts_ms":1789265739243,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0112","position":{"x":1900.0,"y":-900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739243,"virtual_time_s":2263.763259,"measure_result":"no_signal"}} +{"event":"action","seq":113,"wall_ts_ms":1789265739244,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0113","position":{"x":1900.0,"y":-900.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739244,"virtual_time_s":2269.763259,"measure_result":"no_signal"}} +{"event":"action","seq":114,"wall_ts_ms":1789265739244,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0114","position":{"x":1900.0,"y":-900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739244,"virtual_time_s":2275.763259,"measure_result":"no_signal"}} +{"event":"action","seq":115,"wall_ts_ms":1789265739245,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0115","position":{"x":1900.0,"y":-900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739245,"virtual_time_s":2281.763259,"measure_result":"no_signal"}} +{"event":"action","seq":116,"wall_ts_ms":1789265739246,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0116","position":{"x":1900.0,"y":-900.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739246,"virtual_time_s":2287.763259,"measure_result":"no_signal"}} +{"event":"action","seq":117,"wall_ts_ms":1789265739247,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0117","position":{"x":1900.0,"y":-900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739247,"virtual_time_s":2293.763259,"measure_result":"no_signal"}} +{"event":"action","seq":118,"wall_ts_ms":1789265739248,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0118","position":{"x":1400.0,"y":-1400.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739248,"virtual_time_s":2440.184615,"measure_result":"no_signal"}} +{"event":"action","seq":119,"wall_ts_ms":1789265739249,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0119","position":{"x":1400.0,"y":-1400.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739249,"virtual_time_s":2446.184615,"measure_result":"no_signal"}} +{"event":"action","seq":120,"wall_ts_ms":1789265739249,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0120","position":{"x":1400.0,"y":-1400.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739249,"virtual_time_s":2452.184615,"measure_result":"no_signal"}} +{"event":"action","seq":121,"wall_ts_ms":1789265739250,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0121","position":{"x":1400.0,"y":-1400.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739250,"virtual_time_s":2458.184615,"measure_result":"no_signal"}} +{"event":"action","seq":122,"wall_ts_ms":1789265739251,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0122","position":{"x":1400.0,"y":-1400.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739251,"virtual_time_s":2464.184615,"measure_result":"no_signal"}} +{"event":"action","seq":123,"wall_ts_ms":1789265739251,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0123","position":{"x":1400.0,"y":-1400.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739251,"virtual_time_s":2470.184615,"measure_result":"no_signal"}} +{"event":"action","seq":124,"wall_ts_ms":1789265739252,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0124","position":{"x":1400.0,"y":-1400.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739252,"virtual_time_s":2476.184615,"measure_result":"no_signal"}} +{"event":"action","seq":125,"wall_ts_ms":1789265739253,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0125","position":{"x":1400.0,"y":-1400.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739252,"virtual_time_s":2482.184615,"measure_result":"no_signal"}} +{"event":"action","seq":126,"wall_ts_ms":1789265739253,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0126","position":{"x":1400.0,"y":-1400.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739253,"virtual_time_s":2488.184615,"measure_result":"no_signal"}} +{"event":"action","seq":127,"wall_ts_ms":1789265739254,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0127","position":{"x":1400.0,"y":-1400.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739254,"virtual_time_s":2494.184615,"measure_result":"no_signal"}} +{"event":"action","seq":128,"wall_ts_ms":1789265739254,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0128","position":{"x":1400.0,"y":-1400.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739254,"virtual_time_s":2500.184615,"measure_result":"no_signal"}} +{"event":"action","seq":129,"wall_ts_ms":1789265739255,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0129","position":{"x":1400.0,"y":-1400.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739255,"virtual_time_s":2506.184615,"measure_result":"no_signal"}} +{"event":"action","seq":130,"wall_ts_ms":1789265739255,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0130","position":{"x":1400.0,"y":-1400.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739255,"virtual_time_s":2512.184615,"measure_result":"no_signal"}} +{"event":"action","seq":131,"wall_ts_ms":1789265739256,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0131","position":{"x":1400.0,"y":-1400.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739256,"virtual_time_s":2518.184615,"measure_result":"no_signal"}} +{"event":"action","seq":132,"wall_ts_ms":1789265739256,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0132","position":{"x":500.0,"y":-1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739256,"virtual_time_s":2720.161771,"measure_result":"no_signal"}} +{"event":"action","seq":133,"wall_ts_ms":1789265739257,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0133","position":{"x":500.0,"y":-1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739257,"virtual_time_s":2726.161771,"measure_result":"no_signal"}} +{"event":"action","seq":134,"wall_ts_ms":1789265739258,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0134","position":{"x":500.0,"y":-1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739258,"virtual_time_s":2732.161771,"measure_result":"no_signal"}} +{"event":"action","seq":135,"wall_ts_ms":1789265739258,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0135","position":{"x":500.0,"y":-1800.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739258,"virtual_time_s":2738.161771,"measure_result":"no_signal"}} +{"event":"action","seq":136,"wall_ts_ms":1789265739259,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0136","position":{"x":500.0,"y":-1800.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739259,"virtual_time_s":2744.161771,"measure_result":"no_signal"}} +{"event":"action","seq":137,"wall_ts_ms":1789265739260,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0137","position":{"x":500.0,"y":-1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739260,"virtual_time_s":2750.161771,"measure_result":"no_signal"}} +{"event":"action","seq":138,"wall_ts_ms":1789265739260,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0138","position":{"x":500.0,"y":-1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739260,"virtual_time_s":2756.161771,"measure_result":"no_signal"}} +{"event":"action","seq":139,"wall_ts_ms":1789265739261,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0139","position":{"x":500.0,"y":-1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739261,"virtual_time_s":2762.161771,"measure_result":"no_signal"}} +{"event":"action","seq":140,"wall_ts_ms":1789265739262,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0140","position":{"x":500.0,"y":-1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739262,"virtual_time_s":2768.161771,"measure_result":"no_signal"}} +{"event":"action","seq":141,"wall_ts_ms":1789265739262,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0141","position":{"x":500.0,"y":-1800.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739262,"virtual_time_s":2774.161771,"measure_result":"no_signal"}} +{"event":"action","seq":142,"wall_ts_ms":1789265739263,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0142","position":{"x":500.0,"y":-1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739263,"virtual_time_s":2780.161771,"measure_result":"no_signal"}} +{"event":"action","seq":143,"wall_ts_ms":1789265739263,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0143","position":{"x":500.0,"y":-1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739263,"virtual_time_s":2786.161771,"measure_result":"no_signal"}} +{"event":"action","seq":144,"wall_ts_ms":1789265739264,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0144","position":{"x":500.0,"y":-1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739264,"virtual_time_s":2792.161771,"measure_result":"no_signal"}} +{"event":"action","seq":145,"wall_ts_ms":1789265739264,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0145","position":{"x":500.0,"y":-1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739264,"virtual_time_s":2798.161771,"measure_result":"no_signal"}} +{"event":"action","seq":146,"wall_ts_ms":1789265739265,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0146","position":{"x":-400.0,"y":-1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739265,"virtual_time_s":2983.161771,"measure_result":"no_signal"}} +{"event":"action","seq":147,"wall_ts_ms":1789265739266,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0147","position":{"x":-400.0,"y":-1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739266,"virtual_time_s":2989.161771,"measure_result":"no_signal"}} +{"event":"action","seq":148,"wall_ts_ms":1789265739266,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0148","position":{"x":-400.0,"y":-1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739266,"virtual_time_s":2995.161771,"measure_result":"no_signal"}} +{"event":"action","seq":149,"wall_ts_ms":1789265739267,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0149","position":{"x":-400.0,"y":-1800.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739267,"virtual_time_s":3001.161771,"measure_result":"no_signal"}} +{"event":"action","seq":150,"wall_ts_ms":1789265739267,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0150","position":{"x":-400.0,"y":-1800.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739267,"virtual_time_s":3007.161771,"measure_result":"no_signal"}} +{"event":"action","seq":151,"wall_ts_ms":1789265739268,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0151","position":{"x":-400.0,"y":-1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739268,"virtual_time_s":3013.161771,"measure_result":"no_signal"}} +{"event":"action","seq":152,"wall_ts_ms":1789265739268,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0152","position":{"x":-400.0,"y":-1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739268,"virtual_time_s":3019.161771,"measure_result":"no_signal"}} +{"event":"action","seq":153,"wall_ts_ms":1789265739269,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0153","position":{"x":-400.0,"y":-1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739269,"virtual_time_s":3025.161771,"measure_result":"no_signal"}} +{"event":"action","seq":154,"wall_ts_ms":1789265739270,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0154","position":{"x":-400.0,"y":-1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739270,"virtual_time_s":3031.161771,"measure_result":"no_signal"}} +{"event":"action","seq":155,"wall_ts_ms":1789265739270,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0155","position":{"x":-400.0,"y":-1800.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739270,"virtual_time_s":3037.161771,"measure_result":"no_signal"}} +{"event":"action","seq":156,"wall_ts_ms":1789265739271,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0156","position":{"x":-400.0,"y":-1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739271,"virtual_time_s":3043.161771,"measure_result":"no_signal"}} +{"event":"action","seq":157,"wall_ts_ms":1789265739271,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0157","position":{"x":-400.0,"y":-1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739271,"virtual_time_s":3049.161771,"measure_result":"no_signal"}} +{"event":"action","seq":158,"wall_ts_ms":1789265739272,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0158","position":{"x":-400.0,"y":-1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739272,"virtual_time_s":3055.161771,"measure_result":"no_signal"}} +{"event":"action","seq":159,"wall_ts_ms":1789265739273,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0159","position":{"x":-400.0,"y":-1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739273,"virtual_time_s":3061.161771,"measure_result":"no_signal"}} +{"event":"action","seq":160,"wall_ts_ms":1789265739273,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0160","position":{"x":-900.0,"y":-2100.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739273,"virtual_time_s":3182.780809,"measure_result":"no_signal"}} +{"event":"action","seq":161,"wall_ts_ms":1789265739274,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0161","position":{"x":-900.0,"y":-2100.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739274,"virtual_time_s":3188.780809,"measure_result":"no_signal"}} +{"event":"action","seq":162,"wall_ts_ms":1789265739275,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0162","position":{"x":-900.0,"y":-2100.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739275,"virtual_time_s":3194.780809,"measure_result":"no_signal"}} +{"event":"action","seq":163,"wall_ts_ms":1789265739275,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0163","position":{"x":-900.0,"y":-2100.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739275,"virtual_time_s":3200.780809,"measure_result":"no_signal"}} +{"event":"action","seq":164,"wall_ts_ms":1789265739276,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0164","position":{"x":-900.0,"y":-2100.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739276,"virtual_time_s":3206.780809,"measure_result":"no_signal"}} +{"event":"action","seq":165,"wall_ts_ms":1789265739277,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0165","position":{"x":-900.0,"y":-2100.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739277,"virtual_time_s":3212.780809,"measure_result":"no_signal"}} +{"event":"action","seq":166,"wall_ts_ms":1789265739277,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0166","position":{"x":-900.0,"y":-2100.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739277,"virtual_time_s":3218.780809,"measure_result":"no_signal"}} +{"event":"action","seq":167,"wall_ts_ms":1789265739278,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0167","position":{"x":-900.0,"y":-2100.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739278,"virtual_time_s":3224.780809,"measure_result":"no_signal"}} +{"event":"action","seq":168,"wall_ts_ms":1789265739279,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0168","position":{"x":-900.0,"y":-2100.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739279,"virtual_time_s":3230.780809,"measure_result":"no_signal"}} +{"event":"action","seq":169,"wall_ts_ms":1789265739279,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0169","position":{"x":-900.0,"y":-2100.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739279,"virtual_time_s":3236.780809,"measure_result":"no_signal"}} +{"event":"action","seq":170,"wall_ts_ms":1789265739280,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0170","position":{"x":-900.0,"y":-2100.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739280,"virtual_time_s":3242.780809,"measure_result":"no_signal"}} +{"event":"action","seq":171,"wall_ts_ms":1789265739280,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0171","position":{"x":-900.0,"y":-2100.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739280,"virtual_time_s":3248.780809,"measure_result":"no_signal"}} +{"event":"action","seq":172,"wall_ts_ms":1789265739281,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0172","position":{"x":-900.0,"y":-2100.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739281,"virtual_time_s":3254.780809,"measure_result":"no_signal"}} +{"event":"action","seq":173,"wall_ts_ms":1789265739281,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0173","position":{"x":-900.0,"y":-2100.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739281,"virtual_time_s":3260.780809,"measure_result":"no_signal"}} +{"event":"action","seq":174,"wall_ts_ms":1789265739283,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0174","position":{"x":-700.0,"y":-1200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739283,"virtual_time_s":3450.171698,"measure_result":"no_signal"}} +{"event":"action","seq":175,"wall_ts_ms":1789265739284,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0175","position":{"x":-700.0,"y":-1200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739284,"virtual_time_s":3456.171698,"measure_result":"no_signal"}} +{"event":"action","seq":176,"wall_ts_ms":1789265739285,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0176","position":{"x":-700.0,"y":-1200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739285,"virtual_time_s":3462.171698,"measure_result":"no_signal"}} +{"event":"action","seq":177,"wall_ts_ms":1789265739286,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0177","position":{"x":-700.0,"y":-1200.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739286,"virtual_time_s":3468.171698,"measure_result":"no_signal"}} +{"event":"action","seq":178,"wall_ts_ms":1789265739286,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0178","position":{"x":-700.0,"y":-1200.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739286,"virtual_time_s":3474.171698,"measure_result":"no_signal"}} +{"event":"action","seq":179,"wall_ts_ms":1789265739287,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0179","position":{"x":-700.0,"y":-1200.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739287,"virtual_time_s":3480.171698,"measure_result":"no_signal"}} +{"event":"action","seq":180,"wall_ts_ms":1789265739288,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0180","position":{"x":-700.0,"y":-1200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739288,"virtual_time_s":3486.171698,"measure_result":"no_signal"}} +{"event":"action","seq":181,"wall_ts_ms":1789265739289,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0181","position":{"x":-700.0,"y":-1200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739288,"virtual_time_s":3492.171698,"measure_result":"no_signal"}} +{"event":"action","seq":182,"wall_ts_ms":1789265739289,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0182","position":{"x":-700.0,"y":-1200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739289,"virtual_time_s":3498.171698,"measure_result":"no_signal"}} +{"event":"action","seq":183,"wall_ts_ms":1789265739290,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0183","position":{"x":-700.0,"y":-1200.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739290,"virtual_time_s":3504.171698,"measure_result":"no_signal"}} +{"event":"action","seq":184,"wall_ts_ms":1789265739290,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0184","position":{"x":-700.0,"y":-1200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739290,"virtual_time_s":3510.171698,"measure_result":"no_signal"}} +{"event":"action","seq":185,"wall_ts_ms":1789265739291,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0185","position":{"x":-700.0,"y":-1200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739291,"virtual_time_s":3516.171698,"measure_result":"no_signal"}} +{"event":"action","seq":186,"wall_ts_ms":1789265739292,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0186","position":{"x":-700.0,"y":-1200.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739292,"virtual_time_s":3522.171698,"measure_result":"no_signal"}} +{"event":"action","seq":187,"wall_ts_ms":1789265739292,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0187","position":{"x":-700.0,"y":-1200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739292,"virtual_time_s":3528.171698,"measure_result":"no_signal"}} +{"event":"action","seq":188,"wall_ts_ms":1789265739293,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0188","position":{"x":-700.0,"y":-700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739293,"virtual_time_s":3633.171698,"measure_result":"no_signal"}} +{"event":"action","seq":189,"wall_ts_ms":1789265739303,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0189","position":{"x":-700.0,"y":-700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739303,"virtual_time_s":3639.171698,"measure_result":"no_signal"}} +{"event":"action","seq":190,"wall_ts_ms":1789265739305,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0190","position":{"x":-700.0,"y":-700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739305,"virtual_time_s":3645.171698,"measure_result":"no_signal"}} +{"event":"action","seq":191,"wall_ts_ms":1789265739306,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0191","position":{"x":-700.0,"y":-700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739306,"virtual_time_s":3651.171698,"measure_result":"no_signal"}} +{"event":"action","seq":192,"wall_ts_ms":1789265739306,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0192","position":{"x":-700.0,"y":-700.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739306,"virtual_time_s":3657.171698,"measure_result":"no_signal"}} +{"event":"action","seq":193,"wall_ts_ms":1789265739307,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0193","position":{"x":-700.0,"y":-700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739307,"virtual_time_s":3663.171698,"measure_result":"no_signal"}} +{"event":"action","seq":194,"wall_ts_ms":1789265739308,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0194","position":{"x":-700.0,"y":-700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739308,"virtual_time_s":3669.171698,"measure_result":"no_signal"}} +{"event":"action","seq":195,"wall_ts_ms":1789265739309,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0195","position":{"x":-700.0,"y":-700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739309,"virtual_time_s":3675.171698,"measure_result":"no_signal"}} +{"event":"action","seq":196,"wall_ts_ms":1789265739310,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0196","position":{"x":-700.0,"y":-700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739310,"virtual_time_s":3681.171698,"measure_result":"no_signal"}} +{"event":"action","seq":197,"wall_ts_ms":1789265739310,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0197","position":{"x":-700.0,"y":-700.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739310,"virtual_time_s":3687.171698,"measure_result":"no_signal"}} +{"event":"action","seq":198,"wall_ts_ms":1789265739311,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0198","position":{"x":-700.0,"y":-700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739311,"virtual_time_s":3693.171698,"measure_result":"no_signal"}} +{"event":"action","seq":199,"wall_ts_ms":1789265739312,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0199","position":{"x":-700.0,"y":-700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739312,"virtual_time_s":3699.171698,"measure_result":"no_signal"}} +{"event":"action","seq":200,"wall_ts_ms":1789265739313,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0200","position":{"x":-700.0,"y":-700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739313,"virtual_time_s":3705.171698,"measure_result":"no_signal"}} +{"event":"action","seq":201,"wall_ts_ms":1789265739313,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0201","position":{"x":-700.0,"y":-700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739313,"virtual_time_s":3711.171698,"measure_result":"no_signal"}} +{"event":"action","seq":202,"wall_ts_ms":1789265739314,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0202","position":{"x":-800.0,"y":-200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739314,"virtual_time_s":3818.152088,"measure_result":"no_signal"}} +{"event":"action","seq":203,"wall_ts_ms":1789265739315,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0203","position":{"x":-800.0,"y":-200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739315,"virtual_time_s":3824.152088,"measure_result":"no_signal"}} +{"event":"action","seq":204,"wall_ts_ms":1789265739316,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0204","position":{"x":-800.0,"y":-200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739316,"virtual_time_s":3830.152088,"measure_result":"no_signal"}} +{"event":"action","seq":205,"wall_ts_ms":1789265739316,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0205","position":{"x":-800.0,"y":-200.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739316,"virtual_time_s":3836.152088,"measure_result":"no_signal"}} +{"event":"action","seq":206,"wall_ts_ms":1789265739317,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0206","position":{"x":-800.0,"y":-200.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739317,"virtual_time_s":3842.152088,"measure_result":"direction","svd_deg":126.11}} +{"event":"action","seq":207,"wall_ts_ms":1789265739355,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0207","position":{"x":-800.0,"y":-200.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739355,"virtual_time_s":3848.152088,"measure_result":"no_signal"}} +{"event":"action","seq":208,"wall_ts_ms":1789265739356,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0208","position":{"x":-800.0,"y":-200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739356,"virtual_time_s":3854.152088,"measure_result":"no_signal"}} +{"event":"action","seq":209,"wall_ts_ms":1789265739356,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0209","position":{"x":-800.0,"y":-200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739356,"virtual_time_s":3860.152088,"measure_result":"no_signal"}} +{"event":"action","seq":210,"wall_ts_ms":1789265739357,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0210","position":{"x":-800.0,"y":-200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739357,"virtual_time_s":3866.152088,"measure_result":"no_signal"}} +{"event":"action","seq":211,"wall_ts_ms":1789265739358,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0211","position":{"x":-800.0,"y":-200.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739358,"virtual_time_s":3872.152088,"measure_result":"direction","svd_deg":108.11}} +{"event":"action","seq":212,"wall_ts_ms":1789265739392,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0212","position":{"x":-800.0,"y":-200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739392,"virtual_time_s":3878.152088,"measure_result":"no_signal"}} +{"event":"action","seq":213,"wall_ts_ms":1789265739393,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0213","position":{"x":-800.0,"y":-200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739393,"virtual_time_s":3884.152088,"measure_result":"no_signal"}} +{"event":"action","seq":214,"wall_ts_ms":1789265739394,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0214","position":{"x":-800.0,"y":-200.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739394,"virtual_time_s":3890.152088,"measure_result":"no_signal"}} +{"event":"action","seq":215,"wall_ts_ms":1789265739394,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0215","position":{"x":-800.0,"y":-200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739394,"virtual_time_s":3896.152088,"measure_result":"no_signal"}} +{"event":"action","seq":216,"wall_ts_ms":1789265739503,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0216","position":{"x":-947.4060451871933,"y":109.11837968521047},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739503,"virtual_time_s":3970.645216,"measure_result":"direction","svd_deg":131.32}} +{"event":"action","seq":217,"wall_ts_ms":1789265739561,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0217","position":{"x":-1324.9239456154519,"y":558.3476201396235},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739561,"virtual_time_s":4093.003927,"measure_result":"direction","svd_deg":131.0}} +{"event":"action","seq":218,"wall_ts_ms":1789265739594,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0218","position":{"x":-1432.2923947371212,"y":690.0535132542623},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739594,"virtual_time_s":4131.98888,"measure_result":"direction","svd_deg":136.57}} +{"event":"action","seq":219,"wall_ts_ms":1789265739609,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0219","position":{"x":-1483.0245877461791,"y":738.3058311207313},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739609,"virtual_time_s":4150.991796,"measure_result":"direction","svd_deg":135.43}} +{"event":"action","seq":220,"wall_ts_ms":1789265739622,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0220","position":{"x":-1494.2794165389562,"y":749.8626130220727},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739622,"virtual_time_s":4159.218128,"measure_result":"direction","svd_deg":137.48}} +{"event":"action","seq":221,"wall_ts_ms":1789265739623,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0221","position":{"x":-1505.3219950372888,"y":760.3331531575229},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739623,"virtual_time_s":4167.261618,"clear_result":"success"}} +{"event":"action","seq":222,"wall_ts_ms":1789265739805,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0222","position":{"x":-1408.4825659904257,"y":512.8845928212788},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739805,"virtual_time_s":4226.4062,"measure_result":"direction","svd_deg":63.41}} +{"event":"action","seq":223,"wall_ts_ms":1789265739822,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0223","position":{"x":-1195.7660646685601,"y":953.7522119734411},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739822,"virtual_time_s":4329.306673,"measure_result":"direction","svd_deg":51.15}} +{"event":"action","seq":224,"wall_ts_ms":1789265739830,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0224","position":{"x":-1189.5871642775382,"y":964.1176386186069},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739830,"virtual_time_s":4336.720143,"measure_result":"near"}} +{"event":"action","seq":225,"wall_ts_ms":1789265739831,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0225","position":{"x":-1188.4182050448148,"y":963.2096685709439},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739831,"virtual_time_s":4342.016175,"clear_result":"success"}} +{"event":"action","seq":226,"wall_ts_ms":1789265739832,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0226","position":{"x":-1200.0,"y":700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739832,"virtual_time_s":4400.709046,"measure_result":"no_signal"}} +{"event":"action","seq":227,"wall_ts_ms":1789265739833,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0227","position":{"x":-1200.0,"y":700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739833,"virtual_time_s":4406.709046,"measure_result":"no_signal"}} +{"event":"action","seq":228,"wall_ts_ms":1789265739834,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0228","position":{"x":-1200.0,"y":700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739834,"virtual_time_s":4412.709046,"measure_result":"no_signal"}} +{"event":"action","seq":229,"wall_ts_ms":1789265739834,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0229","position":{"x":-1200.0,"y":700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739834,"virtual_time_s":4418.709046,"measure_result":"no_signal"}} +{"event":"action","seq":230,"wall_ts_ms":1789265739835,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0230","position":{"x":-1200.0,"y":700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739835,"virtual_time_s":4424.709046,"measure_result":"no_signal"}} +{"event":"action","seq":231,"wall_ts_ms":1789265739836,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0231","position":{"x":-1200.0,"y":700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739836,"virtual_time_s":4430.709046,"measure_result":"no_signal"}} +{"event":"action","seq":232,"wall_ts_ms":1789265739836,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0232","position":{"x":-1200.0,"y":700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739836,"virtual_time_s":4436.709046,"measure_result":"no_signal"}} +{"event":"action","seq":233,"wall_ts_ms":1789265739837,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0233","position":{"x":-1200.0,"y":700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739837,"virtual_time_s":4442.709046,"measure_result":"no_signal"}} +{"event":"action","seq":234,"wall_ts_ms":1789265739838,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0234","position":{"x":-1200.0,"y":700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739838,"virtual_time_s":4448.709046,"measure_result":"no_signal"}} +{"event":"action","seq":235,"wall_ts_ms":1789265739838,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0235","position":{"x":-1200.0,"y":700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739838,"virtual_time_s":4454.709046,"measure_result":"no_signal"}} +{"event":"action","seq":236,"wall_ts_ms":1789265739839,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0236","position":{"x":-1200.0,"y":700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739839,"virtual_time_s":4460.709046,"measure_result":"no_signal"}} +{"event":"action","seq":237,"wall_ts_ms":1789265739840,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0237","position":{"x":-1200.0,"y":700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739840,"virtual_time_s":4466.709046,"measure_result":"no_signal"}} +{"event":"action","seq":238,"wall_ts_ms":1789265739840,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0238","position":{"x":-1800.0,"y":400.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739840,"virtual_time_s":4605.873125,"measure_result":"no_signal"}} +{"event":"action","seq":239,"wall_ts_ms":1789265739841,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0239","position":{"x":-1800.0,"y":400.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739841,"virtual_time_s":4611.873125,"measure_result":"no_signal"}} +{"event":"action","seq":240,"wall_ts_ms":1789265739842,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0240","position":{"x":-1800.0,"y":400.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739842,"virtual_time_s":4617.873125,"measure_result":"no_signal"}} +{"event":"action","seq":241,"wall_ts_ms":1789265739842,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0241","position":{"x":-1800.0,"y":400.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739842,"virtual_time_s":4623.873125,"measure_result":"no_signal"}} +{"event":"action","seq":242,"wall_ts_ms":1789265739843,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0242","position":{"x":-1800.0,"y":400.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739843,"virtual_time_s":4629.873125,"measure_result":"no_signal"}} +{"event":"action","seq":243,"wall_ts_ms":1789265739843,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0243","position":{"x":-1800.0,"y":400.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739843,"virtual_time_s":4635.873125,"measure_result":"no_signal"}} +{"event":"action","seq":244,"wall_ts_ms":1789265739844,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0244","position":{"x":-1800.0,"y":400.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739844,"virtual_time_s":4641.873125,"measure_result":"no_signal"}} +{"event":"action","seq":245,"wall_ts_ms":1789265739845,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0245","position":{"x":-1800.0,"y":400.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739845,"virtual_time_s":4647.873125,"measure_result":"no_signal"}} +{"event":"action","seq":246,"wall_ts_ms":1789265739845,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0246","position":{"x":-1800.0,"y":400.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739845,"virtual_time_s":4653.873125,"measure_result":"no_signal"}} +{"event":"action","seq":247,"wall_ts_ms":1789265739846,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0247","position":{"x":-1800.0,"y":400.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739846,"virtual_time_s":4659.873125,"measure_result":"no_signal"}} +{"event":"action","seq":248,"wall_ts_ms":1789265739846,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0248","position":{"x":-1800.0,"y":400.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739846,"virtual_time_s":4665.873125,"measure_result":"no_signal"}} +{"event":"action","seq":249,"wall_ts_ms":1789265739848,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0249","position":{"x":-1800.0,"y":400.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739848,"virtual_time_s":4671.873125,"measure_result":"no_signal"}} +{"event":"action","seq":250,"wall_ts_ms":1789265739849,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0250","position":{"x":-1800.0,"y":-300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739848,"virtual_time_s":4816.873125,"measure_result":"no_signal"}} +{"event":"action","seq":251,"wall_ts_ms":1789265739849,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0251","position":{"x":-1800.0,"y":-300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739849,"virtual_time_s":4822.873125,"measure_result":"no_signal"}} +{"event":"action","seq":252,"wall_ts_ms":1789265739850,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0252","position":{"x":-1800.0,"y":-300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739850,"virtual_time_s":4828.873125,"measure_result":"no_signal"}} +{"event":"action","seq":253,"wall_ts_ms":1789265739850,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0253","position":{"x":-1800.0,"y":-300.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739850,"virtual_time_s":4834.873125,"measure_result":"no_signal"}} +{"event":"action","seq":254,"wall_ts_ms":1789265739851,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0254","position":{"x":-1800.0,"y":-300.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739851,"virtual_time_s":4840.873125,"measure_result":"no_signal"}} +{"event":"action","seq":255,"wall_ts_ms":1789265739851,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0255","position":{"x":-1800.0,"y":-300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739851,"virtual_time_s":4846.873125,"measure_result":"no_signal"}} +{"event":"action","seq":256,"wall_ts_ms":1789265739852,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0256","position":{"x":-1800.0,"y":-300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739852,"virtual_time_s":4852.873125,"measure_result":"no_signal"}} +{"event":"action","seq":257,"wall_ts_ms":1789265739852,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0257","position":{"x":-1800.0,"y":-300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739852,"virtual_time_s":4858.873125,"measure_result":"no_signal"}} +{"event":"action","seq":258,"wall_ts_ms":1789265739853,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0258","position":{"x":-1800.0,"y":-300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739853,"virtual_time_s":4864.873125,"measure_result":"no_signal"}} +{"event":"action","seq":259,"wall_ts_ms":1789265739854,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0259","position":{"x":-1800.0,"y":-300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739854,"virtual_time_s":4870.873125,"measure_result":"no_signal"}} +{"event":"action","seq":260,"wall_ts_ms":1789265739854,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0260","position":{"x":-1800.0,"y":-300.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739854,"virtual_time_s":4876.873125,"measure_result":"no_signal"}} +{"event":"action","seq":261,"wall_ts_ms":1789265739855,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0261","position":{"x":-1800.0,"y":-300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739855,"virtual_time_s":4882.873125,"measure_result":"no_signal"}} +{"event":"action","seq":262,"wall_ts_ms":1789265739855,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0262","position":{"x":-1700.0,"y":-500.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739855,"virtual_time_s":4932.594485,"measure_result":"no_signal"}} +{"event":"action","seq":263,"wall_ts_ms":1789265739856,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0263","position":{"x":-1700.0,"y":-500.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739856,"virtual_time_s":4938.594485,"measure_result":"no_signal"}} +{"event":"action","seq":264,"wall_ts_ms":1789265739856,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0264","position":{"x":-1700.0,"y":-500.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739856,"virtual_time_s":4944.594485,"measure_result":"no_signal"}} +{"event":"action","seq":265,"wall_ts_ms":1789265739857,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0265","position":{"x":-1700.0,"y":-500.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739857,"virtual_time_s":4950.594485,"measure_result":"no_signal"}} +{"event":"action","seq":266,"wall_ts_ms":1789265739858,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0266","position":{"x":-1700.0,"y":-500.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739858,"virtual_time_s":4956.594485,"measure_result":"no_signal"}} +{"event":"action","seq":267,"wall_ts_ms":1789265739858,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0267","position":{"x":-1700.0,"y":-500.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739858,"virtual_time_s":4962.594485,"measure_result":"no_signal"}} +{"event":"action","seq":268,"wall_ts_ms":1789265739859,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0268","position":{"x":-1700.0,"y":-500.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739859,"virtual_time_s":4968.594485,"measure_result":"no_signal"}} +{"event":"action","seq":269,"wall_ts_ms":1789265739859,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0269","position":{"x":-1700.0,"y":-500.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739859,"virtual_time_s":4974.594485,"measure_result":"no_signal"}} +{"event":"action","seq":270,"wall_ts_ms":1789265739860,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0270","position":{"x":-1700.0,"y":-500.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739860,"virtual_time_s":4980.594485,"measure_result":"no_signal"}} +{"event":"action","seq":271,"wall_ts_ms":1789265739860,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0271","position":{"x":-1700.0,"y":-500.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739860,"virtual_time_s":4986.594485,"measure_result":"no_signal"}} +{"event":"action","seq":272,"wall_ts_ms":1789265739861,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0272","position":{"x":-1700.0,"y":-500.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739861,"virtual_time_s":4992.594485,"measure_result":"no_signal"}} +{"event":"action","seq":273,"wall_ts_ms":1789265739861,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0273","position":{"x":-1700.0,"y":-500.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739861,"virtual_time_s":4998.594485,"measure_result":"no_signal"}} +{"event":"action","seq":274,"wall_ts_ms":1789265739862,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0274","position":{"x":-1500.0,"y":-1300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739862,"virtual_time_s":5168.51871,"measure_result":"no_signal"}} +{"event":"action","seq":275,"wall_ts_ms":1789265739863,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0275","position":{"x":-1500.0,"y":-1300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739863,"virtual_time_s":5174.51871,"measure_result":"no_signal"}} +{"event":"action","seq":276,"wall_ts_ms":1789265739863,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0276","position":{"x":-1500.0,"y":-1300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739863,"virtual_time_s":5180.51871,"measure_result":"no_signal"}} +{"event":"action","seq":277,"wall_ts_ms":1789265739864,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0277","position":{"x":-1500.0,"y":-1300.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739864,"virtual_time_s":5186.51871,"measure_result":"no_signal"}} +{"event":"action","seq":278,"wall_ts_ms":1789265739864,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0278","position":{"x":-1500.0,"y":-1300.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739864,"virtual_time_s":5192.51871,"measure_result":"no_signal"}} +{"event":"action","seq":279,"wall_ts_ms":1789265739865,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0279","position":{"x":-1500.0,"y":-1300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739865,"virtual_time_s":5198.51871,"measure_result":"no_signal"}} +{"event":"action","seq":280,"wall_ts_ms":1789265739865,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0280","position":{"x":-1500.0,"y":-1300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739865,"virtual_time_s":5204.51871,"measure_result":"no_signal"}} +{"event":"action","seq":281,"wall_ts_ms":1789265739866,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0281","position":{"x":-1500.0,"y":-1300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739866,"virtual_time_s":5210.51871,"measure_result":"no_signal"}} +{"event":"action","seq":282,"wall_ts_ms":1789265739867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0282","position":{"x":-1500.0,"y":-1300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739867,"virtual_time_s":5216.51871,"measure_result":"no_signal"}} +{"event":"action","seq":283,"wall_ts_ms":1789265739867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0283","position":{"x":-1500.0,"y":-1300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739867,"virtual_time_s":5222.51871,"measure_result":"no_signal"}} +{"event":"action","seq":284,"wall_ts_ms":1789265739868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0284","position":{"x":-1500.0,"y":-1300.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739868,"virtual_time_s":5228.51871,"measure_result":"no_signal"}} +{"event":"action","seq":285,"wall_ts_ms":1789265739868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0285","position":{"x":-1500.0,"y":-1300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739868,"virtual_time_s":5234.51871,"measure_result":"no_signal"}} +{"event":"action","seq":286,"wall_ts_ms":1789265739869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0286","position":{"x":-2500.0,"y":500.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739869,"virtual_time_s":5651.343916,"measure_result":"no_signal"}} +{"event":"action","seq":287,"wall_ts_ms":1789265739869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0287","position":{"x":-2500.0,"y":500.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739869,"virtual_time_s":5657.343916,"measure_result":"no_signal"}} +{"event":"action","seq":288,"wall_ts_ms":1789265739870,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0288","position":{"x":-2500.0,"y":500.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739870,"virtual_time_s":5663.343916,"measure_result":"no_signal"}} +{"event":"action","seq":289,"wall_ts_ms":1789265739871,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0289","position":{"x":-2500.0,"y":500.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739870,"virtual_time_s":5669.343916,"measure_result":"no_signal"}} +{"event":"action","seq":290,"wall_ts_ms":1789265739871,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0290","position":{"x":-2500.0,"y":500.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739871,"virtual_time_s":5675.343916,"measure_result":"no_signal"}} +{"event":"action","seq":291,"wall_ts_ms":1789265739872,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0291","position":{"x":-2500.0,"y":500.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739872,"virtual_time_s":5681.343916,"measure_result":"no_signal"}} +{"event":"action","seq":292,"wall_ts_ms":1789265739872,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0292","position":{"x":-2500.0,"y":500.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739872,"virtual_time_s":5687.343916,"measure_result":"no_signal"}} +{"event":"action","seq":293,"wall_ts_ms":1789265739873,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0293","position":{"x":-2500.0,"y":500.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739873,"virtual_time_s":5693.343916,"measure_result":"no_signal"}} +{"event":"action","seq":294,"wall_ts_ms":1789265739873,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0294","position":{"x":-2500.0,"y":500.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739873,"virtual_time_s":5699.343916,"measure_result":"no_signal"}} +{"event":"action","seq":295,"wall_ts_ms":1789265739874,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0295","position":{"x":-2500.0,"y":500.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739874,"virtual_time_s":5705.343916,"measure_result":"no_signal"}} +{"event":"action","seq":296,"wall_ts_ms":1789265739874,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0296","position":{"x":-2500.0,"y":500.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739874,"virtual_time_s":5711.343916,"measure_result":"no_signal"}} +{"event":"action","seq":297,"wall_ts_ms":1789265739875,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0297","position":{"x":-2500.0,"y":500.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739875,"virtual_time_s":5717.343916,"measure_result":"no_signal"}} +{"event":"action","seq":298,"wall_ts_ms":1789265739876,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0298","position":{"x":-1300.0,"y":1500.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739876,"virtual_time_s":6034.753903,"measure_result":"no_signal"}} +{"event":"action","seq":299,"wall_ts_ms":1789265739876,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0299","position":{"x":-1300.0,"y":1500.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739876,"virtual_time_s":6040.753903,"measure_result":"no_signal"}} +{"event":"action","seq":300,"wall_ts_ms":1789265739877,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0300","position":{"x":-1300.0,"y":1500.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739877,"virtual_time_s":6046.753903,"measure_result":"no_signal"}} +{"event":"action","seq":301,"wall_ts_ms":1789265739877,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0301","position":{"x":-1300.0,"y":1500.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739877,"virtual_time_s":6052.753903,"measure_result":"no_signal"}} +{"event":"action","seq":302,"wall_ts_ms":1789265739878,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0302","position":{"x":-1300.0,"y":1500.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739878,"virtual_time_s":6058.753903,"measure_result":"no_signal"}} +{"event":"action","seq":303,"wall_ts_ms":1789265739878,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0303","position":{"x":-1300.0,"y":1500.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739878,"virtual_time_s":6064.753903,"measure_result":"no_signal"}} +{"event":"action","seq":304,"wall_ts_ms":1789265739879,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0304","position":{"x":-1300.0,"y":1500.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739879,"virtual_time_s":6070.753903,"measure_result":"no_signal"}} +{"event":"action","seq":305,"wall_ts_ms":1789265739879,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0305","position":{"x":-1300.0,"y":1500.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739879,"virtual_time_s":6076.753903,"measure_result":"no_signal"}} +{"event":"action","seq":306,"wall_ts_ms":1789265739880,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0306","position":{"x":-1300.0,"y":1500.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739880,"virtual_time_s":6082.753903,"measure_result":"no_signal"}} +{"event":"action","seq":307,"wall_ts_ms":1789265739880,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0307","position":{"x":-1300.0,"y":1500.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739880,"virtual_time_s":6088.753903,"measure_result":"no_signal"}} +{"event":"action","seq":308,"wall_ts_ms":1789265739881,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0308","position":{"x":-1300.0,"y":1500.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739881,"virtual_time_s":6094.753903,"measure_result":"no_signal"}} +{"event":"action","seq":309,"wall_ts_ms":1789265739882,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0309","position":{"x":-1300.0,"y":1500.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739881,"virtual_time_s":6100.753903,"measure_result":"no_signal"}} +{"event":"action","seq":310,"wall_ts_ms":1789265739882,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0310","position":{"x":-400.0,"y":1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739882,"virtual_time_s":6295.490563,"measure_result":"no_signal"}} +{"event":"action","seq":311,"wall_ts_ms":1789265739883,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0311","position":{"x":-400.0,"y":1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739883,"virtual_time_s":6301.490563,"measure_result":"no_signal"}} +{"event":"action","seq":312,"wall_ts_ms":1789265739883,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0312","position":{"x":-400.0,"y":1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739883,"virtual_time_s":6307.490563,"measure_result":"no_signal"}} +{"event":"action","seq":313,"wall_ts_ms":1789265739884,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0313","position":{"x":-400.0,"y":1800.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739884,"virtual_time_s":6313.490563,"measure_result":"direction","svd_deg":354.21}} +{"event":"action","seq":314,"wall_ts_ms":1789265739913,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0314","position":{"x":-400.0,"y":1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739913,"virtual_time_s":6319.490563,"measure_result":"no_signal"}} +{"event":"action","seq":315,"wall_ts_ms":1789265739914,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0315","position":{"x":-400.0,"y":1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739914,"virtual_time_s":6325.490563,"measure_result":"no_signal"}} +{"event":"action","seq":316,"wall_ts_ms":1789265739915,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0316","position":{"x":-400.0,"y":1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739915,"virtual_time_s":6331.490563,"measure_result":"no_signal"}} +{"event":"action","seq":317,"wall_ts_ms":1789265739915,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0317","position":{"x":-400.0,"y":1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739915,"virtual_time_s":6337.490563,"measure_result":"no_signal"}} +{"event":"action","seq":318,"wall_ts_ms":1789265739916,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0318","position":{"x":-400.0,"y":1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739916,"virtual_time_s":6343.490563,"measure_result":"no_signal"}} +{"event":"action","seq":319,"wall_ts_ms":1789265739916,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0319","position":{"x":-400.0,"y":1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739916,"virtual_time_s":6349.490563,"measure_result":"no_signal"}} +{"event":"action","seq":320,"wall_ts_ms":1789265739917,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0320","position":{"x":-400.0,"y":1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739917,"virtual_time_s":6355.490563,"measure_result":"no_signal"}} +{"event":"action","seq":321,"wall_ts_ms":1789265739918,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0321","position":{"x":-400.0,"y":1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739917,"virtual_time_s":6361.490563,"measure_result":"no_signal"}} +{"event":"action","seq":322,"wall_ts_ms":1789265740014,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0322","position":{"x":-24.55089621140732,"y":1727.78050764454},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265740014,"virtual_time_s":6443.956944,"measure_result":"direction","svd_deg":7.73}} +{"event":"action","seq":323,"wall_ts_ms":1789265740060,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0323","position":{"x":101.49926410957077,"y":1747.4479135884048},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265740060,"virtual_time_s":6474.471998,"measure_result":"near"}} +{"event":"action","seq":324,"wall_ts_ms":1789265740064,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0324","position":{"x":101.54406236532077,"y":1747.1545857629853},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265740064,"virtual_time_s":6479.531344,"clear_result":"success"}} +{"event":"action","seq":325,"wall_ts_ms":1789265740066,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0325","position":{"x":400.0,"y":1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740066,"virtual_time_s":6546.151006,"measure_result":"no_signal"}} +{"event":"action","seq":326,"wall_ts_ms":1789265740068,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0326","position":{"x":400.0,"y":1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740068,"virtual_time_s":6552.151006,"measure_result":"no_signal"}} +{"event":"action","seq":327,"wall_ts_ms":1789265740070,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0327","position":{"x":400.0,"y":1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740070,"virtual_time_s":6558.151006,"measure_result":"direction","svd_deg":191.2}} +{"event":"action","seq":328,"wall_ts_ms":1789265740116,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0328","position":{"x":400.0,"y":1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740116,"virtual_time_s":6564.151006,"measure_result":"no_signal"}} +{"event":"action","seq":329,"wall_ts_ms":1789265740118,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0329","position":{"x":400.0,"y":1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740118,"virtual_time_s":6570.151006,"measure_result":"no_signal"}} +{"event":"action","seq":330,"wall_ts_ms":1789265740119,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0330","position":{"x":400.0,"y":1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740119,"virtual_time_s":6576.151006,"measure_result":"no_signal"}} +{"event":"action","seq":331,"wall_ts_ms":1789265740120,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0331","position":{"x":400.0,"y":1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740120,"virtual_time_s":6582.151006,"measure_result":"no_signal"}} +{"event":"action","seq":332,"wall_ts_ms":1789265740120,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0332","position":{"x":400.0,"y":1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740120,"virtual_time_s":6588.151006,"measure_result":"no_signal"}} +{"event":"action","seq":333,"wall_ts_ms":1789265740121,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0333","position":{"x":400.0,"y":1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740121,"virtual_time_s":6594.151006,"measure_result":"direction","svd_deg":272.2}} +{"event":"action","seq":334,"wall_ts_ms":1789265740153,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0334","position":{"x":400.0,"y":1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740153,"virtual_time_s":6600.151006,"measure_result":"no_signal"}} +{"event":"action","seq":335,"wall_ts_ms":1789265740154,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0335","position":{"x":400.0,"y":1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740154,"virtual_time_s":6606.151006,"measure_result":"no_signal"}} +{"event":"action","seq":336,"wall_ts_ms":1789265740313,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0336","position":{"x":-24.20475655272145,"y":1636.8980627348978},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740313,"virtual_time_s":6703.046972,"measure_result":"direction","svd_deg":160.88}} +{"event":"action","seq":337,"wall_ts_ms":1789265740330,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0337","position":{"x":-158.52431169665903,"y":1687.3397389277611},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740330,"virtual_time_s":6736.74269,"measure_result":"direction","svd_deg":192.73}} +{"event":"action","seq":338,"wall_ts_ms":1789265740332,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0338","position":{"x":-165.6025782014923,"y":1685.833818291656},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740332,"virtual_time_s":6743.190028,"clear_result":"success"}} +{"event":"action","seq":339,"wall_ts_ms":1789265740480,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0339","position":{"x":171.91074610145796,"y":1285.0122857297256},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740480,"virtual_time_s":6853.989483,"measure_result":"no_signal"}} +{"event":"action","seq":340,"wall_ts_ms":1789265740610,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0340","position":{"x":429.14297023213675,"y":1391.5613616440485},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740610,"virtual_time_s":6914.674714,"measure_result":"no_signal"}} +{"event":"action","seq":341,"wall_ts_ms":1789265740744,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0341","position":{"x":686.3751943628156,"y":1285.0122857297256},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740744,"virtual_time_s":6975.359945,"measure_result":"no_signal"}} +{"event":"action","seq":342,"wall_ts_ms":1789265740884,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0342","position":{"x":429.1429702321368,"y":1755.3426616890501},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740884,"virtual_time_s":7087.575444,"measure_result":"direction","svd_deg":265.21}} +{"event":"action","seq":343,"wall_ts_ms":1789265740908,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0343","position":{"x":409.83408878169837,"y":1586.197737192631},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740908,"virtual_time_s":7126.624138,"measure_result":"direction","svd_deg":272.13}} +{"event":"action","seq":344,"wall_ts_ms":1789265740925,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0344","position":{"x":411.1387584130592,"y":1552.2577508333961},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740925,"virtual_time_s":7138.417149,"measure_result":"near"}} +{"event":"action","seq":345,"wall_ts_ms":1789265740928,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0345","position":{"x":411.13875841306526,"y":1552.2577508333966},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740928,"virtual_time_s":7143.417149,"clear_result":"success"}} +{"event":"action","seq":346,"wall_ts_ms":1789265740929,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0346","position":{"x":600.0,"y":1900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740929,"virtual_time_s":7228.560877,"measure_result":"no_signal"}} +{"event":"action","seq":347,"wall_ts_ms":1789265740930,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0347","position":{"x":600.0,"y":1900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740930,"virtual_time_s":7234.560877,"measure_result":"no_signal"}} +{"event":"action","seq":348,"wall_ts_ms":1789265740931,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0348","position":{"x":600.0,"y":1900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740931,"virtual_time_s":7240.560877,"measure_result":"no_signal"}} +{"event":"action","seq":349,"wall_ts_ms":1789265740932,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0349","position":{"x":600.0,"y":1900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740932,"virtual_time_s":7246.560877,"measure_result":"no_signal"}} +{"event":"action","seq":350,"wall_ts_ms":1789265740934,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0350","position":{"x":600.0,"y":1900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740934,"virtual_time_s":7252.560877,"measure_result":"no_signal"}} +{"event":"action","seq":351,"wall_ts_ms":1789265740935,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0351","position":{"x":600.0,"y":1900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740935,"virtual_time_s":7258.560877,"measure_result":"no_signal"}} +{"event":"action","seq":352,"wall_ts_ms":1789265740936,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0352","position":{"x":600.0,"y":1900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740936,"virtual_time_s":7264.560877,"measure_result":"no_signal"}} +{"event":"action","seq":353,"wall_ts_ms":1789265740937,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0353","position":{"x":600.0,"y":1900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740937,"virtual_time_s":7270.560877,"measure_result":"no_signal"}} +{"event":"action","seq":354,"wall_ts_ms":1789265740938,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0354","position":{"x":600.0,"y":1900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740938,"virtual_time_s":7276.560877,"measure_result":"no_signal"}} +{"event":"action","seq":355,"wall_ts_ms":1789265740939,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0355","position":{"x":800.0,"y":1200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740939,"virtual_time_s":7427.163075,"measure_result":"no_signal"}} +{"event":"action","seq":356,"wall_ts_ms":1789265740940,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0356","position":{"x":800.0,"y":1200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740940,"virtual_time_s":7433.163075,"measure_result":"no_signal"}} +{"event":"action","seq":357,"wall_ts_ms":1789265740942,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0357","position":{"x":800.0,"y":1200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740942,"virtual_time_s":7439.163075,"measure_result":"no_signal"}} +{"event":"action","seq":358,"wall_ts_ms":1789265740943,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0358","position":{"x":800.0,"y":1200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740943,"virtual_time_s":7445.163075,"measure_result":"no_signal"}} +{"event":"action","seq":359,"wall_ts_ms":1789265740944,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0359","position":{"x":800.0,"y":1200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740944,"virtual_time_s":7451.163075,"measure_result":"no_signal"}} +{"event":"action","seq":360,"wall_ts_ms":1789265740946,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0360","position":{"x":800.0,"y":1200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740946,"virtual_time_s":7457.163075,"measure_result":"no_signal"}} +{"event":"action","seq":361,"wall_ts_ms":1789265740947,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0361","position":{"x":800.0,"y":1200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740947,"virtual_time_s":7463.163075,"measure_result":"no_signal"}} +{"event":"action","seq":362,"wall_ts_ms":1789265740949,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0362","position":{"x":800.0,"y":1200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740949,"virtual_time_s":7469.163075,"measure_result":"no_signal"}} +{"event":"action","seq":363,"wall_ts_ms":1789265740950,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0363","position":{"x":800.0,"y":1200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740950,"virtual_time_s":7475.163075,"measure_result":"no_signal"}} +{"event":"action","seq":364,"wall_ts_ms":1789265740950,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0364","position":{"x":700.0,"y":700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740950,"virtual_time_s":7582.143465,"measure_result":"no_signal"}} +{"event":"action","seq":365,"wall_ts_ms":1789265740951,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0365","position":{"x":700.0,"y":700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740951,"virtual_time_s":7588.143465,"measure_result":"no_signal"}} +{"event":"action","seq":366,"wall_ts_ms":1789265740952,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0366","position":{"x":700.0,"y":700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740952,"virtual_time_s":7594.143465,"measure_result":"no_signal"}} +{"event":"action","seq":367,"wall_ts_ms":1789265740953,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0367","position":{"x":700.0,"y":700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740953,"virtual_time_s":7600.143465,"measure_result":"no_signal"}} +{"event":"action","seq":368,"wall_ts_ms":1789265740954,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0368","position":{"x":700.0,"y":700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740954,"virtual_time_s":7606.143465,"measure_result":"no_signal"}} +{"event":"action","seq":369,"wall_ts_ms":1789265740955,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0369","position":{"x":700.0,"y":700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740955,"virtual_time_s":7612.143465,"measure_result":"no_signal"}} +{"event":"action","seq":370,"wall_ts_ms":1789265740956,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0370","position":{"x":700.0,"y":700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740956,"virtual_time_s":7618.143465,"measure_result":"no_signal"}} +{"event":"action","seq":371,"wall_ts_ms":1789265740957,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0371","position":{"x":700.0,"y":700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740957,"virtual_time_s":7624.143465,"measure_result":"no_signal"}} +{"event":"action","seq":372,"wall_ts_ms":1789265740957,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0372","position":{"x":700.0,"y":700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740957,"virtual_time_s":7630.143465,"measure_result":"no_signal"}} +{"event":"action","seq":373,"wall_ts_ms":1789265740958,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0373","position":{"x":800.0,"y":200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740958,"virtual_time_s":7737.123855,"measure_result":"no_signal"}} +{"event":"action","seq":374,"wall_ts_ms":1789265740959,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0374","position":{"x":800.0,"y":200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740959,"virtual_time_s":7743.123855,"measure_result":"no_signal"}} +{"event":"action","seq":375,"wall_ts_ms":1789265740959,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0375","position":{"x":800.0,"y":200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740959,"virtual_time_s":7749.123855,"measure_result":"no_signal"}} +{"event":"action","seq":376,"wall_ts_ms":1789265740960,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0376","position":{"x":800.0,"y":200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740960,"virtual_time_s":7755.123855,"measure_result":"no_signal"}} +{"event":"action","seq":377,"wall_ts_ms":1789265740961,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0377","position":{"x":800.0,"y":200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740961,"virtual_time_s":7761.123855,"measure_result":"no_signal"}} +{"event":"action","seq":378,"wall_ts_ms":1789265740961,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0378","position":{"x":800.0,"y":200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740961,"virtual_time_s":7767.123855,"measure_result":"no_signal"}} +{"event":"action","seq":379,"wall_ts_ms":1789265740962,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0379","position":{"x":800.0,"y":200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740962,"virtual_time_s":7773.123855,"measure_result":"no_signal"}} +{"event":"action","seq":380,"wall_ts_ms":1789265740963,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0380","position":{"x":800.0,"y":200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740963,"virtual_time_s":7779.123855,"measure_result":"no_signal"}} +{"event":"action","seq":381,"wall_ts_ms":1789265740963,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0381","position":{"x":800.0,"y":200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740963,"virtual_time_s":7785.123855,"measure_result":"no_signal"}} +{"event":"action","seq":382,"wall_ts_ms":1789265740964,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0382","position":{"x":1800.0,"y":300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740964,"virtual_time_s":7991.121367,"measure_result":"no_signal"}} +{"event":"action","seq":383,"wall_ts_ms":1789265740965,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0383","position":{"x":1800.0,"y":300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740965,"virtual_time_s":7997.121367,"measure_result":"no_signal"}} +{"event":"action","seq":384,"wall_ts_ms":1789265740966,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0384","position":{"x":1800.0,"y":300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740966,"virtual_time_s":8003.121367,"measure_result":"no_signal"}} +{"event":"action","seq":385,"wall_ts_ms":1789265740969,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0385","position":{"x":1800.0,"y":300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740969,"virtual_time_s":8009.121367,"measure_result":"no_signal"}} +{"event":"action","seq":386,"wall_ts_ms":1789265740970,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0386","position":{"x":1800.0,"y":300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740970,"virtual_time_s":8015.121367,"measure_result":"no_signal"}} +{"event":"action","seq":387,"wall_ts_ms":1789265740971,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0387","position":{"x":1800.0,"y":300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740971,"virtual_time_s":8021.121367,"measure_result":"no_signal"}} +{"event":"action","seq":388,"wall_ts_ms":1789265740972,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0388","position":{"x":1800.0,"y":300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740972,"virtual_time_s":8027.121367,"measure_result":"no_signal"}} +{"event":"action","seq":389,"wall_ts_ms":1789265740972,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0389","position":{"x":1800.0,"y":300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740972,"virtual_time_s":8033.121367,"measure_result":"no_signal"}} +{"event":"action","seq":390,"wall_ts_ms":1789265740973,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0390","position":{"x":1800.0,"y":300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740973,"virtual_time_s":8039.121367,"measure_result":"no_signal"}} +{"event":"action","seq":391,"wall_ts_ms":1789265740974,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0391","position":{"x":1300.0,"y":1100.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740974,"virtual_time_s":8232.80099,"measure_result":"no_signal"}} +{"event":"action","seq":392,"wall_ts_ms":1789265740975,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0392","position":{"x":1300.0,"y":1100.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740975,"virtual_time_s":8238.80099,"measure_result":"no_signal"}} +{"event":"action","seq":393,"wall_ts_ms":1789265740975,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0393","position":{"x":1300.0,"y":1100.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740975,"virtual_time_s":8244.80099,"measure_result":"no_signal"}} +{"event":"action","seq":394,"wall_ts_ms":1789265740976,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0394","position":{"x":1300.0,"y":1100.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740976,"virtual_time_s":8250.80099,"measure_result":"no_signal"}} +{"event":"action","seq":395,"wall_ts_ms":1789265740976,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0395","position":{"x":1300.0,"y":1100.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740976,"virtual_time_s":8256.80099,"measure_result":"no_signal"}} +{"event":"action","seq":396,"wall_ts_ms":1789265740977,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0396","position":{"x":1300.0,"y":1100.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740977,"virtual_time_s":8262.80099,"measure_result":"no_signal"}} +{"event":"action","seq":397,"wall_ts_ms":1789265740978,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0397","position":{"x":1300.0,"y":1100.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740978,"virtual_time_s":8268.80099,"measure_result":"no_signal"}} +{"event":"action","seq":398,"wall_ts_ms":1789265740979,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0398","position":{"x":1300.0,"y":1100.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740979,"virtual_time_s":8274.80099,"measure_result":"no_signal"}} +{"event":"action","seq":399,"wall_ts_ms":1789265740981,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0399","position":{"x":1300.0,"y":1100.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740981,"virtual_time_s":8280.80099,"measure_result":"no_signal"}} +{"event":"action","seq":400,"wall_ts_ms":1789265740983,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0400","position":{"x":1500.0,"y":1300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740983,"virtual_time_s":8342.369532,"measure_result":"no_signal"}} +{"event":"action","seq":401,"wall_ts_ms":1789265740985,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0401","position":{"x":1500.0,"y":1300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740985,"virtual_time_s":8348.369532,"measure_result":"no_signal"}} +{"event":"action","seq":402,"wall_ts_ms":1789265740986,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0402","position":{"x":1500.0,"y":1300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740986,"virtual_time_s":8354.369532,"measure_result":"no_signal"}} +{"event":"action","seq":403,"wall_ts_ms":1789265740987,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0403","position":{"x":1500.0,"y":1300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740987,"virtual_time_s":8360.369532,"measure_result":"no_signal"}} +{"event":"action","seq":404,"wall_ts_ms":1789265740988,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0404","position":{"x":1500.0,"y":1300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740987,"virtual_time_s":8366.369532,"measure_result":"no_signal"}} +{"event":"action","seq":405,"wall_ts_ms":1789265740988,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0405","position":{"x":1500.0,"y":1300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740988,"virtual_time_s":8372.369532,"measure_result":"no_signal"}} +{"event":"action","seq":406,"wall_ts_ms":1789265740989,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0406","position":{"x":1500.0,"y":1300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740989,"virtual_time_s":8378.369532,"measure_result":"no_signal"}} +{"event":"action","seq":407,"wall_ts_ms":1789265740990,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0407","position":{"x":1500.0,"y":1300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740990,"virtual_time_s":8384.369532,"measure_result":"no_signal"}} +{"event":"action","seq":408,"wall_ts_ms":1789265740990,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0408","position":{"x":1500.0,"y":1300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740990,"virtual_time_s":8390.369532,"measure_result":"no_signal"}} +{"event":"action","seq":409,"wall_ts_ms":1789265740991,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0409","position":{"x":-200.0,"y":900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740991,"virtual_time_s":8744.654516,"measure_result":"no_signal"}} +{"event":"action","seq":410,"wall_ts_ms":1789265740992,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0410","position":{"x":-200.0,"y":900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740992,"virtual_time_s":8750.654516,"measure_result":"no_signal"}} +{"event":"action","seq":411,"wall_ts_ms":1789265740993,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0411","position":{"x":-200.0,"y":900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740993,"virtual_time_s":8756.654516,"measure_result":"no_signal"}} +{"event":"action","seq":412,"wall_ts_ms":1789265740994,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0412","position":{"x":-200.0,"y":900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740994,"virtual_time_s":8762.654516,"measure_result":"no_signal"}} +{"event":"action","seq":413,"wall_ts_ms":1789265740994,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0413","position":{"x":-200.0,"y":900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740994,"virtual_time_s":8768.654516,"measure_result":"no_signal"}} +{"event":"action","seq":414,"wall_ts_ms":1789265740995,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0414","position":{"x":-200.0,"y":900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740995,"virtual_time_s":8774.654516,"measure_result":"no_signal"}} +{"event":"action","seq":415,"wall_ts_ms":1789265740996,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0415","position":{"x":-200.0,"y":900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740996,"virtual_time_s":8780.654516,"measure_result":"no_signal"}} +{"event":"action","seq":416,"wall_ts_ms":1789265740996,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0416","position":{"x":-200.0,"y":900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740996,"virtual_time_s":8786.654516,"measure_result":"no_signal"}} +{"event":"action","seq":417,"wall_ts_ms":1789265740997,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0417","position":{"x":-200.0,"y":900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740997,"virtual_time_s":8792.654516,"measure_result":"no_signal"}} +{"event":"action","seq":418,"wall_ts_ms":1789265740998,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0418","position":{"x":-500.0,"y":700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740998,"virtual_time_s":8869.765542,"measure_result":"no_signal"}} +{"event":"action","seq":419,"wall_ts_ms":1789265740998,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0419","position":{"x":-500.0,"y":700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740998,"virtual_time_s":8875.765542,"measure_result":"no_signal"}} +{"event":"action","seq":420,"wall_ts_ms":1789265740999,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0420","position":{"x":-500.0,"y":700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740999,"virtual_time_s":8881.765542,"measure_result":"no_signal"}} +{"event":"action","seq":421,"wall_ts_ms":1789265741000,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0421","position":{"x":-500.0,"y":700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265741000,"virtual_time_s":8887.765542,"measure_result":"no_signal"}} +{"event":"action","seq":422,"wall_ts_ms":1789265741000,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0422","position":{"x":-500.0,"y":700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265741000,"virtual_time_s":8893.765542,"measure_result":"no_signal"}} +{"event":"action","seq":423,"wall_ts_ms":1789265741001,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0423","position":{"x":-500.0,"y":700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265741001,"virtual_time_s":8899.765542,"measure_result":"no_signal"}} +{"event":"action","seq":424,"wall_ts_ms":1789265741001,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0424","position":{"x":-500.0,"y":700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265741001,"virtual_time_s":8905.765542,"measure_result":"no_signal"}} +{"event":"action","seq":425,"wall_ts_ms":1789265741002,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0425","position":{"x":-500.0,"y":700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265741002,"virtual_time_s":8911.765542,"measure_result":"no_signal"}} +{"event":"action","seq":426,"wall_ts_ms":1789265741003,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0426","position":{"x":-500.0,"y":700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265741003,"virtual_time_s":8917.765542,"measure_result":"no_signal"}} +{"event":"action","seq":427,"wall_ts_ms":1789265741003,"method":"POST","path":"/exit","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0427"},"response":{"accepted":true,"real_timestamp_ms":1789265741003,"virtual_time_s":8917.765542,"exit_reason":"user_exit"}} +{"event":"session_end","reason":"user_exit","virtual_time_s":8917.765542,"real_elapsed_s":10.027643,"request_count":427,"cleared_count":11} diff --git a/referee-data/sessions/GHSN-M38E-74GD-YLUD/log.jsonl b/referee-data/sessions/GHSN-M38E-74GD-YLUD/log.jsonl new file mode 100644 index 0000000..61a42f5 --- /dev/null +++ b/referee-data/sessions/GHSN-M38E-74GD-YLUD/log.jsonl @@ -0,0 +1,429 @@ +{"event": "session_start", "case_code": "GHSN-M38E-74GD-YLUD", "module": "q4_practice", "robot_id": "1", "seed": 1907688398, "countdown_s": 5.0, "window_s": 1500.0, "max_real_duration_s": 1200.0, "truth": [{"channel": 6, "x": -168.78031525275804, "y": 1684.875239455932, "r_eff_m": 1233.1529913973563, "directional": true, "heading_deg": 351.84275431652014}, {"channel": 15, "x": 411.7975180678083, "y": 1548.040304144621, "r_eff_m": 1336.3045523445826, "directional": true, "heading_deg": 72.47781232458263}, {"channel": 8, "x": 978.6674582823607, "y": -996.1121301869524, "r_eff_m": 1336.1370990332562, "directional": true, "heading_deg": 246.14394851382335}, {"channel": 16, "x": 124.00340756473021, "y": -860.3622285357711, "r_eff_m": 1345.578791332298, "directional": false, "heading_deg": 0.0}, {"channel": 10, "x": 729.8914456683548, "y": 714.3629430529361, "r_eff_m": 1127.494833936053, "directional": false, "heading_deg": 0.0}, {"channel": 2, "x": 478.441266630241, "y": 449.08113076378316, "r_eff_m": 1040.6068154097852, "directional": false, "heading_deg": 0.0}, {"channel": 20, "x": -945.2003883886779, "y": 638.5311986666989, "r_eff_m": 1295.456469667405, "directional": false, "heading_deg": 0.0}, {"channel": 4, "x": 99.04602689897295, "y": 1744.5260335974826, "r_eff_m": 1032.9094604449615, "directional": false, "heading_deg": 0.0}, {"channel": 5, "x": -1507.0542438070167, "y": 761.3723575581047, "r_eff_m": 1448.7977020579874, "directional": false, "heading_deg": 0.0}, {"channel": 12, "x": -1188.1583136013294, "y": 963.0220608398997, "r_eff_m": 1226.2619264983982, "directional": false, "heading_deg": 0.0}, {"channel": 19, "x": -177.4461437404443, "y": 343.49207176417394, "r_eff_m": 1277.3413627947266, "directional": false, "heading_deg": 0.0}]} +{"event": "action", "seq": 1, "wall_ts_ms": 1789265737816, "method": "POST", "path": "/enter", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0001"}, "response": {"accepted": true, "real_timestamp_ms": 1789265737816, "virtual_time_s": 0.0, "max_virtual_duration_s": 360000.0, "max_real_duration_s": 1200, "remaining_real_duration_s": 1200}} +{"event": "action", "seq": 2, "wall_ts_ms": 1789265737826, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0002", "position": {"x": 0.0, "y": 0.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265737826, "virtual_time_s": 5.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 3, "wall_ts_ms": 1789265737827, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0003", "position": {"x": 0.0, "y": 0.0}, "channel": 2}, "response": {"accepted": true, "real_timestamp_ms": 1789265737827, "virtual_time_s": 11.0, "measure_result": "direction", "svd_deg": 43.2}} +{"event": "action", "seq": 4, "wall_ts_ms": 1789265737865, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0004", "position": {"x": 0.0, "y": 0.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265737865, "virtual_time_s": 17.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 5, "wall_ts_ms": 1789265737866, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0005", "position": {"x": 0.0, "y": 0.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265737866, "virtual_time_s": 23.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 6, "wall_ts_ms": 1789265737867, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0006", "position": {"x": 0.0, "y": 0.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265737867, "virtual_time_s": 29.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 7, "wall_ts_ms": 1789265737867, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0007", "position": {"x": 0.0, "y": 0.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265737867, "virtual_time_s": 35.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 8, "wall_ts_ms": 1789265737868, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0008", "position": {"x": 0.0, "y": 0.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265737868, "virtual_time_s": 41.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 9, "wall_ts_ms": 1789265737869, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0009", "position": {"x": 0.0, "y": 0.0}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265737869, "virtual_time_s": 47.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 10, "wall_ts_ms": 1789265737869, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0010", "position": {"x": 0.0, "y": 0.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265737869, "virtual_time_s": 53.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 11, "wall_ts_ms": 1789265737870, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0011", "position": {"x": 0.0, "y": 0.0}, "channel": 10}, "response": {"accepted": true, "real_timestamp_ms": 1789265737870, "virtual_time_s": 59.0, "measure_result": "direction", "svd_deg": 45.09}} +{"event": "action", "seq": 12, "wall_ts_ms": 1789265737905, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0012", "position": {"x": 0.0, "y": 0.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265737905, "virtual_time_s": 65.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 13, "wall_ts_ms": 1789265737906, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0013", "position": {"x": 0.0, "y": 0.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265737906, "virtual_time_s": 71.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 14, "wall_ts_ms": 1789265737907, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0014", "position": {"x": 0.0, "y": 0.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265737907, "virtual_time_s": 77.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 15, "wall_ts_ms": 1789265737908, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0015", "position": {"x": 0.0, "y": 0.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265737908, "virtual_time_s": 83.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 16, "wall_ts_ms": 1789265737908, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0016", "position": {"x": 0.0, "y": 0.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265737908, "virtual_time_s": 89.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 17, "wall_ts_ms": 1789265737909, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0017", "position": {"x": 0.0, "y": 0.0}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265737909, "virtual_time_s": 95.0, "measure_result": "direction", "svd_deg": 279.14}} +{"event": "action", "seq": 18, "wall_ts_ms": 1789265737945, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0018", "position": {"x": 0.0, "y": 0.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265737945, "virtual_time_s": 101.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 19, "wall_ts_ms": 1789265737946, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0019", "position": {"x": 0.0, "y": 0.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265737946, "virtual_time_s": 107.0, "measure_result": "no_signal"}} +{"event": "action", "seq": 20, "wall_ts_ms": 1789265737947, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0020", "position": {"x": 0.0, "y": 0.0}, "channel": 19}, "response": {"accepted": true, "real_timestamp_ms": 1789265737947, "virtual_time_s": 113.0, "measure_result": "direction", "svd_deg": 117.36}} +{"event": "action", "seq": 21, "wall_ts_ms": 1789265737983, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0021", "position": {"x": 0.0, "y": 0.0}, "channel": 20}, "response": {"accepted": true, "real_timestamp_ms": 1789265737983, "virtual_time_s": 119.0, "measure_result": "direction", "svd_deg": 145.55}} +{"event": "action", "seq": 22, "wall_ts_ms": 1789265738125, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0022", "position": {"x": -79.66719841213751, "y": 400.9313670917169}, "channel": 19}, "response": {"accepted": true, "real_timestamp_ms": 1789265738125, "virtual_time_s": 206.753978, "measure_result": "direction", "svd_deg": 210.37}} +{"event": "action", "seq": 23, "wall_ts_ms": 1789265738127, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0023", "position": {"x": -177.64052160825486, "y": 343.3794788045638}, "channel": 19}, "response": {"accepted": true, "real_timestamp_ms": 1789265738127, "virtual_time_s": 234.479287, "clear_result": "success"}} +{"event": "action", "seq": 24, "wall_ts_ms": 1789265738245, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0024", "position": {"x": -243.62294879732218, "y": 424.1621461926654}, "channel": 20}, "response": {"accepted": true, "real_timestamp_ms": 1789265738245, "virtual_time_s": 261.340275, "measure_result": "direction", "svd_deg": 162.22}} +{"event": "action", "seq": 25, "wall_ts_ms": 1789265738273, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0025", "position": {"x": -901.7130728821326, "y": 655.9084449749266}, "channel": 20}, "response": {"accepted": true, "real_timestamp_ms": 1789265738273, "virtual_time_s": 405.880801, "measure_result": "direction", "svd_deg": 202.15}} +{"event": "action", "seq": 26, "wall_ts_ms": 1789265738284, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0026", "position": {"x": -922.0070945081434, "y": 643.9441735456403}, "channel": 20}, "response": {"accepted": true, "real_timestamp_ms": 1789265738284, "virtual_time_s": 415.592451, "measure_result": "direction", "svd_deg": 193.27}} +{"event": "action", "seq": 27, "wall_ts_ms": 1789265738286, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0027", "position": {"x": -943.9158056887892, "y": 638.8511609168044}, "channel": 20}, "response": {"accepted": true, "real_timestamp_ms": 1789265738286, "virtual_time_s": 425.09103, "clear_result": "success"}} +{"event": "action", "seq": 28, "wall_ts_ms": 1789265738445, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0028", "position": {"x": 155.06480714962538, "y": 530.7765221920923}, "channel": 10}, "response": {"accepted": true, "real_timestamp_ms": 1789265738445, "virtual_time_s": 651.94741, "measure_result": "direction", "svd_deg": 18.62}} +{"event": "action", "seq": 29, "wall_ts_ms": 1789265738475, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0029", "position": {"x": 691.0981141562518, "y": 722.9949655036279}, "channel": 10}, "response": {"accepted": true, "real_timestamp_ms": 1789265738475, "virtual_time_s": 770.838522, "measure_result": "direction", "svd_deg": 348.1}} +{"event": "action", "seq": 30, "wall_ts_ms": 1789265738490, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0030", "position": {"x": 704.6480025466224, "y": 718.3903941183868}, "channel": 10}, "response": {"accepted": true, "real_timestamp_ms": 1789265738490, "virtual_time_s": 778.7007, "measure_result": "direction", "svd_deg": 350.26}} +{"event": "action", "seq": 31, "wall_ts_ms": 1789265738492, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0031", "position": {"x": 728.5054559976093, "y": 714.7247743974735}, "channel": 10}, "response": {"accepted": true, "real_timestamp_ms": 1789265738492, "virtual_time_s": 788.528183, "clear_result": "success"}} +{"event": "action", "seq": 32, "wall_ts_ms": 1789265738690, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0032", "position": {"x": 282.155927735649, "y": 778.2311705887862}, "channel": 2}, "response": {"accepted": true, "real_timestamp_ms": 1789265738690, "virtual_time_s": 884.697127, "measure_result": "direction", "svd_deg": 301.58}} +{"event": "action", "seq": 33, "wall_ts_ms": 1789265738692, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0033", "position": {"x": 481.9384520825037, "y": 452.79231376594635}, "channel": 2}, "response": {"accepted": true, "real_timestamp_ms": 1789265738692, "virtual_time_s": 966.070815, "clear_result": "success"}} +{"event": "action", "seq": 34, "wall_ts_ms": 1789265738822, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0034", "position": {"x": 119.77278770558408, "y": -365.4630725746676}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738822, "virtual_time_s": 1151.035152, "measure_result": "direction", "svd_deg": 270.43}} +{"event": "action", "seq": 35, "wall_ts_ms": 1789265738857, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0035", "position": {"x": 125.50362627876382, "y": -724.3528216084252}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738857, "virtual_time_s": 1227.822252, "measure_result": "direction", "svd_deg": 268.9}} +{"event": "action", "seq": 36, "wall_ts_ms": 1789265738877, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0036", "position": {"x": 125.3777171626325, "y": -762.3214764994508}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738877, "virtual_time_s": 1240.416025, "measure_result": "direction", "svd_deg": 269.25}} +{"event": "action", "seq": 37, "wall_ts_ms": 1789265738893, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0037", "position": {"x": 125.31476260456685, "y": -790.7980024619326}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738893, "virtual_time_s": 1251.111344, "measure_result": "direction", "svd_deg": 269.45}} +{"event": "action", "seq": 38, "wall_ts_ms": 1789265738907, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0038", "position": {"x": 125.28328532553402, "y": -812.1554085318639}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738907, "virtual_time_s": 1260.38283, "measure_result": "direction", "svd_deg": 269.15999999999997}} +{"event": "action", "seq": 39, "wall_ts_ms": 1789265738919, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0039", "position": {"x": 125.2675466860176, "y": -828.1734669503353}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738919, "virtual_time_s": 1268.586443, "measure_result": "direction", "svd_deg": 268.21}} +{"event": "action", "seq": 40, "wall_ts_ms": 1789265738931, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0040", "position": {"x": 124.96644242180939, "y": -839.1602852992372}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738931, "virtual_time_s": 1275.784632, "measure_result": "direction", "svd_deg": 266.93}} +{"event": "action", "seq": 41, "wall_ts_ms": 1789265738933, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0041", "position": {"x": 124.4615306510994, "y": -853.1635717026913}, "channel": 16}, "response": {"accepted": true, "real_timestamp_ms": 1789265738933, "virtual_time_s": 1283.587109, "clear_result": "success"}} +{"event": "action", "seq": 42, "wall_ts_ms": 1789265738934, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0042", "position": {"x": 200.0, "y": -900.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265738934, "virtual_time_s": 1307.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 43, "wall_ts_ms": 1789265738935, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0043", "position": {"x": 200.0, "y": -900.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265738935, "virtual_time_s": 1313.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 44, "wall_ts_ms": 1789265738936, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0044", "position": {"x": 200.0, "y": -900.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265738936, "virtual_time_s": 1319.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 45, "wall_ts_ms": 1789265738936, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0045", "position": {"x": 200.0, "y": -900.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265738936, "virtual_time_s": 1325.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 46, "wall_ts_ms": 1789265738937, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0046", "position": {"x": 200.0, "y": -900.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265738937, "virtual_time_s": 1331.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 47, "wall_ts_ms": 1789265738938, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0047", "position": {"x": 200.0, "y": -900.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265738938, "virtual_time_s": 1337.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 48, "wall_ts_ms": 1789265738939, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0048", "position": {"x": 200.0, "y": -900.0}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265738939, "virtual_time_s": 1343.363173, "measure_result": "direction", "svd_deg": 352.99}} +{"event": "action", "seq": 49, "wall_ts_ms": 1789265738972, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0049", "position": {"x": 200.0, "y": -900.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265738972, "virtual_time_s": 1349.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 50, "wall_ts_ms": 1789265738973, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0050", "position": {"x": 200.0, "y": -900.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265738973, "virtual_time_s": 1355.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 51, "wall_ts_ms": 1789265738974, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0051", "position": {"x": 200.0, "y": -900.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265738974, "virtual_time_s": 1361.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 52, "wall_ts_ms": 1789265738975, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0052", "position": {"x": 200.0, "y": -900.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265738975, "virtual_time_s": 1367.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 53, "wall_ts_ms": 1789265738977, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0053", "position": {"x": 200.0, "y": -900.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265738977, "virtual_time_s": 1373.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 54, "wall_ts_ms": 1789265738978, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0054", "position": {"x": 200.0, "y": -900.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265738978, "virtual_time_s": 1379.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 55, "wall_ts_ms": 1789265738978, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0055", "position": {"x": 200.0, "y": -900.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265738978, "virtual_time_s": 1385.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 56, "wall_ts_ms": 1789265738979, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0056", "position": {"x": 200.0, "y": -900.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265738979, "virtual_time_s": 1391.363173, "measure_result": "no_signal"}} +{"event": "action", "seq": 57, "wall_ts_ms": 1789265739081, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0057", "position": {"x": 516.6212801392332, "y": -966.9819199979597}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265739081, "virtual_time_s": 1462.088937, "measure_result": "direction", "svd_deg": 357.38}} +{"event": "action", "seq": 58, "wall_ts_ms": 1789265739136, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0058", "position": {"x": 866.5933228570544, "y": -995.2814295412376}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265739136, "virtual_time_s": 1537.311809, "measure_result": "direction", "svd_deg": 358.73}} +{"event": "action", "seq": 59, "wall_ts_ms": 1789265739167, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0059", "position": {"x": 1040.8377161691203, "y": -1003.1570563336973}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265739167, "virtual_time_s": 1577.196266, "measure_result": "no_signal"}} +{"event": "action", "seq": 60, "wall_ts_ms": 1789265739202, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0060", "position": {"x": 970.7414216957415, "y": -1003.1570563336973}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265739202, "virtual_time_s": 1596.215525, "measure_result": "direction", "svd_deg": 41.87}} +{"event": "action", "seq": 61, "wall_ts_ms": 1789265739204, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0061", "position": {"x": 978.7251752457973, "y": -996.0135773020329}, "channel": 8}, "response": {"accepted": true, "real_timestamp_ms": 1789265739204, "virtual_time_s": 1603.358137, "clear_result": "success"}} +{"event": "action", "seq": 62, "wall_ts_ms": 1789265739205, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0062", "position": {"x": 900.0, "y": -700.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739205, "virtual_time_s": 1670.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 63, "wall_ts_ms": 1789265739206, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0063", "position": {"x": 900.0, "y": -700.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739206, "virtual_time_s": 1676.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 64, "wall_ts_ms": 1789265739207, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0064", "position": {"x": 900.0, "y": -700.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739207, "virtual_time_s": 1682.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 65, "wall_ts_ms": 1789265739207, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0065", "position": {"x": 900.0, "y": -700.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739207, "virtual_time_s": 1688.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 66, "wall_ts_ms": 1789265739208, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0066", "position": {"x": 900.0, "y": -700.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739208, "virtual_time_s": 1694.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 67, "wall_ts_ms": 1789265739211, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0067", "position": {"x": 900.0, "y": -700.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739211, "virtual_time_s": 1700.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 68, "wall_ts_ms": 1789265739212, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0068", "position": {"x": 900.0, "y": -700.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739212, "virtual_time_s": 1706.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 69, "wall_ts_ms": 1789265739212, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0069", "position": {"x": 900.0, "y": -700.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739212, "virtual_time_s": 1712.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 70, "wall_ts_ms": 1789265739213, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0070", "position": {"x": 900.0, "y": -700.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739213, "virtual_time_s": 1718.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 71, "wall_ts_ms": 1789265739214, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0071", "position": {"x": 900.0, "y": -700.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739214, "virtual_time_s": 1724.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 72, "wall_ts_ms": 1789265739216, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0072", "position": {"x": 900.0, "y": -700.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739216, "virtual_time_s": 1730.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 73, "wall_ts_ms": 1789265739217, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0073", "position": {"x": 900.0, "y": -700.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739217, "virtual_time_s": 1736.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 74, "wall_ts_ms": 1789265739218, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0074", "position": {"x": 900.0, "y": -700.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739218, "virtual_time_s": 1742.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 75, "wall_ts_ms": 1789265739219, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0075", "position": {"x": 900.0, "y": -700.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739219, "virtual_time_s": 1748.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 76, "wall_ts_ms": 1789265739219, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0076", "position": {"x": 1200.0, "y": -700.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739219, "virtual_time_s": 1813.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 77, "wall_ts_ms": 1789265739220, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0077", "position": {"x": 1200.0, "y": -700.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739220, "virtual_time_s": 1819.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 78, "wall_ts_ms": 1789265739221, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0078", "position": {"x": 1200.0, "y": -700.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739221, "virtual_time_s": 1825.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 79, "wall_ts_ms": 1789265739221, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0079", "position": {"x": 1200.0, "y": -700.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739221, "virtual_time_s": 1831.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 80, "wall_ts_ms": 1789265739222, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0080", "position": {"x": 1200.0, "y": -700.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739222, "virtual_time_s": 1837.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 81, "wall_ts_ms": 1789265739223, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0081", "position": {"x": 1200.0, "y": -700.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739223, "virtual_time_s": 1843.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 82, "wall_ts_ms": 1789265739223, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0082", "position": {"x": 1200.0, "y": -700.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739223, "virtual_time_s": 1849.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 83, "wall_ts_ms": 1789265739224, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0083", "position": {"x": 1200.0, "y": -700.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739224, "virtual_time_s": 1855.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 84, "wall_ts_ms": 1789265739225, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0084", "position": {"x": 1200.0, "y": -700.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739225, "virtual_time_s": 1861.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 85, "wall_ts_ms": 1789265739226, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0085", "position": {"x": 1200.0, "y": -700.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739226, "virtual_time_s": 1867.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 86, "wall_ts_ms": 1789265739226, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0086", "position": {"x": 1200.0, "y": -700.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739226, "virtual_time_s": 1873.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 87, "wall_ts_ms": 1789265739227, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0087", "position": {"x": 1200.0, "y": -700.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739227, "virtual_time_s": 1879.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 88, "wall_ts_ms": 1789265739228, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0088", "position": {"x": 1200.0, "y": -700.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739228, "virtual_time_s": 1885.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 89, "wall_ts_ms": 1789265739228, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0089", "position": {"x": 1200.0, "y": -700.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739228, "virtual_time_s": 1891.61879, "measure_result": "no_signal"}} +{"event": "action", "seq": 90, "wall_ts_ms": 1789265739229, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0090", "position": {"x": 1800.0, "y": -400.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739229, "virtual_time_s": 2030.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 91, "wall_ts_ms": 1789265739230, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0091", "position": {"x": 1800.0, "y": -400.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739230, "virtual_time_s": 2036.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 92, "wall_ts_ms": 1789265739230, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0092", "position": {"x": 1800.0, "y": -400.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739230, "virtual_time_s": 2042.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 93, "wall_ts_ms": 1789265739231, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0093", "position": {"x": 1800.0, "y": -400.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739231, "virtual_time_s": 2048.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 94, "wall_ts_ms": 1789265739232, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0094", "position": {"x": 1800.0, "y": -400.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739232, "virtual_time_s": 2054.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 95, "wall_ts_ms": 1789265739233, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0095", "position": {"x": 1800.0, "y": -400.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739233, "virtual_time_s": 2060.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 96, "wall_ts_ms": 1789265739233, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0096", "position": {"x": 1800.0, "y": -400.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739233, "virtual_time_s": 2066.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 97, "wall_ts_ms": 1789265739234, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0097", "position": {"x": 1800.0, "y": -400.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739234, "virtual_time_s": 2072.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 98, "wall_ts_ms": 1789265739234, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0098", "position": {"x": 1800.0, "y": -400.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739234, "virtual_time_s": 2078.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 99, "wall_ts_ms": 1789265739235, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0099", "position": {"x": 1800.0, "y": -400.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739235, "virtual_time_s": 2084.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 100, "wall_ts_ms": 1789265739236, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0100", "position": {"x": 1800.0, "y": -400.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739236, "virtual_time_s": 2090.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 101, "wall_ts_ms": 1789265739236, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0101", "position": {"x": 1800.0, "y": -400.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739236, "virtual_time_s": 2096.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 102, "wall_ts_ms": 1789265739237, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0102", "position": {"x": 1800.0, "y": -400.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739237, "virtual_time_s": 2102.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 103, "wall_ts_ms": 1789265739238, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0103", "position": {"x": 1800.0, "y": -400.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739238, "virtual_time_s": 2108.782869, "measure_result": "no_signal"}} +{"event": "action", "seq": 104, "wall_ts_ms": 1789265739238, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0104", "position": {"x": 1900.0, "y": -900.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739238, "virtual_time_s": 2215.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 105, "wall_ts_ms": 1789265739239, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0105", "position": {"x": 1900.0, "y": -900.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739239, "virtual_time_s": 2221.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 106, "wall_ts_ms": 1789265739240, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0106", "position": {"x": 1900.0, "y": -900.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739240, "virtual_time_s": 2227.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 107, "wall_ts_ms": 1789265739240, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0107", "position": {"x": 1900.0, "y": -900.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739240, "virtual_time_s": 2233.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 108, "wall_ts_ms": 1789265739241, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0108", "position": {"x": 1900.0, "y": -900.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739241, "virtual_time_s": 2239.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 109, "wall_ts_ms": 1789265739241, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0109", "position": {"x": 1900.0, "y": -900.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739241, "virtual_time_s": 2245.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 110, "wall_ts_ms": 1789265739242, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0110", "position": {"x": 1900.0, "y": -900.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739242, "virtual_time_s": 2251.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 111, "wall_ts_ms": 1789265739242, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0111", "position": {"x": 1900.0, "y": -900.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739242, "virtual_time_s": 2257.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 112, "wall_ts_ms": 1789265739243, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0112", "position": {"x": 1900.0, "y": -900.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739243, "virtual_time_s": 2263.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 113, "wall_ts_ms": 1789265739244, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0113", "position": {"x": 1900.0, "y": -900.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739244, "virtual_time_s": 2269.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 114, "wall_ts_ms": 1789265739244, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0114", "position": {"x": 1900.0, "y": -900.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739244, "virtual_time_s": 2275.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 115, "wall_ts_ms": 1789265739245, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0115", "position": {"x": 1900.0, "y": -900.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739245, "virtual_time_s": 2281.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 116, "wall_ts_ms": 1789265739246, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0116", "position": {"x": 1900.0, "y": -900.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739246, "virtual_time_s": 2287.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 117, "wall_ts_ms": 1789265739247, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0117", "position": {"x": 1900.0, "y": -900.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739247, "virtual_time_s": 2293.763259, "measure_result": "no_signal"}} +{"event": "action", "seq": 118, "wall_ts_ms": 1789265739248, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0118", "position": {"x": 1400.0, "y": -1400.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739248, "virtual_time_s": 2440.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 119, "wall_ts_ms": 1789265739249, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0119", "position": {"x": 1400.0, "y": -1400.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739249, "virtual_time_s": 2446.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 120, "wall_ts_ms": 1789265739249, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0120", "position": {"x": 1400.0, "y": -1400.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739249, "virtual_time_s": 2452.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 121, "wall_ts_ms": 1789265739250, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0121", "position": {"x": 1400.0, "y": -1400.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739250, "virtual_time_s": 2458.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 122, "wall_ts_ms": 1789265739251, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0122", "position": {"x": 1400.0, "y": -1400.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739251, "virtual_time_s": 2464.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 123, "wall_ts_ms": 1789265739251, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0123", "position": {"x": 1400.0, "y": -1400.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739251, "virtual_time_s": 2470.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 124, "wall_ts_ms": 1789265739252, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0124", "position": {"x": 1400.0, "y": -1400.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739252, "virtual_time_s": 2476.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 125, "wall_ts_ms": 1789265739253, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0125", "position": {"x": 1400.0, "y": -1400.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739252, "virtual_time_s": 2482.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 126, "wall_ts_ms": 1789265739253, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0126", "position": {"x": 1400.0, "y": -1400.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739253, "virtual_time_s": 2488.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 127, "wall_ts_ms": 1789265739254, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0127", "position": {"x": 1400.0, "y": -1400.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739254, "virtual_time_s": 2494.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 128, "wall_ts_ms": 1789265739254, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0128", "position": {"x": 1400.0, "y": -1400.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739254, "virtual_time_s": 2500.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 129, "wall_ts_ms": 1789265739255, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0129", "position": {"x": 1400.0, "y": -1400.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739255, "virtual_time_s": 2506.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 130, "wall_ts_ms": 1789265739255, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0130", "position": {"x": 1400.0, "y": -1400.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739255, "virtual_time_s": 2512.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 131, "wall_ts_ms": 1789265739256, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0131", "position": {"x": 1400.0, "y": -1400.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739256, "virtual_time_s": 2518.184615, "measure_result": "no_signal"}} +{"event": "action", "seq": 132, "wall_ts_ms": 1789265739256, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0132", "position": {"x": 500.0, "y": -1800.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739256, "virtual_time_s": 2720.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 133, "wall_ts_ms": 1789265739257, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0133", "position": {"x": 500.0, "y": -1800.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739257, "virtual_time_s": 2726.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 134, "wall_ts_ms": 1789265739258, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0134", "position": {"x": 500.0, "y": -1800.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739258, "virtual_time_s": 2732.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 135, "wall_ts_ms": 1789265739258, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0135", "position": {"x": 500.0, "y": -1800.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739258, "virtual_time_s": 2738.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 136, "wall_ts_ms": 1789265739259, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0136", "position": {"x": 500.0, "y": -1800.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739259, "virtual_time_s": 2744.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 137, "wall_ts_ms": 1789265739260, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0137", "position": {"x": 500.0, "y": -1800.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739260, "virtual_time_s": 2750.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 138, "wall_ts_ms": 1789265739260, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0138", "position": {"x": 500.0, "y": -1800.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739260, "virtual_time_s": 2756.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 139, "wall_ts_ms": 1789265739261, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0139", "position": {"x": 500.0, "y": -1800.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739261, "virtual_time_s": 2762.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 140, "wall_ts_ms": 1789265739262, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0140", "position": {"x": 500.0, "y": -1800.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739262, "virtual_time_s": 2768.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 141, "wall_ts_ms": 1789265739262, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0141", "position": {"x": 500.0, "y": -1800.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739262, "virtual_time_s": 2774.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 142, "wall_ts_ms": 1789265739263, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0142", "position": {"x": 500.0, "y": -1800.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739263, "virtual_time_s": 2780.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 143, "wall_ts_ms": 1789265739263, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0143", "position": {"x": 500.0, "y": -1800.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739263, "virtual_time_s": 2786.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 144, "wall_ts_ms": 1789265739264, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0144", "position": {"x": 500.0, "y": -1800.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739264, "virtual_time_s": 2792.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 145, "wall_ts_ms": 1789265739264, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0145", "position": {"x": 500.0, "y": -1800.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739264, "virtual_time_s": 2798.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 146, "wall_ts_ms": 1789265739265, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0146", "position": {"x": -400.0, "y": -1800.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739265, "virtual_time_s": 2983.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 147, "wall_ts_ms": 1789265739266, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0147", "position": {"x": -400.0, "y": -1800.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739266, "virtual_time_s": 2989.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 148, "wall_ts_ms": 1789265739266, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0148", "position": {"x": -400.0, "y": -1800.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739266, "virtual_time_s": 2995.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 149, "wall_ts_ms": 1789265739267, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0149", "position": {"x": -400.0, "y": -1800.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739267, "virtual_time_s": 3001.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 150, "wall_ts_ms": 1789265739267, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0150", "position": {"x": -400.0, "y": -1800.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739267, "virtual_time_s": 3007.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 151, "wall_ts_ms": 1789265739268, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0151", "position": {"x": -400.0, "y": -1800.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739268, "virtual_time_s": 3013.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 152, "wall_ts_ms": 1789265739268, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0152", "position": {"x": -400.0, "y": -1800.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739268, "virtual_time_s": 3019.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 153, "wall_ts_ms": 1789265739269, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0153", "position": {"x": -400.0, "y": -1800.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739269, "virtual_time_s": 3025.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 154, "wall_ts_ms": 1789265739270, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0154", "position": {"x": -400.0, "y": -1800.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739270, "virtual_time_s": 3031.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 155, "wall_ts_ms": 1789265739270, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0155", "position": {"x": -400.0, "y": -1800.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739270, "virtual_time_s": 3037.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 156, "wall_ts_ms": 1789265739271, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0156", "position": {"x": -400.0, "y": -1800.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739271, "virtual_time_s": 3043.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 157, "wall_ts_ms": 1789265739271, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0157", "position": {"x": -400.0, "y": -1800.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739271, "virtual_time_s": 3049.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 158, "wall_ts_ms": 1789265739272, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0158", "position": {"x": -400.0, "y": -1800.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739272, "virtual_time_s": 3055.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 159, "wall_ts_ms": 1789265739273, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0159", "position": {"x": -400.0, "y": -1800.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739273, "virtual_time_s": 3061.161771, "measure_result": "no_signal"}} +{"event": "action", "seq": 160, "wall_ts_ms": 1789265739273, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0160", "position": {"x": -900.0, "y": -2100.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739273, "virtual_time_s": 3182.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 161, "wall_ts_ms": 1789265739274, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0161", "position": {"x": -900.0, "y": -2100.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739274, "virtual_time_s": 3188.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 162, "wall_ts_ms": 1789265739275, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0162", "position": {"x": -900.0, "y": -2100.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739275, "virtual_time_s": 3194.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 163, "wall_ts_ms": 1789265739275, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0163", "position": {"x": -900.0, "y": -2100.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739275, "virtual_time_s": 3200.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 164, "wall_ts_ms": 1789265739276, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0164", "position": {"x": -900.0, "y": -2100.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739276, "virtual_time_s": 3206.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 165, "wall_ts_ms": 1789265739277, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0165", "position": {"x": -900.0, "y": -2100.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739277, "virtual_time_s": 3212.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 166, "wall_ts_ms": 1789265739277, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0166", "position": {"x": -900.0, "y": -2100.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739277, "virtual_time_s": 3218.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 167, "wall_ts_ms": 1789265739278, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0167", "position": {"x": -900.0, "y": -2100.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739278, "virtual_time_s": 3224.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 168, "wall_ts_ms": 1789265739279, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0168", "position": {"x": -900.0, "y": -2100.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739279, "virtual_time_s": 3230.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 169, "wall_ts_ms": 1789265739279, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0169", "position": {"x": -900.0, "y": -2100.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739279, "virtual_time_s": 3236.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 170, "wall_ts_ms": 1789265739280, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0170", "position": {"x": -900.0, "y": -2100.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739280, "virtual_time_s": 3242.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 171, "wall_ts_ms": 1789265739280, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0171", "position": {"x": -900.0, "y": -2100.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739280, "virtual_time_s": 3248.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 172, "wall_ts_ms": 1789265739281, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0172", "position": {"x": -900.0, "y": -2100.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739281, "virtual_time_s": 3254.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 173, "wall_ts_ms": 1789265739281, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0173", "position": {"x": -900.0, "y": -2100.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739281, "virtual_time_s": 3260.780809, "measure_result": "no_signal"}} +{"event": "action", "seq": 174, "wall_ts_ms": 1789265739283, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0174", "position": {"x": -700.0, "y": -1200.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739283, "virtual_time_s": 3450.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 175, "wall_ts_ms": 1789265739284, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0175", "position": {"x": -700.0, "y": -1200.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739284, "virtual_time_s": 3456.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 176, "wall_ts_ms": 1789265739285, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0176", "position": {"x": -700.0, "y": -1200.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739285, "virtual_time_s": 3462.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 177, "wall_ts_ms": 1789265739286, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0177", "position": {"x": -700.0, "y": -1200.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739286, "virtual_time_s": 3468.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 178, "wall_ts_ms": 1789265739286, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0178", "position": {"x": -700.0, "y": -1200.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739286, "virtual_time_s": 3474.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 179, "wall_ts_ms": 1789265739287, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0179", "position": {"x": -700.0, "y": -1200.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739287, "virtual_time_s": 3480.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 180, "wall_ts_ms": 1789265739288, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0180", "position": {"x": -700.0, "y": -1200.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739288, "virtual_time_s": 3486.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 181, "wall_ts_ms": 1789265739289, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0181", "position": {"x": -700.0, "y": -1200.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739288, "virtual_time_s": 3492.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 182, "wall_ts_ms": 1789265739289, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0182", "position": {"x": -700.0, "y": -1200.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739289, "virtual_time_s": 3498.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 183, "wall_ts_ms": 1789265739290, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0183", "position": {"x": -700.0, "y": -1200.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739290, "virtual_time_s": 3504.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 184, "wall_ts_ms": 1789265739290, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0184", "position": {"x": -700.0, "y": -1200.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739290, "virtual_time_s": 3510.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 185, "wall_ts_ms": 1789265739291, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0185", "position": {"x": -700.0, "y": -1200.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739291, "virtual_time_s": 3516.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 186, "wall_ts_ms": 1789265739292, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0186", "position": {"x": -700.0, "y": -1200.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739292, "virtual_time_s": 3522.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 187, "wall_ts_ms": 1789265739292, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0187", "position": {"x": -700.0, "y": -1200.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739292, "virtual_time_s": 3528.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 188, "wall_ts_ms": 1789265739293, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0188", "position": {"x": -700.0, "y": -700.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739293, "virtual_time_s": 3633.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 189, "wall_ts_ms": 1789265739303, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0189", "position": {"x": -700.0, "y": -700.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739303, "virtual_time_s": 3639.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 190, "wall_ts_ms": 1789265739305, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0190", "position": {"x": -700.0, "y": -700.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739305, "virtual_time_s": 3645.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 191, "wall_ts_ms": 1789265739306, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0191", "position": {"x": -700.0, "y": -700.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739306, "virtual_time_s": 3651.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 192, "wall_ts_ms": 1789265739306, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0192", "position": {"x": -700.0, "y": -700.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739306, "virtual_time_s": 3657.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 193, "wall_ts_ms": 1789265739307, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0193", "position": {"x": -700.0, "y": -700.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739307, "virtual_time_s": 3663.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 194, "wall_ts_ms": 1789265739308, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0194", "position": {"x": -700.0, "y": -700.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739308, "virtual_time_s": 3669.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 195, "wall_ts_ms": 1789265739309, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0195", "position": {"x": -700.0, "y": -700.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739309, "virtual_time_s": 3675.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 196, "wall_ts_ms": 1789265739310, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0196", "position": {"x": -700.0, "y": -700.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739310, "virtual_time_s": 3681.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 197, "wall_ts_ms": 1789265739310, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0197", "position": {"x": -700.0, "y": -700.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739310, "virtual_time_s": 3687.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 198, "wall_ts_ms": 1789265739311, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0198", "position": {"x": -700.0, "y": -700.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739311, "virtual_time_s": 3693.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 199, "wall_ts_ms": 1789265739312, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0199", "position": {"x": -700.0, "y": -700.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739312, "virtual_time_s": 3699.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 200, "wall_ts_ms": 1789265739313, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0200", "position": {"x": -700.0, "y": -700.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739313, "virtual_time_s": 3705.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 201, "wall_ts_ms": 1789265739313, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0201", "position": {"x": -700.0, "y": -700.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739313, "virtual_time_s": 3711.171698, "measure_result": "no_signal"}} +{"event": "action", "seq": 202, "wall_ts_ms": 1789265739314, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0202", "position": {"x": -800.0, "y": -200.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739314, "virtual_time_s": 3818.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 203, "wall_ts_ms": 1789265739315, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0203", "position": {"x": -800.0, "y": -200.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739315, "virtual_time_s": 3824.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 204, "wall_ts_ms": 1789265739316, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0204", "position": {"x": -800.0, "y": -200.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739316, "virtual_time_s": 3830.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 205, "wall_ts_ms": 1789265739316, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0205", "position": {"x": -800.0, "y": -200.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739316, "virtual_time_s": 3836.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 206, "wall_ts_ms": 1789265739317, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0206", "position": {"x": -800.0, "y": -200.0}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739317, "virtual_time_s": 3842.152088, "measure_result": "direction", "svd_deg": 126.11}} +{"event": "action", "seq": 207, "wall_ts_ms": 1789265739355, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0207", "position": {"x": -800.0, "y": -200.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739355, "virtual_time_s": 3848.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 208, "wall_ts_ms": 1789265739356, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0208", "position": {"x": -800.0, "y": -200.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739356, "virtual_time_s": 3854.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 209, "wall_ts_ms": 1789265739356, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0209", "position": {"x": -800.0, "y": -200.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739356, "virtual_time_s": 3860.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 210, "wall_ts_ms": 1789265739357, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0210", "position": {"x": -800.0, "y": -200.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739357, "virtual_time_s": 3866.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 211, "wall_ts_ms": 1789265739358, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0211", "position": {"x": -800.0, "y": -200.0}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739358, "virtual_time_s": 3872.152088, "measure_result": "direction", "svd_deg": 108.11}} +{"event": "action", "seq": 212, "wall_ts_ms": 1789265739392, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0212", "position": {"x": -800.0, "y": -200.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739392, "virtual_time_s": 3878.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 213, "wall_ts_ms": 1789265739393, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0213", "position": {"x": -800.0, "y": -200.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739393, "virtual_time_s": 3884.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 214, "wall_ts_ms": 1789265739394, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0214", "position": {"x": -800.0, "y": -200.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739394, "virtual_time_s": 3890.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 215, "wall_ts_ms": 1789265739394, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0215", "position": {"x": -800.0, "y": -200.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739394, "virtual_time_s": 3896.152088, "measure_result": "no_signal"}} +{"event": "action", "seq": 216, "wall_ts_ms": 1789265739503, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0216", "position": {"x": -947.4060451871933, "y": 109.11837968521047}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739503, "virtual_time_s": 3970.645216, "measure_result": "direction", "svd_deg": 131.32}} +{"event": "action", "seq": 217, "wall_ts_ms": 1789265739561, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0217", "position": {"x": -1324.9239456154519, "y": 558.3476201396235}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739561, "virtual_time_s": 4093.003927, "measure_result": "direction", "svd_deg": 131.0}} +{"event": "action", "seq": 218, "wall_ts_ms": 1789265739594, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0218", "position": {"x": -1432.2923947371212, "y": 690.0535132542623}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739594, "virtual_time_s": 4131.98888, "measure_result": "direction", "svd_deg": 136.57}} +{"event": "action", "seq": 219, "wall_ts_ms": 1789265739609, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0219", "position": {"x": -1483.0245877461791, "y": 738.3058311207313}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739609, "virtual_time_s": 4150.991796, "measure_result": "direction", "svd_deg": 135.43}} +{"event": "action", "seq": 220, "wall_ts_ms": 1789265739622, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0220", "position": {"x": -1494.2794165389562, "y": 749.8626130220727}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739622, "virtual_time_s": 4159.218128, "measure_result": "direction", "svd_deg": 137.48}} +{"event": "action", "seq": 221, "wall_ts_ms": 1789265739623, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0221", "position": {"x": -1505.3219950372888, "y": 760.3331531575229}, "channel": 5}, "response": {"accepted": true, "real_timestamp_ms": 1789265739623, "virtual_time_s": 4167.261618, "clear_result": "success"}} +{"event": "action", "seq": 222, "wall_ts_ms": 1789265739805, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0222", "position": {"x": -1408.4825659904257, "y": 512.8845928212788}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739805, "virtual_time_s": 4226.4062, "measure_result": "direction", "svd_deg": 63.41}} +{"event": "action", "seq": 223, "wall_ts_ms": 1789265739822, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0223", "position": {"x": -1195.7660646685601, "y": 953.7522119734411}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739822, "virtual_time_s": 4329.306673, "measure_result": "direction", "svd_deg": 51.15}} +{"event": "action", "seq": 224, "wall_ts_ms": 1789265739830, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0224", "position": {"x": -1189.5871642775382, "y": 964.1176386186069}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739830, "virtual_time_s": 4336.720143, "measure_result": "near"}} +{"event": "action", "seq": 225, "wall_ts_ms": 1789265739831, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0225", "position": {"x": -1188.4182050448148, "y": 963.2096685709439}, "channel": 12}, "response": {"accepted": true, "real_timestamp_ms": 1789265739831, "virtual_time_s": 4342.016175, "clear_result": "success"}} +{"event": "action", "seq": 226, "wall_ts_ms": 1789265739832, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0226", "position": {"x": -1200.0, "y": 700.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739832, "virtual_time_s": 4400.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 227, "wall_ts_ms": 1789265739833, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0227", "position": {"x": -1200.0, "y": 700.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739833, "virtual_time_s": 4406.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 228, "wall_ts_ms": 1789265739834, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0228", "position": {"x": -1200.0, "y": 700.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739834, "virtual_time_s": 4412.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 229, "wall_ts_ms": 1789265739834, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0229", "position": {"x": -1200.0, "y": 700.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739834, "virtual_time_s": 4418.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 230, "wall_ts_ms": 1789265739835, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0230", "position": {"x": -1200.0, "y": 700.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739835, "virtual_time_s": 4424.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 231, "wall_ts_ms": 1789265739836, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0231", "position": {"x": -1200.0, "y": 700.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739836, "virtual_time_s": 4430.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 232, "wall_ts_ms": 1789265739836, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0232", "position": {"x": -1200.0, "y": 700.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739836, "virtual_time_s": 4436.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 233, "wall_ts_ms": 1789265739837, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0233", "position": {"x": -1200.0, "y": 700.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739837, "virtual_time_s": 4442.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 234, "wall_ts_ms": 1789265739838, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0234", "position": {"x": -1200.0, "y": 700.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739838, "virtual_time_s": 4448.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 235, "wall_ts_ms": 1789265739838, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0235", "position": {"x": -1200.0, "y": 700.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739838, "virtual_time_s": 4454.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 236, "wall_ts_ms": 1789265739839, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0236", "position": {"x": -1200.0, "y": 700.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739839, "virtual_time_s": 4460.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 237, "wall_ts_ms": 1789265739840, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0237", "position": {"x": -1200.0, "y": 700.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739840, "virtual_time_s": 4466.709046, "measure_result": "no_signal"}} +{"event": "action", "seq": 238, "wall_ts_ms": 1789265739840, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0238", "position": {"x": -1800.0, "y": 400.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739840, "virtual_time_s": 4605.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 239, "wall_ts_ms": 1789265739841, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0239", "position": {"x": -1800.0, "y": 400.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739841, "virtual_time_s": 4611.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 240, "wall_ts_ms": 1789265739842, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0240", "position": {"x": -1800.0, "y": 400.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739842, "virtual_time_s": 4617.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 241, "wall_ts_ms": 1789265739842, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0241", "position": {"x": -1800.0, "y": 400.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739842, "virtual_time_s": 4623.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 242, "wall_ts_ms": 1789265739843, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0242", "position": {"x": -1800.0, "y": 400.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739843, "virtual_time_s": 4629.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 243, "wall_ts_ms": 1789265739843, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0243", "position": {"x": -1800.0, "y": 400.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739843, "virtual_time_s": 4635.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 244, "wall_ts_ms": 1789265739844, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0244", "position": {"x": -1800.0, "y": 400.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739844, "virtual_time_s": 4641.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 245, "wall_ts_ms": 1789265739845, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0245", "position": {"x": -1800.0, "y": 400.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739845, "virtual_time_s": 4647.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 246, "wall_ts_ms": 1789265739845, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0246", "position": {"x": -1800.0, "y": 400.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739845, "virtual_time_s": 4653.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 247, "wall_ts_ms": 1789265739846, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0247", "position": {"x": -1800.0, "y": 400.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739846, "virtual_time_s": 4659.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 248, "wall_ts_ms": 1789265739846, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0248", "position": {"x": -1800.0, "y": 400.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739846, "virtual_time_s": 4665.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 249, "wall_ts_ms": 1789265739848, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0249", "position": {"x": -1800.0, "y": 400.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739848, "virtual_time_s": 4671.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 250, "wall_ts_ms": 1789265739849, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0250", "position": {"x": -1800.0, "y": -300.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739848, "virtual_time_s": 4816.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 251, "wall_ts_ms": 1789265739849, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0251", "position": {"x": -1800.0, "y": -300.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739849, "virtual_time_s": 4822.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 252, "wall_ts_ms": 1789265739850, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0252", "position": {"x": -1800.0, "y": -300.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739850, "virtual_time_s": 4828.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 253, "wall_ts_ms": 1789265739850, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0253", "position": {"x": -1800.0, "y": -300.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739850, "virtual_time_s": 4834.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 254, "wall_ts_ms": 1789265739851, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0254", "position": {"x": -1800.0, "y": -300.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739851, "virtual_time_s": 4840.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 255, "wall_ts_ms": 1789265739851, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0255", "position": {"x": -1800.0, "y": -300.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739851, "virtual_time_s": 4846.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 256, "wall_ts_ms": 1789265739852, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0256", "position": {"x": -1800.0, "y": -300.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739852, "virtual_time_s": 4852.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 257, "wall_ts_ms": 1789265739852, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0257", "position": {"x": -1800.0, "y": -300.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739852, "virtual_time_s": 4858.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 258, "wall_ts_ms": 1789265739853, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0258", "position": {"x": -1800.0, "y": -300.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739853, "virtual_time_s": 4864.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 259, "wall_ts_ms": 1789265739854, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0259", "position": {"x": -1800.0, "y": -300.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739854, "virtual_time_s": 4870.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 260, "wall_ts_ms": 1789265739854, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0260", "position": {"x": -1800.0, "y": -300.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739854, "virtual_time_s": 4876.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 261, "wall_ts_ms": 1789265739855, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0261", "position": {"x": -1800.0, "y": -300.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739855, "virtual_time_s": 4882.873125, "measure_result": "no_signal"}} +{"event": "action", "seq": 262, "wall_ts_ms": 1789265739855, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0262", "position": {"x": -1700.0, "y": -500.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739855, "virtual_time_s": 4932.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 263, "wall_ts_ms": 1789265739856, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0263", "position": {"x": -1700.0, "y": -500.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739856, "virtual_time_s": 4938.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 264, "wall_ts_ms": 1789265739856, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0264", "position": {"x": -1700.0, "y": -500.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739856, "virtual_time_s": 4944.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 265, "wall_ts_ms": 1789265739857, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0265", "position": {"x": -1700.0, "y": -500.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739857, "virtual_time_s": 4950.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 266, "wall_ts_ms": 1789265739858, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0266", "position": {"x": -1700.0, "y": -500.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739858, "virtual_time_s": 4956.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 267, "wall_ts_ms": 1789265739858, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0267", "position": {"x": -1700.0, "y": -500.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739858, "virtual_time_s": 4962.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 268, "wall_ts_ms": 1789265739859, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0268", "position": {"x": -1700.0, "y": -500.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739859, "virtual_time_s": 4968.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 269, "wall_ts_ms": 1789265739859, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0269", "position": {"x": -1700.0, "y": -500.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739859, "virtual_time_s": 4974.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 270, "wall_ts_ms": 1789265739860, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0270", "position": {"x": -1700.0, "y": -500.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739860, "virtual_time_s": 4980.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 271, "wall_ts_ms": 1789265739860, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0271", "position": {"x": -1700.0, "y": -500.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739860, "virtual_time_s": 4986.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 272, "wall_ts_ms": 1789265739861, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0272", "position": {"x": -1700.0, "y": -500.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739861, "virtual_time_s": 4992.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 273, "wall_ts_ms": 1789265739861, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0273", "position": {"x": -1700.0, "y": -500.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739861, "virtual_time_s": 4998.594485, "measure_result": "no_signal"}} +{"event": "action", "seq": 274, "wall_ts_ms": 1789265739862, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0274", "position": {"x": -1500.0, "y": -1300.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739862, "virtual_time_s": 5168.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 275, "wall_ts_ms": 1789265739863, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0275", "position": {"x": -1500.0, "y": -1300.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739863, "virtual_time_s": 5174.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 276, "wall_ts_ms": 1789265739863, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0276", "position": {"x": -1500.0, "y": -1300.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739863, "virtual_time_s": 5180.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 277, "wall_ts_ms": 1789265739864, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0277", "position": {"x": -1500.0, "y": -1300.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739864, "virtual_time_s": 5186.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 278, "wall_ts_ms": 1789265739864, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0278", "position": {"x": -1500.0, "y": -1300.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739864, "virtual_time_s": 5192.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 279, "wall_ts_ms": 1789265739865, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0279", "position": {"x": -1500.0, "y": -1300.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739865, "virtual_time_s": 5198.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 280, "wall_ts_ms": 1789265739865, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0280", "position": {"x": -1500.0, "y": -1300.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739865, "virtual_time_s": 5204.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 281, "wall_ts_ms": 1789265739866, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0281", "position": {"x": -1500.0, "y": -1300.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739866, "virtual_time_s": 5210.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 282, "wall_ts_ms": 1789265739867, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0282", "position": {"x": -1500.0, "y": -1300.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739867, "virtual_time_s": 5216.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 283, "wall_ts_ms": 1789265739867, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0283", "position": {"x": -1500.0, "y": -1300.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739867, "virtual_time_s": 5222.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 284, "wall_ts_ms": 1789265739868, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0284", "position": {"x": -1500.0, "y": -1300.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739868, "virtual_time_s": 5228.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 285, "wall_ts_ms": 1789265739868, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0285", "position": {"x": -1500.0, "y": -1300.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739868, "virtual_time_s": 5234.51871, "measure_result": "no_signal"}} +{"event": "action", "seq": 286, "wall_ts_ms": 1789265739869, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0286", "position": {"x": -2500.0, "y": 500.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739869, "virtual_time_s": 5651.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 287, "wall_ts_ms": 1789265739869, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0287", "position": {"x": -2500.0, "y": 500.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739869, "virtual_time_s": 5657.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 288, "wall_ts_ms": 1789265739870, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0288", "position": {"x": -2500.0, "y": 500.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739870, "virtual_time_s": 5663.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 289, "wall_ts_ms": 1789265739871, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0289", "position": {"x": -2500.0, "y": 500.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739870, "virtual_time_s": 5669.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 290, "wall_ts_ms": 1789265739871, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0290", "position": {"x": -2500.0, "y": 500.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739871, "virtual_time_s": 5675.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 291, "wall_ts_ms": 1789265739872, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0291", "position": {"x": -2500.0, "y": 500.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739872, "virtual_time_s": 5681.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 292, "wall_ts_ms": 1789265739872, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0292", "position": {"x": -2500.0, "y": 500.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739872, "virtual_time_s": 5687.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 293, "wall_ts_ms": 1789265739873, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0293", "position": {"x": -2500.0, "y": 500.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739873, "virtual_time_s": 5693.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 294, "wall_ts_ms": 1789265739873, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0294", "position": {"x": -2500.0, "y": 500.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739873, "virtual_time_s": 5699.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 295, "wall_ts_ms": 1789265739874, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0295", "position": {"x": -2500.0, "y": 500.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739874, "virtual_time_s": 5705.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 296, "wall_ts_ms": 1789265739874, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0296", "position": {"x": -2500.0, "y": 500.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739874, "virtual_time_s": 5711.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 297, "wall_ts_ms": 1789265739875, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0297", "position": {"x": -2500.0, "y": 500.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739875, "virtual_time_s": 5717.343916, "measure_result": "no_signal"}} +{"event": "action", "seq": 298, "wall_ts_ms": 1789265739876, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0298", "position": {"x": -1300.0, "y": 1500.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739876, "virtual_time_s": 6034.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 299, "wall_ts_ms": 1789265739876, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0299", "position": {"x": -1300.0, "y": 1500.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739876, "virtual_time_s": 6040.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 300, "wall_ts_ms": 1789265739877, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0300", "position": {"x": -1300.0, "y": 1500.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739877, "virtual_time_s": 6046.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 301, "wall_ts_ms": 1789265739877, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0301", "position": {"x": -1300.0, "y": 1500.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739877, "virtual_time_s": 6052.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 302, "wall_ts_ms": 1789265739878, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0302", "position": {"x": -1300.0, "y": 1500.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739878, "virtual_time_s": 6058.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 303, "wall_ts_ms": 1789265739878, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0303", "position": {"x": -1300.0, "y": 1500.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739878, "virtual_time_s": 6064.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 304, "wall_ts_ms": 1789265739879, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0304", "position": {"x": -1300.0, "y": 1500.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739879, "virtual_time_s": 6070.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 305, "wall_ts_ms": 1789265739879, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0305", "position": {"x": -1300.0, "y": 1500.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739879, "virtual_time_s": 6076.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 306, "wall_ts_ms": 1789265739880, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0306", "position": {"x": -1300.0, "y": 1500.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739880, "virtual_time_s": 6082.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 307, "wall_ts_ms": 1789265739880, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0307", "position": {"x": -1300.0, "y": 1500.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739880, "virtual_time_s": 6088.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 308, "wall_ts_ms": 1789265739881, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0308", "position": {"x": -1300.0, "y": 1500.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739881, "virtual_time_s": 6094.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 309, "wall_ts_ms": 1789265739882, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0309", "position": {"x": -1300.0, "y": 1500.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739881, "virtual_time_s": 6100.753903, "measure_result": "no_signal"}} +{"event": "action", "seq": 310, "wall_ts_ms": 1789265739882, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0310", "position": {"x": -400.0, "y": 1800.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265739882, "virtual_time_s": 6295.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 311, "wall_ts_ms": 1789265739883, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0311", "position": {"x": -400.0, "y": 1800.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265739883, "virtual_time_s": 6301.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 312, "wall_ts_ms": 1789265739883, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0312", "position": {"x": -400.0, "y": 1800.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265739883, "virtual_time_s": 6307.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 313, "wall_ts_ms": 1789265739884, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0313", "position": {"x": -400.0, "y": 1800.0}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265739884, "virtual_time_s": 6313.490563, "measure_result": "direction", "svd_deg": 354.21}} +{"event": "action", "seq": 314, "wall_ts_ms": 1789265739913, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0314", "position": {"x": -400.0, "y": 1800.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265739913, "virtual_time_s": 6319.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 315, "wall_ts_ms": 1789265739914, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0315", "position": {"x": -400.0, "y": 1800.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265739914, "virtual_time_s": 6325.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 316, "wall_ts_ms": 1789265739915, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0316", "position": {"x": -400.0, "y": 1800.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265739915, "virtual_time_s": 6331.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 317, "wall_ts_ms": 1789265739915, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0317", "position": {"x": -400.0, "y": 1800.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265739915, "virtual_time_s": 6337.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 318, "wall_ts_ms": 1789265739916, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0318", "position": {"x": -400.0, "y": 1800.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265739916, "virtual_time_s": 6343.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 319, "wall_ts_ms": 1789265739916, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0319", "position": {"x": -400.0, "y": 1800.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265739916, "virtual_time_s": 6349.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 320, "wall_ts_ms": 1789265739917, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0320", "position": {"x": -400.0, "y": 1800.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265739917, "virtual_time_s": 6355.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 321, "wall_ts_ms": 1789265739918, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0321", "position": {"x": -400.0, "y": 1800.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265739917, "virtual_time_s": 6361.490563, "measure_result": "no_signal"}} +{"event": "action", "seq": 322, "wall_ts_ms": 1789265740014, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0322", "position": {"x": -24.55089621140732, "y": 1727.78050764454}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265740014, "virtual_time_s": 6443.956944, "measure_result": "direction", "svd_deg": 7.73}} +{"event": "action", "seq": 323, "wall_ts_ms": 1789265740060, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0323", "position": {"x": 101.49926410957077, "y": 1747.4479135884048}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265740060, "virtual_time_s": 6474.471998, "measure_result": "near"}} +{"event": "action", "seq": 324, "wall_ts_ms": 1789265740064, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0324", "position": {"x": 101.54406236532077, "y": 1747.1545857629853}, "channel": 4}, "response": {"accepted": true, "real_timestamp_ms": 1789265740064, "virtual_time_s": 6479.531344, "clear_result": "success"}} +{"event": "action", "seq": 325, "wall_ts_ms": 1789265740066, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0325", "position": {"x": 400.0, "y": 1800.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740066, "virtual_time_s": 6546.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 326, "wall_ts_ms": 1789265740068, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0326", "position": {"x": 400.0, "y": 1800.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740068, "virtual_time_s": 6552.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 327, "wall_ts_ms": 1789265740070, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0327", "position": {"x": 400.0, "y": 1800.0}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265740070, "virtual_time_s": 6558.151006, "measure_result": "direction", "svd_deg": 191.2}} +{"event": "action", "seq": 328, "wall_ts_ms": 1789265740116, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0328", "position": {"x": 400.0, "y": 1800.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740116, "virtual_time_s": 6564.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 329, "wall_ts_ms": 1789265740118, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0329", "position": {"x": 400.0, "y": 1800.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740118, "virtual_time_s": 6570.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 330, "wall_ts_ms": 1789265740119, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0330", "position": {"x": 400.0, "y": 1800.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740119, "virtual_time_s": 6576.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 331, "wall_ts_ms": 1789265740120, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0331", "position": {"x": 400.0, "y": 1800.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740120, "virtual_time_s": 6582.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 332, "wall_ts_ms": 1789265740120, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0332", "position": {"x": 400.0, "y": 1800.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740120, "virtual_time_s": 6588.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 333, "wall_ts_ms": 1789265740121, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0333", "position": {"x": 400.0, "y": 1800.0}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740121, "virtual_time_s": 6594.151006, "measure_result": "direction", "svd_deg": 272.2}} +{"event": "action", "seq": 334, "wall_ts_ms": 1789265740153, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0334", "position": {"x": 400.0, "y": 1800.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740153, "virtual_time_s": 6600.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 335, "wall_ts_ms": 1789265740154, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0335", "position": {"x": 400.0, "y": 1800.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740154, "virtual_time_s": 6606.151006, "measure_result": "no_signal"}} +{"event": "action", "seq": 336, "wall_ts_ms": 1789265740313, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0336", "position": {"x": -24.20475655272145, "y": 1636.8980627348978}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265740313, "virtual_time_s": 6703.046972, "measure_result": "direction", "svd_deg": 160.88}} +{"event": "action", "seq": 337, "wall_ts_ms": 1789265740330, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0337", "position": {"x": -158.52431169665903, "y": 1687.3397389277611}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265740330, "virtual_time_s": 6736.74269, "measure_result": "direction", "svd_deg": 192.73}} +{"event": "action", "seq": 338, "wall_ts_ms": 1789265740332, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0338", "position": {"x": -165.6025782014923, "y": 1685.833818291656}, "channel": 6}, "response": {"accepted": true, "real_timestamp_ms": 1789265740332, "virtual_time_s": 6743.190028, "clear_result": "success"}} +{"event": "action", "seq": 339, "wall_ts_ms": 1789265740480, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0339", "position": {"x": 171.91074610145796, "y": 1285.0122857297256}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740480, "virtual_time_s": 6853.989483, "measure_result": "no_signal"}} +{"event": "action", "seq": 340, "wall_ts_ms": 1789265740610, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0340", "position": {"x": 429.14297023213675, "y": 1391.5613616440485}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740610, "virtual_time_s": 6914.674714, "measure_result": "no_signal"}} +{"event": "action", "seq": 341, "wall_ts_ms": 1789265740744, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0341", "position": {"x": 686.3751943628156, "y": 1285.0122857297256}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740744, "virtual_time_s": 6975.359945, "measure_result": "no_signal"}} +{"event": "action", "seq": 342, "wall_ts_ms": 1789265740884, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0342", "position": {"x": 429.1429702321368, "y": 1755.3426616890501}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740884, "virtual_time_s": 7087.575444, "measure_result": "direction", "svd_deg": 265.21}} +{"event": "action", "seq": 343, "wall_ts_ms": 1789265740908, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0343", "position": {"x": 409.83408878169837, "y": 1586.197737192631}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740908, "virtual_time_s": 7126.624138, "measure_result": "direction", "svd_deg": 272.13}} +{"event": "action", "seq": 344, "wall_ts_ms": 1789265740925, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0344", "position": {"x": 411.1387584130592, "y": 1552.2577508333961}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740925, "virtual_time_s": 7138.417149, "measure_result": "near"}} +{"event": "action", "seq": 345, "wall_ts_ms": 1789265740928, "method": "POST", "path": "/clear", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0345", "position": {"x": 411.13875841306526, "y": 1552.2577508333966}, "channel": 15}, "response": {"accepted": true, "real_timestamp_ms": 1789265740928, "virtual_time_s": 7143.417149, "clear_result": "success"}} +{"event": "action", "seq": 346, "wall_ts_ms": 1789265740929, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0346", "position": {"x": 600.0, "y": 1900.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740929, "virtual_time_s": 7228.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 347, "wall_ts_ms": 1789265740930, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0347", "position": {"x": 600.0, "y": 1900.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740930, "virtual_time_s": 7234.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 348, "wall_ts_ms": 1789265740931, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0348", "position": {"x": 600.0, "y": 1900.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740931, "virtual_time_s": 7240.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 349, "wall_ts_ms": 1789265740932, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0349", "position": {"x": 600.0, "y": 1900.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740932, "virtual_time_s": 7246.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 350, "wall_ts_ms": 1789265740934, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0350", "position": {"x": 600.0, "y": 1900.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740934, "virtual_time_s": 7252.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 351, "wall_ts_ms": 1789265740935, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0351", "position": {"x": 600.0, "y": 1900.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740935, "virtual_time_s": 7258.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 352, "wall_ts_ms": 1789265740936, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0352", "position": {"x": 600.0, "y": 1900.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740936, "virtual_time_s": 7264.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 353, "wall_ts_ms": 1789265740937, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0353", "position": {"x": 600.0, "y": 1900.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740937, "virtual_time_s": 7270.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 354, "wall_ts_ms": 1789265740938, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0354", "position": {"x": 600.0, "y": 1900.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740938, "virtual_time_s": 7276.560877, "measure_result": "no_signal"}} +{"event": "action", "seq": 355, "wall_ts_ms": 1789265740939, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0355", "position": {"x": 800.0, "y": 1200.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740939, "virtual_time_s": 7427.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 356, "wall_ts_ms": 1789265740940, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0356", "position": {"x": 800.0, "y": 1200.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740940, "virtual_time_s": 7433.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 357, "wall_ts_ms": 1789265740942, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0357", "position": {"x": 800.0, "y": 1200.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740942, "virtual_time_s": 7439.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 358, "wall_ts_ms": 1789265740943, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0358", "position": {"x": 800.0, "y": 1200.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740943, "virtual_time_s": 7445.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 359, "wall_ts_ms": 1789265740944, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0359", "position": {"x": 800.0, "y": 1200.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740944, "virtual_time_s": 7451.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 360, "wall_ts_ms": 1789265740946, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0360", "position": {"x": 800.0, "y": 1200.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740946, "virtual_time_s": 7457.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 361, "wall_ts_ms": 1789265740947, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0361", "position": {"x": 800.0, "y": 1200.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740947, "virtual_time_s": 7463.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 362, "wall_ts_ms": 1789265740949, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0362", "position": {"x": 800.0, "y": 1200.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740949, "virtual_time_s": 7469.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 363, "wall_ts_ms": 1789265740950, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0363", "position": {"x": 800.0, "y": 1200.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740950, "virtual_time_s": 7475.163075, "measure_result": "no_signal"}} +{"event": "action", "seq": 364, "wall_ts_ms": 1789265740950, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0364", "position": {"x": 700.0, "y": 700.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740950, "virtual_time_s": 7582.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 365, "wall_ts_ms": 1789265740951, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0365", "position": {"x": 700.0, "y": 700.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740951, "virtual_time_s": 7588.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 366, "wall_ts_ms": 1789265740952, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0366", "position": {"x": 700.0, "y": 700.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740952, "virtual_time_s": 7594.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 367, "wall_ts_ms": 1789265740953, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0367", "position": {"x": 700.0, "y": 700.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740953, "virtual_time_s": 7600.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 368, "wall_ts_ms": 1789265740954, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0368", "position": {"x": 700.0, "y": 700.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740954, "virtual_time_s": 7606.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 369, "wall_ts_ms": 1789265740955, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0369", "position": {"x": 700.0, "y": 700.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740955, "virtual_time_s": 7612.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 370, "wall_ts_ms": 1789265740956, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0370", "position": {"x": 700.0, "y": 700.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740956, "virtual_time_s": 7618.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 371, "wall_ts_ms": 1789265740957, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0371", "position": {"x": 700.0, "y": 700.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740957, "virtual_time_s": 7624.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 372, "wall_ts_ms": 1789265740957, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0372", "position": {"x": 700.0, "y": 700.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740957, "virtual_time_s": 7630.143465, "measure_result": "no_signal"}} +{"event": "action", "seq": 373, "wall_ts_ms": 1789265740958, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0373", "position": {"x": 800.0, "y": 200.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740958, "virtual_time_s": 7737.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 374, "wall_ts_ms": 1789265740959, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0374", "position": {"x": 800.0, "y": 200.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740959, "virtual_time_s": 7743.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 375, "wall_ts_ms": 1789265740959, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0375", "position": {"x": 800.0, "y": 200.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740959, "virtual_time_s": 7749.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 376, "wall_ts_ms": 1789265740960, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0376", "position": {"x": 800.0, "y": 200.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740960, "virtual_time_s": 7755.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 377, "wall_ts_ms": 1789265740961, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0377", "position": {"x": 800.0, "y": 200.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740961, "virtual_time_s": 7761.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 378, "wall_ts_ms": 1789265740961, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0378", "position": {"x": 800.0, "y": 200.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740961, "virtual_time_s": 7767.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 379, "wall_ts_ms": 1789265740962, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0379", "position": {"x": 800.0, "y": 200.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740962, "virtual_time_s": 7773.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 380, "wall_ts_ms": 1789265740963, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0380", "position": {"x": 800.0, "y": 200.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740963, "virtual_time_s": 7779.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 381, "wall_ts_ms": 1789265740963, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0381", "position": {"x": 800.0, "y": 200.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740963, "virtual_time_s": 7785.123855, "measure_result": "no_signal"}} +{"event": "action", "seq": 382, "wall_ts_ms": 1789265740964, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0382", "position": {"x": 1800.0, "y": 300.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740964, "virtual_time_s": 7991.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 383, "wall_ts_ms": 1789265740965, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0383", "position": {"x": 1800.0, "y": 300.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740965, "virtual_time_s": 7997.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 384, "wall_ts_ms": 1789265740966, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0384", "position": {"x": 1800.0, "y": 300.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740966, "virtual_time_s": 8003.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 385, "wall_ts_ms": 1789265740969, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0385", "position": {"x": 1800.0, "y": 300.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740969, "virtual_time_s": 8009.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 386, "wall_ts_ms": 1789265740970, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0386", "position": {"x": 1800.0, "y": 300.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740970, "virtual_time_s": 8015.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 387, "wall_ts_ms": 1789265740971, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0387", "position": {"x": 1800.0, "y": 300.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740971, "virtual_time_s": 8021.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 388, "wall_ts_ms": 1789265740972, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0388", "position": {"x": 1800.0, "y": 300.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740972, "virtual_time_s": 8027.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 389, "wall_ts_ms": 1789265740972, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0389", "position": {"x": 1800.0, "y": 300.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740972, "virtual_time_s": 8033.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 390, "wall_ts_ms": 1789265740973, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0390", "position": {"x": 1800.0, "y": 300.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740973, "virtual_time_s": 8039.121367, "measure_result": "no_signal"}} +{"event": "action", "seq": 391, "wall_ts_ms": 1789265740974, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0391", "position": {"x": 1300.0, "y": 1100.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740974, "virtual_time_s": 8232.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 392, "wall_ts_ms": 1789265740975, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0392", "position": {"x": 1300.0, "y": 1100.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740975, "virtual_time_s": 8238.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 393, "wall_ts_ms": 1789265740975, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0393", "position": {"x": 1300.0, "y": 1100.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740975, "virtual_time_s": 8244.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 394, "wall_ts_ms": 1789265740976, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0394", "position": {"x": 1300.0, "y": 1100.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740976, "virtual_time_s": 8250.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 395, "wall_ts_ms": 1789265740976, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0395", "position": {"x": 1300.0, "y": 1100.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740976, "virtual_time_s": 8256.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 396, "wall_ts_ms": 1789265740977, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0396", "position": {"x": 1300.0, "y": 1100.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740977, "virtual_time_s": 8262.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 397, "wall_ts_ms": 1789265740978, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0397", "position": {"x": 1300.0, "y": 1100.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740978, "virtual_time_s": 8268.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 398, "wall_ts_ms": 1789265740979, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0398", "position": {"x": 1300.0, "y": 1100.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740979, "virtual_time_s": 8274.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 399, "wall_ts_ms": 1789265740981, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0399", "position": {"x": 1300.0, "y": 1100.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740981, "virtual_time_s": 8280.80099, "measure_result": "no_signal"}} +{"event": "action", "seq": 400, "wall_ts_ms": 1789265740983, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0400", "position": {"x": 1500.0, "y": 1300.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740983, "virtual_time_s": 8342.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 401, "wall_ts_ms": 1789265740985, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0401", "position": {"x": 1500.0, "y": 1300.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740985, "virtual_time_s": 8348.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 402, "wall_ts_ms": 1789265740986, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0402", "position": {"x": 1500.0, "y": 1300.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740986, "virtual_time_s": 8354.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 403, "wall_ts_ms": 1789265740987, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0403", "position": {"x": 1500.0, "y": 1300.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740987, "virtual_time_s": 8360.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 404, "wall_ts_ms": 1789265740988, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0404", "position": {"x": 1500.0, "y": 1300.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740987, "virtual_time_s": 8366.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 405, "wall_ts_ms": 1789265740988, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0405", "position": {"x": 1500.0, "y": 1300.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740988, "virtual_time_s": 8372.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 406, "wall_ts_ms": 1789265740989, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0406", "position": {"x": 1500.0, "y": 1300.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740989, "virtual_time_s": 8378.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 407, "wall_ts_ms": 1789265740990, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0407", "position": {"x": 1500.0, "y": 1300.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740990, "virtual_time_s": 8384.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 408, "wall_ts_ms": 1789265740990, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0408", "position": {"x": 1500.0, "y": 1300.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740990, "virtual_time_s": 8390.369532, "measure_result": "no_signal"}} +{"event": "action", "seq": 409, "wall_ts_ms": 1789265740991, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0409", "position": {"x": -200.0, "y": 900.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265740991, "virtual_time_s": 8744.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 410, "wall_ts_ms": 1789265740992, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0410", "position": {"x": -200.0, "y": 900.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740992, "virtual_time_s": 8750.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 411, "wall_ts_ms": 1789265740993, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0411", "position": {"x": -200.0, "y": 900.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740993, "virtual_time_s": 8756.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 412, "wall_ts_ms": 1789265740994, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0412", "position": {"x": -200.0, "y": 900.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265740994, "virtual_time_s": 8762.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 413, "wall_ts_ms": 1789265740994, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0413", "position": {"x": -200.0, "y": 900.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265740994, "virtual_time_s": 8768.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 414, "wall_ts_ms": 1789265740995, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0414", "position": {"x": -200.0, "y": 900.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265740995, "virtual_time_s": 8774.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 415, "wall_ts_ms": 1789265740996, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0415", "position": {"x": -200.0, "y": 900.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265740996, "virtual_time_s": 8780.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 416, "wall_ts_ms": 1789265740996, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0416", "position": {"x": -200.0, "y": 900.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265740996, "virtual_time_s": 8786.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 417, "wall_ts_ms": 1789265740997, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0417", "position": {"x": -200.0, "y": 900.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740997, "virtual_time_s": 8792.654516, "measure_result": "no_signal"}} +{"event": "action", "seq": 418, "wall_ts_ms": 1789265740998, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0418", "position": {"x": -500.0, "y": 700.0}, "channel": 17}, "response": {"accepted": true, "real_timestamp_ms": 1789265740998, "virtual_time_s": 8869.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 419, "wall_ts_ms": 1789265740998, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0419", "position": {"x": -500.0, "y": 700.0}, "channel": 1}, "response": {"accepted": true, "real_timestamp_ms": 1789265740998, "virtual_time_s": 8875.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 420, "wall_ts_ms": 1789265740999, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0420", "position": {"x": -500.0, "y": 700.0}, "channel": 3}, "response": {"accepted": true, "real_timestamp_ms": 1789265740999, "virtual_time_s": 8881.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 421, "wall_ts_ms": 1789265741000, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0421", "position": {"x": -500.0, "y": 700.0}, "channel": 7}, "response": {"accepted": true, "real_timestamp_ms": 1789265741000, "virtual_time_s": 8887.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 422, "wall_ts_ms": 1789265741000, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0422", "position": {"x": -500.0, "y": 700.0}, "channel": 9}, "response": {"accepted": true, "real_timestamp_ms": 1789265741000, "virtual_time_s": 8893.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 423, "wall_ts_ms": 1789265741001, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0423", "position": {"x": -500.0, "y": 700.0}, "channel": 11}, "response": {"accepted": true, "real_timestamp_ms": 1789265741001, "virtual_time_s": 8899.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 424, "wall_ts_ms": 1789265741001, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0424", "position": {"x": -500.0, "y": 700.0}, "channel": 13}, "response": {"accepted": true, "real_timestamp_ms": 1789265741001, "virtual_time_s": 8905.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 425, "wall_ts_ms": 1789265741002, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0425", "position": {"x": -500.0, "y": 700.0}, "channel": 14}, "response": {"accepted": true, "real_timestamp_ms": 1789265741002, "virtual_time_s": 8911.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 426, "wall_ts_ms": 1789265741003, "method": "POST", "path": "/measure", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0426", "position": {"x": -500.0, "y": 700.0}, "channel": 18}, "response": {"accepted": true, "real_timestamp_ms": 1789265741003, "virtual_time_s": 8917.765542, "measure_result": "no_signal"}} +{"event": "action", "seq": 427, "wall_ts_ms": 1789265741003, "method": "POST", "path": "/exit", "status": 200, "request": {"arena_id": "default", "robot_id": "1", "request_id": "baa9dc681441-0427"}, "response": {"accepted": true, "real_timestamp_ms": 1789265741003, "virtual_time_s": 8917.765542, "exit_reason": "user_exit"}} +{"event": "session_end", "reason": "user_exit", "virtual_time_s": 8917.765542, "real_elapsed_s": 10.027643, "request_count": 427, "cleared_count": 11} diff --git a/referee-data/sessions/GHSN-M38E-74GD-YLUD/meta.json b/referee-data/sessions/GHSN-M38E-74GD-YLUD/meta.json new file mode 100644 index 0000000..6bb33e0 --- /dev/null +++ b/referee-data/sessions/GHSN-M38E-74GD-YLUD/meta.json @@ -0,0 +1,96 @@ +{ + "case_code": "GHSN-M38E-74GD-YLUD", + "module": "q4_practice", + "robot_id": "1", + "seed": 1907688398, + "truth": [ + { + "channel": 6, + "x": -168.78031525275804, + "y": 1684.875239455932, + "r_eff_m": 1233.1529913973563, + "directional": true, + "heading_deg": 351.84275431652014 + }, + { + "channel": 15, + "x": 411.7975180678083, + "y": 1548.040304144621, + "r_eff_m": 1336.3045523445826, + "directional": true, + "heading_deg": 72.47781232458263 + }, + { + "channel": 8, + "x": 978.6674582823607, + "y": -996.1121301869524, + "r_eff_m": 1336.1370990332562, + "directional": true, + "heading_deg": 246.14394851382335 + }, + { + "channel": 16, + "x": 124.00340756473021, + "y": -860.3622285357711, + "r_eff_m": 1345.578791332298, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 10, + "x": 729.8914456683548, + "y": 714.3629430529361, + "r_eff_m": 1127.494833936053, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 2, + "x": 478.441266630241, + "y": 449.08113076378316, + "r_eff_m": 1040.6068154097852, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 20, + "x": -945.2003883886779, + "y": 638.5311986666989, + "r_eff_m": 1295.456469667405, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 4, + "x": 99.04602689897295, + "y": 1744.5260335974826, + "r_eff_m": 1032.9094604449615, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 5, + "x": -1507.0542438070167, + "y": 761.3723575581047, + "r_eff_m": 1448.7977020579874, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 12, + "x": -1188.1583136013294, + "y": 963.0220608398997, + "r_eff_m": 1226.2619264983982, + "directional": false, + "heading_deg": 0.0 + }, + { + "channel": 19, + "x": -177.4461437404443, + "y": 343.49207176417394, + "r_eff_m": 1277.3413627947266, + "directional": false, + "heading_deg": 0.0 + } + ] +} \ No newline at end of file diff --git a/scripts/archive_replay_logs.py b/scripts/archive_replay_logs.py index 816e8bb..22c145b 100644 --- a/scripts/archive_replay_logs.py +++ b/scripts/archive_replay_logs.py @@ -3,7 +3,7 @@ ``referee-data/`` 与 ``output/`` 都在 .gitignore 里:本机清掉评测机数据后, ``docs/figures/*.png`` 就无法复现。本脚本把"作图用到的那几局"抽出来, 命名成 ``..jsonl`` 存进 ``examples/replay/``(入库、几万行以内), -``scripts/make_figures.py`` 在没有评测机数据时自动改读这里。 +``scripts/build_figure_data.py`` 在没有评测机数据时自动改读这里。 uv run python scripts/archive_replay_logs.py # 归档作图默认选中的两局 uv run python scripts/archive_replay_logs.py BBM9-HZG2-77N5-NKKC # 指定案例 @@ -26,7 +26,7 @@ ARCHIVE_DIR = ROOT / 'examples' / 'replay' sys.path.insert(0, str(Path(__file__).resolve().parent)) -from make_figures import discover_runs, pick_run # noqa: E402 +from build_figure_data import discover_runs, pick_run # noqa: E402 def archive(run: dict, out_dir: Path) -> Path: diff --git a/scripts/build_figure_data.py b/scripts/build_figure_data.py new file mode 100644 index 0000000..82ed36f --- /dev/null +++ b/scripts/build_figure_data.py @@ -0,0 +1,747 @@ +"""为 MATLAB 出图准备数据,并更新 docs/figures/manifest.json。 + + uv run python scripts/build_figure_data.py --prepare # 只写 .mat 数据 + uv run python scripts/build_figure_data.py # 写数据 + 调 MATLAB 出图 + uv run python scripts/build_figure_data.py --only geo-q3-seven-point-coverage + uv run python scripts/build_figure_data.py --list + +分工: + +- **本脚本(Python)**:解析行为日志与覆盖计划、调用生产求解器算几何、把绘图数据写成 + ``docs/figures/.data/*.mat``、维护 manifest(来源路径 + sha256 + 行数); +- **MATLAB**:``scripts/matlab/*.m`` 负责排版与出图,只读 .mat,不做数据解析。 + 手动出图:MATLAB 中 ``cd scripts/matlab`` 后执行 ``run_all_figures``。 + +图内不放标题、图注与解释性文字,只保留坐标轴、图例与数据标注; +每张图的含义由文件名与 ``docs/figures/README.md`` 承担。 +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import math +import subprocess +import sys +from pathlib import Path +from typing import Any, Callable, Sequence + +import numpy as np +from scipy.io import savemat + +ROOT = Path(__file__).resolve().parents[1] +OUT_DIR = ROOT / "docs" / "figures" +DATA_DIR = OUT_DIR / ".data" +MATLAB_DIR = ROOT / "scripts" / "matlab" +SESSIONS_DIR = ROOT / "referee-data" / "sessions" +ARCHIVE_DIR = ROOT / "examples" / "replay" +MATLAB_BIN = Path("/Applications/MATLAB_R2025a.app/bin/matlab") + +# 题面常量(与 src/mcm26b/config.py 一致;此处只用于画图) +OMEGA_R = 1800.0 +R_EFF = 1000.0 +SPEED_MPS = 5.0 +MEASURE_S = 5.0 +SWITCH_S = 1.0 +CLEAR_OK_S = 5.0 +CLEAR_NO_S = 3.0 +RING_RADIUS_M = 1159.7 + +# 回放图指定的 q4 演练局(缺失时回退到自动挑选) +Q4_REPLAY_CASE = "GHSN-M38E-74GD-YLUD" +SEVEN_R = 1800.0 + +# 图名 → (MATLAB 函数, .mat 数据名) +FIGURES: tuple[tuple[str, str, str], ...] = ( + ("flow-overall-architecture", "fig_flow_overall", "flow_overall"), + ("steps-state-machine", "fig_steps_state_machine", "steps_state_machine"), + ("timing-attachment-example-105-111-194-199", "fig_timing_attachment", + "timing_attachment"), + ("timing-measured-q3-10-sources", "fig_timing_measured", "timing_measured"), + ("geo-q1-convex-intersection-zoom", "fig_geo_q1_meetup", "geo_q1_meetup"), + ("geo-q1-diameter-circle-counterexample", "fig_geo_q1_counterexample", + "geo_q1_counterexample"), + ("geo-q2-guaranteed-reception-disk", "fig_geo_q2_safe_disk", "geo_q2"), + ("geo-q3-seven-point-coverage", "fig_geo_q3_coverage", "geo_q3"), + ("geo-q4-minimum-cover-31-points", "fig_geo_q4_mincover", "geo_q4"), + ("replay-webui-q3-omnidirectional", "fig_replay", "replay_q3"), + ("replay-webui-q4-directional", "fig_replay", "replay_q4"), +) + +SOURCES: dict[str, list[str]] = { + "flow-overall-architecture": ["src/mcm26b/config.py", "docs/B题建模分析与实施计划.md"], + "steps-state-machine": ["docs/协议规则表与状态机.md", "src/mcm26b/protocol/client.py"], + "timing-attachment-example-105-111-194-199": ["docs/协议规则表与状态机.md"], + "geo-q1-diameter-circle-counterexample": ["examples/q1/triangle.json"], + "geo-q2-guaranteed-reception-disk": ["src/mcm26b/config.py", "docs/algo-2.md"], + "geo-q3-seven-point-coverage": ["src/mcm26b/planner/seven.py", "docs/algo-3.md"], + "geo-q4-minimum-cover-31-points": [ + "src/mcm26b/guarantee/plans/q4_mincover_v2.json", "docs/algo-4.md"], +} + + +# --------------------------------------------------------------------------- +# 数据来源 +# --------------------------------------------------------------------------- +def source(path: str | Path, **extra: Any) -> dict[str, Any]: + p = Path(path) + p = p if p.is_absolute() else ROOT / p + digest, lines = "-", 0 + if p.is_file(): + data = p.read_bytes() + digest = hashlib.sha256(data).hexdigest()[:12] + lines = data.count(b"\n") + (0 if data.endswith(b"\n") else 1) + rel = str(p.relative_to(ROOT)) if p.is_relative_to(ROOT) else str(p) + return {"path": rel, "sha256_12": digest, "lines": lines, **extra} + + +def parse_jsonl(path: Path) -> dict[str, Any]: + """兼容评测机 ``event=action`` 与客户端 ``event=accepted`` 两种日志。""" + meta: dict[str, Any] = {} + actions: list[dict[str, Any]] = [] + fallback: dict[str, dict[str, Any]] = {} + seq = 0 + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line: + continue + try: + ev = json.loads(line) + except json.JSONDecodeError: + continue + kind = ev.get("event") + if kind == "session_start": + meta = ev + elif kind == "action": + seq += 1 + actions.append(dict(seq=ev.get("seq", seq), path=ev.get("path", ""), + request=ev.get("request") or {}, + response=ev.get("response") or {}, + wall_ts_ms=ev.get("wall_ts_ms"))) + elif kind == "accepted": + fallback[str(ev.get("request_id", ""))] = ev + elif kind == "step" and str(ev.get("request_id", "")) not in fallback: + fallback[str(ev.get("request_id", ""))] = ev + if not actions: + for ev in fallback.values(): + if not ev.get("path"): + continue + seq += 1 + stamp = ev.get("logged_at_unix_s") + actions.append(dict(seq=seq, path=ev["path"], request=ev.get("request") or {}, + response=ev.get("response") or {}, + wall_ts_ms=stamp * 1000 if stamp else None)) + if not actions: + raise ValueError(f"{path} 没有可回放的动作事件") + return dict(case_code=meta.get("case_code") or path.parent.name, + module=meta.get("module") or "?", robot_id=str(meta.get("robot_id") or "?"), + truth=list(meta.get("truth") or []), actions=actions, source=path) + + +def discover_runs() -> list[dict[str, Any]]: + runs: list[dict[str, Any]] = [] + if SESSIONS_DIR.is_dir(): + for log in sorted(SESSIONS_DIR.glob("*/log.jsonl")): + try: + runs.append(parse_jsonl(log)) + except ValueError: + continue + if not runs and ARCHIVE_DIR.is_dir(): + for log in sorted(ARCHIVE_DIR.glob("*.jsonl")): + try: + runs.append(parse_jsonl(log)) + except ValueError: + continue + return runs + + +def pick_case(runs: Sequence[dict[str, Any]], case_code: str) -> dict[str, Any] | None: + """按案例编码取局;不在本机留档里就返回 None,由调用方回退。""" + return next((r for r in runs if r["case_code"] == case_code), None) + + +def pick_run(runs: Sequence[dict[str, Any]], module: str, truth: int) -> dict[str, Any]: + cands = [r for r in runs if r["module"].startswith(module) and len(r["truth"]) >= truth + and any(a["path"] == "/measure" for a in r["actions"])] + if not cands: + cands = [r for r in runs if r["module"].startswith(module)] + return sorted(cands, key=lambda r: (abs(len(r["truth"]) - truth), len(r["actions"])))[0] + + +def decompose(run: dict[str, Any]) -> dict[str, Any]: + """按附件规则逐动作复算移动 / 换频 / 动作耗时。""" + pos = (0.0, 0.0) + channel: int | None = None + rows: list[dict[str, Any]] = [] + for act in run["actions"]: + req, res = act["request"], act["response"] + move_m = switch = action_s = 0.0 + if act["path"] in ("/measure", "/clear") and "position" in req: + tgt = (float(req["position"]["x"]), float(req["position"]["y"])) + move_m = math.dist(pos, tgt) + if move_m > 0: + pos = tgt + if act["path"] == "/measure": + ch = int(req.get("channel", 0)) + switch = 0.0 if channel in (None, ch) else SWITCH_S + channel = ch + action_s = MEASURE_S + elif act["path"] == "/clear": + action_s = CLEAR_OK_S if str(res.get("clear_result")) == "success" else CLEAR_NO_S + rows.append(dict(path=act["path"], move_s=move_m / SPEED_MPS, switch_s=switch, + action_s=action_s, move_m=move_m, + virtual_s=float(res.get("virtual_time_s") or 0.0), + hit=str(res.get("measure_result")) == "direction", + cleared=str(res.get("clear_result")) == "success", + channel=req.get("channel"), + x=req.get("position", {}).get("x"), + y=req.get("position", {}).get("y"))) + last = run["actions"][-1]["response"] + return dict(rows=rows, virtual_s=float(last.get("virtual_time_s") or 0.0), + move_m=sum(r["move_m"] for r in rows), + measures=sum(1 for r in rows if r["path"] == "/measure"), + clears=sum(1 for r in rows if r["path"] == "/clear")) + + +def solved_channels(run: dict[str, Any]) -> list[int]: + return sorted({int(a["request"]["channel"]) for a in run["actions"] + if a["path"] == "/clear" and "channel" in a["request"] + and str(a["response"].get("clear_result")) == "success"}) + + +# --------------------------------------------------------------------------- +# 几何:半平面裁剪与问题一求解 +# --------------------------------------------------------------------------- +def clip_halfplane(poly: np.ndarray, a: float, b: float, c: float) -> np.ndarray: + """Sutherland–Hodgman:半平面 a·x + b·y <= c 裁剪凸多边形。""" + if len(poly) == 0: + return poly + out: list[list[float]] = [] + n = len(poly) + for i in range(n): + cur, nxt = poly[i], poly[(i + 1) % n] + dc = a * cur[0] + b * cur[1] - c + dn = a * nxt[0] + b * nxt[1] - c + if dc <= 1e-9: + out.append(list(cur)) + if dn > 1e-9: + t = dc / (dc - dn) + out.append([cur[0] + t * (nxt[0] - cur[0]), + cur[1] + t * (nxt[1] - cur[1])]) + elif dn <= 1e-9: + t = dc / (dc - dn) + out.append([cur[0] + t * (nxt[0] - cur[0]), + cur[1] + t * (nxt[1] - cur[1])]) + return np.array(out) if out else np.empty((0, 2)) + + +def angle_error(poly: np.ndarray, station: Sequence[float], bearing: float) -> float: + centre = poly.mean(axis=0) + dx, dy = centre[0] - station[0], centre[1] - station[1] + if abs(dx) < 1e-12 and abs(dy) < 1e-12: + return 0.0 + return abs((math.degrees(math.atan2(dy, dx)) - bearing + 180.0) % 360.0 - 180.0) + + +def clip_wedge(region: np.ndarray, station: Sequence[float], bearing: float, + half_deg: float) -> np.ndarray: + """用角域 W(s, θ ± δ) 裁剪区域:两个半平面各试一次,取方向一致的那一侧。""" + region = np.asarray(region, dtype=float) + if len(region) == 0: + return region + for edge in (bearing - half_deg, bearing + half_deg): + ang = math.radians(edge) + a, b = -math.sin(ang), math.cos(ang) + c = a * station[0] + b * station[1] + cands = [cand for cand in (clip_halfplane(region, a, b, c), + clip_halfplane(region, -a, -b, -c)) if len(cand) >= 3] + if not cands: + return np.empty((0, 2)) + region = cands[0] if len(cands) == 1 else min( + cands, key=lambda cand: angle_error(cand, station, bearing)) + return region + + +def wedge_polygon(station: Sequence[float], bearing: float, half_deg: float, + reach: float) -> np.ndarray: + a0, a1 = math.radians(bearing - half_deg), math.radians(bearing + half_deg) + ang = np.linspace(a0, a1, 24) + return np.vstack([[station[0], station[1]], + np.column_stack([station[0] + reach * np.cos(ang), + station[1] + reach * np.sin(ang)])]) + + +def overview_window(stations: np.ndarray, verts: np.ndarray, + dc: dict[str, Any], mec: dict[str, Any]) -> tuple[float, np.ndarray]: + """总览窗口:包含全部站点、定位区域与两个圆,中心取包围盒中心。""" + pts = [np.asarray(stations, dtype=float), np.asarray(verts, dtype=float)] + for circ in (dc, mec): + c = np.asarray(circ["center"], dtype=float) + r = float(circ["radius_m"]) + pts.append(np.array([c + r, c - r])) + all_pts = np.vstack(pts) + lo, hi = all_pts.min(axis=0), all_pts.max(axis=0) + center = (lo + hi) / 2 + half = float(np.max(hi - lo) / 2 * 1.12 + 40.0) + return half, center + + +def q1_solve(stations: Sequence[Sequence[float]]) -> dict[str, Any]: + """调用生产求解器,保证图中数字与代码一致。""" + sys.path.insert(0, str(ROOT / "src")) + from mcm26b import Measurement, solve # noqa: PLC0415 + res = solve([Measurement(x, y, b, h) for x, y, b, h in stations]) + dc = res["diameter_circle"] + mec = res["minimum_enclosing_circle"] + return dict(vertices=np.array(res["vertices"]), + dc=dict(center=np.array(dc["center"]), radius_m=float(dc["radius_m"])), + mec=dict(center=np.array(mec["center"]), radius_m=float(mec["radius_m"]))) + + +def q1_practice_case() -> dict[str, Any] | None: + for path in sorted((ROOT / "output" / "q1" / "practice").glob("*_observations.json")): + doc = json.loads(path.read_text(encoding="utf-8")) + if doc.get("result"): + doc["_path"] = path + return doc + return None + + +def load_plan(name: str) -> dict[str, Any]: + path = ROOT / "src" / "mcm26b" / "guarantee" / "plans" / f"{name}.json" + return json.loads(path.read_text(encoding="utf-8")) + + +def seven_bound(a: float = RING_RADIUS_M, radius: float = SEVEN_R) -> float: + return max(a / math.sqrt(3), + math.sqrt(radius ** 2 + a ** 2 - math.sqrt(3) * radius * a)) + + +# --------------------------------------------------------------------------- +# 各图数据 +# --------------------------------------------------------------------------- +def data_flow_overall() -> dict[str, Any]: + """四个层次带:层标签、每层的框内短标签与语义色名。""" + bands = [ + ("L0", [("区域 Ω:半径 1800 m", 8.0, 26.0), + ("移动 5 m/s · 检测 5 s", 36.5, 26.0), + ("换频 1 s · 清除 5/3 s", 65.0, 26.0), + ("源 10~16 个 · 频道 1~20", 93.5, 24.0)]), + ("L1", [("证据层:候选集与粒子幸存集", 8.0, 34.0), + ("决策层:选点与任务表", 45.0, 34.0), + ("执行层:串行客户端", 82.0, 34.0)]), + ("L2", [("问题 1 定位解算", 8.0, 26.0), + ("问题 2 第二点选择", 36.5, 26.0), + ("问题 3 全向搜索", 65.0, 26.0), + ("问题 4 混合定向", 93.5, 24.0)]), + ("L3", [("发现闭环", 8.0, 34.0), + ("定位闭环", 45.0, 34.0), + ("清除闭环", 82.0, 34.0)]), + ] + colors = {"L0": "primary", "L1": "primary", "L2": "accent", "L3": "success"} + return dict(tags=[b[0] for b in bands], + labels=[[i[0] for i in b[1]] for b in bands], + colors=[colors[b[0]] for b in bands]) + + +def data_steps_state_machine() -> dict[str, Any]: + return dict(labels=["IDLE", "倒计时 5 s", "OPEN 接口开放", "CLOSED 断连"], + edges=["muted", "warn", "success", "accent"]) + + +EXAMPLE_STEPS = (("/enter", 0.0, 0.0, 0.0), + ("/measure ch1", 100.0, 0.0, 5.0), + ("/measure ch2", 0.0, 1.0, 5.0), + ("/clear ch3", 80.0, 0.0, 3.0), + ("/measure ch2", 0.0, 0.0, 5.0), + ("/exit", 0.0, 0.0, 0.0)) + + +def data_timing_attachment() -> dict[str, Any]: + return dict(labels=[s[0] for s in EXAMPLE_STEPS], + move=np.array([s[1] for s in EXAMPLE_STEPS]), + switch_s=np.array([s[2] for s in EXAMPLE_STEPS]), + action=np.array([s[3] for s in EXAMPLE_STEPS]), + xlabel="虚拟耗时 / s", + legend=["移动 L/5", "换频 1 s", "检测/清除动作"]) + + +def data_timing_measured(run: dict[str, Any]) -> dict[str, Any]: + tl = decompose(run) + rows = tl["rows"] + seq = np.arange(1.0, len(rows) + 1.0) + steps = np.array([[r["move_s"], r["action_s"], r["switch_s"]] for r in rows], + dtype=float) + cum = np.cumsum(np.cumsum(steps, axis=1), axis=0) # 移动 / +动作 / +换频 + return dict(seq=seq, cum=cum, + xlabel="动作序号", ylabel="累计虚拟时间 / s", + legend=["移动", "检测/清除动作", "换频"]) + + +def data_geo_q1_meetup() -> tuple[dict[str, Any], Path]: + case = q1_practice_case() + if case: + stations = [(m["x"], m["y"], m["bearing_deg"], m["half_angle_deg"]) + for m in case["measurements"]] + res = case["result"] + verts = np.array(res["vertices"]) + dc = dict(center=np.array(res["diameter_circle"]["center"]), + radius_m=float(res["diameter_circle"]["radius_m"])) + mec = dict(center=np.array(res["minimum_enclosing_circle"]["center"]), + radius_m=float(res["minimum_enclosing_circle"]["radius_m"])) + src = case["_path"] + else: + src = ROOT / "examples" / "q1" / "triangle.json" + doc = json.loads(src.read_text(encoding="utf-8")) + stations = [(m["x"], m["y"], m["bearing_deg"], m.get("half_angle_deg", 1.0)) + for m in doc["measurements"]] + sol = q1_solve(stations) + verts, dc, mec = sol["vertices"], sol["dc"], sol["mec"] + + zoom_c = verts.mean(axis=0) + span = float(np.abs(verts - zoom_c).max()) + zoom = max(1.8 * span, 0.8 * mec["radius_m"] + span, 12.0) + xs = [s[0] for s in stations] + ys = [s[1] for s in stations] + half, view_c = overview_window(np.array([[s[0], s[1]] for s in stations]), + verts, dc, mec) + reach = 2.4 * half + wedges = [wedge_polygon((sx, sy), b, hd, reach) for sx, sy, b, hd in stations] + region = np.array([[zoom_c[0] - zoom, zoom_c[1] - zoom], + [zoom_c[0] + zoom, zoom_c[1] - zoom], + [zoom_c[0] + zoom, zoom_c[1] + zoom], + [zoom_c[0] - zoom, zoom_c[1] + zoom]], dtype=float) + for sx, sy, b, hd in stations: + region = clip_wedge(region, (sx, sy), b, hd) + data = dict( + stations=np.array([[s[0], s[1]] for s in stations]), + station_labels=[f"s{i + 1}" for i in range(len(stations))], + wedges=np.stack(wedges), zoom_wedges=np.stack(wedges), + zoom_region=region, + dc_center=dc["center"], dc_radius=dc["radius_m"], + mec_center=mec["center"], mec_radius=mec["radius_m"], + view_center=view_c, half_overview=float(half), + zoom_center=zoom_c, zoom_half=float(zoom), + legend1=["前向角域 W(s, θ ± 1°)", "定位区域 P"], + legend2=["直径圆", "最小包围圆 MEC"]) + return data, Path(src) + + +def data_geo_q1_counterexample() -> dict[str, Any]: + src = ROOT / "examples" / "q1" / "triangle.json" + doc = json.loads(src.read_text(encoding="utf-8")) + stations = [(m["x"], m["y"], m["bearing_deg"], m.get("half_angle_deg", 1.0)) + for m in doc["measurements"]] + sol = q1_solve(stations) + verts, dc, mec = sol["vertices"], sol["dc"], sol["mec"] + zoom_c = verts.mean(axis=0) + zoom = max(1.9 * float(np.abs(verts - zoom_c).max()) + mec["radius_m"], 45.0) + half, view_c = overview_window(np.array([[s[0], s[1]] for s in stations]), + verts, dc, mec) + wedges = [wedge_polygon((sx, sy), b, hd, 3600.0) for sx, sy, b, hd in stations] + region = np.array([[zoom_c[0] - zoom, zoom_c[1] - zoom], + [zoom_c[0] + zoom, zoom_c[1] - zoom], + [zoom_c[0] + zoom, zoom_c[1] + zoom], + [zoom_c[0] - zoom, zoom_c[1] + zoom]], dtype=float) + for sx, sy, b, hd in stations: + region = clip_wedge(region, (sx, sy), b, hd) + return dict( + stations=np.array([[s[0], s[1]] for s in stations]), + station_labels=[f"s{i + 1}" for i in range(len(stations))], + wedges=np.stack(wedges), zoom_wedges=np.stack(wedges), + zoom_region=region, + dc_center=dc["center"], dc_radius=dc["radius_m"], + mec_center=mec["center"], mec_radius=mec["radius_m"], + view_center=view_c, half_overview=float(half), + zoom_center=zoom_c, zoom_half=float(zoom), + legend1=["前向角域 W(s, θ ± 1°)", "定位区域 P"], + legend2=["直径圆", "最小包围圆 MEC"]) + + +def data_geo_q2() -> dict[str, Any]: + a = 1500.0 / (2 * math.cos(math.radians(1.0))) + safe = R_EFF - a + c = np.array([a * math.cos(math.radians(30.0)), a * math.sin(math.radians(30.0))]) + return dict(omega_r=OMEGA_R, wedge=wedge_polygon((0.0, 0.0), 30.0, 1.0, 1500.0), + a=float(a), safe=float(safe), c=c, half=1900.0, + legend=["前向角域 W(s1)", "截断角域外接圆 B(c, a)", + "安全候选盘 B(c, 1000 − a)"]) + + +def data_geo_q3() -> dict[str, Any]: + a = RING_RADIUS_M + stations = np.array([[0.0, 0.0]] + [[a * math.cos(k * math.pi / 3), + a * math.sin(k * math.pi / 3)] for k in range(6)]) + return dict(omega_r=OMEGA_R, r_eff=R_EFF, + stations=stations, + worst=np.array([0.0, -SEVEN_R]), + half=float(RING_RADIUS_M + R_EFF + 90.0), + legend=["区域 Ω", "1000 m 接收盘", "覆盖站点", "最差点"]) + + +def data_geo_q4() -> dict[str, Any]: + plan = load_plan("q4_mincover_v2") + pts = np.array(plan["points"], dtype=float) + theta = np.linspace(-math.pi / 2, math.pi / 2, 60) + half_disk = np.vstack([[0.0, 0.5], + np.column_stack([0.85 * np.cos(theta), + 0.5 + 0.85 * np.sin(theta)])]) + half = float(max(OMEGA_R, np.abs(pts).max()) * 1.06) + return dict(omega_r=OMEGA_R, points=pts, half=half, half_disk=half_disk, + radius_label="覆盖半径 1000 m", + heading_label="前向半盘 ±90°(朝向未知)", + legend=["区域 Ω", "31 点最小命中集"]) + + +def data_replay(run: dict[str, Any], *, directional: bool) -> dict[str, Any]: + tl = decompose(run) + rows = tl["rows"] + truth = run["truth"] + solved = set(solved_channels(run)) + truth_pts, truth_solved, truth_labels = [], [], [] + for src in truth: + ch = int(src["channel"]) + truth_pts.append([src["x"], src["y"]]) + truth_solved.append(1.0 if ch in solved else 0.0) + truth_labels.append(f"ch{ch}") + # 定向源:朝向箭头(长度取该源有效接收半径)+ ±90° 前向半盘 + headings, half_disks = [], [] + for src in truth: + if not (directional and src.get("directional")): + continue + r = float(src.get("r_eff_m") or R_EFF) + ang = math.radians(float(src.get("heading_deg") or 0.0)) + headings.append([src["x"], src["y"], r * math.cos(ang), r * math.sin(ang)]) + arc = ang + np.linspace(-math.pi / 2, math.pi / 2, 49) + half_disks.append(np.vstack([[src["x"], src["y"]], + np.column_stack([src["x"] + r * np.cos(arc), + src["y"] + r * np.sin(arc)])])) + half_disk_arr = (np.stack(half_disks) if half_disks + else np.zeros((0, 50, 2), dtype=float)) + path = [(0.0, 0.0)] + rays, clears, marks, events = [], [], [], [] + for act, row in zip(run["actions"], rows): + if act["path"] == "/measure" and row["hit"]: + bearing = math.radians(float(act["response"].get("svd_deg") or 0.0)) + rays.append([row["x"], row["y"], 220 * math.cos(bearing), + 220 * math.sin(bearing)]) + if act["path"] in ("/measure", "/clear") and row["x"] is not None: + if (row["x"], row["y"]) != path[-1]: + path.append((row["x"], row["y"])) + if act["path"] == "/clear": + clears.append([row["x"], row["y"], 1.0 if row["cleared"] else 0.0]) + marks.append([row["virtual_s"], 1.0 if row["hit"] else 0.0, + 1.0 if act["path"] == "/clear" and row["cleared"] else 0.0]) + if len(events) < 10: + if act["path"] == "/measure": + detail = f"ch{row['channel']} ({row['x']:.0f},{row['y']:.0f})" + elif act["path"] == "/clear": + detail = f"ch{row['channel']} {'成功' if row['cleared'] else '未发现'}" + else: + detail = "启动会话" if act["path"] == "/enter" else "退出" + events.append([act["path"], detail, f"{row['virtual_s']:.0f}"]) + legend = ["移动轨迹", "检测示向度", "已清除频道", "未清除频道"] + if directional: + legend = ["移动轨迹", "检测示向度", "定向源前向半盘 (±90°)", + "已清除频道", "未清除频道"] + # 世界视图窗口:容纳 Ω、轨迹、射线与定向半盘,避免半盘被画到框外 + geom = [np.asarray(truth_pts, dtype=float), np.asarray(path, dtype=float)] + if rays: + rays_arr = np.asarray(rays, dtype=float) + geom.append(rays_arr[:, :2] + rays_arr[:, 2:]) + if half_disk_arr.size: + geom.append(half_disk_arr.reshape(-1, 2)) + half = float(max(OMEGA_R, np.abs(np.vstack(geom)).max()) * 1.06) + return dict( + omega_r=OMEGA_R, half=half, + out_png=("replay-webui-q4-directional.png" if directional + else "replay-webui-q3-omnidirectional.png"), + truth=np.array(truth_pts, dtype=float), + truth_solved=np.array(truth_solved, dtype=float).reshape(-1, 1), + truth_labels=truth_labels, + headings=np.array(headings, dtype=float).reshape(-1, 4), + half_disks=half_disk_arr, + path=np.array(path, dtype=float), + rays=np.array(rays, dtype=float).reshape(-1, 4), + clears=np.array(clears, dtype=float).reshape(-1, 3), + marks=np.array(marks, dtype=float).reshape(-1, 3), + events=events, total_s=float(tl["virtual_s"]), legend=legend) + + +# --------------------------------------------------------------------------- +# 产出 +# --------------------------------------------------------------------------- +def _as_cell(values: Any) -> np.ndarray: + """字符串列表 → object 数组(MATLAB cell);纯数值嵌套列表 → 数值矩阵。""" + if isinstance(values, str): + return np.array([values], dtype=object) + if isinstance(values, (list, tuple)): + if values and all(isinstance(v, (list, tuple)) and + all(isinstance(x, (int, float)) for x in v) + for v in values): + return np.asarray(values, dtype=float) + return np.array([_as_cell(v) if isinstance(v, (list, tuple)) else v + for v in values], dtype=object) + return np.asarray(values) + + +def write_mat(name: str, data: dict[str, Any]) -> None: + """写 .mat;字符串字段转 object 数组,MATLAB 侧按 cell 读取。""" + DATA_DIR.mkdir(parents=True, exist_ok=True) + + def wrap(value: Any, key: str) -> Any: # noqa: ARG001 + if isinstance(value, (str, list, tuple)): + return _as_cell(value) + return value + + payload = {key: wrap(value, key) for key, value in data.items()} + savemat(DATA_DIR / f"{name}.mat", payload, do_compression=True, + long_field_names=True) + + +def prepare(only: Sequence[str] | None) -> dict[str, list[dict[str, Any]]]: + """写全部 .mat 数据,返回每张图的数据来源。""" + want = set(only) if only else None + runs = discover_runs() + q3 = pick_run(runs, "q3", 10) if runs else None + q4 = (pick_case(runs, Q4_REPLAY_CASE) if runs else None) or \ + (pick_run(runs, "q4", 12) if runs else None) + sources: dict[str, list[dict[str, Any]]] = {} + + def need(stem: str) -> bool: + return want is None or stem in want + + build: list[tuple[str, str, Callable[[], dict[str, Any]]]] = [ + ("flow-overall-architecture", "flow_overall", data_flow_overall), + ("steps-state-machine", "steps_state_machine", data_steps_state_machine), + ("timing-attachment-example-105-111-194-199", "timing_attachment", + data_timing_attachment), + ("geo-q1-diameter-circle-counterexample", "geo_q1_counterexample", + data_geo_q1_counterexample), + ("geo-q2-guaranteed-reception-disk", "geo_q2", data_geo_q2), + ("geo-q3-seven-point-coverage", "geo_q3", data_geo_q3), + ("geo-q4-minimum-cover-31-points", "geo_q4", data_geo_q4), + ] + for stem, name, maker in build: + if not need(stem): + continue + write_mat(name, maker()) + sources[stem] = [source(p) for p in SOURCES.get(stem, [])] + + if need("geo-q1-convex-intersection-zoom"): + data, src = data_geo_q1_meetup() + write_mat("geo_q1_meetup", data) + sources["geo-q1-convex-intersection-zoom"] = [source(src)] + if q3: + if need("timing-measured-q3-10-sources"): + write_mat("timing_measured", data_timing_measured(q3)) + sources["timing-measured-q3-10-sources"] = [ + source(q3["source"], case_code=q3["case_code"], module=q3["module"])] + if need("replay-webui-q3-omnidirectional"): + write_mat("replay_q3", data_replay(q3, directional=False)) + sources["replay-webui-q3-omnidirectional"] = [ + source(q3["source"], case_code=q3["case_code"])] + if q4 and need("replay-webui-q4-directional"): + write_mat("replay_q4", data_replay(q4, directional=True)) + sources["replay-webui-q4-directional"] = [ + source(q4["source"], case_code=q4["case_code"])] + return sources + + +def run_matlab(only: Sequence[str] | None, matlab_bin: Path) -> None: + """逐张调用 MATLAB 出图。 + + 本机实测:同一 MATLAB 批处理会话里渲染第二张图时图形子系统会崩溃, + 因此每张图单独起一个会话(每次约数秒),并显式 exit。 + """ + if not matlab_bin.is_file(): + raise SystemExit(f"未找到 MATLAB:{matlab_bin}") + want = set(only) if only else None + log = MATLAB_DIR / "matlab_run.log" + lines: list[str] = [] + for stem, fn, name in FIGURES: + if want and stem not in want: + continue + call = f"{fn}('{name}')" if fn == "fig_replay" else f"{fn}()" + script = (f"cd('{MATLAB_DIR}'); addpath('{MATLAB_DIR}'); " + f"{call}; exit") + proc = subprocess.run([str(matlab_bin), "-batch", script], + capture_output=True, text=True, check=False) + ok = (OUT_DIR / f"{stem}.png").is_file() + lines.append(f"{'OK ' if ok else 'FAIL'} {stem}") + if not ok: + tail = [ln for ln in (proc.stdout + proc.stderr).splitlines() + if ln.strip() and "Keyboard" not in ln and "TISFile" not in ln] + lines.extend(f" {ln}" for ln in tail[-6:]) + log.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def finish(only: Sequence[str] | None, sources: dict[str, list[dict[str, Any]]]) -> None: + """删掉历史遗留的 SVG,写 manifest。""" + for stale in OUT_DIR.glob("*.svg"): + stale.unlink() + want = set(only) if only else None + entries = [] + for stem, fn, _name in FIGURES: + if want and stem not in want: + continue + png = OUT_DIR / f"{stem}.png" + entry = {"stem": stem, "png": str(png.relative_to(ROOT)), + "matlab": f"scripts/matlab/{fn}.m", + "sources": sources.get(stem, [])} + if not png.is_file(): + entry["missing"] = True + entries.append(entry) + manifest = { + "generator": "scripts/build_figure_data.py(数据)+ scripts/matlab/*.m(MATLAB 出图)", + "command": "uv run python scripts/build_figure_data.py" + + (f" --only {','.join(only)}" if only else ""), + "manual": "MATLAB 中 cd scripts/matlab 后执行 run_all_figures", + "figures": entries, + } + (OUT_DIR / "manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("--only", default="", help="逗号分隔的图名子集(见 --list)") + parser.add_argument("--prepare", action="store_true", help="只写 .mat 数据,不调 MATLAB") + parser.add_argument("--list", action="store_true", help="列出全部图名") + parser.add_argument("--matlab", default=str(MATLAB_BIN), help="matlab 可执行文件路径") + args = parser.parse_args() + names = [stem for stem, _fn, _name in FIGURES] + if args.list: + print("\n".join(names)) + return 0 + only = [s.strip() for s in args.only.split(",") if s.strip()] + unknown = [s for s in only if s not in set(names)] + if unknown: + parser.error(f"未知图名 {unknown}") + + sources = prepare(only or None) + if args.prepare: + print(f"[fig] 已写入 {len(list(DATA_DIR.glob('*.mat')))} 个 .mat → " + f"{DATA_DIR.relative_to(ROOT)}") + return 0 + targets = only or names + for stem in targets: # 先清掉旧文件:只认本次生成的 + (OUT_DIR / f"{stem}.png").unlink(missing_ok=True) + run_matlab(only or None, Path(args.matlab)) + finish(only or None, sources) + missing = [] + for stem in targets: + if (OUT_DIR / f"{stem}.png").is_file(): + print(f"[fig] OK {stem}") + else: + missing.append(stem) + print(f"[fig] 缺失 {stem}") + print(f"[fig] manifest → {(OUT_DIR / 'manifest.json').relative_to(ROOT)}") + if missing: + print(f"[fig] {len(missing)} 张未生成:{', '.join(missing)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/make_figures.py b/scripts/make_figures.py deleted file mode 100644 index 57e7ec4..0000000 --- a/scripts/make_figures.py +++ /dev/null @@ -1,1181 +0,0 @@ -"""docs/figures 的论文插图生成器(matplotlib 版)。 - - uv run python scripts/make_figures.py # 全部 11 张 - uv run python scripts/make_figures.py --list # 图名 - uv run python scripts/make_figures.py --only flow-overall-architecture - uv run python scripts/make_figures.py --scale 1.5 # 尺寸倍率 - -约定(与 docs/figures/README.md 对应): - -- **只输出 PNG**(不生成 SVG),分辨率按论文插图设置; -- **图内不放标题、图注与解释性文字**,只保留坐标轴、图例与数据标注; - 图的含义由文件名与 README 清单承担,解释写在论文正文; -- 字体取自 ``docs/paper/fonts/``(宋体 / 黑体 / Times New Roman),与 main.tex 一致; -- 数据来源与 sha256 写入 ``docs/figures/manifest.json``。 -""" - -from __future__ import annotations - -import argparse -import hashlib -import json -import math -import os -import sys -from pathlib import Path -from typing import Any, Callable, Sequence - -ROOT = Path(__file__).resolve().parents[1] -FONT_DIR = ROOT / "docs" / "paper" / "fonts" -OUT_DIR = ROOT / "docs" / "figures" -SESSIONS_DIR = ROOT / "referee-data" / "sessions" -ARCHIVE_DIR = ROOT / "examples" / "replay" -CACHE_DIR = ROOT / ".mpl-cache" - -# matplotlib 的缓存目录:仓库内可写,避免污染用户目录 -CACHE_DIR.mkdir(exist_ok=True) -os.environ.setdefault("MPLCONFIGDIR", str(CACHE_DIR)) -os.environ.setdefault("XDG_CACHE_HOME", str(CACHE_DIR)) - -import matplotlib # noqa: E402 -matplotlib.use("Agg") -import numpy as np # noqa: E402 -from matplotlib import font_manager as fm # noqa: E402 -from matplotlib import pyplot as plt # noqa: E402 -from matplotlib.lines import Line2D # noqa: E402 -from matplotlib.patches import Circle, FancyArrowPatch, FancyBboxPatch, Polygon # noqa: E402 - -sys.path.insert(0, str(Path(__file__).resolve().parent)) - -# 题面常量(与 src/mcm26b/config.py 一致) -OMEGA_R = 1800.0 -R_EFF = 1000.0 -SPEED_MPS = 5.0 -MEASURE_S = 5.0 -SWITCH_S = 1.0 -CLEAR_OK_S = 5.0 -CLEAR_NO_S = 3.0 -RING_RADIUS_M = 1159.7 -SEVEN_R = 1800.0 -Q4_DESIGN_R = 965.0 -Q4_HEADING_MARGIN_DEG = 5.0 - -# 论文配色:低饱和,单色打印可辨 -C = { - "ink": "#1c2430", - "muted": "#5c6673", - "grid": "#e4e9ee", - "primary": "#1f4e79", - "primary_fill": "#dce6f1", - "accent": "#b03a2e", - "accent_fill": "#f6dcd8", - "success": "#1e7a5f", - "success_fill": "#d8ece5", - "warn": "#b8860b", - "warn_fill": "#f6ecd2", - "violet": "#5b4b8a", -} - -FONTS = { - "song": "SongtiSC-Regular.ttf", - "song_bold": "SongtiSC-Bold.ttf", - "hei": "HeitiSC-Light.ttf", - "hei_bold": "HeitiSC-Medium.ttf", - "times": "Times New Roman.ttf", - "times_bold": "Times New Roman Bold.ttf", -} - - -# --------------------------------------------------------------------------- -# 样式 -# --------------------------------------------------------------------------- -def setup_style() -> dict[str, Any]: - """注册自带字体并设全局样式,返回 FontProperties 字典。""" - for name in FONTS.values(): - path = FONT_DIR / name - if path.is_file(): - fm.fontManager.addfont(str(path)) - props = {key: fm.FontProperties(fname=str(FONT_DIR / name)) - for key, name in FONTS.items() if (FONT_DIR / name).is_file()} - plt.rcParams.update({ - "figure.dpi": 120, - "savefig.dpi": 200, - "font.family": [props["song"].get_name(), "DejaVu Sans"], - "font.size": 8.5, - "axes.titlesize": 9, - "axes.labelsize": 8.5, - "xtick.labelsize": 8, - "ytick.labelsize": 8, - "legend.fontsize": 8, - "axes.edgecolor": C["muted"], - "axes.labelcolor": C["ink"], - "text.color": C["ink"], - "xtick.color": C["muted"], - "ytick.color": C["muted"], - "axes.grid": False, - "axes.unicode_minus": False, - "lines.linewidth": 1.2, - }) - return props - - -def new_axes(width_mm: float, height_mm: float, *, ncols: int = 1, - nrows: int = 1, scale: float = 1.0, **kw: Any) -> tuple[Any, Any]: - """按毫米尺寸建图(论文按 160 mm 宽排版时用 1.0 倍)。""" - fig, axes = plt.subplots(nrows, ncols, - figsize=(width_mm / 25.4 * scale, height_mm / 25.4 * scale), - layout="constrained", **kw) - return fig, axes - - -def axes_for_panels(panel_mm: float, aspects: Sequence[float], *, scale: float = 1.0, - width_ratios: Sequence[float] | None = None, - **kw: Any) -> tuple[Any, Any]: - """按"每个面板高 panel_mm、宽 = 高 × 宽高比"手工排版。 - - 等比例坐标轴(``set_aspect('equal')``)在自动布局(constrained/tight)下会被 - 挤成一小块,因此这里直接按数据比例分配位置:每个子图的方框宽高比等于 - 数据宽高比,等比例坐标轴正好铺满方框。 - """ - del kw - ratios = list(width_ratios) if width_ratios else [1.0] * len(aspects) - widths = [panel_mm * aspect * ratio for aspect, ratio in zip(aspects, ratios)] - left_mm, right_mm, top_mm = 16.0, 6.0, 6.0 - gap_mm, bottom_mm = 16.0, 15.0 - total_w = left_mm + sum(widths) + gap_mm * (len(widths) - 1) + right_mm - total_h = top_mm + panel_mm + bottom_mm - fig = plt.figure(figsize=(total_w / 25.4 * scale, total_h / 25.4 * scale)) - - def frac_x(mm: float) -> float: - return mm / total_w - - def frac_y(mm: float) -> float: - return mm / total_h - - axes = [] - cursor = left_mm - for width in widths: - box = [frac_x(cursor), frac_y(bottom_mm), frac_x(width), frac_y(panel_mm)] - axes.append(fig.add_axes(box)) - cursor += width + gap_mm - return fig, (axes if len(axes) > 1 else axes[0]) - - -def polar_axes(ax: Any, half: float, *, grid: float = 500.0, - center: Sequence[float] = (0.0, 0.0)) -> None: - """世界坐标视图:等比例、留白、细网格;``center`` 为视图中心。""" - cx, cy = float(center[0]), float(center[1]) - step = grid - ticks = [] - while step <= half * 1.2: - ticks += [-step, step] - step *= 2 - ticks = sorted({round(cx + t) for t in ticks if abs(t) <= half * 1.05} | - {round(cy + t) for t in ticks if abs(t) <= half * 1.05}) - # 顺序要紧:set_xticks 会在数据范围内重新 autoscale,必须最后再钉住范围 - ax.set_xticks(ticks) - ax.set_yticks(ticks) - ax.set_xlim(cx - half, cx + half) - ax.set_ylim(cy - half, cy + half) - # 面板方框由 axes_for_panels 按数据宽高比分配,刻度范围也是 1:1, - # 不需要再让 matplotlib 调 aspect(它会反过来改写已设定的范围) - ax.set_aspect("auto") - ax.grid(True, color=C["grid"], lw=0.6) - for side in ("top", "right"): - ax.spines[side].set_visible(False) - ax.set_axisbelow(True) - - -def save(fig: Any, stem: str, sources: Sequence[dict[str, Any]], scale: float) -> dict[str, Any]: - """落盘 PNG(仅 PNG:论文插图不再维护矢量版),返回 manifest 条目。""" - OUT_DIR.mkdir(parents=True, exist_ok=True) - png = OUT_DIR / f"{stem}.png" - fig.savefig(png, format="png") - plt.close(fig) - return {"stem": stem, "png": str(png.relative_to(ROOT)), "scale": scale, - "sources": list(sources)} - - -def source(path: str | Path, **extra: Any) -> dict[str, Any]: - """记录数据来源:仓库内相对路径、sha256 前 12 位、行数。""" - p = Path(path) - p = p if p.is_absolute() else ROOT / p - digest, lines = "-", 0 - if p.is_file(): - data = p.read_bytes() - digest = hashlib.sha256(data).hexdigest()[:12] - lines = data.count(b"\n") + (0 if data.endswith(b"\n") else 1) - rel = str(p.relative_to(ROOT)) if p.is_relative_to(ROOT) else str(p) - return {"path": rel, "sha256_12": digest, "lines": lines, **extra} - - -# --------------------------------------------------------------------------- -# 行为日志:解析、计时复算、归档回退 -# --------------------------------------------------------------------------- -def parse_jsonl(path: Path) -> dict[str, Any]: - """兼容评测机 ``event=action`` 与客户端 ``event=accepted`` 两种日志。""" - meta: dict[str, Any] = {} - actions: list[dict[str, Any]] = [] - fallback: dict[str, dict[str, Any]] = {} - seq = 0 - for line in path.read_text(encoding="utf-8").splitlines(): - line = line.strip() - if not line: - continue - try: - ev = json.loads(line) - except json.JSONDecodeError: - continue - kind = ev.get("event") - if kind == "session_start": - meta = ev - elif kind == "action": - seq += 1 - actions.append(dict(seq=ev.get("seq", seq), path=ev.get("path", ""), - request=ev.get("request") or {}, - response=ev.get("response") or {}, - wall_ts_ms=ev.get("wall_ts_ms"))) - elif kind == "accepted": - fallback[str(ev.get("request_id", ""))] = ev - elif kind == "step" and str(ev.get("request_id", "")) not in fallback: - fallback[str(ev.get("request_id", ""))] = ev - if not actions: - for ev in fallback.values(): - if not ev.get("path"): - continue - seq += 1 - stamp = ev.get("logged_at_unix_s") - actions.append(dict(seq=seq, path=ev["path"], request=ev.get("request") or {}, - response=ev.get("response") or {}, - wall_ts_ms=stamp * 1000 if stamp else None)) - if not actions: - raise ValueError(f"{path} 没有可回放的动作事件") - return dict(label=path.stem, case_code=meta.get("case_code") or path.parent.name, - module=meta.get("module") or "?", robot_id=str(meta.get("robot_id") or "?"), - truth=list(meta.get("truth") or []), actions=actions, source=path) - - -def discover_runs() -> list[dict[str, Any]]: - runs: list[dict[str, Any]] = [] - if SESSIONS_DIR.is_dir(): - for log in sorted(SESSIONS_DIR.glob("*/log.jsonl")): - try: - runs.append(parse_jsonl(log)) - except ValueError: - continue - if not runs and ARCHIVE_DIR.is_dir(): - for log in sorted(ARCHIVE_DIR.glob("*.jsonl")): - try: - runs.append(parse_jsonl(log)) - except ValueError: - continue - return runs - - -def pick_run(runs: Sequence[dict[str, Any]], module: str, truth: int) -> dict[str, Any]: - cands = [r for r in runs if r["module"].startswith(module) and len(r["truth"]) >= truth - and sum(1 for a in r["actions"] if a["path"] == "/measure") > 0] - if not cands: - cands = [r for r in runs if r["module"].startswith(module)] - return sorted(cands, key=lambda r: (abs(len(r["truth"]) - truth), len(r["actions"])))[0] - - -def decompose(run: dict[str, Any]) -> dict[str, Any]: - """按附件规则逐动作复算移动 / 换频 / 动作耗时。""" - pos = (0.0, 0.0) - channel: int | None = None - rows: list[dict[str, Any]] = [] - for act in run["actions"]: - req, res = act["request"], act["response"] - move_m = switch = action_s = 0.0 - if act["path"] in ("/measure", "/clear") and "position" in req: - tgt = (float(req["position"]["x"]), float(req["position"]["y"])) - move_m = math.dist(pos, tgt) - if move_m > 0: - pos = tgt - if act["path"] == "/measure": - ch = int(req.get("channel", 0)) - switch = 0.0 if channel in (None, ch) else SWITCH_S - channel = ch - action_s = MEASURE_S - elif act["path"] == "/clear": - action_s = CLEAR_OK_S if str(res.get("clear_result")) == "success" else CLEAR_NO_S - rows.append(dict(seq=act["seq"], path=act["path"], move_s=move_m / SPEED_MPS, - switch_s=switch, action_s=action_s, move_m=move_m, - virtual_s=float(res.get("virtual_time_s") or 0.0), - hit=str(res.get("measure_result")) == "direction", - cleared=str(res.get("clear_result")) == "success", - channel=req.get("channel"), - x=req.get("position", {}).get("x"), - y=req.get("position", {}).get("y"))) - wall = [r for r in run["actions"] if r.get("wall_ts_ms")] - real_s = (wall[-1]["wall_ts_ms"] - wall[0]["wall_ts_ms"]) / 1000.0 if len(wall) > 1 else 0.0 - last = run["actions"][-1]["response"] - return dict(rows=rows, virtual_s=float(last.get("virtual_time_s") or 0.0), - real_s=real_s, - move_s=sum(r["move_s"] for r in rows), - switch_s=sum(r["switch_s"] for r in rows), - action_s=sum(r["action_s"] for r in rows), - move_m=sum(r["move_m"] for r in rows)) - - -def solved_channels(run: dict[str, Any]) -> list[int]: - return sorted({int(a["request"]["channel"]) for a in run["actions"] - if a["path"] == "/clear" and "channel" in a["request"] - and str(a["response"].get("clear_result")) == "success"}) - - -# --------------------------------------------------------------------------- -# 几何工具 -# --------------------------------------------------------------------------- -def clip_halfplane(poly: np.ndarray, a: float, b: float, c: float) -> np.ndarray: - """Sutherland–Hodgman:半平面 a·x + b·y <= c 裁剪凸多边形。""" - if len(poly) == 0: - return poly - out: list[list[float]] = [] - n = len(poly) - for i in range(n): - cur, nxt = poly[i], poly[(i + 1) % n] - dc = a * cur[0] + b * cur[1] - c - dn = a * nxt[0] + b * nxt[1] - c - if dc <= 1e-9: - out.append(list(cur)) - if dn > 1e-9: - t = dc / (dc - dn) - out.append([cur[0] + t * (nxt[0] - cur[0]), cur[1] + t * (nxt[1] - cur[1])]) - elif dn <= 1e-9: - t = dc / (dc - dn) - out.append([cur[0] + t * (nxt[0] - cur[0]), cur[1] + t * (nxt[1] - cur[1])]) - return np.array(out) if out else np.empty((0, 2)) - - -def wedge_polygon(station: Sequence[float], bearing: float, half_deg: float, - reach: float) -> np.ndarray: - a0, a1 = math.radians(bearing - half_deg), math.radians(bearing + half_deg) - ang = np.linspace(a0, a1, 16) - pts = [[station[0], station[1]]] + \ - [[station[0] + reach * math.cos(t), station[1] + reach * math.sin(t)] for t in ang] - return np.array(pts) - - -def clip_convex(region: np.ndarray, a: float, b: float, c: float) -> np.ndarray: - """半平面 a·x + b·y <= c 裁剪(对 numpy 数组的薄封装)。""" - return clip_halfplane(np.asarray(region, dtype=float), a, b, c) - - -def clip_wedge(region: np.ndarray, station: Sequence[float], bearing: float, - half_deg: float) -> np.ndarray: - """用角域 W(s, θ ± δ) 裁剪区域。 - - 角域是两条边界射线的半平面交。示向度可能跨越 0/360 度,法向的正负不能靠叉积 - 猜:两个半平面各试一次,用"结果中心与站点的连线是否落在示向度 ±δ 内"来判定 - 哪一侧是角域内部。 - """ - region = np.asarray(region, dtype=float) - if len(region) == 0: - return region - for edge in (bearing - half_deg, bearing + half_deg): - ang = math.radians(edge) - a, b = -math.sin(ang), math.cos(ang) - c = a * station[0] + b * station[1] - candidates = [cand for cand in (clip_convex(region, a, b, c), - clip_convex(region, -a, -b, -c)) - if len(cand) >= 3] - if not candidates: - return np.empty((0, 2)) - if len(candidates) == 1: - region = candidates[0] - continue - region = min(candidates, key=lambda cand: _direction_error(cand, station, - bearing)) - return region - - -def _direction_error(poly: np.ndarray, station: Sequence[float], - bearing: float) -> float: - """多边形中心方向与示向度的偏差;用于挑正确的半平面一侧。""" - centre = poly.mean(axis=0) - dx, dy = centre[0] - station[0], centre[1] - station[1] - if abs(dx) < 1e-12 and abs(dy) < 1e-12: - return 0.0 - return abs(angle_diff(math.degrees(math.atan2(dy, dx)), bearing)) - - -def polygon_area(poly: np.ndarray) -> float: - if len(poly) < 3: - return 0.0 - x, y = poly[:, 0], poly[:, 1] - return 0.5 * abs(float(np.dot(x, np.roll(y, -1)) - np.dot(y, np.roll(x, -1)))) - - -def angle_diff(a: float, b: float) -> float: - return (a - b + 180.0) % 360.0 - 180.0 - - -def wedge_clip(station: Sequence[float], bearing: float, half_deg: float, - box: Sequence[float]) -> np.ndarray: - """角域与视窗矩形的交集,用于局部放大图。""" - x0, y0, x1, y1 = box - poly = np.array([[x0, y0], [x1, y0], [x1, y1], [x0, y1]], dtype=float) - return clip_wedge(poly, station, bearing, half_deg) - - -def q1_solve(stations: Sequence[Sequence[float]]) -> dict[str, Any]: - """调用生产求解器,避免图中数字与代码不一致。""" - sys.path.insert(0, str(ROOT / "src")) - from mcm26b import Measurement, solve # noqa: PLC0415 - res = solve([Measurement(x, y, b, h) for x, y, b, h in stations]) - dc, mec = res["diameter_circle"], res["minimum_enclosing_circle"] - return dict(vertices=np.array(res["vertices"]), pair=res["diameter_pair"], - dc=dc, mec=mec) - - -def q1_practice_case() -> dict[str, Any] | None: - for path in sorted((ROOT / "output" / "q1" / "practice").glob("*_observations.json")): - doc = json.loads(path.read_text(encoding="utf-8")) - if doc.get("result"): - doc["_path"] = path - return doc - return None - - -def load_plan(name: str) -> dict[str, Any]: - path = ROOT / "src" / "mcm26b" / "guarantee" / "plans" / f"{name}.json" - return json.loads(path.read_text(encoding="utf-8")) - - -def seven_bound(a: float = RING_RADIUS_M, radius: float = SEVEN_R) -> float: - return max(a / math.sqrt(3), math.sqrt(radius ** 2 + a ** 2 - math.sqrt(3) * radius * a)) - - -# --------------------------------------------------------------------------- -# 排版小工具 -# --------------------------------------------------------------------------- -def draw_boxes(ax: Any, boxes: Sequence[dict[str, Any]], font: Any) -> None: - """画一组统一风格的圆角框(流程示意图用)。""" - for b in boxes: - ax.add_patch(FancyBboxPatch((b["x"], b["y"]), b["w"], b["h"], - boxstyle="round,pad=0.02,rounding_size=0.6", - linewidth=1.0, edgecolor=b.get("edge", C["primary"]), - facecolor=b.get("face", C["primary_fill"]), - zorder=2)) - ax.text(b["x"] + b["w"] / 2, b["y"] + b["h"] / 2, b["label"], - ha="center", va="center", fontproperties=b.get("font", font["hei_bold"]), - fontsize=b.get("size", 8.2), color=b.get("color", C["ink"]), - linespacing=1.5, zorder=3) - - -def connect(ax: Any, p0: Sequence[float], p1: Sequence[float], *, - color: str | None = None, style: str = "-", lw: float = 1.0, - rad: float = 0.0) -> None: - ax.add_patch(FancyArrowPatch(p0, p1, arrowstyle="-|>", mutation_scale=9, - linewidth=lw, color=color or C["muted"], - linestyle=style, zorder=4, - connectionstyle=f"arc3,rad={rad}")) - - -def chips(ax: Any, items: Sequence[tuple[str, str]], *, x: float = 0.02, y: float = 0.02, - dy: float = 0.06, font: Any = None) -> None: - """左下角竖排色块图例(坐标用 axes 分数)。""" - for i, (label, color) in enumerate(items): - yy = y + i * dy - ax.add_patch(FancyBboxPatch((x, yy - 0.012), 0.018, 0.024, - boxstyle="round,pad=0.002,rounding_size=0.004", - transform=ax.transAxes, facecolor=color, - edgecolor="none", zorder=5, clip_on=False)) - ax.text(x + 0.026, yy, label, transform=ax.transAxes, va="center", ha="left", - fontproperties=font, fontsize=7.6, color=C["ink"], zorder=5) - - -# =========================================================================== -# 1. 总体思路与算法主线 -# =========================================================================== -def fig_flow_overall(font: dict[str, Any]) -> Any: - fig, ax = new_axes(170, 96) - ax.set_xlim(0, 120) - ax.set_ylim(0, 56) - ax.axis("off") - - def band(tag: str, y: float, items: Sequence[tuple[str, float, float]], - face: str, color: str) -> None: - ax.text(3.0, y + 3.0, tag, ha="center", va="center", - fontproperties=font["hei_bold"], fontsize=8.6, color=color) - for label, x, width in items: - draw_boxes(ax, [dict(x=x, y=y, w=width, h=6.0, label=label, face=face, - edge=color, font=font["song"], size=7.8)], font) - ax.plot([8.0, 116.0], [y - 1.6, y - 1.6], color=C["grid"], lw=0.8, zorder=1) - - band("L0", 46.0, [ - ("区域 Ω:半径 1800 m", 9.0, 26.5), - ("移动 5 m/s · 检测 5 s", 36.0, 26.5), - ("换频 1 s · 清除 5/3 s", 63.0, 26.5), - ("源 10~16 个 · 频道 1~20", 90.0, 25.5)], C["primary_fill"], C["primary"]) - - band("L1", 33.0, [ - ("证据层:候选集与粒子幸存集", 9.0, 33.0), - ("决策层:选点与任务表", 44.0, 33.0), - ("执行层:串行客户端", 79.0, 33.0)], C["primary_fill"], C["primary"]) - for x in (42.6, 77.6): - connect(ax, (x, 36.0), (x + 1.4, 36.0), color=C["ink"]) - - band("L2", 20.0, [ - ("问题 1 定位解算", 9.0, 25.5), - ("问题 2 第二点选择", 35.5, 25.5), - ("问题 3 全向搜索", 62.0, 25.5), - ("问题 4 混合定向", 88.5, 27.0)], C["accent_fill"], C["accent"]) - - band("L3", 7.0, [ - ("发现闭环", 9.0, 33.0), - ("定位闭环", 44.0, 33.0), - ("清除闭环", 79.0, 33.0)], C["success_fill"], C["success"]) - return fig - - -# =========================================================================== -# 2. 执行步骤:会话状态机 -# =========================================================================== -def fig_steps_state_machine(font: dict[str, Any]) -> Any: - fig, ax = new_axes(160, 34) - ax.set_xlim(0, 100) - ax.set_ylim(0, 22) - ax.axis("off") - states = [("IDLE", 3, C["grid"], C["muted"]), - ("倒计时 5 s", 26, C["warn_fill"], C["warn"]), - ("OPEN 接口开放", 49, C["success_fill"], C["success"]), - ("CLOSED 断连", 72, C["accent_fill"], C["accent"])] - for label, x, face, edge in states: - draw_boxes(ax, [dict(x=x, y=9, w=22, h=6.5, label=label, face=face, edge=edge, - font=font["hei_bold"], size=8.4)], font) - for i in range(3): - connect(ax, (25 + i * 23 + 0.3, 12.2), (26 + i * 23 - 0.5, 12.2), color=C["ink"]) - ax.text(50, 6.2, "现实预算 1200 s(程序)与测试窗口 1500 s(服务端)独立计时", - ha="center", fontproperties=font["song"], fontsize=7.6, color=C["muted"]) - ax.text(83, 4.0, "剩余不足 60 s 时预留 /exit", ha="center", - fontproperties=font["song"], fontsize=7.6, color=C["accent"]) - return fig - - -# =========================================================================== -# 3. 执行时间:附件示例逐步推演 -# =========================================================================== -EXAMPLE_STEPS = [ - ("/enter", 0.0, 0.0, 0.0), - ("/measure ch1", 100.0, 0.0, 5.0), - ("/measure ch2", 0.0, 1.0, 5.0), - ("/clear ch3", 80.0, 0.0, 3.0), - ("/measure ch2", 0.0, 0.0, 5.0), - ("/exit", 0.0, 0.0, 0.0), -] - - -def fig_timing_attachment(font: dict[str, Any]) -> Any: - fig, ax = new_axes(160, 46) - y = np.arange(len(EXAMPLE_STEPS))[::-1] - move = np.array([s[1] for s in EXAMPLE_STEPS]) - switch = np.array([s[2] for s in EXAMPLE_STEPS]) - action = np.array([s[3] for s in EXAMPLE_STEPS]) - ax.barh(y, move, color=C["primary"], height=0.6, label="移动 L/5") - ax.barh(y, switch, left=move, color=C["warn"], height=0.6, label="换频 1 s") - ax.barh(y, action, left=move + switch, color=C["success"], height=0.6, - label="检测/清除动作") - cumulative = np.cumsum(move + switch + action) - for i, (yy, total, acc) in enumerate(zip(y, move + switch + action, cumulative)): - if total > 0: - ax.text(move[i] + switch[i] + action[i] + 2, yy, f"{total:.0f} s", - va="center", fontproperties=font["times"], fontsize=7.6, color=C["ink"]) - ax.text(-4, yy, f"{acc:.0f}", va="center", ha="right", - fontproperties=font["times_bold"], fontsize=7.8, color=C["accent"]) - ax.set_yticks(y) - ax.set_yticklabels([s[0] for s in EXAMPLE_STEPS], fontproperties=font["times"], - fontsize=7.8) - ax.set_xlabel("虚拟耗时 / s", fontproperties=font["song"]) - ax.set_xlim(-14, 132) - ax.text(-4, len(EXAMPLE_STEPS) - 0.35, "累计", ha="right", va="center", - fontproperties=font["song"], fontsize=7.6, color=C["accent"]) - ax.legend(prop=font["song"], frameon=False, loc="lower right", ncols=3) - for side in ("top", "right"): - ax.spines[side].set_visible(False) - ax.grid(True, axis="x", color=C["grid"], lw=0.6) - ax.set_axisbelow(True) - return fig - - -# =========================================================================== -# 4. 执行时间:实测日志分解 -# =========================================================================== -def fig_timing_measured(run: dict[str, Any], font: dict[str, Any]) -> Any: - tl = decompose(run) - rows = tl["rows"] - seq = np.array([r["seq"] for r in rows]) - move = np.cumsum([r["move_s"] for r in rows]) - switch = np.cumsum([r["switch_s"] for r in rows]) - action = np.cumsum([r["action_s"] for r in rows]) - total = move + switch + action - parts = [tl["move_s"], tl["action_s"], tl["switch_s"]] - labels = ["移动", "检测/清除", "换频"] - colors = [C["primary"], C["success"], C["warn"]] - - fig, (ax, ax2) = new_axes(170, 54, ncols=2, width_ratios=[1.45, 1.0]) - ax.stackplot(seq, move, switch, action, colors=colors, - labels=["移动 L/5", "检测/清除动作", "换频 1 s"], lw=0) - ax.set_xlim(seq[0], seq[-1]) - ax.set_ylim(0, total[-1] * 1.08) - ax.set_xlabel("动作序号", fontproperties=font["song"]) - ax.set_ylabel("累计虚拟时间 / s", fontproperties=font["song"]) - ax.legend(prop=font["song"], frameon=False, loc="upper left") - for side in ("top", "right"): - ax.spines[side].set_visible(False) - ax.grid(True, axis="y", color=C["grid"], lw=0.6) - ax.set_axisbelow(True) - - # 右:构成条形 + 汇总(同一坐标下三段,末段极窄故编号标注) - ax2.set_xlim(0, 1) - ax2.set_ylim(0, 1) - ax2.axis("off") - bar_y, bar_h = 0.62, 0.14 - left = 0.0 - for i, (value, color) in enumerate(zip(parts, colors)): - frac = value / total[-1] - ax2.add_patch(FancyBboxPatch((left, bar_y), frac, bar_h, - boxstyle="round,pad=0,rounding_size=0.005", - facecolor=color, edgecolor="none")) - if frac > 0.06: - ax2.text(left + frac / 2, bar_y + bar_h / 2, f"{value:,.0f} s", ha="center", - va="center", fontproperties=font["song"], fontsize=7.4, - color="white") - left += frac - ax2.text(0.0, 0.84, f"虚拟 {total[-1]:,.1f} s", fontproperties=font["song"], - fontsize=7.8, color=C["ink"]) - ax2.text(0.5, 0.84, f"现实 {tl['real_s']:.2f} s", fontproperties=font["song"], - fontsize=7.8, color=C["ink"]) - ax2.text(1.0, 0.84, f"加速 {total[-1] / max(tl['real_s'], 1e-9):,.0f} 倍", ha="right", - fontproperties=font["song"], fontsize=7.8, color=C["accent"]) - for i, (value, label, color) in enumerate(zip(parts, labels, colors)): - ax2.add_patch(FancyBboxPatch((0.0 + i * 0.36, 0.40), 0.03, 0.05, - boxstyle="round,pad=0.002,rounding_size=0.01", - facecolor=color, edgecolor="none")) - ax2.text(0.05 + i * 0.36, 0.425, - f"{i + 1} {label} {value:,.0f} s", fontproperties=font["song"], - fontsize=7.4, va="center") - ax2.text(0.0, 0.24, f"检测 {sum(1 for r in rows if r['path'] == '/measure')} 次 · " - f"清除 {sum(1 for r in rows if r['path'] == '/clear')} 次 · " - f"里程 {tl['move_m'] / 1000:.1f} km", - fontproperties=font["song"], fontsize=7.4, color=C["muted"]) - return fig - - -# =========================================================================== -# 5. 问题一:交会定位区域 -# =========================================================================== -def _q1_data() -> dict[str, Any]: - case = q1_practice_case() - if case: - return dict(subtitle=f"官方演练 {case['case_code']}", - stations=[(m["x"], m["y"], m["bearing_deg"], m["half_angle_deg"]) - for m in case["measurements"]], - verts=np.array(case["result"]["vertices"]), - dc=case["result"]["diameter_circle"], - mec=case["result"]["minimum_enclosing_circle"], - src=case["_path"]) - doc = json.loads((ROOT / "examples" / "q1" / "triangle.json").read_text(encoding="utf-8")) - sol = q1_solve([(m["x"], m["y"], m["bearing_deg"], m.get("half_angle_deg", 1.0)) - for m in doc["measurements"]]) - return dict(subtitle="反例算例 triangle.json", - stations=[(m["x"], m["y"], m["bearing_deg"], m.get("half_angle_deg", 1.0)) - for m in doc["measurements"]], - verts=sol["vertices"], dc=sol["dc"], mec=sol["mec"], - src=ROOT / "examples" / "q1" / "triangle.json") - - -def fig_q1_meetup(font: dict[str, Any]) -> Any: - data = _q1_data() - stations = data["stations"] - xs = [s[0] for s in stations] - ys = [s[1] for s in stations] - half = max(max(xs) - min(xs), max(ys) - min(ys)) / 2 * 1.35 + 60 - reach = 2.4 * half - mec_c = data["mec"]["center"] - mec_r = data["mec"]["radius_m"] - dc_c, dc_r = data["dc"]["center"], data["dc"]["radius_m"] - # 放大窗口取定位区域外接框的 1.8 倍,使多边形、直径圆、MEC 同框且尺寸可比 - verts = data["verts"] - zoom_c = (float(verts[:, 0].mean()), float(verts[:, 1].mean())) - span = float(np.abs(verts - np.array(zoom_c)).max()) - zoom = max(1.8 * span, 0.8 * mec_r + span, 12.0) - - fig, axes = axes_for_panels(62.0, [1.0, 1.0]) - ax, axz = axes - polar_axes(ax, half, grid=half / 2) - for sx, sy, bearing, hd in stations: - ax.add_patch(Polygon(wedge_polygon((sx, sy), bearing, hd, reach), closed=True, - facecolor=C["primary"], alpha=0.16, edgecolor="none")) - ax.plot([sx], [sy], marker="o", ms=4, color=C["primary"]) - ax.annotate(f"({sx:.0f}, {sy:.0f})", (sx, sy), textcoords="offset points", - xytext=(6, 4), fontproperties=font["times"], fontsize=7.2, - color=C["primary"]) - ax.add_patch(Polygon(data["verts"], closed=True, facecolor=C["accent"], - edgecolor=C["accent"], lw=1.0)) - ax.annotate("定位区域 P →", (float(data["verts"][:, 0].mean()), - float(data["verts"][:, 1].mean())), - textcoords="offset points", xytext=(14, -18), - fontproperties=font["song"], fontsize=7.6, color=C["accent"], - arrowprops=dict(arrowstyle="-", color=C["accent"], lw=0.9)) - ax.set_xlabel("x / m", fontproperties=font["song"]) - ax.set_ylabel("y / m", fontproperties=font["song"]) - - polar_axes(axz, zoom, grid=zoom / 2, center=zoom_c) - axz.set_xticks([]) - axz.set_yticks([]) - axz.set_ylabel("") - # 放大面板:角域按面板的坐标范围裁剪,范围与 xlim/ylim 一致 - xlim, ylim = axz.get_xlim(), axz.get_ylim() - box = (float(xlim[0]), float(ylim[0]), float(xlim[1]), float(ylim[1])) - for sx, sy, bearing, hd in stations: - poly = wedge_clip((sx, sy), bearing, hd, box) - if len(poly): - axz.add_patch(Polygon(poly, closed=True, facecolor=C["primary"], - alpha=0.28, edgecolor="none")) - region = np.array([[box[0], box[1]], [box[2], box[1]], - [box[2], box[3]], [box[0], box[3]]], dtype=float) - for sx, sy, bearing, hd in stations: - region = clip_wedge(region, (sx, sy), bearing, hd) - if len(region) >= 3: - axz.add_patch(Polygon(region, closed=True, facecolor=C["accent_fill"], - edgecolor=C["accent"], lw=1.6)) - axz.add_patch(Polygon(data["verts"], closed=True, facecolor=C["accent_fill"], - edgecolor=C["accent"], lw=1.0)) - axz.add_patch(Circle(dc_c, dc_r, facecolor="none", edgecolor=C["violet"], - lw=1.2, ls=(0, (5, 3)))) - axz.add_patch(Circle(mec_c, mec_r, facecolor="none", edgecolor=C["success"], lw=1.4)) - axz.plot([dc_c[0]], [dc_c[1]], marker="o", ms=3.4, color=C["violet"]) - axz.plot([mec_c[0]], [mec_c[1]], marker="o", ms=3.4, color=C["success"]) - outside = max(data["verts"], key=lambda v: math.dist(v, dc_c)) - axz.annotate("", xy=outside, xytext=dc_c, - arrowprops=dict(arrowstyle="-|>", color=C["accent"], lw=1.0)) - axz.annotate("E > 0", (outside[0], outside[1]), textcoords="offset points", - xytext=(10, 6), fontproperties=font["times"], fontsize=7.4, - color=C["accent"]) - axz.set_xlabel(f"x / m(放大 ±{zoom:.0f} m)", fontproperties=font["song"]) - chips(ax, [("前向角域 W(s, θ ± 1°)", C["primary"]), ("定位区域 P", C["accent"])]) - chips(axz, [("直径圆(不覆盖)", C["violet"]), ("最小包围圆 MEC", C["success"])]) - return fig - - -# =========================================================================== -# 6. 问题一:直径圆反例 -# =========================================================================== -def fig_q1_counterexample(font: dict[str, Any]) -> Any: - doc = json.loads((ROOT / "examples" / "q1" / "triangle.json").read_text(encoding="utf-8")) - stations = [(m["x"], m["y"], m["bearing_deg"], m.get("half_angle_deg", 1.0)) - for m in doc["measurements"]] - sol = q1_solve(stations) - verts = sol["vertices"] - dc, mec = sol["dc"], sol["mec"] - mec_r = mec["radius_m"] - mec_c, dc_c = mec["center"], dc["center"] - # 反例的定位区域是边长 40 m 的等边三角形:取 1.8 倍直径做放大窗口 - zoom = max(1.8 * float(np.abs(verts - np.array(mec_c)).max()) * 2.0, 40.0) - - fig, axes = axes_for_panels(60.0, [1.0, 1.0]) - ax, axz = axes - half = 1200.0 - polar_axes(ax, half, grid=400.0) - for sx, sy, bearing, hd in stations: - ax.add_patch(Polygon(wedge_polygon((sx, sy), bearing, hd, 3 * half), closed=True, - facecolor=C["primary"], alpha=0.14, edgecolor="none")) - ax.plot([sx], [sy], marker="o", ms=4, color=C["primary"]) - ax.annotate(f"({sx:.0f}, {sy:.0f})", (sx, sy), textcoords="offset points", - xytext=(6, 4), fontproperties=font["times"], fontsize=7.2, - color=C["primary"]) - ax.add_patch(Polygon(verts, closed=True, facecolor=C["accent"], edgecolor=C["accent"])) - ax.set_xlabel("x / m", fontproperties=font["song"]) - ax.set_ylabel("y / m", fontproperties=font["song"]) - - polar_axes(axz, zoom, grid=zoom / 2, center=mec_c) - axz.set_xticks([]) - axz.set_yticks([]) - axz.set_ylabel("") - box = (mec_c[0] - zoom, mec_c[1] - zoom, mec_c[0] + zoom, mec_c[1] + zoom) - for sx, sy, bearing, hd in stations: - poly = wedge_clip((sx, sy), bearing, hd, box) - if len(poly): - axz.add_patch(Polygon(poly, closed=True, facecolor=C["primary"], - alpha=0.24, edgecolor="none")) - region = np.array([[box[0], box[1]], [box[2], box[1]], - [box[2], box[3]], [box[0], box[3]]], dtype=float) - for sx, sy, bearing, hd in stations: - region = clip_wedge(region, (sx, sy), bearing, hd) - if len(region) >= 3: - axz.add_patch(Polygon(region, closed=True, facecolor=C["accent_fill"], - edgecolor=C["accent"], lw=1.6)) - axz.add_patch(Circle(dc_c, dc["radius_m"], facecolor="none", edgecolor=C["violet"], - lw=1.4, ls=(0, (5, 3)))) - axz.add_patch(Circle(mec_c, mec_r, facecolor="none", edgecolor=C["success"], lw=1.4)) - outside = max(verts, key=lambda v: math.dist(v, dc_c)) - axz.annotate("最大超出顶点", xy=outside, xytext=(outside[0] + 6, outside[1] - 10), - fontproperties=font["song"], fontsize=7.6, color=C["accent"], - arrowprops=dict(arrowstyle="-|>", color=C["accent"], lw=1.0)) - axz.set_xlabel(f"x / m(放大 ±{zoom:.0f} m)", fontproperties=font["song"]) - chips(axz, [("直径圆(不覆盖)", C["violet"]), ("最小包围圆 MEC", C["success"])]) - return fig - - -# =========================================================================== -# 7. 问题二:保证接收盘 -# =========================================================================== -def fig_q2_safe_disk(font: dict[str, Any]) -> Any: - delta = math.radians(1.0) - a = 1500.0 / (2 * math.cos(delta)) - safe = R_EFF - a - bearing = 30.0 - c = (a * math.cos(math.radians(bearing)), a * math.sin(math.radians(bearing))) - - fig, axes = axes_for_panels(64.0, [1.0, 1.0], width_ratios=[1.0, 1.0]) - ax, axz = axes - half = 1900.0 - polar_axes(ax, half, grid=500.0) - ax.add_patch(Circle((0, 0), OMEGA_R, facecolor="none", edgecolor=C["primary"], lw=1.2)) - ax.add_patch(Polygon(wedge_polygon((0, 0), bearing, 1.0, 1500.0), closed=True, - facecolor=C["accent"], alpha=0.5, edgecolor=C["accent"], lw=1.0)) - ax.plot([0], [0], marker="o", ms=4, color=C["accent"]) - ax.annotate("s1", (0, 0), textcoords="offset points", xytext=(6, -10), - fontproperties=font["times"], fontsize=7.6, color=C["accent"]) - ax.add_patch(Circle(c, a, facecolor="none", edgecolor=C["violet"], lw=1.0, - ls=(0, (5, 3)))) - ax.add_patch(Circle(c, safe, facecolor=C["success"], alpha=0.35, - edgecolor=C["success"], lw=1.2)) - ax.annotate("", xy=c, xytext=(0, 0), - arrowprops=dict(arrowstyle="-|>", color=C["violet"], lw=1.0)) - ax.annotate(f"a = {a:.1f} m", (c[0] / 2, c[1] / 2), textcoords="offset points", - xytext=(-10, 30), ha="center", fontproperties=font["song"], - fontsize=7.6, color=C["violet"], - arrowprops=dict(arrowstyle="-", color=C["violet"], lw=0.8)) - ax.annotate(f"安全盘半径 {safe:.1f} m", (c[0], c[1]), textcoords="offset points", - xytext=(30, -34), ha="left", fontproperties=font["song"], - fontsize=7.6, color=C["success"], - arrowprops=dict(arrowstyle="-", color=C["success"], lw=0.8)) - ax.text(0, OMEGA_R * 0.98, "Ω:R = 1800 m", fontproperties=font["song"], - fontsize=7.6, color=C["primary"], ha="center", va="top") - ax.set_xlabel("x / m", fontproperties=font["song"]) - ax.set_ylabel("y / m", fontproperties=font["song"]) - - # 右:安全性依据(两半径相加 = 1000 m) - axz.set_aspect("equal", adjustable="box") - axz.axis("off") - axz.set_xlim(-1.15, 1.25) - axz.set_ylim(-0.35, 1.05) - r_safe, r_a = safe / 1000.0, a / 1000.0 - axz.add_patch(Circle((0, 0.45), r_a, facecolor=C["violet"], alpha=0.16, - edgecolor=C["violet"], lw=1.0, ls=(0, (4, 3)))) - axz.add_patch(Circle((0, 0.45), r_safe, facecolor=C["success"], alpha=0.35, - edgecolor=C["success"], lw=1.2)) - axz.plot([0], [0.45], marker="o", ms=3.4, color=C["ink"]) - ang = math.radians(20) - axz.annotate("", xy=(r_a * math.cos(ang), 0.45 + r_a * math.sin(ang)), - xytext=(0, 0.45), arrowprops=dict(arrowstyle="-", color=C["violet"], lw=1.0)) - axz.annotate("", xy=(-r_safe * math.cos(ang), 0.45 - r_safe * math.sin(ang)), - xytext=(0, 0.45), arrowprops=dict(arrowstyle="-", color=C["success"], lw=1.0)) - axz.text(0.30, 0.72, f"a = {a:.1f} m", fontproperties=font["song"], fontsize=7.6, - color=C["violet"]) - axz.text(-0.62, 0.18, f"1000 − a = {safe:.1f} m", fontproperties=font["song"], - fontsize=7.6, color=C["success"]) - chips(ax, [("前向角域 W(s1)", C["accent"]), ("截断角域外接圆 B(c, a)", C["violet"]), - ("安全候选盘 B(c, 1000 − a)", C["success"])]) - return fig - - -# =========================================================================== -# 8. 问题三:七点覆盖 -# =========================================================================== -def fig_q3_seven_coverage(font: dict[str, Any]) -> Any: - a = RING_RADIUS_M - stations = [(0.0, 0.0)] + [(a * math.cos(k * math.pi / 3), a * math.sin(k * math.pi / 3)) - for k in range(6)] - bound = seven_bound(a) - fig, axes = axes_for_panels(66.0, [1.0, 0.95], width_ratios=[1.0, 0.95]) - ax, axr = axes - half = 2050.0 - polar_axes(ax, half, grid=600.0) - ax.add_patch(Circle((0, 0), OMEGA_R, facecolor="#f7fafc", edgecolor=C["primary"], lw=1.4)) - for px, py in stations: - ax.add_patch(Circle((px, py), R_EFF, facecolor=C["success"], alpha=0.28, - edgecolor=C["success"], lw=0.8)) - ax.add_patch(Circle((0, 0), OMEGA_R, facecolor="none", edgecolor=C["primary"], lw=1.4)) - for px, py in stations: - ax.plot([px], [py], marker="o", ms=4.2, color=C["accent"]) - ax.plot([0, a], [0, 0], color=C["accent"], lw=0.9) - ax.text(a / 2, 60, f"a = {a:.1f} m", ha="center", fontproperties=font["times"], - fontsize=7.6, color=C["accent"]) - ax.plot([0], [-SEVEN_R], marker="o", ms=4.6, mfc="none", mec=C["accent"], mew=1.2) - ax.annotate(f"最坏点 {bound:.2f} m", (0, -SEVEN_R), textcoords="offset points", - xytext=(-4, 14), ha="center", fontproperties=font["song"], fontsize=7.6, - color=C["accent"], - arrowprops=dict(arrowstyle="-", color=C["accent"], lw=0.8)) - ax.text(0, OMEGA_R, "Ω", ha="center", va="bottom", fontproperties=font["song"], - fontsize=8, color=C["primary"]) - ax.set_xlabel("x / m", fontproperties=font["song"]) - ax.set_ylabel("y / m", fontproperties=font["song"]) - chips(ax, [("覆盖站点(原点 + 六等分环)", C["accent"]), ("1000 m 接收盘", C["success"])]) - - axr.axis("off") - axr.set_xlim(0, 1) - axr.set_ylim(0, 1) - rows = [("七点解析(默认)", "7", f"{bound:.2f} m", C["success_fill"], C["success"]), - ("49 点网格基线", "49", "989.95 m", "#f7f9fb", C["muted"]), - ("31 点最小命中集(题 4)", "31", "990.05 m", "#f7f9fb", C["muted"])] - header = ["方案", "点数", "覆盖半径上界"] - xs = [0.02, 0.62, 0.78] - for x, head in zip(xs, header): - axr.text(x, 0.9, head, fontproperties=font["hei_bold"], fontsize=7.8, - color=C["primary"]) - for i, (name, count, dist, face, edge) in enumerate(rows): - y = 0.76 - i * 0.13 - axr.add_patch(FancyBboxPatch((0.0, y - 0.045), 1.0, 0.11, - boxstyle="round,pad=0.004,rounding_size=0.02", - facecolor=face, edgecolor=edge, lw=0.8)) - axr.text(xs[0], y, name, fontproperties=font["song"], fontsize=7.6) - axr.text(xs[1], y, count, fontproperties=font["times"], fontsize=7.6) - axr.text(xs[2], y, dist, fontproperties=font["times"], fontsize=7.6) - return fig - - -# =========================================================================== -# 9. 问题四:31 点最小命中集 -# =========================================================================== -def fig_q4_mincover(font: dict[str, Any]) -> Any: - plan = load_plan("q4_mincover_v2") - pts = np.array(plan["points"], dtype=float) - - fig, axes = axes_for_panels(64.0, [1.0, 1.0], width_ratios=[1.0, 1.0]) - ax, axr = axes - half = 2150.0 - polar_axes(ax, half, grid=600.0) - ax.add_patch(Circle((0, 0), OMEGA_R, facecolor="#f7fafc", edgecolor=C["primary"], lw=1.4)) - ax.plot(pts[:, 0], pts[:, 1], ls="none", marker="o", ms=4.2, color=C["accent"], - label=f"{len(pts)} 个覆盖点") - ax.legend(prop=font["song"], frameon=False, loc="lower left") - ax.text(0, OMEGA_R, "Ω", ha="center", va="bottom", fontproperties=font["song"], - fontsize=8, color=C["primary"]) - ax.set_xlabel("x / m", fontproperties=font["song"]) - ax.set_ylabel("y / m", fontproperties=font["song"]) - ax.set_xlabel("x / m", fontproperties=font["song"]) - - # 右:forward_half_disk 语义与证书 - axr.axis("off") - axr.set_xlim(0, 1) - axr.set_ylim(0, 1) - axr.add_patch(Circle((0.36, 0.66), 0.24, facecolor="#f7f9fb", edgecolor=C["muted"], - lw=0.9)) - half_disk = [[0.36, 0.66]] + [[0.36 + 0.24 * math.cos(math.radians(-90 + 180 * i / 24)), - 0.66 + 0.24 * math.sin(math.radians(-90 + 180 * i / 24))] - for i in range(25)] - axr.add_patch(Polygon(half_disk, closed=True, facecolor=C["accent"], alpha=0.32, - edgecolor="none")) - axr.annotate("", xy=(0.57, 0.66), xytext=(0.36, 0.66), - arrowprops=dict(arrowstyle="-|>", color=C["accent"], lw=1.2)) - axr.plot([0.36, 0.36], [0.42, 0.90], color=C["accent"], lw=0.9, ls=(0, (4, 3))) - axr.annotate("", xy=(0.60, 0.95), xytext=(0.12, 0.95), - arrowprops=dict(arrowstyle="<->", color=C["muted"], lw=0.8)) - axr.text(0.36, 0.90, "覆盖半径 1000 m", ha="center", fontproperties=font["song"], - fontsize=7.4, color=C["muted"]) - axr.text(0.62, 0.60, "朝向未知\n±90° 前向半盘", ha="left", va="top", - fontproperties=font["song"], fontsize=7.4, color=C["accent"], linespacing=1.6) - return fig -# =========================================================================== -# 10/11. WebUI 回放复现 -# =========================================================================== -def fig_replay(run: dict[str, Any], font: dict[str, Any], *, directional: bool) -> Any: - tl = decompose(run) - rows = tl["rows"] - truth = run["truth"] - solved = set(solved_channels(run)) - - fig = plt.figure(figsize=(170 / 25.4, 108 / 25.4)) - ax = fig.add_axes([0.04, 0.30, 0.60, 0.66]) - polar_axes(ax, 2100.0, grid=1000.0) - ax.add_patch(Circle((0, 0), OMEGA_R, facecolor="#f7fafc", edgecolor=C["primary"], lw=1.4)) - for src in truth: - ch = int(src["channel"]) - color = C["accent"] if ch in solved else C["warn"] - ax.plot([src["x"]], [src["y"]], marker="o", ms=5, color=color, zorder=5) - ax.annotate(f"ch{ch}", (src["x"], src["y"]), textcoords="offset points", - xytext=(5, 2), fontproperties=font["times"], fontsize=6.8, color=color) - if directional and src.get("directional"): - hd = math.radians(float(src.get("heading_deg") or 0.0)) - ax.annotate("", xy=(src["x"] + 200 * math.cos(hd), src["y"] + 200 * math.sin(hd)), - xytext=(src["x"], src["y"]), - arrowprops=dict(arrowstyle="-|>", color=C["accent"], lw=1.0)) - path = [(0.0, 0.0)] - for row in rows: - if row["x"] is None: - continue - if (row["x"], row["y"]) != path[-1]: - path.append((row["x"], row["y"])) - if len(path) > 1: - px, py = zip(*path) - ax.plot(px, py, color=C["primary"], lw=1.1, alpha=0.85, zorder=3) - for act, row in zip(run["actions"], rows): - if row["x"] is None: - continue - if act["path"] == "/measure" and row["hit"]: - bearing = math.radians(float(act["response"].get("svd_deg") or 0.0)) - ax.annotate("", xy=(row["x"] + 220 * math.cos(bearing), - row["y"] + 220 * math.sin(bearing)), - xytext=(row["x"], row["y"]), - arrowprops=dict(arrowstyle="-|>", color=C["success"], lw=0.7, - alpha=0.55)) - ax.plot([row["x"]], [row["y"]], marker="o", ms=2.6, color=C["success"]) - elif act["path"] == "/clear": - ax.plot([row["x"]], [row["y"]], marker="o", ms=7, mfc="none", - mec=C["success"] if row["cleared"] else C["muted"], mew=1.2) - if row["cleared"]: - ax.plot([row["x"]], [row["y"]], marker="x", ms=5, color=C["success"], - mew=1.6) - ax.set_xlabel("x / m", fontproperties=font["song"]) - ax.set_ylabel("y / m", fontproperties=font["song"]) - ax.legend(handles=[ - Line2D([], [], marker="o", ls="none", color=C["success"], label="已清除频道"), - Line2D([], [], marker="o", ls="none", color=C["warn"], label="未清除频道"), - Line2D([], [], color=C["accent"], lw=1.2, label="定向源朝向"), - Line2D([], [], color=C["success"], lw=0.8, label="检测示向度"), - ], prop=font["song"], frameon=False, loc="upper center", - bbox_to_anchor=(0.5, -0.13), ncols=4) - - # 右侧:事件流水(前 10 条) - axt = fig.add_axes([0.70, 0.30, 0.285, 0.62]) - axt.axis("off") - axt.set_xlim(0, 1) - axt.set_ylim(0, 1) - axt.text(0.0, 1.0, run["case_code"], fontproperties=font["times_bold"], fontsize=7.8, - color=C["primary"], va="top") - axt.text(0.0, 0.93, f"{run['module']} · 源 {len(truth)} · " - f"全清 {len(solved)}/{len(truth)}", fontproperties=font["song"], - fontsize=7.4, color=C["muted"], va="top") - axt.text(0.0, 0.86, "动作 参数 虚拟 t/s", fontproperties=font["hei_bold"], - fontsize=7.4, color=C["primary"], va="top") - for i, (act, row) in enumerate(list(zip(run["actions"], rows))[:10]): - if act["path"] == "/measure": - detail = f"ch{row['channel']} ({row['x']:.0f},{row['y']:.0f})" - elif act["path"] == "/clear": - detail = f"ch{row['channel']} {'成功' if row['cleared'] else '未发现'}" - elif act["path"] == "/enter": - detail = "启动" - else: - detail = "退出" - axt.text(0.0, 0.78 - i * 0.075, act["path"], fontproperties=font["times"], - fontsize=7.2, va="top") - axt.text(0.45, 0.78 - i * 0.075, detail, fontproperties=font["song"], - fontsize=7.2, va="top") - axt.text(1.0, 0.78 - i * 0.075, f"{row['virtual_s']:.0f}", - fontproperties=font["times"], fontsize=7.2, va="top", ha="right") - - # 底部:虚拟时间轴(检测命中 / 清除刻度) - axb = fig.add_axes([0.04, 0.13, 0.945, 0.09]) - axb.set_xlim(0, max(tl["virtual_s"], 1e-9)) - axb.set_ylim(0, 1) - axb.axis("off") - axb.add_patch(FancyBboxPatch((0, 0.35), tl["virtual_s"], 0.3, - boxstyle="round,pad=0,rounding_size=0", - facecolor=C["primary_fill"], edgecolor="none")) - for act, row in zip(run["actions"], rows): - if act["path"] == "/measure" and row["hit"]: - axb.plot([row["virtual_s"], row["virtual_s"]], [0.2, 0.8], color=C["accent"], - lw=0.9) - elif act["path"] == "/clear" and row["cleared"]: - axb.plot([row["virtual_s"], row["virtual_s"]], [0.05, 0.95], color=C["success"], - lw=1.4) - axb.text(0, 1.15, "0 s", fontproperties=font["times"], fontsize=7.2, color=C["muted"]) - axb.text(tl["virtual_s"], 1.15, f"{tl['virtual_s']:,.0f} s", ha="right", - fontproperties=font["times"], fontsize=7.2, color=C["muted"]) - axb.text(tl["virtual_s"] / 2, 1.15, "竖线:检测到信号(红)/ 成功清除(绿)", - ha="center", fontproperties=font["song"], fontsize=7.2, color=C["muted"]) - return fig - - -# =========================================================================== -# 入口 -# =========================================================================== -def build_figures(only: Sequence[str] | None, scale: float) -> list[dict[str, Any]]: - font = setup_style() - want = set(only) if only else None - runs = discover_runs() - q3 = pick_run(runs, "q3", 10) if runs else None - q4 = pick_run(runs, "q4", 12) if runs else None - if not runs: - print("[fig] 未找到 JSONL,跳过与日志相关的 3 张图") - - jobs: list[tuple[str, Callable[[], Any], list[dict[str, Any]]]] = [ - ("flow-overall-architecture", lambda: fig_flow_overall(font), - [source("src/mcm26b/config.py"), source("docs/B题建模分析与实施计划.md")]), - ("steps-state-machine", lambda: fig_steps_state_machine(font), - [source("docs/协议规则表与状态机.md"), source("src/mcm26b/protocol/client.py")]), - ("timing-attachment-example-105-111-194-199", lambda: fig_timing_attachment(font), - [source("docs/协议规则表与状态机.md")]), - ("geo-q1-convex-intersection-zoom", lambda: fig_q1_meetup(font), []), - ("geo-q1-diameter-circle-counterexample", lambda: fig_q1_counterexample(font), - [source("examples/q1/triangle.json")]), - ("geo-q2-guaranteed-reception-disk", lambda: fig_q2_safe_disk(font), - [source("src/mcm26b/config.py"), source("docs/algo-2.md")]), - ("geo-q3-seven-point-coverage", lambda: fig_q3_seven_coverage(font), - [source("src/mcm26b/planner/seven.py"), source("docs/algo-3.md")]), - ("geo-q4-minimum-cover-31-points", lambda: fig_q4_mincover(font), - [source("src/mcm26b/guarantee/plans/q4_mincover_v2.json"), source("docs/algo-4.md")]), - ] - if q3: - jobs.append(("timing-measured-q3-10-sources", lambda: fig_timing_measured(q3, font), - [source(q3["source"], case_code=q3["case_code"], module=q3["module"])])) - jobs.append(("replay-webui-q3-omnidirectional", - lambda: fig_replay(q3, font, directional=False), - [source(q3["source"], case_code=q3["case_code"])])) - if q4: - jobs.append(("replay-webui-q4-directional", - lambda: fig_replay(q4, font, directional=True), - [source(q4["source"], case_code=q4["case_code"])])) - - entries: list[dict[str, Any]] = [] - for stem, maker, sources in jobs: - if want and stem not in want: - continue - fig = maker() - if stem == "geo-q1-convex-intersection-zoom": - sources = [source(_q1_data()["src"])] - entry = save(fig, stem, sources, scale) - entries.append(entry) - print(f"[fig] {stem:<44} → {entry['png']}") - return entries - - -def main() -> int: - names = ["flow-overall-architecture", "steps-state-machine", - "timing-attachment-example-105-111-194-199", "timing-measured-q3-10-sources", - "geo-q1-convex-intersection-zoom", "geo-q1-diameter-circle-counterexample", - "geo-q2-guaranteed-reception-disk", "geo-q3-seven-point-coverage", - "geo-q4-minimum-cover-31-points", "replay-webui-q3-omnidirectional", - "replay-webui-q4-directional"] - parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) - parser.add_argument("--only", default="", help="逗号分隔的图名子集") - parser.add_argument("--scale", type=float, default=1.0, help="尺寸倍率") - parser.add_argument("--list", action="store_true") - args = parser.parse_args() - if args.list: - print("\n".join(names)) - return 0 - only = [s.strip() for s in args.only.split(",") if s.strip()] - unknown = [s for s in only if s not in names] - if unknown: - parser.error(f"未知图名 {unknown}") - entries = build_figures(only or None, args.scale) - manifest = {"generator": "scripts/make_figures.py", - "command": "uv run python scripts/make_figures.py" - + (f" --only {args.only}" if args.only else ""), - "palette": C, "fonts": {"dir": "docs/paper/fonts", "map": FONTS}, - "figures": entries} - path = OUT_DIR / "manifest.json" - path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", - encoding="utf-8") - print(f"[fig] manifest → {path.relative_to(ROOT)}({len(entries)} 张)") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/scripts/matlab/fig_flow_overall.m b/scripts/matlab/fig_flow_overall.m new file mode 100644 index 0000000..65b9227 --- /dev/null +++ b/scripts/matlab/fig_flow_overall.m @@ -0,0 +1,65 @@ +function fig_flow_overall() +%FIG_FLOW_OVERALL 四层主线:题面抽象(L0)、在线三层(L1)、四问主线(L2)、三条闭环(L3)。 +% 仅保留分层框图与层标签,图内不放任何说明性文字。 + + S = fig_style(); + D = load_data(S, 'flow_overall'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off'); + ax = axes(fig, 'Position', [0.02 0.06 0.96 0.90], ... + 'XLim', [0 100], 'YLim', [0 100], 'Visible', 'off'); + hold(ax, 'on'); + + n = numel(D.tags); + x_tag = 7; % 层标签中心 + x_lo = 15; x_hi = 99; % 框体水平范围 + box_gap = 2.2; % 框间距(放箭头) + pad = 1.4; % 框内左右留白 + band_h = 14; % 层高 + band_gap = 6.5; + y_top = 96; + + % 统一字号:逐行按量得的文本宽度试算,保证一排框加间距放得下 + fs = ax.FontSize; + while fs > 8 + need_max = 0; + for b = 1:n + labels = D.labels{b}; + m = numel(labels); + need = sum(cellfun(@(s) H.text_width(ax, s, fs), labels)) ... + + 2 * pad * m + box_gap * (m - 1); + need_max = max(need_max, need); + end + if need_max <= x_hi - x_lo + break; + end + fs = fs - 0.5; + end + + for b = 1:n + labels = D.labels{b}; + m = numel(labels); + tw = cellfun(@(s) H.text_width(ax, s, fs), labels); + avail = (x_hi - x_lo) - box_gap * (m - 1); + w = (tw + 2 * pad) * avail / sum(tw + 2 * pad); + y = y_top - band_h - (b - 1) * (band_h + band_gap); + color = pick_color(S, D.colors{b}); + text(ax, x_tag, y + band_h / 2, D.tags{b}, 'FontSize', fs + 1, ... + 'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle'); + x = x_lo; + for i = 1:m + rectangle(ax, 'Position', [x, y, w(i), band_h], 'FaceColor', 'w', ... + 'EdgeColor', color, 'LineWidth', 1.1); + text(ax, x + w(i) / 2, y + band_h / 2, labels{i}, 'FontSize', fs, ... + 'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle', ... + 'Interpreter', 'none'); + if i < m + H.arrow(ax, [x + w(i) + 0.25, y + band_h / 2], ... + [x + w(i) + box_gap - 0.25, y + band_h / 2], color); + end + x = x + w(i) + box_gap; + end + end + hold(ax, 'off'); + fig_save(fig, S, 'flow-overall-architecture.png'); +end diff --git a/scripts/matlab/fig_geo_q1_counterexample.m b/scripts/matlab/fig_geo_q1_counterexample.m new file mode 100644 index 0000000..8b0680e --- /dev/null +++ b/scripts/matlab/fig_geo_q1_counterexample.m @@ -0,0 +1,52 @@ +function fig_geo_q1_counterexample() +%FIG_GEO_Q1_COUNTEREXAMPLE 问题一:等边三角形布站时直径圆不覆盖定位区域的反例。 + + S = fig_style(); + D = load_data(S, 'geo_q1_counterexample'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off'); + t = tiledlayout(fig, 1, 2, 'TileSpacing', 'compact', 'Padding', 'compact'); + + % 左:角域交会总览 + ax1 = nexttile(t); + hold(ax1, 'on'); + hw = gobjects(0); + for i = 1:size(D.wedges, 1) + hw = H.wedge(ax1, squeeze(D.wedges(i, :, :)), pick_color(S, 'primary'), 0.25); + end + hr = plot(ax1, D.zoom_center(1), D.zoom_center(2), 's', 'MarkerSize', 6, ... + 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); + plot(ax1, D.stations(:, 1), D.stations(:, 2), 'o', 'MarkerSize', 6, ... + 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); + H.label_points(ax1, D.stations, D.station_labels, pick_color(S, 'accent')); + hold(ax1, 'off'); + axis(ax1, 'equal'); + xlim(ax1, D.view_center(1) + [-D.half_overview, D.half_overview]); + ylim(ax1, D.view_center(2) + [-D.half_overview, D.half_overview]); + xlabel(ax1, 'x / m'); + ylabel(ax1, 'y / m'); + legend(ax1, [hw(1), hr], D.legend1, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + % 右:定位区域放大 + ax2 = nexttile(t); + hold(ax2, 'on'); + for i = 1:size(D.zoom_wedges, 1) + H.wedge(ax2, squeeze(D.zoom_wedges(i, :, :)), pick_color(S, 'primary'), 0.25); + end + H.poly(ax2, D.zoom_region, pick_color(S, 'accent'), 1, 'none', 0.5); + hd = H.circle(ax2, D.dc_center, D.dc_radius, pick_color(S, 'violet'), 1.2, '--'); + hm = H.circle(ax2, D.mec_center, D.mec_radius, pick_color(S, 'success'), 1.4, '-'); + H.marker(ax2, D.dc_center, pick_color(S, 'violet'), 5, true); + H.marker(ax2, D.mec_center, pick_color(S, 'success'), 5, true); + hold(ax2, 'off'); + axis(ax2, 'equal'); + xlim(ax2, D.zoom_center(1) + [-D.zoom_half, D.zoom_half]); + ylim(ax2, D.zoom_center(2) + [-D.zoom_half, D.zoom_half]); + xlabel(ax2, 'x / m'); + ylabel(ax2, 'y / m'); + legend(ax2, [hd, hm], D.legend2, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + fig_save(fig, S, 'geo-q1-diameter-circle-counterexample.png'); +end diff --git a/scripts/matlab/fig_geo_q1_meetup.m b/scripts/matlab/fig_geo_q1_meetup.m new file mode 100644 index 0000000..2d98da2 --- /dev/null +++ b/scripts/matlab/fig_geo_q1_meetup.m @@ -0,0 +1,52 @@ +function fig_geo_q1_meetup() +%FIG_GEO_Q1_MEETUP 问题一:角域交会总览与定位区域放大(直径圆、最小包围圆)。 + + S = fig_style(); + D = load_data(S, 'geo_q1_meetup'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off'); + t = tiledlayout(fig, 1, 2, 'TileSpacing', 'compact', 'Padding', 'compact'); + + % 左:角域交会总览(交会区域在总览里只是一个点,放大后见右图) + ax1 = nexttile(t); + hold(ax1, 'on'); + hw = gobjects(0); + for i = 1:size(D.wedges, 1) + hw = H.wedge(ax1, squeeze(D.wedges(i, :, :)), pick_color(S, 'primary'), 0.25); + end + hr = plot(ax1, D.zoom_center(1), D.zoom_center(2), 's', 'MarkerSize', 6, ... + 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); + plot(ax1, D.stations(:, 1), D.stations(:, 2), 'o', 'MarkerSize', 6, ... + 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); + H.label_points(ax1, D.stations, D.station_labels, pick_color(S, 'accent')); + hold(ax1, 'off'); + axis(ax1, 'equal'); + xlim(ax1, D.view_center(1) + [-D.half_overview, D.half_overview]); + ylim(ax1, D.view_center(2) + [-D.half_overview, D.half_overview]); + xlabel(ax1, 'x / m'); + ylabel(ax1, 'y / m'); + legend(ax1, [hw(1), hr], D.legend1, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + % 右:定位区域放大 + ax2 = nexttile(t); + hold(ax2, 'on'); + for i = 1:size(D.zoom_wedges, 1) + H.wedge(ax2, squeeze(D.zoom_wedges(i, :, :)), pick_color(S, 'primary'), 0.25); + end + H.poly(ax2, D.zoom_region, pick_color(S, 'accent'), 1, 'none', 0.5); + hd = H.circle(ax2, D.dc_center, D.dc_radius, pick_color(S, 'violet'), 1.2, '--'); + hm = H.circle(ax2, D.mec_center, D.mec_radius, pick_color(S, 'success'), 1.4, '-'); + H.marker(ax2, D.dc_center, pick_color(S, 'violet'), 5, true); + H.marker(ax2, D.mec_center, pick_color(S, 'success'), 5, true); + hold(ax2, 'off'); + axis(ax2, 'equal'); + xlim(ax2, D.zoom_center(1) + [-D.zoom_half, D.zoom_half]); + ylim(ax2, D.zoom_center(2) + [-D.zoom_half, D.zoom_half]); + xlabel(ax2, 'x / m'); + ylabel(ax2, 'y / m'); + legend(ax2, [hd, hm], D.legend2, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + fig_save(fig, S, 'geo-q1-convex-intersection-zoom.png'); +end diff --git a/scripts/matlab/fig_geo_q2_safe_disk.m b/scripts/matlab/fig_geo_q2_safe_disk.m new file mode 100644 index 0000000..f6d724a --- /dev/null +++ b/scripts/matlab/fig_geo_q2_safe_disk.m @@ -0,0 +1,55 @@ +function fig_geo_q2_safe_disk() +%FIG_GEO_Q2_SAFE_DISK 问题二:截断角域外接圆与保证接收的安全候选盘。 + + S = fig_style(); + D = load_data(S, 'geo_q2'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off'); + t = tiledlayout(fig, 1, 2, 'TileSpacing', 'compact', 'Padding', 'compact'); + + % 左:真实几何(Ω 内的角域与两个候选圆) + ax1 = nexttile(t); + hold(ax1, 'on'); + H.circle(ax1, [0 0], D.omega_r, pick_color(S, 'primary'), 1.2, '-'); + hw = H.wedge(ax1, D.wedge, pick_color(S, 'accent'), 0.25); + hd = H.circle(ax1, D.c, D.a, pick_color(S, 'violet'), 1.2, '--'); + hs = H.disk(ax1, D.c, D.safe, pick_color(S, 'success'), 0.30, '-'); + H.marker(ax1, [0 0], pick_color(S, 'accent'), 6, true); + H.marker(ax1, D.c, pick_color(S, 'violet'), 5, true); + H.label_points(ax1, [0 0], {'s1'}, pick_color(S, 'accent')); + H.label_points(ax1, D.c, {'c'}, pick_color(S, 'violet')); + hold(ax1, 'off'); + axis(ax1, 'equal'); + xlim(ax1, [-D.half, D.half]); + ylim(ax1, [-D.half, D.half]); + xlabel(ax1, 'x / m'); + ylabel(ax1, 'y / m'); + legend(ax1, [hw, hd, hs], D.legend, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + % 右:半径分解 a + (1000 − a) = 1000 m + ax2 = nexttile(t); + hold(ax2, 'on'); + H.circle(ax2, [0 0], D.a, pick_color(S, 'violet'), 1.2, '--'); + H.disk(ax2, [0 0], D.safe, pick_color(S, 'success'), 0.30, '-'); + H.marker(ax2, [0 0], 'k', 5, true); + ang = deg2rad(35); + p_out = D.a * [cos(ang), sin(ang)]; + p_in = D.safe * [cos(-ang), sin(-ang)]; + H.arrow(ax2, [0 0], p_out, pick_color(S, 'violet')); + H.arrow(ax2, [0 0], p_in, pick_color(S, 'success')); + text(ax2, p_out(1) * 1.06, p_out(2) * 1.12, sprintf('a = %.1f m', D.a), ... + 'Color', pick_color(S, 'violet'), 'Interpreter', 'none'); + text(ax2, p_in(1) * 1.04, p_in(2) * 1.30, sprintf('1000 − a = %.1f m', D.safe), ... + 'Color', pick_color(S, 'success'), 'HorizontalAlignment', 'right', ... + 'Interpreter', 'none'); + text(ax2, -D.safe * 0.45, 0, 'c', 'Color', 'k', ... + 'HorizontalAlignment', 'right', 'VerticalAlignment', 'middle'); + hold(ax2, 'off'); + axis(ax2, 'equal'); + xlim(ax2, [-D.a * 1.15, D.a * 1.75]); + ylim(ax2, [-D.a * 1.05, D.a * 1.05]); + axis(ax2, 'off'); + + fig_save(fig, S, 'geo-q2-guaranteed-reception-disk.png'); +end diff --git a/scripts/matlab/fig_geo_q3_coverage.m b/scripts/matlab/fig_geo_q3_coverage.m new file mode 100644 index 0000000..3692ba5 --- /dev/null +++ b/scripts/matlab/fig_geo_q3_coverage.m @@ -0,0 +1,29 @@ +function fig_geo_q3_coverage() +%FIG_GEO_Q3_COVERAGE 问题三:七个 1000 m 接收盘覆盖区域 Ω。 + + S = fig_style(); + D = load_data(S, 'geo_q3'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off'); + ax = axes(fig); + hold(ax, 'on'); + + hd = gobjects(0); + for i = 1:size(D.stations, 1) + hd = H.disk(ax, D.stations(i, :), D.r_eff, pick_color(S, 'success'), 0.18, '-'); + end + hw = H.circle(ax, [0 0], D.omega_r, pick_color(S, 'primary'), 1.2, '-'); + hs = plot(ax, D.stations(:, 1), D.stations(:, 2), 'o', 'MarkerSize', 6, ... + 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); + hx = H.marker(ax, D.worst, 'k', 8, false); + hold(ax, 'off'); + axis(ax, 'equal'); + xlim(ax, [-D.half, D.half]); + ylim(ax, [-D.half, D.half]); + xlabel(ax, 'x / m'); + ylabel(ax, 'y / m'); + legend(ax, [hw, hd(1), hs, hx], D.legend, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + fig_save(fig, S, 'geo-q3-seven-point-coverage.png'); +end diff --git a/scripts/matlab/fig_geo_q4_mincover.m b/scripts/matlab/fig_geo_q4_mincover.m new file mode 100644 index 0000000..49fbf73 --- /dev/null +++ b/scripts/matlab/fig_geo_q4_mincover.m @@ -0,0 +1,44 @@ +function fig_geo_q4_mincover() +%FIG_GEO_Q4_MINCOVER 问题四:31 点最小命中集与前向半盘覆盖语义。 + + S = fig_style(); + D = load_data(S, 'geo_q4'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off'); + t = tiledlayout(fig, 1, 2, 'TileSpacing', 'compact', 'Padding', 'compact'); + + % 左:Ω 内的 31 个覆盖点 + ax1 = nexttile(t); + hold(ax1, 'on'); + hw = H.circle(ax1, [0 0], D.omega_r, pick_color(S, 'primary'), 1.2, '-'); + hp = plot(ax1, D.points(:, 1), D.points(:, 2), 'o', 'MarkerSize', 5, ... + 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); + hold(ax1, 'off'); + axis(ax1, 'equal'); + xlim(ax1, [-D.half, D.half]); + ylim(ax1, [-D.half, D.half]); + xlabel(ax1, 'x / m'); + ylabel(ax1, 'y / m'); + legend(ax1, [hw, hp], D.legend, 'Location', 'southoutside', ... + 'Orientation', 'horizontal'); + + % 右:前向半盘(朝向未知,±90°) + ax2 = nexttile(t); + hold(ax2, 'on'); + H.poly(ax2, D.half_disk, pick_color(S, 'accent'), 0.30, 'none', 0.5); + H.circle(ax2, [0 0.5], 0.85, pick_color(S, 'muted'), 0.9, '-'); + plot(ax2, [0 0], [0.5 - 0.85, 0.5 + 0.85], '--', ... + 'Color', pick_color(S, 'accent'), 'LineWidth', 1.0); + H.arrow(ax2, [0 0.5], [0.85 0.5], pick_color(S, 'accent')); + text(ax2, 0.425, 0.30, D.radius_label, 'HorizontalAlignment', 'center', ... + 'Interpreter', 'none'); + text(ax2, 0.0, 1.55, D.heading_label, 'HorizontalAlignment', 'center', ... + 'Interpreter', 'none'); + hold(ax2, 'off'); + axis(ax2, 'equal'); + xlim(ax2, [-1.15 1.35]); + ylim(ax2, [-0.55 1.75]); + axis(ax2, 'off'); + + fig_save(fig, S, 'geo-q4-minimum-cover-31-points.png'); +end diff --git a/scripts/matlab/fig_replay.m b/scripts/matlab/fig_replay.m new file mode 100644 index 0000000..6d1d7e6 --- /dev/null +++ b/scripts/matlab/fig_replay.m @@ -0,0 +1,109 @@ +function fig_replay(name) +%FIG_REPLAY 回放画布(点运动图):世界视图 + 事件流水 + 虚拟时间轴。 +% name: 'replay_q3' 或 'replay_q4',对应 docs/figures/.data/.mat。 +% 本图是唯一保留自定义画布版式的图:三个区互不重叠,图例置于世界视图下方。 + + if nargin < 1 + name = 'replay_q3'; + end + S = fig_style(); + D = load_data(S, name); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off', 'Position', [100 100 1040 660]); + + c_path = [0.35 0.35 0.35]; + c_ray = pick_color(S, 'primary'); + c_solved = pick_color(S, 'success'); + c_unsolv = pick_color(S, 'accent'); + c_head = pick_color(S, 'violet'); + + % ---------------- 世界视图 ---------------- + ax = axes(fig, 'Position', [0.075 0.40 0.49 0.56]); + hold(ax, 'on'); + H.circle(ax, [0 0], D.omega_r, pick_color(S, 'primary'), 1.2, '-'); + h_path = plot(ax, D.path(:, 1), D.path(:, 2), 'Color', c_path, 'LineWidth', 0.9); + h_ray = plot(ax, nan, nan, 'Color', c_ray, 'LineWidth', 0.8); + for i = 1:size(D.rays, 1) + p0 = D.rays(i, 1:2); + p1 = p0 + D.rays(i, 3:4); + plot(ax, [p0(1) p1(1)], [p0(2) p1(2)], 'Color', c_ray, 'LineWidth', 0.8); + end + h_disk = gobjects(0); + for i = 1:size(D.half_disks, 1) + disk = squeeze(D.half_disks(i, :, :)); + h_disk(end + 1) = patch(ax, 'XData', disk(:, 1), 'YData', disk(:, 2), ... + 'FaceColor', c_head, 'FaceAlpha', 0.10, ... + 'EdgeColor', c_head, 'LineWidth', 0.8); %#ok + end + for i = 1:size(D.headings, 1) + p0 = D.headings(i, 1:2); + p1 = p0 + D.headings(i, 3:4); + H.arrow(ax, p0, p1, c_head); + end + solved = D.truth_solved > 0.5; + h_solved = plot(ax, D.truth(solved, 1), D.truth(solved, 2), 'o', ... + 'MarkerSize', 6, 'MarkerFaceColor', c_solved, 'MarkerEdgeColor', 'none'); + h_unsolv = plot(ax, D.truth(~solved, 1), D.truth(~solved, 2), 'o', ... + 'MarkerSize', 6, 'MarkerFaceColor', c_unsolv, 'MarkerEdgeColor', 'none'); + label_color = repmat(c_unsolv, size(D.truth, 1), 1); + label_color(solved, :) = repmat(c_solved, nnz(solved), 1); + H.label_points(ax, D.truth, D.truth_labels, label_color); + plot(ax, D.clears(D.clears(:, 3) > 0.5, 1), D.clears(D.clears(:, 3) > 0.5, 2), ... + 'x', 'MarkerSize', 7, 'LineWidth', 1.4, 'Color', c_solved); + plot(ax, D.clears(D.clears(:, 3) <= 0.5, 1), D.clears(D.clears(:, 3) <= 0.5, 2), ... + 'o', 'MarkerSize', 6, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'none'); + hold(ax, 'off'); + axis(ax, 'equal'); + xlim(ax, [-D.half, D.half]); + ylim(ax, [-D.half, D.half]); + xlabel(ax, 'x / m'); + ylabel(ax, 'y / m'); + hleg = [h_path, h_ray]; + if ~isempty(h_disk) + hleg(end + 1) = h_disk(1); + end + hleg = [hleg, h_solved, h_unsolv]; + legend(ax, hleg, D.legend, 'Location', 'southoutside', 'Orientation', 'horizontal'); + + % ---------------- 事件流水 ---------------- + ex = axes(fig, 'Position', [0.625 0.40 0.345 0.56], ... + 'XLim', [0 1], 'YLim', [0 1], 'Visible', 'off'); + hold(ex, 'on'); + cols = [0.00 0.34 1.00]; + align = {'left', 'left', 'right'}; + head = {'动作', '参数', 't / s'}; + for j = 1:3 + text(ex, cols(j), 0.97, head{j}, 'FontWeight', 'bold', ... + 'HorizontalAlignment', align{j}); + end + for i = 1:size(D.events, 1) + y = 0.90 - (i - 1) * 0.088; + for j = 1:3 + text(ex, cols(j), y, D.events{i, j}, 'HorizontalAlignment', align{j}, ... + 'Interpreter', 'none'); + end + end + hold(ex, 'off'); + + % ---------------- 虚拟时间轴 ---------------- + tx = axes(fig, 'Position', [0.075 0.155 0.90 0.125]); + hold(tx, 'on'); + rectangle(tx, 'Position', [0 0.34 D.total_s 0.32], ... + 'FaceColor', pick_color(S, 'primary'), 'FaceAlpha', 0.12, ... + 'EdgeColor', 'none'); + for i = 1:size(D.marks, 1) + t = D.marks(i, 1); + if D.marks(i, 3) > 0.5 + plot(tx, [t t], [0.05 0.95], 'Color', c_solved, 'LineWidth', 1.0); + elseif D.marks(i, 2) > 0.5 + plot(tx, [t t], [0.22 0.78], 'Color', c_unsolv, 'LineWidth', 0.8); + end + end + hold(tx, 'off'); + xlim(tx, [0 D.total_s]); + ylim(tx, [0 1]); + set(tx, 'YTick', []); + xlabel(tx, '虚拟时间 t / s'); + + fig_save(fig, S, D.out_png{1}); +end diff --git a/scripts/matlab/fig_save.m b/scripts/matlab/fig_save.m new file mode 100644 index 0000000..ba430d0 --- /dev/null +++ b/scripts/matlab/fig_save.m @@ -0,0 +1,11 @@ +function fig_save(fig, S, name) +%FIG_SAVE 导出白底 PNG(300 dpi)并关闭图形窗口。 +% 导出前关掉坐标轴工具条,避免交互按钮被画进图片。 + axs = findall(fig, 'Type', 'axes'); + for k = 1:numel(axs) + axs(k).Toolbar.Visible = 'off'; + end + exportgraphics(fig, fullfile(S.out_dir, name), 'Resolution', S.dpi, ... + 'BackgroundColor', 'white'); + close(fig); +end diff --git a/scripts/matlab/fig_steps_state_machine.m b/scripts/matlab/fig_steps_state_machine.m new file mode 100644 index 0000000..9e565b6 --- /dev/null +++ b/scripts/matlab/fig_steps_state_machine.m @@ -0,0 +1,34 @@ +function fig_steps_state_machine() +%FIG_STEPS_STATE_MACHINE 会话状态机:IDLE → 倒计时 → OPEN → CLOSED。 +% 只画状态框与迁移箭头,图内不放任何说明性文字。 + + S = fig_style(); + D = load_data(S, 'steps_state_machine'); + H = geom_helpers(); + fig = figure('Color', 'w', 'Visible', 'off', 'Position', [100 100 900 240]); + ax = axes(fig, 'Position', [0.02 0.10 0.96 0.80], ... + 'XLim', [0 100], 'YLim', [0 100], 'Visible', 'off'); + hold(ax, 'on'); + + n = numel(D.labels); + w = 21; + gap = 4.0; + x0 = (100 - (n * w + (n - 1) * gap)) / 2; + y0 = 25; + h = 50; + for i = 1:n + x = x0 + (i - 1) * (w + gap); + color = pick_color(S, D.edges{i}); + rectangle(ax, 'Position', [x, y0, w, h], 'FaceColor', 'w', ... + 'EdgeColor', color, 'LineWidth', 1.2); + text(ax, x + w / 2, y0 + h / 2, D.labels{i}, ... + 'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle', ... + 'Interpreter', 'none'); + if i < n + H.arrow(ax, [x + w + 0.5, y0 + h / 2], ... + [x + w + gap - 0.5, y0 + h / 2], color); + end + end + hold(ax, 'off'); + fig_save(fig, S, 'steps-state-machine.png'); +end diff --git a/scripts/matlab/fig_style.m b/scripts/matlab/fig_style.m new file mode 100644 index 0000000..48bab71 --- /dev/null +++ b/scripts/matlab/fig_style.m @@ -0,0 +1,11 @@ +function S = fig_style() +%FIG_STYLE 出图环境:目录、导出参数与 MATLAB 默认配色。 +% 除 fig_replay(回放画布,点运动图)外,各图一律使用 MATLAB 默认图形样式: +% 默认配色、默认字体、默认坐标轴与图例;本函数不设置任何自定义样式。 + + root = fileparts(fileparts(fileparts(mfilename('fullpath')))); + S.data_dir = fullfile(root, 'docs', 'figures', '.data'); + S.out_dir = fullfile(root, 'docs', 'figures'); + S.dpi = 300; % 论文插图导出分辨率 + S.c = get(groot, 'defaultAxesColorOrder'); % 默认配色(7×3) +end diff --git a/scripts/matlab/fig_timing_attachment.m b/scripts/matlab/fig_timing_attachment.m new file mode 100644 index 0000000..bd2631f --- /dev/null +++ b/scripts/matlab/fig_timing_attachment.m @@ -0,0 +1,29 @@ +function fig_timing_attachment() +%FIG_TIMING_ATTACHMENT 附件计时示例:逐动作的耗时构成(堆叠条形)与单步合计。 + + S = fig_style(); + D = load_data(S, 'timing_attachment'); + fig = figure('Color', 'w', 'Visible', 'off'); + ax = axes(fig); + + n = numel(D.labels); + Y = [D.move(:), D.switch_s(:), D.action(:)]; + y = (n:-1:1)'; % 动作按先后从上到下排列 + barh(ax, y, Y, 'stacked'); + total = sum(Y, 2); + xlim(ax, [0, max(total) * 1.18]); + hold(ax, 'on'); + for i = 1:n + if total(i) > 0 + text(ax, total(i) + max(total) * 0.02, y(i), ... + sprintf('%.0f s', total(i)), 'VerticalAlignment', 'middle', ... + 'Interpreter', 'none'); + end + end + hold(ax, 'off'); + set(ax, 'YTick', 1:n, 'YTickLabel', flipud(D.labels(:)), ... + 'TickLabelInterpreter', 'none'); + xlabel(ax, D.xlabel); + legend(ax, D.legend); + fig_save(fig, S, 'timing-attachment-example-105-111-194-199.png'); +end diff --git a/scripts/matlab/fig_timing_measured.m b/scripts/matlab/fig_timing_measured.m new file mode 100644 index 0000000..7d2c771 --- /dev/null +++ b/scripts/matlab/fig_timing_measured.m @@ -0,0 +1,17 @@ +function fig_timing_measured() +%FIG_TIMING_MEASURED 实测一局:累计虚拟时间按动作类型的堆叠构成。 + + S = fig_style(); + D = load_data(S, 'timing_measured'); + fig = figure('Color', 'w', 'Visible', 'off'); + ax = axes(fig); + + seq = D.seq(:); + bands = [D.cum(:, 1), diff(D.cum, 1, 2)]; % area 对矩阵按列堆叠,这里给每层厚度 + h = area(ax, seq, bands, 'FaceAlpha', 1); + xlim(ax, [seq(1), seq(end)]); + xlabel(ax, D.xlabel); + ylabel(ax, D.ylabel); + legend(ax, h, D.legend, 'Location', 'northwest'); + fig_save(fig, S, 'timing-measured-q3-10-sources.png'); +end diff --git a/scripts/matlab/geom_helpers.m b/scripts/matlab/geom_helpers.m new file mode 100644 index 0000000..a1d03bb --- /dev/null +++ b/scripts/matlab/geom_helpers.m @@ -0,0 +1,194 @@ +function H = geom_helpers() +%GEOM_HELPERS 几何示意图共用的绘制函数。 +% 只使用 MATLAB 默认图形对象与默认配色,不做自定义样式。 + + H.circle = @draw_circle; + H.wedge = @draw_wedge; + H.disk = @draw_disk; + H.poly = @draw_poly; + H.marker = @draw_marker; + H.arrow = @draw_arrow; + H.label_points = @label_points; + H.text_width = @text_width; +end + +% --------------------------------------------------------------------------- +% 基本图元 +% --------------------------------------------------------------------------- +function h = draw_circle(ax, center, radius, color, lw, style) + t = linspace(0, 2 * pi, 360); + h = plot(ax, center(1) + radius * cos(t), center(2) + radius * sin(t), ... + 'Color', color, 'LineWidth', lw, 'LineStyle', style); +end + +function h = draw_wedge(ax, poly, color, alpha) + h = patch(ax, 'XData', poly(:, 1), 'YData', poly(:, 2), 'FaceColor', color, ... + 'FaceAlpha', alpha, 'EdgeColor', 'none'); +end + +function h = draw_disk(ax, center, radius, color, alpha, edge_style) + t = linspace(0, 2 * pi, 360); + h = patch(ax, 'XData', center(1) + radius * cos(t), ... + 'YData', center(2) + radius * sin(t), ... + 'FaceColor', color, 'FaceAlpha', alpha, 'EdgeColor', color, ... + 'LineWidth', 0.6, 'LineStyle', edge_style); +end + +function h = draw_poly(ax, poly, face, alpha, edge, lw) + h = patch(ax, 'XData', poly(:, 1), 'YData', poly(:, 2), 'FaceColor', face, ... + 'FaceAlpha', alpha, 'EdgeColor', edge, 'LineWidth', lw); +end + +function h = draw_marker(ax, p, color, size, filled) + if filled + h = plot(ax, p(1), p(2), 'o', 'MarkerSize', size, ... + 'MarkerFaceColor', color, 'MarkerEdgeColor', 'none'); + else + h = plot(ax, p(1), p(2), 'o', 'MarkerSize', size, ... + 'MarkerFaceColor', 'none', 'MarkerEdgeColor', color, ... + 'LineWidth', 0.9); + end +end + +function h = draw_arrow(ax, p0, p1, color) +%DRAW_ARROW 数据坐标箭头:直线 + 实心三角箭头。 +% 箭头在"像素空间"里构造后换算回数据坐标,因此与坐标轴比例无关, +% 也不依赖绘制时的 axes 位置(图例把坐标区挤小后箭头依然对准数据点)。 + h = plot(ax, [p0(1) p1(1)], [p0(2) p1(2)], 'Color', color, 'LineWidth', 0.9); + d = [p1(1) - p0(1), p1(2) - p0(2)]; + [sx, sy] = px_scale(ax); % 每像素对应的数据单位 + v = [d(1) / sx, d(2) / sy]; % 像素空间向量 + len = hypot(v(1), v(2)); + if len < 1e-9 + return; + end + u = v / len; + n = [-u(2), u(1)]; + head = min(len * 0.6, 10); % 头长(像素) + base = v - u * head; + tri = [v; base + n * head * 0.42; base - n * head * 0.42] .* [sx, sy]; + patch(ax, 'XData', p0(1) + tri(:, 1), 'YData', p0(2) + tri(:, 2), ... + 'FaceColor', color, 'EdgeColor', 'none'); +end + +function [sx, sy] = px_scale(ax) + pos = ax.Position; + fpos = ancestor(ax, 'figure').Position; + sx = diff(ax.XLim) / (pos(3) * fpos(3)); + sy = diff(ax.YLim) / (pos(4) * fpos(4)); +end + +% --------------------------------------------------------------------------- +% 标签自动避让 +% --------------------------------------------------------------------------- +function label_points(ax, pts, labels, color) +%LABEL_POINTS 在散点旁放置标签:按候选方位打分选出与已放标签、标记点都不重叠的位置。 +% color 可以是 1×3(所有标签同色)或 n×3(逐点配色)。 + if isempty(pts) + return; + end + if size(color, 1) == 1 + color = repmat(color, numel(labels), 1); + end + xl = ax.XLim; + yl = ax.YLim; + gap = pixel_gap(ax, 5); % 标签与标记点之间的固定像素间距 + mbox = marker_size(ax) * [-0.5 -0.5 1 1]; + placed = zeros(0, 4); + for i = 1:numel(labels) + if pts(i, 1) < xl(1) || pts(i, 1) > xl(2) || ... + pts(i, 2) < yl(1) || pts(i, 2) > yl(2) + continue; % 视野外的点不标注 + end + sz = text_size(ax, labels{i}); + cand = candidates(pts(i, :), sz, gap); + best_pen = inf; + best = cand(1, :); + for k = 1:size(cand, 1) + box = [cand(k, 1) - sz(1) / 2 - gap(1), cand(k, 2) - sz(2) / 2 - gap(2), ... + sz(1) + 2 * gap(1), sz(2) + 2 * gap(2)]; + pen = penalty(box, placed, pts, mbox, xl, yl); + if pen < best_pen + best_pen = pen; + best = cand(k, :); + end + end + text(ax, best(1), best(2), labels{i}, 'Color', color(i, :), ... + 'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle'); + placed(end + 1, :) = [best(1) - sz(1) / 2 - gap(1), ... + best(2) - sz(2) / 2 - gap(2), ... + sz(1) + 2 * gap(1), sz(2) + 2 * gap(2)]; %#ok + end +end + +function cand = candidates(p, sz, gap) +%CANDIDATES 标记点周围的候选标签中心:先近后远,四正方向 + 四斜角。 + dx = gap(1) + sz(1) / 2; + dy = gap(2) + sz(2) / 2; + cand = [p(1) + dx, p(2); p(1) - dx, p(2) + p(1), p(2) + dy; p(1), p(2) - dy + p(1) + dx, p(2) + dy; p(1) - dx, p(2) + dy + p(1) + dx, p(2) - dy; p(1) - dx, p(2) - dy + p(1) + 2.2 * dx, p(2); p(1) - 2.2 * dx, p(2) + p(1), p(2) + 2.2 * dy; p(1), p(2) - 2.2 * dy + p(1) + 1.9 * dx, p(2) + 1.9 * dy; p(1) - 1.9 * dx, p(2) + 1.9 * dy + p(1) + 1.9 * dx, p(2) - 1.9 * dy; p(1) - 1.9 * dx, p(2) - 1.9 * dy + p(1) + 3.4 * dx, p(2); p(1) - 3.4 * dx, p(2) + p(1), p(2) + 3.4 * dy; p(1), p(2) - 3.4 * dy]; +end + +function g = pixel_gap(ax, npix) + pos = ax.Position; + fpos = ancestor(ax, 'figure').Position; + g = [npix * diff(ax.XLim) / (pos(3) * fpos(3)), ... + npix * diff(ax.YLim) / (pos(4) * fpos(4))]; +end + +function pen = penalty(box, placed, pts, mbox, xl, yl) + pen = 0; + for j = 1:size(placed, 1) % 标签之间重叠代价最高 + pen = pen + 12 * overlap(box, placed(j, :)); + end + for j = 1:size(pts, 1) % 其次避免压住标记点 + mb = [pts(j, 1) + mbox(1), pts(j, 2) + mbox(2), mbox(3), mbox(4)]; + pen = pen + 3 * overlap(box, mb); + end + dx = max(0, xl(1) - box(1)) + max(0, box(1) + box(3) - xl(2)); + dy = max(0, yl(1) - box(2)) + max(0, box(2) + box(4) - yl(2)); + pen = pen + 1e3 * (dx * box(4) + dy * box(3)); +end + +function a = overlap(b1, b2) + w = min(b1(1) + b1(3), b2(1) + b2(3)) - max(b1(1), b2(1)); + h = min(b1(2) + b1(4), b2(2) + b2(4)) - max(b1(2), b2(2)); + a = max(0, w) * max(0, h); +end + +function sz = text_size(ax, str) +%TEXT_SIZE 文本在数据坐标下的包围盒尺寸(用临时 text 对象的 Extent 量取)。 + h = text(ax, 0, 0, str, 'Units', 'data', 'Visible', 'off', ... + 'Interpreter', 'none'); + e = get(h, 'Extent'); + delete(h); + sz = [e(3) e(4)] * 1.12; +end + +function w = text_width(ax, str, fs) +%TEXT_WIDTH 指定字号下文本在数据坐标下的宽度。 + h = text(ax, 0, 0, str, 'Units', 'data', 'Visible', 'off', ... + 'FontSize', fs, 'Interpreter', 'none'); + e = get(h, 'Extent'); + delete(h); + w = e(3) * 1.04; +end + +function s = marker_size(ax) + xl = ax.XLim; + yl = ax.YLim; + pos = ax.Position; + fpos = ancestor(ax, 'figure').Position; + w_px = pos(3) * fpos(3); + h_px = pos(4) * fpos(4); + s = 8 * max(diff(xl) / w_px, diff(yl) / h_px); % 约 8 px +end + diff --git a/scripts/matlab/load_data.m b/scripts/matlab/load_data.m new file mode 100644 index 0000000..8814110 --- /dev/null +++ b/scripts/matlab/load_data.m @@ -0,0 +1,11 @@ +function D = load_data(S, name) +%LOAD_DATA 读取 scripts/build_figure_data.py 预先写好的绘图数据并规范化文本字段。 + path = fullfile(S.data_dir, [name '.mat']); + if ~isfile(path) + error('缺少绘图数据:%s(请先运行 scripts/build_figure_data.py --prepare)', path); + end + D = normalize_text(load(path)); + if isfield(D, 'switch_') && ~isfield(D, 'switch_s') + D.switch_s = D.switch_; + end +end diff --git a/scripts/matlab/normalize_text.m b/scripts/matlab/normalize_text.m new file mode 100644 index 0000000..f0c3a73 --- /dev/null +++ b/scripts/matlab/normalize_text.m @@ -0,0 +1,15 @@ +function D = normalize_text(D) +%NORMALIZE_TEXT 把 load 出来的字符矩阵还原成字符串列表。 +% scipy.io.savemat 会把 Python 的字符串列表写成三维 char 数组(或 char 矩阵), +% MATLAB 侧读回来是 char,不能按 {i} 取值,这里统一转成 cellstr。 + + fn = fieldnames(D); + for k = 1:numel(fn) + v = D.(fn{k}); + if ischar(v) && ndims(v) > 2 + D.(fn{k}) = cellstr(v); + elseif isstruct(v) + D.(fn{k}) = normalize_text(v); + end + end +end diff --git a/scripts/matlab/pick_color.m b/scripts/matlab/pick_color.m new file mode 100644 index 0000000..19c67d8 --- /dev/null +++ b/scripts/matlab/pick_color.m @@ -0,0 +1,13 @@ +function c = pick_color(S, name) +%PICK_COLOR 语义色名 → MATLAB 默认配色(不引入自定义调色板)。 + switch name + case 'primary', c = S.c(1, :); % 几何区域、主体对象 + case 'accent', c = S.c(2, :); % 真值源、关键结论 + case 'warn', c = S.c(3, :); % 警示、未清除 + case 'violet', c = S.c(4, :); % 直径圆等辅助对象 + case 'success', c = S.c(5, :); % 覆盖、清除、通过 + case 'grid', c = [0.5 0.5 0.5]; + case 'muted', c = [0.45 0.45 0.45]; + otherwise, c = [0 0 0]; + end +end diff --git a/scripts/matlab/run_all_figures.m b/scripts/matlab/run_all_figures.m new file mode 100644 index 0000000..991986d --- /dev/null +++ b/scripts/matlab/run_all_figures.m @@ -0,0 +1,38 @@ +function run_all_figures() +%RUN_ALL_FIGURES 生成 docs/figures 下的全部论文插图。 +% 数据由 scripts/build_figure_data.py 写入 docs/figures/.data/*.mat。 +% 本机图形子系统在同一批处理会话里连续渲染多张图会崩溃,故每张图单独起会话; +% 这里只作为 MATLAB 内的手动入口,逐张调用并记日志。 + + here = fileparts(mfilename('fullpath')); + addpath(here); + log = fullfile(here, 'run_all_figures.log'); + items = { 'flow-overall-architecture', @fig_flow_overall + 'steps-state-machine', @fig_steps_state_machine + 'timing-attachment-example-105-111-194-199', @fig_timing_attachment + 'timing-measured-q3-10-sources', @fig_timing_measured + 'geo-q1-convex-intersection-zoom', @fig_geo_q1_meetup + 'geo-q1-diameter-circle-counterexample', @fig_geo_q1_counterexample + 'geo-q2-guaranteed-reception-disk', @fig_geo_q2_safe_disk + 'geo-q3-seven-point-coverage', @fig_geo_q3_coverage + 'geo-q4-minimum-cover-31-points', @fig_geo_q4_mincover + 'replay-webui-q3-omnidirectional', @() fig_replay('replay_q3') + 'replay-webui-q4-directional', @() fig_replay('replay_q4') }; + fid = fopen(log, 'w'); + failed = 0; + for i = 1:2:numel(items) + name = items{i}; + fn = items{i + 1}; + try + fn(); + fprintf(fid, 'OK %s\n', name); + catch err + failed = failed + 1; + fprintf(fid, 'FAIL %s: %s\n', name, err.message); + end + end + fclose(fid); + if failed > 0 + fprintf('有 %d 张图生成失败,详见 %s\n', failed, log); + end +end