Skip to content

Replace manual support painting with general-purpose Bambu Studio PLA recipe + manually-baked narrowing-pillar / tree-support workflow (with mesh-ray-cast placement) for TPU-safe coverage of vertical members + PR #35 T3-prism gcode verification on Bamb... - #66

Draft
sgbaird with Copilot wants to merge 50 commits into
mainfrom
copilot/add-manual-supports
Draft

Conversation

Copilot AI commented May 22, 2026

Copy link
Copy Markdown
Contributor

Audrey's manual paint protocol (bottom-view stripes along each member's centerline, ~1/3 projected width, trimmed at vertex overlaps except the three bed-contact vertices which are connected triangularly) is laborious, gets wiped whenever the source mesh is re-rendered, and does not generalize across the structure families and parameter sweeps planned in PR #22. This PR replaces the paint step with a general-purpose, single-material PLA support recipe for Bambu Studio that works on any tensegrity topology without per-geometry tuning, plus a manually-baked narrowing-pillar / tree-support STL workflow for any print that contains vertical or near-vertical members (e.g. the vertical TPU cables of a T-prism). Overhang analysis can never flag a perfectly vertical cylinder as an overhang regardless of support_threshold_angle value — it has no down-facing surface — so the slicer settings alone are physically incapable of placing supports under vertical cables. The narrowing-pillar path was therefore promoted to the recommended TPU-safe path (replacing the Support Enforcer STL approach, which still proved unreliable in practice and is kept only as a secondary fallback).

The headless verification toolchain now targets the actual Bambu Lab H2D 0.4 nozzle system profile via the genuine Bambu Studio CLI (the bambu-studio binary shipped in the BambuStudio Linux AppImage). The previously-used OrcaSlicer fork has been dropped: the Ubuntu 24.04 Bambu Studio build links libsoup-3.0 / WebKit2GTK-4.1 (the older 2.4 / 4.0 dependency was only an issue on legacy AppImage builds) and runs cleanly under xvfb, so we no longer need a community fork to drive the same resources/profiles/BBL/ bundle. The PyPI bambu-cli package is a printer-control MQTT client, not a slicer, so it isn't applicable here.

Changes

Path (a) — Bambu Studio settings recipe (no painting, no per-geometry code)

Suitable on its own for PLA-only prints whose members all have a meaningful tilt away from vertical.

  • cad/print-supports/README.md — derives the override set that reproduces Audrey's "centerline stripes, ~1/3 member width, no vertex overlaps, three bed-vertices bridged" pattern from the slicer's overhang analysis instead of paint flags:
    • support_type = tree(auto) + support_on_build_plate_only = 1 (branches root at the plate, never on a member — matches the bottom-view-only rule).
    • support_threshold_angle = 10 (flags the entire down-facing side of every tilted member as an overhang so the tree generator builds branches from the plate all the way along each strut's bottom). Documented limitation: this still cannot cover perfectly vertical surfaces (there's no down-facing geometry to detect); use §C for those.
    • tree_support_tip_diameter = 0.8 + tree_support_branch_distance = 2.5 (reproduces the ~1/3-of-member-width stripe coverage).
    • bridge_no_support = 1 (the three bottom-triangle cables bridge cleanly between bed-contact vertices).
    • brim_type = outer_only, brim_width = 5 (insurance against tip-over for the tiny node footprints).
  • cad/print-supports/bambu-pla-tensegrity-process.json — one-shot importable process-override snippet (Process → Add → Import process).

Path (c) — manually-baked narrowing-pillar / tree-support STL generator (primary TPU-safe path / any structure with vertical members)

Tapered contact pillars are baked directly into the printable mesh — bottom view, narrowing upward from the bed to a small contact patch on the underside of each member. Because they are part of the printed object (not slicer supports), they print reliably regardless of slicer behaviour around vertical cylinders, are visible in any STL viewer before sending to the printer, and snap off cleanly after printing.

The generator now defaults to a Bambu-Studio-style --tree mode (in response to print-floor feedback that the earlier one-cone-per-cell pillars were effectively solid columns that fused onto the part and tore it on removal, and built up too much material on the plate):

  • --tree mode — slim Ø0.4 mm breakaway contact tips merge pairwise into thin, near-hollow Ø1.8 mm self-supporting branches (kept within --max_branch_angle, default 40°, of vertical) that converge agglomeratively onto just a few trunk feet on the build plate instead of one wide base per pillar. This dramatically reduces both the part-contact area (clean snap-off, no fused infill) and the build-plate footprint. Branch/trunk/tip diameters are tunable via --branch_d, --trunk_d, --tip_d; merging is controlled by --merge_radius. All emitted geometry is clamped to the build plate (z ≥ base_z).
  • Contact-tip diameter benchmarked against Bambu Studio — in response to review feedback that the connection points looked wide, the tip diameter was checked against Bambu's own numbers (tree_support_tip_diameter defaults to 0.8 mm, with official guidance to shrink it toward 0.3–0.4 mm for fine/delicate features). The previous Ø 0.6 mm tip flared to the branch over only 1.5 mm, giving a ~0.8 mm effective contact footprint at the part (right at Bambu's default). The defaults are now --tip_d 0.4 mm (one nozzle width — finer than Bambu's default, matching its delicate-feature guidance; the tip is buried --tip_overshoot 0.3 mm into the member so it still slices reliably) and --tip_contact_h 2.5 mm (up from 1.5 mm) so the slim neck stays narrow for longer before flaring to branch width, dropping the surface contact footprint from ~0.8 mm to ~0.55 mm. Both knobs remain CLI-tunable.
  • cad/print-supports/generate_support_pillars.py — geometry-agnostic generator. Three placement modes, each usable with or without --tree:
    • --stl part.stl (mesh-ray-cast mode, primary) — uses trimesh's ray-intersection engine to look "up from the build plate" through the actual printable mesh. For each cell of an XY grid (--spacing, default 4 mm for the committed artefacts) it casts a +Z ray and inspects every triangle the ray crosses (multiple_hits=True), classifying each by its face normal: a closed solid is entered through a down-facing face (a member's underside) and exited through an up-facing one. A contact tip is placed under each down-facing underside that sits above --min_clearance and has more than --min_gap mm of open air directly below it (so faces already resting on the plate or on a lower member are skipped); the --down_normal_max knob sets how steep a face still counts as down-facing. In tree mode those undersides become the branch tips. This replaced an earlier multiple_hits=False version that recorded only the single lowest surface per XY column — which silently dropped every member stacked above another one, most importantly the bottom end-caps of the vertical TPU cables that hang above the struts, so they printed unsupported and the print failed. Walking all crossings now guarantees a tip on the underside of every member at every height — including joint-sphere bulges, fillets, members crossing over other members, and any other geometry the centerline-sampling / lowest-hit modes missed. The committed run (--spacing 4 --min_clearance 1.5 --min_gap 1.0 --merge_radius 22) yields 188 tips spanning z ≈ 1.6–126.1 mm (verified by verify_support_geometry.py to land on the part underside to within 0.0000 mm, with all feet clamped to the plate).
    • --topology t3_prism|prism_n preset (built-in, no extra dep) — parametric centerline sampling along each member.
    • --members my_members.json (list of {p1, p2, d, trim_ends}) — parametric centerline sampling for arbitrary structures.
    • Pure-Python binary-STL writer; numpy always; trimesh only for the --stl ray-cast mode.

