license: cc-by-4.0
tags:
- robotics
- mlp
- numpy
- obstacle-avoidance
- simulation
pretty_name: Sim Driving MLP (NumPy)
Sim Driving MLP โ 279-parameter obstacle-avoidance policy (NumPy)
A deliberately tiny neural network: 4 ultrasonic distances in, one driving command out. 279 parameters, float32, trained and verified entirely inside our robot simulation studio. Small enough to read, small enough to run on an MCU-class device.
Trained on simulation data from a virtual map โ no real-world or customer data.
Architecture
| part | meaning |
|---|---|
| input (4) | ultrasonic distances: Front, Left, Right, Back (normalized with the included norm_mean / norm_std) |
| output (5 + 1) | 5 command logits โ FWD / LEFT / RIGHT / STOP / BACK โ plus 1 turning-angle regression head |
Metrics (validation, virtual map)
| metric | value |
|---|---|
| command accuracy | 97.2 % (best epoch 529 / 572) |
| turning-angle MAE | ~6.9ยฐ |
The .npz also embeds meta_json: the full 572-epoch training history
(per-class accuracy, loss, angle MAE per epoch), so the training curve is inspectable.
The plot below is drawn directly from that embedded history:
Load and run (NumPy only, no framework)
import numpy as np
d = np.load("sim_driving_mlp.npz")
x = np.array([[120.0, 45.0, 200.0, 300.0]]) # F, L, R, B distances (mm)
x = (x - d["norm_mean"]) / d["norm_std"]
h = np.maximum(x @ d["W0"] + d["b0"], 0)
h = np.maximum(h @ d["W1"] + d["b1"], 0)
y = h @ d["W2"] + d["b2"]
cmd = ["FWD", "LEFT", "RIGHT", "STOP", "BACK"][int(np.argmax(y[0, :5]))]
angle = float(y[0, 5])
print(cmd, angle)
The simulator and the target robot
The studio stage where the model's four inputs are defined: ultrasonic sensors F/L/R/B with datasheet-based noise models, checked by the built-in self QA/QC checklist. On the right, the local LLM explains a warning from that checklist, citing the stage report as its basis.
A driving run on the 8 m ร 8 m virtual map used for data collection (green: ultrasonic rays from the robot):
And this exact model running in the studio's 3D evaluation stage. The left panel shows the live inference at the current step: the four sensor inputs (F/L/R/B, mm), the softmax over the five commands with FORWARD selected, and the angle head:
The target hardware: a tracked test robot with the ultrasonic sensors mounted on the hand, the same F-channel placement the simulator reproduces.
Where this fits: our 4-layer stack
(Diagram is in Korean; it is the same figure used on our website, demo video, and companion dataset.)
This model is a layer-2 artifact of our stack โ an edge neural network verified through the 8-stage physics simulation workflow of our robot simulation studio. Every stage of that workflow runs self QA/QC (layer 3) and reports through an on-premise conversational LLM (layer 4); the record formats those layers produce are shown in our companion dataset: NCDTech/human-gated-qaqc-knowledge-example
ํ๊ตญ์ด
์ด์ํ 4๋ฐฉํฅ ๊ฑฐ๋ฆฌ(์ ยท์ขยท์ฐยทํ)๋ฅผ ๋ฃ์ผ๋ฉด ์ฃผํ ๋ช ๋ น์ด ๋์ค๋ 279 ํ๋ผ๋ฏธํฐ์ง๋ฆฌ ์์ ์ ๊ฒฝ๋ง์ ๋๋ค. ์ ํฌ ๋ก๋ด ์๋ฎฌ๋ ์ด์ ์คํ๋์ค์ 8๋จ๊ณ ์ํฌํ๋ก(๋ฐ์ดํฐ ์์ง โ ํ์ต โ ํ๊ฐ โ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ๊ฒ์ฆ)๋ฅผ ํต๊ณผํ ๊ณ์ธต 2(์ฃ์ง ์ ๊ฒฝ๋ง) ์ฐ์ถ๋ฌผ์ด๋ฉฐ, ๊ฐ์ ๋งต ์๋ฎฌ๋ ์ด์ ๋ฐ์ดํฐ๋ก๋ง ํ์ตํ์ต๋๋ค โ ์ค๋ฐ์ดํฐยท๊ณ ๊ฐ ๋ฐ์ดํฐ ์์.
์ถ๋ ฅ์ ์ฃผํ ๋ช ๋ น 5ํด๋์ค(์ ์ง/์ขํ์ /์ฐํ์ /์ ์ง/ํ์ง) + ํ์ ๊ฐ ํ๊ท 1๊ฐ. ๊ฒ์ฆ ์ ํ๋ 97.2 %, ๊ฐ๋ ์ค์ฐจ ์ฝ 6.9ยฐ. ํ์ผ ์์ ์ ๊ทํ ํต๊ณ์ 572 ์ํฌํฌ ํ์ต ์ด๋ ฅ ์ ์ฒด๊ฐ ํจ๊ป ๋ค์ด ์์ด ํ์ต ๊ณก์ ์ ๊ทธ๋๋ก ํ์ธํ ์ ์์ต๋๋ค.
Learn more: https://huggingface.co/NCDTech ยท https://www.ncdtech.org






