Update README.md

This commit is contained in:
Sedra 2026-08-13 12:27:47 +00:00
parent 1bdc484d03
commit 2f76c49a8b

View File

@ -373,30 +373,3 @@ X2_dashboard/
└── systemd_user/ unit files
```
---
## Design notes
**No framework, no CDN, no build step.** The frontend is plain ES modules and hand-written DOM. The robot has no internet access, and the dashboard is often loaded over the robot's own Wi-Fi — the same link it uses to walk. A framework would cost more than it saves at this size.
That constraint also explains two hand-rolled renderers:
- **`charts.js`** — SVG charts. 2 px lines with round joins, area washes at 10 % opacity, ≥8 px end markers with a 2 px surface ring, hairline gridlines, endpoint-only direct labels, a legend from two series up, and a crosshair tooltip on hover. Text always wears text tokens, never the series colour.
- **`model3d.js`** — one shader, flat shading, a rigid-body tree of 41 links. Geometry arrives as **uint16 positions quantised inside each mesh's bounding box** and the shader expands them back to metres, so the 4× saving over float32 costs two extra instructions per vertex. Normals are computed per-face in the fragment shader from screen-space derivatives, so the vertex buffer carries positions and nothing else.
**Nothing assumes a fixed IP.** Every URL in the frontend is derived from `window.location`, so opening the page from a laptop, a phone, a tablet or a hostname all work with no configuration. The server binds `0.0.0.0` and enumerates its own addresses.
**The Fast DDS profile is not optional.** A camera frame is 170430 KB and a LiDAR scan is 816 KB. Fast DDS defaults to a 512 KB shared-memory segment and small socket buffers, and it **drops samples that large in complete silence** — discovery succeeds, the reader matches the writer, `ros2 topic info` reports a publisher, and not one message is ever delivered. The vendor profile raises the segment to 32 MB and UDP buffers to 10 MB. An earlier revision of `x2_spec.py` concluded this unit had one camera and no chest LiDAR; it has six camera feeds and a LiDAR, and the agent simply could not receive them.
**mDNS is implemented on the stdlib, not `zeroconf`.** The advertised name is additive and reversible — the host keeps its own identity, and the extra name exists only while the dashboard is running, so it needs neither administrator rights nor a reboot.
---
## What is not in this copy
Two things were deliberately excluded when this snapshot was taken from the robot:
- **The Sanad API service** (`sanad_api_x2`) — it carries live credentials in a `.env`, so it is not published here.
- **Teach mode / Manual Recorder** — the record-an-arm-motion-by-hand feature and its `/api/recorder/*` routes were removed from this copy. The dashboard runs without it; the feature still exists on the robot.
No API keys or credentials are present in this repository. The Gemini and LinkSoul credentials the voice session depends on are read at runtime from `~/.sanad_agibot_env` on the robot and are never embedded in this code.