Path (c′, fallback) — geometry-agnostic Support Enforcer STL generator

Kept as a secondary fallback for users who want to drive supports through the slicer rather than baking them into the mesh.

  • cad/print-supports/generate_support_enforcers.py — geometry-agnostic enforcer-STL generator. Same --members JSON / --topology preset interface; vertical members emit footprint enforcers via --vertical_pad.

Support verification — geometry checks + layer-by-layer CalculiX FEA (cad/print-supports/verification/)

Added in response to a print failure where the committed support STL was found to be stale — re-casting the underside rays against the real PR #35 mesh produces 188 contact points (z ≈ 1.6–126.1 mm), but the previously committed t3-prism-pr35-pillars.stl held only 181 (topping out at z ≈ 112 mm), so the 7 top-cap / joint undersides were missing and the highest members printed unsupported. The artefacts are regenerated and two automated, reproducible verification tools now gate against this recurring (eyeballing the preview was not enough):

  • verify_support_geometry.py (new) — uses trimesh's exact ray/proximity engine, exits non-zero on any failure. Four invariants, all PASS on the committed artefact:
    • CONTACT — every tip lands on the part underside (max gap 0.0000 mm).
    • REALISED — every intended tip is present in the committed STL (the check that caught the stale artefact; max tip→pillar 0.30 mm = the --tip_overshoot).
    • ON-PLATE — no geometry below z = 0; 662 foot vertices on the build plate.
    • COVERAGE — re-samples undersides at 2× density: 99.3 % of flat overhangs (face normal nz < −0.7; near-vertical walls self-support) within 5 mm of a support, worst 6.3 mm (within PLA's bridge), 0 beyond 8 mm.
  • fea_support_stability.py (new) — CalculiX (ccx) layer-by-layer FEA. Reconstructs the emitted branch network, extracts the worst-case column (longest continuous run = 108.5 mm, 1.2° from vertical, Ø1.8–3.1 mm) and grows it from the plate: self-weight buckling min safety factor 61× (PASS), tip-over COM margin 27.8 mm inside the convex hull of 1148 plate contacts / 79 mm base span (PASS), plus a documented worst-case lateral-compliance caveat (a fully free-standing 108 mm Ø1.8 mm column is floppy, but never stands free in practice — neighbouring struts/branches print in lockstep, in-print forces are ~hundredths of a N, the 5 mm brim anchors the feet; bump --trunk_d or --merge_radius to brace a taller lone column). Produces t3-prism-pr35-fea-stability.png.
  • render_pillars_preview.py (new) — still iso + bottom-view preview renderer (the preview PNG previously had no committed generator), matching the rotating-GIF scene/colours.
  • The geometry + FEA checks answer the two questions that actually failed the print ("does every support touch the part?" / "will the supports stand up?") more rigorously than a sliced preview. As a final on-hardware-profile confirmation, the combined printable mesh is also driven through the live bambu-studio CLI — see the slice subsection below.

End-to-end verification on PR #35 T3-prism (cad/print-supports/verification/) — Bambu Lab H2D + Bambu Studio CLI

  • slice_bambu_h2d.py (renamed from slice_h2d.py) — headless slicing driver. Resolves the BambuStudio AppImage's bundled Bambu Lab H2D 0.4 nozzle machine profile, walks the inherits chain through the matching process + Bambu PLA Basic @BBL H2D filament, layers the tensegrity overrides from bambu-pla-tensegrity-process.json on top, and invokes the bambu-studio CLI under xvfb. Supports the path-(a) auto-only flow, the path-(c) baked-pillar flow (slice the combined mesh with --no-repo-overrides --override enable_support=0, keeping the 5 mm brim), and the path-(c′) enforcer flow.
  • On-hardware-profile slice of the baked-pillar mesh (path (c)) — the actual printable mesh t3-prism-pr35-with-pillars.stl (part + baked tree pillars) slices end-to-end with no errors on the genuine BambuStudio 02.06.00.51 CLI / Bambu Lab H2D 0.4 nozzle PLA profile: 646 layers, max_z 129.20 mm, 20 094 mm / 60.90 g filament, ~5 h 36 m. Because the pillars are baked into the mesh, slicer-side support generation is disabled so it slices as one solid object. (Running the Ubuntu-24.04 AppImage CLI headlessly requires the libgstreamer1.0-0, libgstreamer-plugins-base1.0-0, libsoup-3.0-0, libwebkit2gtk-4.1-0, libgtk-3-0 apt libs.)
  • render_gcode.py — gained a --baked-supports mode so the gcode preview is honest for a single-object (baked-pillar) slice: the slicer emits no Support features, so the panels are relabelled to show the object (members + baked pillars) coloured by layer height plus the pillar feet + brim that land on the plate. The default (path-(a) slicer-supports) behaviour is unchanged.
  • diff_supports.py, gcode_to_stl.py, merge_stls.py — gcode parsers/renderers and STL utilities, unchanged from prior revisions of this PR.
  • render_pillars_gif.py — small matplotlib-based renderer that loads the combined part+pillars STL and writes a rotating 360° GIF (configurable frame count, elevation, FPS, resolution) so the bed-up support coverage can be verified visually from every angle without an external viewer.
  • build_enforcer_3mf.py — bundles a printable STL + an enforcer STL into a single 3MF with the enforcer marked volume_type=SupportEnforcer (used only for the fallback enforcer path).
  • t3-prism-pr35-pillars.stl (regenerated, tree mode with the finer Ø 0.4 mm contact tips and the multi-hit underside ray-cast, 188 contact tips / 31 trunk feet / 23,520 tris) — tree-support mesh produced by generate_support_pillars.py --stl … --tree ray-cast against the actual PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 T3-prism printable mesh, so every down-facing underside the bed's-eye rays cross gets a tip (including the vertical-cable end-caps, members stacked above struts, and the top-cap / joint undersides the prior stale 181-tip pass missed) while branching off only a handful of feet on the plate.
  • t3-prism-pr35-with-pillars.stl (regenerated, 50,336 tris) — combined printable STL (T3-prism + ray-cast tree supports merged via merge_stls.py), ready to slice as a single solid object with no slicer-side support material required.
  • t3-prism-pr35-pillars-preview.png (regenerated, via render_pillars_preview.py) — iso + bottom-view render showing the T3-prism part in grey with the ray-cast tree supports (orange) branching from a few feet up to the underside of each member at every height, including the joint-sphere bulges and the vertical-cable end-caps the prior lowest-hit pass missed.
  • t3-prism-pr35-pillars-gcode-preview.png (new, via render_gcode.py --baked-supports) — 3-panel render of the on-hardware-profile slice of the combined part+pillars mesh: bottom view + first-layer panels show every baked pillar foot and member base landing on the bed inside the brim, and the height-coloured iso panel confirms the toolpath spans the full z ≈ 0–126 mm with everything rooted on the plate.
  • t3-prism-pr35-pillars-rotating.gif (regenerated) — rotating 360° turntable animation of the combined part+pillars mesh (object grey, supports orange), produced by render_pillars_gif.py, for full-angle visual verification of support-to-underside coverage.
  • t3-prism-pr35-fea-stability.png (new) — 2-panel CalculiX FEA figure (layer-by-layer buckling safety factor + tip-over margin) produced by fea_support_stability.py.
  • Earlier preview PNGs and support-only / object+supports STLs from the auto-slicer path (a) and the enforcer fallback path (c′) are retained for reference.
  • README.md — full reproduction recipe for path (a), path (c) multi-hit ray-cast tree supports / narrowing-pillars (and the parametric --topology/--members fallbacks), the path (c′) enforcer fallback, the rotating-GIF render step, a verification section documenting verify_support_geometry.py, fea_support_stability.py, render_pillars_preview.py and their results (geometry all-PASS; FEA buckling SF 61×, tip-over margin 27.8 mm, lateral-compliance caveat), and a new on-hardware-profile slice subsection with the slice_bambu_h2d.py --no-repo-overrides --override enable_support=0 recipe, the render_gcode.py --baked-supports preview step, and the slice result table (646 layers, 129.2 mm, 60.9 g, ~5 h 36 m). Includes a "why these defaults" rationale that documents the Ø 0.4 mm tip / 2.5 mm contact-neck choice against Bambu Studio's own tip-diameter defaults and delicate-feature guidance, plus the multi-hit underside detection and the --min_clearance 1.5 --min_gap 1.0 defaults.
  • cad/print-supports/HOW-TO-PRINT.md — GUI print guide for the Bambu Studio multi-STL upload, updated to describe the tree supports, their easier breakaway removal, and the --branch_d / --trunk_d / --tip_d / --tip_contact_h / --merge_radius / --min_gap tuning knobs.

Copilot AI linked an issue May 22, 2026 that may be closed by this pull request
Copilot AI changed the title [WIP] Add functionality to paint manual supports from bottom view Automate manual support painting with parametric enforcer-STL generator May 22, 2026
Copilot AI requested a review from sgbaird May 22, 2026 18:01
@sgbaird

sgbaird commented May 22, 2026

Copy link
Copy Markdown
Collaborator

@copilot no, we need this to be general-purpose. Try to figure this out for a single-material PLA print using bambu slicer

Copilot AI commented May 22, 2026

Copy link
Copy Markdown
Contributor Author

@copilot no, we need this to be general-purpose. Try to figure this out for a single-material PLA print using bambu slicer

Want to make sure I take this in the right direction before rewriting — when you say "general-purpose" for single-material PLA in Bambu Studio, do you mean:

(a) Drop the custom enforcer-STL workflow entirely and replace this PR with a documented Bambu Studio profile/settings recipe (tree(auto) + support_on_build_plate_only=1 + tuned support_threshold_angle, brim, etc.) that works for any tensegrity assembly when printed as single-material PLA — i.e. no per-geometry Python generator at all; or

(b) Keep the enforcer-STL idea but make the generator geometry-agnostic — take an arbitrary input STL/3mf, auto-detect bottom-facing cylindrical members, and emit enforcer prisms under each one (no hard-coded R/H/twist/strut-count), tuned for single-material PLA slicer defaults; or

(c) Something else (e.g. a Bambu Studio process/.json preset committed to the repo)?

I'm leaning toward (a) since it's the simplest thing that actually generalizes across geometries, but want to confirm before I tear out generate_support_enforcers.py.

@sgbaird

sgbaird commented May 22, 2026

Copy link
Copy Markdown
Collaborator

@copilot (a) is ideal, (b) as a fallback. For context we'll be varying many parameters as well as structure types (see #22 )

…geometry-agnostic fallback generator

Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/80f96023-40fd-457c-a568-bb77ad9f69b6

Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>

Copilot AI commented May 22, 2026

Copy link
Copy Markdown
Contributor Author

@copilot (a) is ideal, (b) as a fallback. For context we'll be varying many parameters as well as structure types (see #22 )

Done in 21ca244 (plus a doc-path clarification in the follow-up commit).

Path (a) — primary, no painting required for any tensegrity structure:

Path (b) — fallback for exotic topologies the auto recipe fails on:

  • cad/print-supports/generate_support_enforcers.py is now geometry-agnostic — accepts --members my_members.json (list of {p1, p2, d, trim_ends}) for any structure, with --topology t3_prism|prism_n built-in presets for quick checks. No hard-coded R/H/twist/strut-count in the data path; old t3-prism-specific directory removed.

Copilot AI changed the title Automate manual support painting with parametric enforcer-STL generator Replace manual support painting with general-purpose Bambu Studio PLA recipe (fallback: geometry-agnostic enforcer-STL generator) May 22, 2026
@sgbaird

sgbaird commented May 23, 2026

Copy link
Copy Markdown
Collaborator

@copilot Perform (a) for a single T3-prism from #35 , slice, show a render of the gcode so I can verify

Copilot AI commented May 23, 2026

Copy link
Copy Markdown
Contributor Author

@copilot Perform (a) for a single T3-prism from #35 , slice, show a render of the gcode so I can verify

Done in fb41388. Sliced cad/t3-prism/t3-prism.stl from PR #35 head (copilot/get-bambu-sliced-print-t3-prism, bonded-captive-core T3-prism @ scale 1.5×, R=37.5, H=105, twist=60, strut_d=9, cable_d=4.5) using a 1-to-1 PrusaSlicer 2.7 translation of bambu-pla-tensegrity-process.json (Bambu→Prusa key mapping documented in-line in prusaslicer-pla-tensegrity.ini; used PrusaSlicer instead of the BambuStudio AppImage since both share organic tree / support_material_buildplate_only / support_tree_tip_diameter semantics and PrusaSlicer is headless-friendly).

Slice summary: 601 layers / 0.20 mm / 38.39 cm³ PLA / 6 h 52 m / 425 230 extrusion segments (96 176 support · 327 553 object · 1 198 brim). Supports = organic tree, buildplate-only, θ=40°, tip Ø 0.8 mm, 5 mm outer brim, bridges unsupported.

3-panel gcode render (bottom-view supports-only · iso object+supports · first layer):

T3-prism PR #35 sliced with §B PLA recipe — gcode preview

What to look for vs. Audrey's manual paint:

  • Left panel (bottom-view, supports only) ≈ Audrey's centerline-stripe pattern, fully automatic.
  • Middle panel (iso): every orange tree branch terminates at z≈0 — none rooted on a member (the support_on_build_plate_only=1 rule).
  • Right panel (first layer): three bottom-triangle cables bridge unsupported between the bed-contact vertices (the bridge_no_support=1 exception); orange touch-points only appear under the 9 non-bed-contact members.

Reproduction recipe + full slice metrics in cad/print-supports/verification/README.md.

…r height) + clarify branch reference

Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/95196825-ad83-42ca-86cf-0a7a108ea58f

Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
Copilot AI changed the title Replace manual support painting with general-purpose Bambu Studio PLA recipe (fallback: geometry-agnostic enforcer-STL generator) Replace manual support painting with general-purpose Bambu Studio PLA recipe (fallback: geometry-agnostic enforcer-STL generator) + PR #35 T3-prism gcode verification May 23, 2026
@sgbaird

