This commit is contained in:
2026-08-14 10:26:28 +08:00
parent f051146486
commit 7d12459a32
44 changed files with 900211 additions and 15295 deletions
+40 -3
View File
@@ -34,6 +34,7 @@ from src.joint_module.reducer_adapters import (
SUPPORTED_JOINT_FAMILIES,
get_reducer_joint_adapter,
)
from src.joint_module.reference_assembly import infer_reference_placements
from src.kinematics import solve_instance
from src.models import ValidationReport, read_json
from src.parameter_solver import load_requirement, solve_parameters
@@ -49,6 +50,11 @@ REDUCER_REQ = ROOT / "input" / "requirements" / "reducers" / "simple_2k_h" / "si
TEMPLATE = ROOT / "src" / "configurations" / "simple_2k_h" / "topology.template.json"
CASCADE_JOINT_REQ = ROOT / "input" / "requirements" / "joint_modules" / "3500_motor_housing_cascade.json"
CASCADE_REDUCER_REQ = ROOT / "input" / "requirements" / "reducers" / "simple_2k_h_cascade" / "simple_2kh_cascade_ratio_9_spur.json"
STANDARD_MOTOR_STEP = ROOT / "input" / "assets" / "motors" / "3500_motor_part2_standard.step"
ACTUATOR_HOUSING_STEP = ROOT / "input" / "assets" / "housings" / "actuator_v2_knee_abd_main_case_2.step"
CHIP_STEP = ROOT / "input" / "assets" / "chip" / "chip.step"
REFERENCE_ASSEMBLY_STEP = ROOT / "input" / "assets" / "references" / "actuator_v2_knee_abd_reference.step"
FIXED_PLATFORM_PROFILE = ROOT / "input" / "assets" / "platforms" / "actuator_v2_fixed_platform.json"
FERGUSON_REDUCER_REQ = ROOT / "input" / "requirements" / "reducers" / "ferguson_wolfrom" / "ferguson_wolfrom_ratio_531p25_spur.json"
CASCADE_TEMPLATE = ROOT / "src" / "configurations" / "simple_2k_h_cascade" / "topology.template.json"
FERGUSON_TEMPLATE = ROOT / "src" / "configurations" / "ferguson_wolfrom" / "topology.template.json"
@@ -95,11 +101,9 @@ def _generated_housing_step(tmp_path: Path) -> Path:
def _runtime_joint_requirement(tmp_path: Path) -> Path:
housing_step = _generated_housing_step(tmp_path)
payload = {
"module_type": "planetary_joint_module",
"motor_step": str(MOTOR_STEP.resolve()),
"housing_step": str(housing_step.resolve()),
"platform_profile": str(FIXED_PLATFORM_PROFILE.resolve()),
"reducer_requirement": str(REDUCER_REQ.resolve()),
"placement_policy": "infer_then_write_editable_json",
"motor_to_reducer_relation": "motor_output_to_sun_keyed_input",
@@ -215,6 +219,12 @@ def _passing_reducer_report(run_id: str) -> ValidationReport:
def test_joint_requirement_loads() -> None:
requirement = load_joint_requirement(JOINT_REQ)
assert requirement.module_type == "planetary_joint_module"
assert requirement.platform_id == "actuator_v2_fixed_platform"
assert Path(requirement.motor_step) == STANDARD_MOTOR_STEP
assert Path(requirement.housing_step) == ACTUATOR_HOUSING_STEP
assert requirement.chip_step is None
assert Path(requirement.reference_assembly_step or "") == REFERENCE_ASSEMBLY_STEP
assert requirement.motor_placement_policy == "external_flush_input_end"
assert requirement.motor_to_reducer_relation == "motor_output_to_sun_keyed_input"
assert requirement.housing_relation == "ring_fixed_to_housing"
@@ -237,11 +247,30 @@ def test_cascade_joint_requirement_loads_and_ports_resolve() -> None:
template=load_template(CASCADE_TEMPLATE),
)[0]
assert requirement.joint_output == "s2_carrier_output"
assert requirement.platform_id == "actuator_v2_fixed_platform"
assert requirement.chip_step is None
assert Path(requirement.reference_assembly_step or "") == REFERENCE_ASSEMBLY_STEP
assert requirement.motor_placement_policy == "external_flush_input_end"
assert instance.boundary.input == "s1_sun"
assert instance.boundary.output == "s2_carrier"
assert instance.boundary.fixed_members == ["s1_ring", "s2_ring"]
def test_reference_assembly_recovers_motor_placement() -> None:
_ocp_or_skip()
placements = infer_reference_placements(
reference_step=REFERENCE_ASSEMBLY_STEP,
component_steps={
"housing": ACTUATOR_HOUSING_STEP,
"motor": STANDARD_MOTOR_STEP,
},
)
assert placements["housing"].translation_mm == (0.0, 0.0, 0.0)
assert placements["motor"].translation_mm[0] == pytest.approx(2.0, abs=1e-6)
assert placements["motor"].source == "inferred_from_reference_assembly_occurrence"
def test_joint_requirements_reference_supported_reducer_families() -> None:
for requirement_path in (ROOT / "input" / "requirements" / "joint_modules").glob("*.json"):
requirement = load_joint_requirement(requirement_path)
@@ -250,6 +279,14 @@ def test_joint_requirements_reference_supported_reducer_families() -> None:
assert reducer_requirement.topology_family in SUPPORTED_JOINT_FAMILIES
def test_all_joint_requirements_use_the_fixed_platform_profile() -> None:
platform_ids = {
load_joint_requirement(requirement_path).platform_id
for requirement_path in (ROOT / "input" / "requirements" / "joint_modules").glob("*.json")
}
assert platform_ids == {"actuator_v2_fixed_platform"}
def test_ferguson_reducer_ports_remain_available_for_reducer_exports() -> None:
instance = solve_parameters(
requirement=load_requirement(FERGUSON_REDUCER_REQ),