补充test_mql机械节点运动学

This commit is contained in:
huojiarong committed 2026-07-20 09:09:49 +00:00
1 parent 0035243361
commit 8782f96baf
2 files changed
+57 -1

No files matched your search

+32 -1
View File
@@ -153,9 +153,17 @@ class TestMqlMechanicalMassState:
return [self.velocity_m_s, self.displacement_m] return [self.velocity_m_s, self.displacement_m]
@dataclass(frozen=True)
class TestMqlMechanicalNodeKinematics:
alias: str
velocities_m_s: dict[int, float]
displacements_m: dict[int, float]
@dataclass(frozen=True) @dataclass(frozen=True)
class TestMqlMechanicalMassSnapshot: class TestMqlMechanicalMassSnapshot:
states: tuple[TestMqlMechanicalMassState, ...] states: tuple[TestMqlMechanicalMassState, ...]
node_kinematics_by_alias: dict[str, TestMqlMechanicalNodeKinematics]
@property @property
def state_count(self) -> int: def state_count(self) -> int:
@@ -186,7 +194,30 @@ class TestMqlMechanicalMassClosure:
) )
for index, alias in enumerate(self.mass_aliases) for index, alias in enumerate(self.mass_aliases)
) )
return TestMqlMechanicalMassSnapshot(states=states) return TestMqlMechanicalMassSnapshot(
states=states,
node_kinematics_by_alias=self._node_kinematics_by_alias(states),
)
def _node_kinematics_by_alias(
self,
states: tuple[TestMqlMechanicalMassState, ...],
) -> dict[str, TestMqlMechanicalNodeKinematics]:
state_by_alias = {state.alias: state for state in states}
front = state_by_alias["mass_friction_endstops_18"]
rear = state_by_alias["mass_friction_endstops_19"]
return {
"dynamic_mechanical_node_alternative_2": TestMqlMechanicalNodeKinematics(
alias="dynamic_mechanical_node_alternative_2",
velocities_m_s={port: -front.velocity_m_s for port in range(1, 9)},
displacements_m={port: -front.displacement_m for port in range(1, 9)},
),
"dynamic_mechanical_node_alternative_3": TestMqlMechanicalNodeKinematics(
alias="dynamic_mechanical_node_alternative_3",
velocities_m_s={port: rear.velocity_m_s for port in range(1, 9)},
displacements_m={port: rear.displacement_m for port in range(1, 9)},
),
}
def rhs( def rhs(
self, self,
+25
View File
@@ -63,6 +63,31 @@ class TestMqlMechanicalAssemblyTests(unittest.TestCase):
for index, mass_state in enumerate(snapshot.states): for index, mass_state in enumerate(snapshot.states):
self.assertAlmostEqual(rhs[2 * index + 1], mass_state.velocity_m_s) self.assertAlmostEqual(rhs[2 * index + 1], mass_state.velocity_m_s)
def test_mechanical_mass_snapshot_exposes_lmechan1_node_kinematics(self) -> None:
closure = TestMqlMechanicalMassClosure(self.assembly)
state = closure.initial_state_vector()
state[16] = 0.2
state[17] = 0.37
state[18] = -0.3
state[19] = -0.72
snapshot = closure.snapshot(state)
front = snapshot.node_kinematics_by_alias[
"dynamic_mechanical_node_alternative_2"
]
rear = snapshot.node_kinematics_by_alias[
"dynamic_mechanical_node_alternative_3"
]
self.assertEqual(set(front.velocities_m_s), set(range(1, 9)))
self.assertEqual(set(front.displacements_m), set(range(1, 9)))
self.assertEqual(set(rear.velocities_m_s), set(range(1, 9)))
self.assertEqual(set(rear.displacements_m), set(range(1, 9)))
self.assertAlmostEqual(front.velocities_m_s[1], -0.2)
self.assertAlmostEqual(front.displacements_m[8], -0.37)
self.assertAlmostEqual(rear.velocities_m_s[1], -0.3)
self.assertAlmostEqual(rear.displacements_m[8], -0.72)
def test_system_simulates_mechanical_mass_state_closure(self) -> None: def test_system_simulates_mechanical_mass_state_closure(self) -> None:
system = TestMqlSystem() system = TestMqlSystem()