sgbaird commented May 23, 2026

Copy link
Copy Markdown
Collaborator

@copilot the PLA near vertical oriented struts appear to be unsupported, which is problematic when we move to TPU which struggles to hold itself up. That's why I want you to figure out a way to force supports all the way along the bottom of the shallow overhang

…overage; re-slice + add before/after comparison panel

Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/67def28e-b528-405b-aaef-3c533f80feba

Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
github-actions Bot and others added 6 commits July 23, 2026 04:32
PR35's branch HEAD mesh has drifted (blob d552684 vs 4db9b48 at the
65d0d3f commit that HOW-TO-PRINT pins for the struts/cables STLs and
that the committed pillar artefacts match). Cages regenerated from the
pinned mesh: 3 tendons Ø4.8-4.95 mm, tilt 19.7 deg, z 22-100 mm, full
3x97 mm pillars + 3-4 C-rings each, 3,736 tris.

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…age builder

- verify_cage_geometry.py: NO-CONTACT / ON-PLATE / ENCIRCLE / REMOVABLE
  checks, exits non-zero for CI gating. Lifts the part into the cage
  frame (raw PR35 mesh sits at z_min=-7.65; the generator builds output
  in the lifted on-plate frame) - without the lift every distance is
  offset and the checks false-fail.
- build_tendon_cages: final vertex-level clash gate on each emitted
  pillar/ring (with guard-shortening retries), hardening the sparse
  sample-based pre-checks against thin diagonal members near joints.
