CAD als Code
Bei Code-CAD werden Teile nicht per Mausklick in einer GUI gezeichnet; sie sind Python-Programme, die Geometrie erzeugen. Strido geht noch weiter: Jede physische Aussage über den Roboter (Schrauben passen, Beine kollidieren nicht, Teile lassen sich drucken, die Verkabelung liegt innerhalb ihrer Nennwerte) ist eine ausführbare Prüfung, die den Build scheitern lassen kann. Diese Seite erklärt die Pipeline, die Prüfungen und warum sie so aufgebaut ist.
In Strido
- CAD-Paket:
packages/strido-cad(CadQuery 2.8 für Volumenkörper, manifold3d für robuste Mesh-Booleans, trimesh für Mesh-Arbeit). - Verifikationspaket:
packages/strido-verify(Durchdringung, Bewegungsbereich, Passungen, Freigang, Sensor-Sichtfeld, Druckbarkeit, Elektronik). - Veröffentlichungspaket:
packages/strido-publish(Druckpaket, Stückliste, Anleitung, Renderings, 3D-Ansicht, Katalogbuch). - Daten:
hardware/*.yaml(Kinematik, Gelenkgrenzen, Stückliste, Elektronik, Befestigungselemente), Toleranzbänder inhardware/verification/tolerances.yaml. - Entscheidungsprotokoll: ADR-002 „CAD as code, verification as gates“ in Entscheidungen; Nachweise in Verifikation.
Warum Code statt einer GUI-CAD-Datei
Eine GUI-CAD-Datei hält fest, was die Geometrie ist. Code hält auch fest, warum: Die Konstante PEDESTAL_PILOT_DEPTH = 11.0 steht neben ihrem Kommentar „Schraubenspitze 10,0 mm tief im Sockel“. Code-CAD überträgt Software-Gewohnheiten auf Hardware:
| Software-Gewohnheit | Wirkung auf den Roboter |
|---|---|
| Versionskontrolle mit lesbaren Diffs | Eine geänderte Lochtiefe ist eine Zeile im Review, keine undurchsichtige Binärdatei |
| Eine einzige Quelle der Wahrheit | Koppellängen werden einmal gemessen und in Python und C++ generiert; niemand tippt sie zweimal ein |
| Automatisierte Tests | Ein falsches Loch scheitert an einer Prüfung, bevor es jemand druckt |
| Reproduzierbare Builds | make publish erzeugt jede STL, Druckplatte, Stückliste und Anleitungsseite aus denselben Eingaben neu |
Die Motivation in ADR-002 ist konkret: Menschen drucken und montieren allein auf Basis dieses Repositorys, und ein falsches Loch kostet einen Neudruck.
Von einem realen, gebauten Design ausgehen
Strido modelliert den Roboter nicht neu. Die Mechanik stammt aus dem Upstream-Projekt Yertle: dessen STEP-Baugruppe (upstream/yertle/design/CAD/Yertle_Single_v2.step) und dessen veröffentlichte Druck-STLs, die tatsächlich gedruckt und montiert wurden. Diese Dateien bleiben byteidentisch (ADR-004); jede Strido-Änderung ist eine Boolesche Operation darauf, und Korrekturen von Upstream-Fehlern werden als Daten (hardware/assembly/corrections.yaml) oder abgeleitete Teile (left_servo_mount_fl, right_servo_mount_fr) ausgedrückt.
Die Pipeline
Wichtige Schritte:
step_cachetesselliert jeden Volumenkörper der 32-MB-STEP-Datei einmal und speichert die Meshes im Cache, mit dem Datei-Hash als Schlüssel, damit er nie unbemerkt veraltet.extract_kinematicsvermisst den Roboter anhand von Zylinderachsen im CAD (Servoverzahnungen, Lagerbohrungen, Koppelbolzen): Hüft-/Oberschenkel-/Knieachsen, Koppellängen, die beiden Knie-Koppelgetriebe. „Nichts wird von Hand eingetippt.“ So fand es zum Beispiel eine Koppellängen-Abweichung von 1,02 mm in der Upstream-STEP (Design).romfährt jedes Bein in einem 5°-Raster durch seinen Bereich, posiert dabei die gesamte Baugruppe mit dem exakten Knie-Koppelgetriebe und schreibt die kollisionsfreien Gelenkgrenzen.codegenschreibt diese Zahlen inpackages/strido-core/src/strido/geometry.pyundfirmware/.../geometry_generated.h. Gait, Simulation, NT-X-Adapter und Firmware lesen alle dieselben generierten Werte (Kinematik).partsbaut die Strido-Teile. Ein reales Beispiel, der LiDAR-Sockel (gekürzt ausparts.py):pythonouter = box(cx - PEDESTAL_HALF, cy - PEDESTAL_HALF, z0, cx + PEDESTAL_HALF, cy + PEDESTAL_HALF, z1).edges("|Z").fillet(4.0) inner = box(cx - 25.0, cy - 25.0, z0 - 1, cx + 25.0, cy + 25.0, z1 - 3.0) shape = outer.cut(inner) # hollow, 3 mm top plate for dx, dy in PEDESTAL_SCREWS: # M3 pilot holes from below cuts.append(cylinder((cx + dx, cy + dy, z0), (0, 0, 1), 1.3, -0.1, PEDESTAL_PILOT_DEPTH)) return boolean(to_mesh(shape), cut=cuts)boxundcylinderliefern CadQuery-Workplanes;booleanwandelt für die finalen Schnitte in manifold3d-Volumenkörper um, die selbst auf den tessellierten Upstream-Meshes wasserdicht bleiben.assemblyplatziert jede Instanz (gedruckt, zugekauft, Befestigungselement) auf einem Starrkörper (base,FL.thigh,FL.crank…) und kann den Roboter in beliebigen Gelenkwinkeln posieren. Jede Prüfung läuft auf diesem realen Mechanismus, nicht auf einer vereinfachten URDF.
Die Verifikationsprüfungen
Eine Prüfung ist ein Programm, das mit Code 1 endet, wenn eine Regel verletzt ist, sodass make stoppt. Jede schreibt einen versionierten Bericht unter docs/verification/. Toleranzbänder und Kontaktregeln liegen samt Begründung in YAML; laut ADR-002 darf eine Prüfung nur durch eine dokumentierte Entscheidung gelockert werden.
| Prüfung | Befehl | Was sie beweist |
|---|---|---|
| Lochstapel und Befestigungselemente | python -m strido_cad.hole_stacks, python -m strido_cad.fasteners | Jede koaxiale Lochgruppe in den Upstream-Teilen passt zu genau einer Befestigungsregel; nicht zugeordnete Löcher scheitern |
| Durchdringung | python -m strido_verify.contacts | Keine Volumenkörper überlappen in 4 Posen, außer klassifizierten Kontakten (Gewindeeingriff, konstruktive Auflage ≤ 0,2 mm, Gelenke) |
| Bewegungsbereich | python -m strido_verify.rom | Gelenkgrenzen kollisionsfrei, Übertragungswinkel ≥ 25°, Servo innerhalb ±85° |
| Passungen | python -m strido_verify.fits | Jeder Schrauben- und Lagersitz hat eine Passung, die nach dem FDM-Druck funktioniert |
| Freigang | python -m strido_verify.clearance | Bewegte Teile halten in jeder Betriebspose einen Laufspalt |
| Sensor-Sichtfeld | python -m strido_verify.sensor_fov | 720 LiDAR-Strahlen frei; die Kamera sieht den Roboter nicht |
| Elektronik | python -m strido_verify.electronics | Pins, Busse, Kanäle und Leistungswerte stimmen zwischen YAML und Firmware überein |
| Druckbarkeit | make printability | Jedes Teil und jede Druckplatte lässt sich in PrusaSlicer ohne Stabilitätsprobleme slicen; Wände dick genug |
| Stücklistenabdeckung | make bom | Jedes Zukaufteil und Befestigungselement im CAD wird gekauft, mit Reserve |
| Drift | make drift | Generierte Dateien entsprechen dem, was die Generatoren jetzt schreiben würden |
make verify führt die mechanischen Prüfungen aus; make check führt alles aus (etwa 10 Minuten).
Passungen
Die Passungsprüfung tastet die Schaftachse jeder Schraube alle 0,5 mm ab und schneidet jedes gedruckte Teil darum herum, um das Loch zu vermessen. FDM druckt Löcher etwa 0,1–0,2 mm zu klein, daher nimmt die Prüfung 0,15 mm Schrumpfung an und prüft die gedruckte Größe:
| Passung | Regel ( |
|---|---|
| Durchgangsloch | |
| Kernloch für gewindeformende Schraube | gedrucktes Kernloch |
| Lagersitz | Bohrung −0,15 … +0,30 mm relativ zum Lageraußendurchmesser |
Jede Schraube muss außerdem in etwas enden, das sie hält: einer Mutter, einem gedruckten Kernloch oder einem Gewindeteil. Der dokumentierte Lauf prüfte 223 Schrauben und 32 Lagersitze: 0 Fehler, 137 mit einer Aufgabe für den Erbauer (dieses Loch aufbohren, ein schwaches Kernloch mit CA-Kleber härten). Er fand echte Fehler, etwa 9 mm tiefe Kernlöcher im LiDAR-Sockel für Schrauben, die 10 mm herausragen; deshalb beträgt PEDESTAL_PILOT_DEPTH jetzt 11 mm. Siehe Befestigungselemente.
Freigang
Die Durchdringungsprüfung beweist, dass nichts überlappt; die Freigangsprüfung beweist, dass nichts schleift. Zwei gedruckte Flächen können jeweils ~0,15 mm abweichen, daher müssen bewegte Teile auf verschiedenen Starrkörpern in allen 13 Betriebsposen (Stehen, Hocken, Hoch, acht Trot-Phasen, Hüften außen und innen) ≥ 0,3 mm Abstand halten, und unter 1,0 mm werden sie als knapp gemeldet. Diese Prüfung entdeckte, dass beide Vorderfüße in der Pose hips_in kollidierten, was zu den engeren Hüftgrenzen nach innen führte (ADR-005).
Elektronik
hardware/electronics.yaml ist die Quelle der Wahrheit für die Verkabelung. Die Prüfung stellt sicher, dass der Firmware-Header board_config.h genau deren Pins, I²C-Adressen, Servokanäle und Frequenzen definiert (in beide Richtungen), dass kein GPIO und keine I²C-Adresse doppelt verwendet wird und dass jeder Wandler, Schalter, jede Sicherung und jeder Draht seine Last trägt (load ≤ fuse ≤ wire ampacity). Ihre Tests beweisen, dass ein vertauschter Pin, ein doppelter Kanal, ein Adresskonflikt oder ein zu dünner Draht scheitern. Siehe Stromversorgung.
Druckbarkeit
Statische Prüfungen (geschlossene Mannigfaltigkeit, passt auf ein 220 × 220 × 250 mm großes Druckbett, liegt auf z = 0) laufen in make print. Die Druckbarkeitsprüfung geht weiter: Sie slict jedes Teil mit dem echten PrusaSlicer und dem Profil des Repos (hardware/print/prusaslicer.ini), mit Stützen und Brim genau wie in der Druckliste vorgeschrieben, und scheitert bei Slicer-Fehlern oder Stabilitätswarnungen (frei schwebende Brückenanker, einbrechende Überhänge, geringe Betthaftung). Ein strahlbasierter Scan lässt Wände dünner als eine Extrusionslinie oder Häute dünner als eine Schicht scheitern. Außerdem slict sie jede 3MF-Druckplatte so, wie sie angeordnet ist. Ergebnis: 34 Teiletypen und 13 Druckplatten, 0 Fehler, 958 g PETG und 100 h Druckzeit. Siehe 3D-Druck.
Rot gesehen
Jede Prüfung im Verifikationsprotokoll dokumentiert einen Fall, in dem sie bei einem echten Problem oder einem absichtlichen Defekt gescheitert ist. Eine Prüfung, die nie gescheitert ist, prüft womöglich gar nichts.
Die Veröffentlichungs-Pipeline
Dieselbe verifizierte Baugruppe speist jedes Artefakt, das Sie herunterladen:
make print # oriented STLs (hardware/print/stl/), 3MF plates (hardware/print/plates/), print_list.md
make bom # docs/bom/README.md, shopping_list.md, bom.csv + CAD coverage check
make manual # docs/assembly/README.md + step drawings (Blender)
make renders # hero, exploded, section, x-ray images → docs/images/
make viewer # docs/viewer/strido.glb + assembly.json for the web 3D viewer
make catalog # docs/catalog/parts.json + strido-catalog.pdf (WeasyPrint)
make publish # all of the above, in that orderDie Reihenfolge zählt: Das Katalogbuch liest die Druckliste, die Anleitung und die Rendering-Ausgabe. Da jede Instanz der Baugruppe genau einem Anleitungsschritt zugeordnet ist (sonst scheitert der Build), ergeben die Teile in Anleitung, Stückliste, 3D-Ansicht und Katalog stets denselben Roboter. Auch die Simulationsmodelle stammen aus derselben Baugruppe (make models, siehe Simulation und RL).
Grenzen des Ansatzes
Die Prüfungen prüfen das CAD, nicht die Realität. Das Verifikationsprotokoll sagt es klar: Noch wurde nichts gedruckt, montiert, verkabelt oder eingeschaltet (keine Q3-Hardware-Stufe). Passungen nehmen ein Schrumpfmodell von 0,15 mm an; Ihr Drucker kann abweichen, weshalb der Passungsbericht Aufgaben für den Erbauer enthält. Code-CAD verlagert Fehler nach vorne und macht sie sichtbar; den ersten physischen Aufbau ersetzt es nicht.
Selbsttest
- Warum baut Strido auf der Upstream-STEP auf, statt den Roboter neu zu modellieren?
- Wie gelangt eine gemessene Koppellänge in die Firmware, ohne dass jemand sie eintippt?
- Was ist der Unterschied zwischen der Durchdringungs- und der Freigangsprüfung?
- Warum zieht die Passungsprüfung 0,15 mm von den CAD-Lochgrößen ab?
- Warum muss
make catalognachmake print,make manualundmake renderslaufen?
Antworten
- Die Upstream-Mechanik wurde tatsächlich gedruckt und gebaut; sie per Boolescher Operation zu verändern, bewahrt diese Geschichte und erlaubt Diffs gegen Upstream-Änderungen (ADR-001, ADR-004).
extract_kinematicsschreibt sie nachhardware/kinematics.yaml;codegenerzeugtgeometry_generated.h;make driftscheitert, wenn der Header veraltet ist.- Die Durchdringungsprüfung stellt sicher, dass sich keine Volumenkörper überlappen; die Freigangsprüfung stellt sicher, dass bewegte Teile in jeder Betriebspose mindestens 0,3 mm Abstand halten, damit sie nach dem Druck nicht schleifen.
- FDM druckt Löcher etwa 0,1–0,2 mm zu klein; die Prüfung bewertet das Loch so, wie es gedruckt wird.
- Das Buch setzt die Druckliste, die Anleitungsschritte und die Renderings, die diese Targets erzeugen.