Split project into frontend and backend

This commit is contained in:
2026-08-13 16:24:36 +08:00
commit f051146486
274 changed files with 953932 additions and 0 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,190 @@
from dataclasses import dataclass
from pathlib import Path
import math
import cadquery as cq
# All dimensions are millimetres. The main body is a revolved radial section.
INNER_BOTTOM_RADIUS = 60.0
INNER_STEP_RADIUS = 57.5
INNER_SHOULDER_RADIUS = 70.0
INNER_WALL_RADIUS = 79.0
BOTTOM_OUTER_RADIUS = 77.5
BODY_OUTER_RADIUS = 82.5
TOP_OUTER_RADIUS = 85.0
BASE_MIN_Z = -18.0
BASE_MAX_Z = 92.0
BASE_HEIGHT = BASE_MAX_Z - BASE_MIN_Z
@dataclass(frozen=True)
class HousingScale:
radial_scale: float = 1.0
axial_scale: float = 1.0
source: str = "default_template_scale"
def scaled_dimensions(scale: HousingScale) -> dict[str, float]:
return {
"inner_bottom_radius": INNER_BOTTOM_RADIUS * scale.radial_scale,
"inner_step_radius": INNER_STEP_RADIUS * scale.radial_scale,
"inner_shoulder_radius": INNER_SHOULDER_RADIUS * scale.radial_scale,
"inner_wall_radius": INNER_WALL_RADIUS * scale.radial_scale,
"bottom_outer_radius": BOTTOM_OUTER_RADIUS * scale.radial_scale,
"body_outer_radius": BODY_OUTER_RADIUS * scale.radial_scale,
"top_outer_radius": TOP_OUTER_RADIUS * scale.radial_scale,
"min_z": BASE_MIN_Z * scale.axial_scale,
"max_z": BASE_MAX_Z * scale.axial_scale,
"height": BASE_HEIGHT * scale.axial_scale,
"radial_scale": scale.radial_scale,
"axial_scale": scale.axial_scale,
"source": scale.source,
}
def scale_from_motor(
*,
motor_radial_diameter_mm: float,
motor_axis_length_mm: float,
radial_clearance_mm: float = 14.0,
reducer_axial_allowance_mm: float = 42.0,
min_radial_scale: float = 0.45,
max_radial_scale: float = 1.50,
min_axial_scale: float = 0.55,
max_axial_scale: float = 1.80,
) -> HousingScale:
target_inner_radius = motor_radial_diameter_mm / 2.0 + radial_clearance_mm
radial_scale = target_inner_radius / INNER_WALL_RADIUS
target_height = motor_axis_length_mm + reducer_axial_allowance_mm
axial_scale = target_height / BASE_HEIGHT
return HousingScale(
radial_scale=max(min_radial_scale, min(max_radial_scale, radial_scale)),
axial_scale=max(min_axial_scale, min(max_axial_scale, axial_scale)),
source="computed_from_motor_bbox",
)
def _polar_points(radius: float, start_degrees: float, count: int):
return [
(
radius * math.cos(math.radians(start_degrees + 360.0 * index / count)),
radius * math.sin(math.radians(start_degrees + 360.0 * index / count)),
)
for index in range(count)
]
def _radial_point(radius: float, angle_degrees: float, z: float) -> cq.Vector:
angle = math.radians(angle_degrees)
return cq.Vector(radius * math.cos(angle), radius * math.sin(angle), z)
def _radial_direction(angle_degrees: float) -> cq.Vector:
angle = math.radians(angle_degrees)
return cq.Vector(math.cos(angle), math.sin(angle), 0.0)
def build_body(scale: HousingScale = HousingScale()):
rd = scale.radial_scale
zd = scale.axial_scale
def r(value: float) -> float:
return value * rd
def z(value: float) -> float:
return value * zd
# Exact circular-arc midpoints for the two revolved outer blends.
lower_arc_mid = (r(78.8397459621556), z(-8.66025403784439))
upper_arc_mid = (r(83.1458565330652), z(71.9211556282713))
radial_section = (
cq.Workplane("XZ")
.moveTo(r(INNER_BOTTOM_RADIUS), z(-18.0))
.lineTo(r(BOTTOM_OUTER_RADIUS), z(-18.0))
.lineTo(r(BOTTOM_OUTER_RADIUS), z(-13.6602540378))
.threePointArc(lower_arc_mid, (r(BODY_OUTER_RADIUS), z(-5.0)))
.lineTo(r(BODY_OUTER_RADIUS), z(68.3856217223))
.threePointArc(upper_arc_mid, (r(TOP_OUTER_RADIUS), z(75.0)))
.lineTo(r(TOP_OUTER_RADIUS), z(92.0))
.lineTo(r(INNER_WALL_RADIUS), z(92.0))
.lineTo(r(INNER_WALL_RADIUS), z(0.0))
.lineTo(r(INNER_SHOULDER_RADIUS), z(0.0))
.lineTo(r(INNER_SHOULDER_RADIUS), z(-3.0))
.lineTo(r(INNER_STEP_RADIUS), z(-3.0))
.lineTo(r(INNER_STEP_RADIUS), z(-5.0))
.lineTo(r(INNER_BOTTOM_RADIUS), z(-5.0))
.close()
)
return radial_section.revolve(360.0, (0.0, 0.0), (0.0, 1.0))
def build(scale: HousingScale = HousingScale()):
rd = scale.radial_scale
zd = scale.axial_scale
def r(value: float) -> float:
return value * rd
def z(value: float) -> float:
return value * zd
part = build_body(scale)
# Ten Ø5 blind drilled holes, equally spaced on a Ø135 pitch circle.
drill_tip_height = z(1.5021515475689)
for x, y in _polar_points(r(67.5), 18.0, 10):
straight_hole = cq.Solid.makeCylinder(
r(2.5), z(10.0), cq.Vector(x, y, z(-18.0)), cq.Vector(0.0, 0.0, 1.0)
)
drill_tip = cq.Solid.makeCone(
r(2.5),
0.0,
drill_tip_height,
cq.Vector(x, y, z(-8.0)),
cq.Vector(0.0, 0.0, 1.0),
)
part = part.cut(straight_hole).cut(drill_tip)
# Four Ø2.5 blind holes opening at z=0, with 118-degree drill tips.
small_tip_height = z(0.75107577378445)
for x, y in _polar_points(r(71.875), 0.0, 4):
straight_hole = cq.Solid.makeCylinder(
r(1.25), z(4.24892422621555), cq.Vector(x, y, z(0.0)), cq.Vector(0.0, 0.0, -1.0)
)
drill_tip = cq.Solid.makeCone(
r(1.25),
0.0,
small_tip_height,
cq.Vector(x, y, z(-4.24892422621555)),
cq.Vector(0.0, 0.0, -1.0),
)
part = part.cut(straight_hole).cut(drill_tip)
# Eight radial Ø6.6 holes with 90-degree countersinks around the top rim.
for angle in range(0, 360, 45):
direction = _radial_direction(float(angle))
straight_hole = cq.Solid.makeCylinder(
r(3.3), r(3.9), _radial_point(r(78.0), float(angle), z(85.1)), direction
)
countersink = cq.Solid.makeCone(
r(3.3),
r(6.4),
r(3.1),
_radial_point(r(81.9), float(angle), z(85.1)),
direction,
)
part = part.cut(straight_hole).cut(countersink)
return part
def export_scaled(output: Path, scale: HousingScale) -> None:
cq.exporters.export(build(scale), str(output))
if __name__ == "__main__":
output = Path(__file__).resolve().with_name("gear_housing.step")
export_scaled(output, HousingScale())
print(output)
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,17 @@
{
"module_type": "planetary_joint_module",
"motor_step": "../../assets/motors/3500_motor_part2.step",
"housing_step": "../../assets/housings/generated_housing_baseline.step",
"reducer_requirement": "../reducers/simple_2k_h/simple_2kh_industrial_ratio_7p5_spur.json",
"placement_policy": "infer_then_write_editable_json",
"motor_to_reducer_relation": "motor_output_to_sun_keyed_input",
"housing_relation": "ring_fixed_to_housing",
"joint_output": "carrier_output_shaft",
"output_extension_mm": 8.0,
"coupling_clearance_mm": 1.0,
"input_shaft_insertion_depth_mm": 4.0,
"motor_output_side": "axis_max",
"axis_angle_tolerance_deg": 0.5,
"axis_distance_tolerance_mm": 0.25,
"volume_tolerance_mm3": 0.000001
}
@@ -0,0 +1,17 @@
{
"module_type": "planetary_joint_module",
"motor_step": "../../assets/motors/3500_motor_part2.step",
"housing_step": "../../assets/housings/generated_housing_baseline.step",
"reducer_requirement": "../reducers/simple_2k_h_cascade/simple_2kh_cascade_ratio_9_spur.json",
"placement_policy": "infer_then_write_editable_json",
"motor_to_reducer_relation": "motor_output_to_s1_sun_input",
"housing_relation": "stage_rings_fixed_to_housing",
"joint_output": "s2_carrier_output",
"output_extension_mm": 2.0,
"coupling_clearance_mm": 0.5,
"input_shaft_insertion_depth_mm": 1.0,
"motor_output_side": "axis_max",
"axis_angle_tolerance_deg": 0.5,
"axis_distance_tolerance_mm": 0.25,
"volume_tolerance_mm3": 0.000001
}
@@ -0,0 +1,26 @@
{
"target_ratio": 531.25,
"ratio_tolerance": 0.001,
"topology_family": "ferguson_wolfrom",
"detail_level": "kinematic_demo",
"input": "planet1",
"fixed": "static_carrier",
"output": "output_carrier",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.25],
"pressure_angle_deg": 20.0,
"face_width_mm": 6.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"gear_tooth_counts": {
"ring1": 150,
"sun1": 102,
"planet1": 24,
"ring2": 144,
"sun2": 96,
"planet2": 24
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 1.5,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h",
"input": "ring",
"fixed": "sun",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 0.3333333333333333,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h",
"input": "carrier",
"fixed": "ring",
"output": "sun",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
}
}
@@ -0,0 +1,27 @@
{
"target_ratio": 2.0,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "carrier",
"output": "ring",
"tooth_form": "helical",
"helix_angle_deg": 15.0,
"helix_hand": "right",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 2.0,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "carrier",
"output": "ring",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
}
}
@@ -0,0 +1,28 @@
{
"target_ratio": 7.5,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"detail_level": "industrial_core",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "helical",
"helix_angle_deg": 15.0,
"helix_hand": "right",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 20,
"max_sun_teeth": 20,
"min_planet_teeth": 55,
"max_planet_teeth": 55
}
}
@@ -0,0 +1,26 @@
{
"target_ratio": 7.5,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"detail_level": "industrial_core",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 20,
"max_sun_teeth": 20,
"min_planet_teeth": 55,
"max_planet_teeth": 55
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 10.0,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 2.5,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 3.0,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,27 @@
{
"target_ratio": 3.0,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "helical",
"helix_angle_deg": 15.0,
"helix_hand": "right",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 3.5,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 4.0,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 5.0,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 6.0,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 7.5,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,25 @@
{
"target_ratio": 8.0,
"ratio_tolerance": 0.01,
"topology_family": "simple_2k_h",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"tooth_form": "spur",
"planet_count_candidates": [3, 4, 5],
"module_candidates_mm": [0.5, 0.75, 1.0, 1.25, 1.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 18,
"max_sun_teeth": 80,
"min_planet_teeth": 18,
"max_planet_teeth": 160
}
}
@@ -0,0 +1,44 @@
{
"target_ratio": 6.0,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h_cascade",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
},
"stages": [
{
"stage_id": "s1",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5]
},
{
"stage_id": "s2",
"input": "sun",
"fixed": "carrier",
"output": "ring",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5]
}
],
"cascade": {
"coupling_policy": "stage_output_to_next_stage_input",
"stage_gap_mm": 2.0
}
}
@@ -0,0 +1,46 @@
{
"target_ratio": 9.0,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h_cascade",
"tooth_form": "helical",
"helix_angle_deg": 15.0,
"helix_hand": "right",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
},
"stages": [
{
"stage_id": "s1",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5]
},
{
"stage_id": "s2",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5]
}
],
"cascade": {
"coupling_policy": "stage_output_to_next_stage_input",
"stage_gap_mm": 2.0
}
}
@@ -0,0 +1,44 @@
{
"target_ratio": 9.0,
"ratio_tolerance": 0.000001,
"topology_family": "simple_2k_h_cascade",
"tooth_form": "spur",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5],
"pressure_angle_deg": 20.0,
"face_width_mm": 8.0,
"backlash_mm": 0.03,
"addendum_coeff": 1.0,
"clearance_coeff": 0.25,
"ring_rim_thickness_mm": 2.5,
"constraints": {
"max_outer_diameter_mm": 100.0,
"min_planet_neighbor_clearance_mm": 0.3,
"min_sun_teeth": 36,
"max_sun_teeth": 36,
"min_planet_teeth": 18,
"max_planet_teeth": 18
},
"stages": [
{
"stage_id": "s1",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5]
},
{
"stage_id": "s2",
"input": "sun",
"fixed": "ring",
"output": "carrier",
"planet_count_candidates": [3],
"module_candidates_mm": [0.5]
}
],
"cascade": {
"coupling_policy": "stage_output_to_next_stage_input",
"stage_gap_mm": 2.0
}
}