- Regenerated cage STL/report at default gaps; verified: closest
  cage-to-part distance 0.92 mm, 82 plate feet, max azimuth gap 92 deg,
  opening chord > tendon dia on all 3 tendons.
- Re-rendered preview with the part in the lifted frame (previous render
  had the part 7.65 mm low relative to the cages).

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sgbaird

sgbaird commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

Noting that at some point, we started printing smaller structures. This could also be contributing a bit towards the difficulty of printing. We can try upscaling a bit, too. Obviously increases the print time.

@claude is there some kind of physics-based or other kind of simulation we could run to help us decide on the right path to better manual supports and printing? TPU humidity is a clear, recurring issue, but there's not a lot we can do about it being more humid outside recently. We're already doing a lot of dry cycles. Likewise send an edison query asking for advice on the issues being experienced in #35 and how this might be addressed. Provide general feedback on our approaches here, too.

@claude

claude Bot commented Jul 23, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 16m 26s —— View job


TL;DR

Yes — and I built one. The decisive physics for the tendon failures is beam mechanics: a Ø4.8 mm × ~80 mm TPU 85A column has ~1000× the lateral compliance of the same column in PLA, so any nozzle touch moves it millimetres. I committed an analytic nozzle-wobble simulation (simulate_tendon_wobble.py, 45400e4) that ranks the interventions: the tendon cage is ~5× better than a ×1.5 uniform upscale — upscaling helps, but it's the weakest lever per unit print time. The Edison literature query completed (task 722c51c6, full answer + references committed in 5bf0f99) and independently reaches the same conclusion, adding concrete drying/parameter numbers for the humidity problem.

