补充test_mql质量端止动原语

This commit is contained in:
huojiarong committed 2026-07-15 10:19:24 +00:00
1 parent a63fda313b
commit f6dda509a2
5 files changed
+142

No files matched your search

@@ -5,6 +5,7 @@ from pathlib import Path
from PythonModels.components.amesim_mechanical import (
AmesimElasticEndstop,
AmesimMassFrictionEndstops,
AmesimPistonGeometry,
circular_area,
m_to_mm,
@@ -76,6 +77,22 @@ class AmesimMechanicalComponentsTest(unittest.TestCase):
self.assertEqual(endstop.static_contact_force(0.1), 0.0)
self.assertEqual(endstop.penetration_m_from_gap_mm(0.1), 0.0)
def test_mass_endstop_penetration_and_viscous_friction(self) -> None:
mass = AmesimMassFrictionEndstops(
mass_kg=50.0,
lower_limit_m=-1.0,
upper_limit_m=0.8,
lower_stiffness_n_per_m=1.0e9,
upper_stiffness_n_per_m=1.0e9,
viscous_friction_n_per_m_per_s=12.0,
)
self.assertEqual(mass.lower_penetration_m(0.0), 0.0)
self.assertEqual(mass.upper_penetration_m(0.0), 0.0)
self.assertAlmostEqual(mass.lower_static_force_magnitude(-1.001), 1.0e6, delta=1.0e-6)
self.assertAlmostEqual(mass.upper_static_force_magnitude(0.801), 1.0e6, delta=1.0e-6)
self.assertAlmostEqual(mass.viscous_friction_force(0.25), -3.0)
if __name__ == "__main__":
unittest.main()
+35
View File
@@ -61,7 +61,16 @@ class TestMqlMechanicalAssemblyTests(unittest.TestCase):
self.assertEqual(mass.max_damping_n_per_m_per_s, 1.0e4)
self.assertAlmostEqual(mass.min_penetration_m, 1.0e-4)
self.assertAlmostEqual(mass.max_penetration_m, 1.0e-4)
self.assertEqual(mass.stiction_force_n, 0.0)
self.assertEqual(mass.coulomb_friction_n, 0.0)
self.assertEqual(mass.viscous_friction_n_per_m_per_s, 0.0)
self.assertEqual(mass.windage_n_per_m2_per_s2, 0.0)
self.assertEqual(mass.stick_velocity_threshold_m_s, 1.0e-6)
self.assertEqual(mass.reset_velocity_threshold_m_s, 1.0e-6)
self.assertEqual(mass.rest_coeff, 0.65)
self.assertEqual(mass.stribeck_constant_m_s, 1.0e-3)
self.assertTrue(mass.use_friction)
self.assertEqual(mass.stop_type, 4)
self.assertIn("v1@mass_friction_endstops_10", mass.data_paths)
self.assertIn("x1@mass_friction_endstops_10", mass.data_paths)
@@ -131,6 +140,32 @@ class TestMqlMechanicalAssemblyTests(unittest.TestCase):
delta=1.0e-3,
)
def test_mass_endstop_second_port_observables_are_opposite_sign(self) -> None:
for alias in self.assembly.masses:
with self.subTest(alias=alias):
for signal in ("x1", "v1", "acc1"):
primary = self.amesim_results.series(f"{signal}@{alias}")
second_port = self.amesim_results.series(f"{signal}dup@{alias}")
for index in (0, len(primary) // 2, -1):
self.assertAlmostEqual(primary[index], -second_port[index])
def test_mass_endstop_force_observables_match_inactive_amesim_contacts(self) -> None:
for alias, mass_spec in self.assembly.masses.items():
endstop = mass_spec.endstop()
with self.subTest(alias=alias):
x1 = self.amesim_results.series(f"x1@{alias}")[-1]
v1 = self.amesim_results.series(f"v1@{alias}")[-1]
self.assertAlmostEqual(
endstop.viscous_friction_force(v1),
self.amesim_results.series(f"Fvisc@{alias}")[-1],
)
self.assertAlmostEqual(self.amesim_results.series(f"Ffric@{alias}")[-1], 0.0)
self.assertAlmostEqual(self.amesim_results.series(f"Fmin@{alias}")[-1], 0.0)
self.assertAlmostEqual(self.amesim_results.series(f"Fmax@{alias}")[-1], 0.0)
self.assertLessEqual(endstop.lower_penetration_m(x1), 1.0e-12)
self.assertLessEqual(endstop.upper_penetration_m(x1), 1.0e-12)
def test_unit_helpers(self) -> None:
self.assertAlmostEqual(mm_to_m(20.0), 0.02)
self.assertAlmostEqual(n_per_mm_to_n_per_m(1.0e6), 1.0e9)