Physics
Geometry & panel models
Every force model (aero, SRP, Earth radiation) sums over one flat-plate table: outward normal, area and centroid per plate. This page covers where that table comes from and what it can and cannot carry.
The .geom plate format
# comment lines start with '#'
# nx ny nz area_m2 cx cy cz (body frame, metres; normal is normalised on load)
3.86397878e-08 -9.25292046e-09 1 0.6851072 2.85854239e-06 -1.23764175e-08 -0.00148214848
2.56280635e-05 1.47689322e-05 -1 0.686308478 -4.750931e-06 1.54475543e-05 -0.00185992405
...
- Exactly 7 columns per line.
geometry.load_geomrejects anything else, so there is no material column today. - A thin membrane is two plates with opposite normals (front and back). Each face is summed separately by the aero and SRP laws.
- Loaded into C++ as
PanelSoA {nx, ny, nz, area, cx, cy, cz}viaSimulator.set_panels(n, A, c).
Shipped models
| File | Plates | Used by |
|---|---|---|
data/earthcup_hex_v3.geom | hex sail plate model | default env (v3–v11) |
data/SolarCat_v3_1pct_plates.geom | 176 (raw STL triangles merged by normal, 12° tolerance). Error vs the full mesh over 200 attitudes: force 0.094 %, projected area 0.892 %, torque 2.681 %. | SC_v1/v2/v3_6mq, vehicle_v3*.yaml |
Mesh → plates (geometry.py)
load_mesh: STL/OBJ (unit default mm) or STEP/STP (via trimesh + cascadio/OpenCASCADE, using the file's own unit). Welds vertices and drops degenerate faces.- Region-grow faces whose normals are within θ_merge (8° for quality
1pct). - Area-weighted least-squares plane per side, outward flip.
- Seal: shared edges are snapped to the intersection line of the two side planes, so there are no cracks.
- Ear-clip each sealed polygon. Each triangle becomes a plate (n̂, A, r_c).
- Quality budget
1pct/5pct/10pcton wetted and ram area at six attitudes. The original triangle area is kept where an outline would exceed the budget.
python main.py sim geometry --in part.step --quality 1pct # -> outputs/results/geometry/part_1pct.geom
python main.py sim validate_attitudes --quality 1pct # projected-area check vs the STL
python main.py sim plot_simplify # 3D comparison figure
Part identity is lost
The simplifier merges by normal direction only. Two different parts (for example a solar-cell face and a Kapton face) that are coplanar and adjacent get merged into one side, and the CAD part or body name is not kept. Material assignment therefore needs either a per-part pass (simplify each STEP body separately, then concatenate) or a post-hoc spatial tagging step. Both are covered in the plan.
CHANGELOG_v2.7 also notes that simplify_sides emits far-away sliver centroids on SolarCat_v3; the 176-plate model was produced by a separate clustering script for that reason.Vehicle cards
config/plant/vehicle.yaml(six-beam hex, 0.750 kg),vehicle_v3.yaml,vehicle_v3b.yaml,vehicle_v3c.yaml(SolarCat_v3 with a 7 cm static margin, PCB position, trim mass).vehicle.pybuilds mass properties, rod axes and dipoles from them.cp_offset_m: centroids are shifted to offset the centre of pressure from the CoM (a stated balance assumption).damage.py(v11): membrane holes and tears scale plate areas mid-episode (set_panelsis called again).
Not in the panel model
- Materials, per-face optical or GSI properties, wall temperature per plate.
- Shadowing and shielding: no plate blocks another plate's sunlight or flow.
- Deformation (membrane billowing) and articulation (moving panels). Only the v11 damage area scaling exists.