Todos — all complete

1. The simulation you can run now (committed)

simulate_tendon_wobble.py models the partially-printed tendon as a growing cantilever under a lateral nozzle/bead-drag force (Euler–Bernoulli, first-order — the point is the orders of magnitude between scenarios, and everything scales linearly in the assumed force). Defaults mirror the committed cage artefacts (Ø4.8 mm tendon, 80 mm span, rings every 18 mm with 0.8 mm clearance):

Scenario Tip deflection @ 10 mN vs. current
Bare TPU Ø4.8 (current failure mode) 4.4 mm
TPU uniformly upscaled ×1.5 (Ø7.2 × 120 mm) 2.9 mm 1.5× better
TPU + committed cage (rings @ 18 mm) 0.85 mm ~5× better
PLA Ø4.8 (why struts never wobble) 0.03 mm ~150× better

Key scaling facts that fall out of the model:

  • Uniform upscale by factor s only reduces wobble by s (stiffness ∝ d⁴/L³ — the d⁴ gain is mostly eaten by the L³ loss). So upscaling is a mild win for wobble, though it does make bubbles proportionally less damaging to the cross-section.
  • Diameter-only increase is much stronger: Ø4.8 → 6.0 mm = 2.4× stiffer at the same height; Ø7.2 = 5× stiffer. If the tensegrity mechanics allow it, fatten the tendons rather than scaling everything.
  • The cage is the strongest lever because it cuts the free cantilever length (stiffness ∝ 1/L³ — halving free length = 8× stiffer), and its benefit is capped only by ring clearance. Panel B shows the committed 18 mm spacing is already deep in the diminishing-returns region — good as-is.

2. Edison's advice on the PR #35 issues (full answer · references, 14-item prioritized table with citations)

On humidity/bubbling (the part you can partially do something about):

  • The highest-impact fix isn't more dry cycles — it's a continuously dry feed path: print from a sealed heated/desiccant dry box with a sealed PTFE tube to the extruder inlet, so the filament never re-absorbs moisture mid-print. Bubbles appearing mid-print on long tendons are the signature of re-uptake during the job, not incomplete drying.
  • Literature drying setpoints bracket: 80 °C / 16 h under vacuum (TPU foaming study) down to 50 °C / 5 h (TPU 85A FFF study) — use the strongest spool-safe protocol, then transfer to the dry box without ambient exposure.
  • Verify dryness by spool mass before/after drying, not box RH — enclosure RH is a process indicator, not proof of polymer moisture content; no universal foaming-onset wt% exists in the literature.
  • Parameter mitigation: run the coolest stable TPU temperature (start 225–230 °C, step down in 5 °C increments), 10–15 mm/s tendon walls, 30–40 % fan after first layers, minimal/no retraction.

On tendon stabilization, Edison independently converges on the cage: 3–4 PLA guide towers per tendon, and notes a free-standing shield gives almost no restraint unless it's a close-fitting cage — which is what the --cage artefacts already are. One escalation it suggests beyond the current no-contact design: sparse breakaway PLA→TPU ties every 10–20 mm for positive restraint (PLA bonds weakly to TPU, so they snap off naturally). Worth trying only if the clearance-limited ~0.8 mm residual wobble still produces defects. Also: z-hop 0.4–0.8 mm and eliminating travel moves that cross tendons — cheap, worth adding to the process JSON.

On simulation strategy, it recommends exactly the ladder we're on: Level 1 = reduced-order beam model (now committed) → Level 2 = CalculiX/FEniCSx nonlinear beam + nozzle contact with element activation (a natural extension of the existing fea_support_stability.py) → Level 3 = full G-code-driven thermo-mechanical FEA → Level 4 = moisture-diffusion/foaming models (explicitly not recommended — the inputs are unobtainable; a conditioned-filament print experiment answers the question faster). One measurement it flags as more valuable than any simulation refinement: the actual nozzle lateral force is unknown in the literature — a one-off load-cell measurement on a printed tendon stub would calibrate the whole model.

3. General feedback on the approaches in this PR

  • The verification-gate philosophy is the right one. The stale-artifact print failure showed eyeballing previews doesn't work; verify_support_geometry.py / verify_cage_geometry.py exiting non-zero is what actually prevents recurrence. Suggestion: wire them into CI on any PR touching the STL artefacts, and regenerate artefacts from the pinned mesh in that job so mesh drift (the PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 HEAD divergence already flagged in the README) is caught mechanically.
  • Baked-in supports over slicer supports remains correct for this geometry — slicer overhang analysis is physically blind to vertical cylinders, and the baked mesh survives re-slicing and slicer version churn.
  • The cage closes the right gap. The tree pillars solve underside support (PLA sag); the cage solves lateral restraint (TPU wobble) — different failure modes, both needed. The model above confirms the committed ring spacing/clearance are sensible.
  • Division of labor is now clear: wobble/sag → geometry (cage + pillars, done); bubbling → materials handling (dry-box feed — a hardware purchase, not a code change); residual surface quality → print parameters. That last group (nozzle temp, speed, fan, z-hop) is exactly what fits the PR Add reference STL models for canonical tensegrity structures + Edison literature surveys (initial + design-gaps follow-up) #22 optimization campaign as tunable parameters, per the plan to let the algorithm work on imperfections.
  • On upscaling: reasonable as insurance, but the model says prefer tendon-diameter increases over uniform scale if print time matters — ×1.5 uniform scale costs ~1.5–2× print time for only a 1.5× wobble reduction, while Ø4.8→6.0 mm costs little and gives 2.4×.

Committed in this session

Commit Contents
523353f Edison task id (outputs/edison-pr35-print-advice/_task_id.json)
45400e4 simulate_tendon_wobble.py + figure
5bf0f99 Edison artifacts: answer.md, references.md, full task dump
· Branch

github-actions Bot and others added 3 commits July 23, 2026 05:09
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
…vs PLA)

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
…k dump

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
@sgbaird

sgbaird commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator

On humidity/bubbling (the part you can partially do something about):

@claude we have the fancy Bambu Lab single channel dry box, forgot the name, ams pro 2 or something like that, and according to Jinkwan there is now a PTFE tube connecting from the box to the chamber and we have the new TPU assist module, too

On simulation strategy

Run all of these, as best as you can, as comprehensively as you can, iteratively in terms of design, up to your full 3 hr timeout window

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 36m 25s —— View job


TL;DR

Ran the full Edison simulation ladder (Level 1 analytic sweep → Level 2 CalculiX contact FEA → Level 3 g-code-driven thermal FEA) end-to-end on the PR #35 tendon cages, and the simulations changed the design: the old cage's 120° ring opening was an escape corridor — the tendon could wobble clean out of the cage in that direction, which no amount of ring tuning would fix. The cage is now regenerated with sim-tuned parameters (rings every 12 mm, gap 0.8 mm, opening 70°) that bound the tendon's wobble to ~1 mm in every direction while staying removable (the soft TPU cable squeezes out of the sub-diameter opening after printing). All four geometry checks PASS on the new artefact, and the merged part+pillars+cages mesh slices cleanly on the live Bambu Studio H2D CLI (646 layers, ~6 h 25 m). Also noted your dry-box/PTFE/TPU-assist hardware in the docs — that closes Edison's #1 recommendation, leaving drying protocol + spool-mass verification as the remaining materials-side actions.

The simulation ladder (all committed, all reproducible)

Level 1 — sweep_cage_design.py (6908f8b): exact cross-section contact model of the cage (restraint rose = how far the tendon can translate in each direction before touching cage geometry), plus a growing-cantilever model with nozzle force, self-weight sag of the 19.7°-tilted tendon, and a Newton-cooling hot tip, swept over ring spacing × ring gap × opening angle. Panel A shows the old design's escape corridor; panel C shows the escape transition at ~95° opening and the removability trade-off.

Level 2 — fea_tendon_wobble.py (73e9467): CalculiX growing-tendon FEA (tilted B32 beams, NLGEOM, gravity + 10 mN nozzle force, rings as active-set unilateral contacts). It cross-validates Level 1 (bare tendon 4.2 mm vs 4.75 mm analytic; self-weight buckling SF 30.5 vs Greenhill hand-calc ≈29) and adds what the analytic model can't see: a ring caps translation but rotation carries past it, so rings only work when several engage together — the old 18 mm spacing really allowed 1.83 mm wobble, the tuned 12 mm spacing holds 1.15 mm.

Level 3 — gcode_thermal_wobble.py (30d3d02): sliced the committed mesh on the genuine BambuStudio 02.06.00.51 CLI / H2D 0.4-nozzle profile, integrated per-layer times from the g-code (~30 s/layer across the tendon span), ran Newton cooling + an E(T) map for TPU 85A, and fed the per-element modulus profile back into the contact FEA. Result: only ~1.0 mm of tendon below the print front is still soft when the nozzle returns (0.2 mm on the slower PLA+TPU schedule), so thermal softening is second-order — cage clearance is the lever. Even a worst-case 3 s/layer tendon-only schedule (9.5 mm soft) only moves the caged wobble from 1.03 → 1.10 mm, which quantifies Edison's "print several parts at once" advice as insurance rather than a primary fix here.

Design iteration (955069f) — regenerated artefacts

generate_support_pillars.py cage defaults are now the sim-tuned values, with a new --cage_squeeze 0.75 knob replacing the old rigid-body removability rule (chord > diameter — the very rule that created the escape corridor; a soft TPU tendon squeezes out of a 0.75ר chord). verify_cage_geometry.py's REMOVABLE check enforces the squeeze criterion. Regenerated against the pinned 65d0d3f mesh: 3 tendons × (3 pillars + 5–6 rings), all checks PASS (NO-CONTACT 0.54 mm, ON-PLATE 82 feet, ENCIRCLE ≤92°, REMOVABLE 0.76× squeeze). New t3-prism-pr35-cages.stl (the optional 4th STL in HOW-TO-PRINT):

Rotating view: t3-prism-pr35-cages-rotating.gif · end-to-end slice of part + pillars + cages on the H2D profile: 646 layers, 52.9 cm³, ~6 h 25 m (+51 min for the rings).

Bonus finding: a real CalculiX defect, and a corrected number

Cross-validating the FEA against the analytic cantilever exposed that ccx 2.21's SECTION=CIRC beam expansion is broken (~14× too compliant, diverges under mesh refinement; RECT converges correctly). Both FEA scripts now use an I-equivalent square section. This also corrects the earlier PLA tree-support result: self-weight buckling SF is really 245×, not 61× (the old number was conservative, so all prior PASS verdicts stand) — regenerated t3-prism-pr35-fea-stability.png.

Hardware note (610070c)

Recorded in HOW-TO-PRINT.md: the heated single-slot dry box + sealed PTFE tube into the chamber + TPU assist module satisfy Edison's #1 (continuously dry feed path). Remaining materials-side actions from the review: strongest spool-safe drying cycle before loading, transfer without ambient exposure, and verify dryness by spool mass before/after drying rather than box RH.

Caveats / next best measurement

All deflections scale linearly in the assumed 10 mN nozzle lateral force — the one unknown that most affects absolute numbers. Edison flagged a one-off load-cell measurement of nozzle force on a printed tendon stub as worth more than any further model refinement. The E(T) map and cooling constant (τ≈73 s) are engineering estimates; they set the soft length, which Level 3 shows is small enough not to matter on real schedules.

Todos — all complete

  • Context + toolchain (ccx 2.21, trimesh, BambuStudio AppImage under xvfb)
  • Hardware status in docs — 610070c
  • Level 1 design-space sweep — 6908f8b
  • Level 2 CalculiX contact FEA — 73e9467
  • Level 3 g-code-driven thermal FEA — 30d3d02
  • Design iteration: tuned cage defaults, squeeze-based removability, regenerated + verified artefacts, ccx CIRC fix — 955069f
  • READMEs (simulation-ladder section, corrected numbers, slice check) — 7cf6df3
    · Branch

github-actions Bot and others added 6 commits July 25, 2026 20:09
…ow in place

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… in 120-deg opening

Swept-contact cross-section model of the exact build_tendon_cages layout
shows the committed C-ring opening (120 deg, chord 6.37 mm > tendon dia)
plus the pillar spacing leaves an azimuthal corridor through which the
tendon escapes the cage entirely. Recommended design from the sweep:
opening 70 deg (soft-TPU squeeze-out ratio 0.76 keeps it removable),
ring gap 1.2 -> 0.8 mm, ring spacing 18 -> 12 mm. Worst-direction free
travel drops from escape to 1.06 mm; closed-direction worst deflection
1.25 -> 0.81 mm (10 mN nozzle force + self-weight sag of the 19.7-deg
tilted tendon + Newton-cooling hot tip).

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ot clamps

Tilted (19.7 deg) TPU 85A tendon grown layer-by-layer as B32 beams,
NLGEOM statics under gravity + 10 mN nozzle force, C-rings as active-set
unilateral stops. Cross-validates Level 1: bare tendon 4.2 mm FEA vs
4.75 mm analytic; bare self-weight buckling SF 30.5 (ccx *BUCKLE) vs 29
Greenhill hand-calc. New finding: because a ring caps translation but
rotation carries past it, the committed cage really allows 1.83 mm worst
print-front wobble (fresh-clamp analytic said 1.25); the Level-1
recommended design (gap 0.8 @ 12 mm) holds 1.15 mm.

Also found and worked around a ccx 2.21 defect: SECTION=CIRC beam
expansion is ~14x too compliant and diverges under mesh refinement;
SECTION=RECT converges to the analytic cantilever, so the model uses the
I-equivalent square section (side (12I)^0.25, area within 2.3%).

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mal softening second-order

Sliced the committed part+pillars mesh on the live BambuStudio 02.06.00.51
CLI / H2D 0.4-nozzle PLA profile (646 layers, 5h33m est), integrated
per-layer times from the g-code (~30 s/layer across the tendon span), ran
Newton cooling + an engineering E(T) map for TPU 85A, and fed the
resulting per-element modulus profile into the Level-2 CalculiX contact
FEA. Findings: only ~1.0 mm of tendon below the print front is still soft
(E < E/2) when the nozzle returns on the real schedule (0.2 mm on the
slower PLA+TPU schedule), so wobble is dominated by elastic compliance
and cage clearance, not melt softening — the fixed 0.5 mm hot-tip
assumption in Levels 1-2 was sound. Even a worst-case 3 s/layer
tendon-only schedule (9.5 mm soft) only raises the caged deflection from
1.03 to 1.10 mm, quantifying Edison's print-several-parts advice (#10) as
insurance rather than a primary lever for this geometry.

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…+ regenerated artefacts

generate_support_pillars.py cage defaults are now the sweep/FEA-tuned
values: ring gap 1.2 -> 0.8 mm (the wobble floor), ring spacing
18 -> 12 mm (rings are point stops and must engage together), opening
120 -> 70 deg with a new --cage_squeeze 0.75 removability floor (chord
as a fraction of tendon diameter). The old rigid-body rule (chord >
diameter + 0.6) is gone: the Level-1 restraint rose showed such an
opening is an escape corridor the tendon can wobble through during the
print, while a soft TPU tendon still squeezes out of a 0.75x chord
afterwards. verify_cage_geometry.py's REMOVABLE check now enforces the
squeeze criterion (and reads the squeeze value from the report).

Regenerated the PR35 cage artefacts against the pinned 65d0d3f mesh:
3 tendons, 3 pillars + 5-6 rings each, 6,096 tris, all four checks PASS
(NO-CONTACT 0.54 mm, ON-PLATE 82 feet, ENCIRCLE <= 92 deg, REMOVABLE
0.76x squeeze), preview + rotating GIF re-rendered.

Also fixed the ccx 2.21 SECTION=CIRC defect in fea_support_stability.py
(same I-equivalent RECT workaround as fea_tendon_wobble.py): corrected
self-weight buckling SF for the PLA tree supports is 245x, not 61x (old
number was conservative; all PASS verdicts stand). Verification README
gains a 'Simulation ladder' section documenting all three levels;
HOW-TO-PRINT documents the squeeze-off removal.

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ages (646 layers, ~6h25m)

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sgbaird

sgbaird commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

@claude I guess we're using 85A, not 90A?

@claude

claude Bot commented Jul 26, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 1m 28s —— View job


Yes — 85A, everywhere

Everything in this PR (and PR #35) is built around TPU 85A; there is no 90A assumption anywhere on this branch.

Where 85A is pinned

The only 90A mentions in the repo are inside quoted literature in the Edison artifacts (a study that processed 85A and 90A grades side-by-side) — not anything we're using as a spec.

If the spool on the printer is actually 90A

Nothing breaks, and the safety margins move in the right direction: 90A is roughly 1.5–2× stiffer than 85A, so the wobble/sag predictions (bare-tendon 4.4 mm, caged ~1 mm) become conservative over-estimates, and the cage squeeze-out removal gets slightly harder but 0.76× chord is still fine for 90A. The only real changes would be swapping the filament profile in the MM slice (Bambu TPU 85A @BBL H2D 0.4 nozzle → the 90A equivalent) and bumping --e_tpu to ~25–30 MPa if you want the sim numbers to match. But if the intent all along is the Bambu TPU 85A spool with the H2D's high-flow TPU setup — which is what PR #35 froze — then the docs, profiles, and sims are already consistent as-is.
· Branch

@sgbaird

sgbaird commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

Noting also that another alternative we hadn't really considered is using a harder TPU..

@me-madsen

Copy link
Copy Markdown
Collaborator

@claude pull up a report on if white vs. black PLA (basic PLA from Bambu, just different colors) have any noticeably different material properties, particularly when it comes to shock transmission, stiffness, etc.

@claude

claude Bot commented Aug 21, 2026

Copy link
Copy Markdown

Claude finished @me-madsen's task in 18m 38s —— View job


White vs black Bambu PLA Basic: what the data actually supports

Short answer: stiffness, no difference. Strength, a couple of percent. Shock transmission and damping, nobody has measured it, and the physics leaves almost no room for it to matter.

Full write-up + reproducible analysis committed at cad/materials/README.md (15f8961).

1. Stiffness — the cleanest result

There is exactly one study that holds the base resin fixed and reports white and black separately: Wittbrodt & Pearce, Addit. Manuf. 8:110 (2015) (five colours all extruded from the same NatureWorks 4043D pellets, printed at 190 °C, ASTM D638 + XRD). I pulled the full preprint for the table:

Colour UTS (MPa) Yield (MPa) Crystallinity (%) Specimen scatter, SD (MPa)
Natural 57.16 ± 0.35 52.47 0.93 1.09
Black 52.81 ± 1.18 49.23 2.62 3.72
Grey 50.84 ± 0.23 46.08 4.79 0.71
Blue 54.11 ± 0.30 50.10 4.85 0.96
White 53.97 ± 0.26 50.51 5.05 0.82
  • Young's modulus did not track colour at all. The authors report a single band for every specimen: 2.78 ± 0.35 GPa. Colour moved crystallinity by 5× and UTS by a few percent without moving stiffness out of one scatter band.
  • White is +2.2 % UTS / +2.6 % yield over black — inside Bambu's own ±11 % tensile tolerance.
  • Black was the least repeatable colour (SD 3.72 MPa vs 0.82 for white); the authors flag it as the one colour whose scatter exceeds their measurement error.

Bambu itself publishes one TDS for all ~30 PLA Basic colours with no per-colour data: E(X-Y) = 2580 ± 220 MPa, UTS(X-Y) = 35 ± 4 MPa, ρ = 1.24 g/cm³. Worth knowing: the V2.0 sheet quotes wildly different numbers from V3.0 for the same line (unnotched impact 61.2 → 26.6 kJ/m², MFI 45.8 → 23.2 g/10 min). Revision drift in this product line dwarfs anything colour does.

2. Shock transmission — bounded by a square root

Stress-wave propagation in a slender member goes as c = √(E/ρ) and Z = ρc, so a stiffness spread shrinks by half in log terms:

Across Bambu's entire stiffness band
E 2360 to 2800 MPa (18.6 % spread)
ρ 1240 kg/m³, colour independent
c = √(E/ρ) 1380 to 1503 m/s (8.9 %)
Z = ρc 1.71 to 1.86 MRayl

Take the deliberately pessimistic case of a white member at one band edge bonded to a black member at the other: R = (Z₂−Z₁)/(Z₂+Z₁) = 0.043, so 0.18 % of incident energy reflects, 99.82 % transmits. And that's built from a tolerance band far wider than the measured white-vs-black difference.

For damping: room-temperature tan δ of glassy PLA is ~0.01–0.03 and is set by the polymer's sub-Tg relaxations. A ~1–3 wt% pigment loading isn't a plausible route to moving that, whereas infill, wall count and interlayer bond quality demonstrably are — the printed-PLA damping literature specifically ties high damping to poor inter-filament bonding.

3. Where colour does show up (and why it's mostly process, not polymer)

Multi-colour surveys report big spreads (up to 31 % UTS over 14 colours, 80 % impact over 10 colours), but the extremes in those sets are red / pink / silver, not white or black, and none separates pigment from carrier resin, dispersant or lot. Panel B puts them next to effects we already accept as ordinary: print direction alone is 93 % on impact and 25 % on modulus.

Two findings from the Edison literature query (task 59997d42, references) are worth flagging:

  • A colour × nozzle-temperature crossover. Frunzaverde 2022 found black Verbatim PLA was the stronger of the pair at 200–210 °C (52.41 MPa) and the weaker at 230–240 °C (43.23 MPa). The ranking is a property of pigment plus your profile, not of the pigment.
  • Black gave the better dimensional accuracy (1.96 % vs 5.50 % volumetric deviation), attributed to different cooling/contraction, with black tending to under-extrude and red to over-extrude on an identical profile.
  • Edison lists damping/DMA/impact/restitution/shock by colour as its largest evidence gap — no same-grade study exists, and it explicitly warns not to use static UTS as a proxy for damping. (It also missed Wittbrodt & Pearce, which is why the manual search above is in the report too.)
  • The eye-catching "colour η² = 97.3 %" from Frunzaverde 2023 only partitions variance inside one factorial experiment with everything else frozen. It is not a claim that colour drives 97 % of real variability.

4. Recommendation

  • Fix colour and lot for a whole campaign — not because they differ much, but because the cheapest way to keep a variable out of the #22 BO campaign is not to vary it. If both get used, log colour + spool lot as a categorical factor and randomise run order.
  • Don't re-tune the profile between colours. One frozen profile + one fixed colour removes the only robust interaction in the literature.
  • Neither colour is preferable for stiffness or shock. White had the tighter specimen scatter; black had the better dimensional accuracy. They point opposite ways, which is the answer: pick on visibility for photography and defect inspection.
  • One caveat that cuts the other way: for a tensegrity, structure-level damping is dominated by prestress, joint compliance and member dimensions. If a colour swap quietly shifts effective extrusion width, that would move measured transmissibility far more than tan δ. Still a reason to hold colour fixed, but the mechanism is dimensional, not viscoelastic.
  • If shock behaviour of the assembled structure actually matters, measure the structure (modal hammer or drop test with an accelerometer on an assembled T3 prism). That answers the real question directly.

Todos

  • Check what Bambu publishes per-colour (PLA Basic TDS V2.0 + V3.0 pulled and parsed)
  • Search literature and community data on pigment effects (TiO₂ white vs carbon black)
  • Retrieve the one resin-controlled white/black study in full (Wittbrodt & Pearce 2015)
  • Derive the shock-transmission consequences (wave speed, impedance, interface reflection)
  • Edison Scientific literature query — completed, artefacts committed (118e209)
  • Commit the analysis script, figure and report (cc51991, 15f8961)

Not done: no experiment was run. Everything above is published data plus closed-form derivation from it. If you want a repo-local answer, the drop/modal test in the last bullet is the thing to do, and it needs hardware, not more literature.
· Branch

github-actions Bot and others added 4 commits August 21, 2026 20:52
…ack) change mechanics?

Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
…e + derived shock-transmission analysis

Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
…cs and viscoelasticity

Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
…ck transmission

Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Figure out how to add manual supports

4 participants