From 629c61a80705cdf4025f43c691a4d23e3aa065eb Mon Sep 17 00:00:00 2001 From: Wendy Date: Wed, 24 Jun 2026 14:29:02 +0900 Subject: [PATCH 1/6] Add temperature tracking (MOS and rotor) to motor state --- src/openarm_driver/driver.py | 15 +++++++++++++-- tests/test_driver.py | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/openarm_driver/driver.py b/src/openarm_driver/driver.py index 023136a..6a72011 100644 --- a/src/openarm_driver/driver.py +++ b/src/openarm_driver/driver.py @@ -132,14 +132,17 @@ def set_latest_state(self, timeout_us=300): """Update the state.""" self.openarm.recv_all(timeout_us) motor_values = ( - (m.get_position(), m.get_velocity(), m.get_torque()) + (m.get_position(), m.get_velocity(), m.get_torque(), + m.get_state_tmos(), m.get_state_trotor()) for m in self._iter_motors() ) - qpos, qvel, qtau = zip(*motor_values) + qpos, qvel, qtau, tmos, trotor = zip(*motor_values) self.latest_state = { "qpos": np.array(qpos, dtype=float) - self.joint_offsets, "qvel": np.array(qvel, dtype=float), "qtorque": np.array(qtau, dtype=float), + "tmos": np.array(tmos, dtype=int), + "trotor": np.array(trotor, dtype=int), } def fetch_state(self, refresh=True) -> dict[str, np.ndarray]: @@ -162,6 +165,14 @@ def fetch_torque(self, refresh=True) -> np.ndarray: """Fetch the torque.""" return self.fetch_state(refresh=refresh)["qtorque"] + def fetch_mos_temp(self, refresh=True) -> np.ndarray: + """Fetch the MOS temperature for each motor.""" + return self.fetch_state(refresh=refresh)["tmos"] + + def fetch_rotor_temp(self, refresh=True) -> np.ndarray: + """Fetch the rotor temperature for each motor.""" + return self.fetch_state(refresh=refresh)["trotor"] + def send_position(self, position: ArrayLike): """Move the arm by sending the position.""" checked_result = self.safety_checker.check(position, driver=self) diff --git a/tests/test_driver.py b/tests/test_driver.py index b5095fd..d140352 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -22,6 +22,8 @@ def __init__(self): self.position = 0.5 self.velocity = 0.0 self.torque = 0.0 + self.tmos = 25 + self.trotor = 30 def get_position(self): return self.position @@ -32,6 +34,12 @@ def get_velocity(self): def get_torque(self): return self.torque + def get_state_tmos(self): + return self.tmos + + def get_state_trotor(self): + return self.trotor + class CanMock: def __init__(self, *args, **kwargs): @@ -95,6 +103,22 @@ def test_fetch_torque(can_mock): driver.fetch_torque(refresh=False) +def test_fetch_mos_temp(can_mock): + driver = SingleArmDriver("right_arm") + temps = driver.fetch_mos_temp(refresh=True) + assert len(temps) == 8 + assert all(t == 25 for t in temps) + driver.fetch_mos_temp(refresh=False) + + +def test_fetch_rotor_temp(can_mock): + driver = SingleArmDriver("right_arm") + temps = driver.fetch_rotor_temp(refresh=True) + assert len(temps) == 8 + assert all(t == 30 for t in temps) + driver.fetch_rotor_temp(refresh=False) + + def test_fetch_state(can_mock): driver = SingleArmDriver("right_arm") driver.fetch_state(refresh=True) From 9feefa51ee6ea5891e7635d98736d1ddc6836059 Mon Sep 17 00:00:00 2001 From: Wendy Date: Wed, 24 Jun 2026 15:29:04 +0900 Subject: [PATCH 2/6] Update src/openarm_driver/driver.py avoiding abbreviation Co-authored-by: Sutou Kouhei --- src/openarm_driver/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openarm_driver/driver.py b/src/openarm_driver/driver.py index 6a72011..8bd5156 100644 --- a/src/openarm_driver/driver.py +++ b/src/openarm_driver/driver.py @@ -165,7 +165,7 @@ def fetch_torque(self, refresh=True) -> np.ndarray: """Fetch the torque.""" return self.fetch_state(refresh=refresh)["qtorque"] - def fetch_mos_temp(self, refresh=True) -> np.ndarray: + def fetch_mos_temperature(self, refresh=True) -> np.ndarray: """Fetch the MOS temperature for each motor.""" return self.fetch_state(refresh=refresh)["tmos"] From e5951a993f55e49aa8890142c9a8926623800d1a Mon Sep 17 00:00:00 2001 From: Wendy Date: Wed, 24 Jun 2026 15:29:39 +0900 Subject: [PATCH 3/6] Update src/openarm_driver/driver.py avoiding abbreviation Co-authored-by: Sutou Kouhei --- src/openarm_driver/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openarm_driver/driver.py b/src/openarm_driver/driver.py index 8bd5156..6af12b2 100644 --- a/src/openarm_driver/driver.py +++ b/src/openarm_driver/driver.py @@ -169,7 +169,7 @@ def fetch_mos_temperature(self, refresh=True) -> np.ndarray: """Fetch the MOS temperature for each motor.""" return self.fetch_state(refresh=refresh)["tmos"] - def fetch_rotor_temp(self, refresh=True) -> np.ndarray: + def fetch_rotor_temperature(self, refresh=True) -> np.ndarray: """Fetch the rotor temperature for each motor.""" return self.fetch_state(refresh=refresh)["trotor"] From f68d9d2a2bab5c9b3cbf2c60d4a2050c50fe2fc1 Mon Sep 17 00:00:00 2001 From: Wendy Date: Wed, 24 Jun 2026 15:30:12 +0900 Subject: [PATCH 4/6] Update tests/test_driver.py Co-authored-by: Sutou Kouhei --- tests/test_driver.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_driver.py b/tests/test_driver.py index d140352..3e52fa1 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -106,8 +106,7 @@ def test_fetch_torque(can_mock): def test_fetch_mos_temp(can_mock): driver = SingleArmDriver("right_arm") temps = driver.fetch_mos_temp(refresh=True) - assert len(temps) == 8 - assert all(t == 25 for t in temps) + assert temps == [25] * 8 driver.fetch_mos_temp(refresh=False) From a5e9d862ebce24ef2c14e584c05a2e9e29ad2199 Mon Sep 17 00:00:00 2001 From: Wendy Date: Wed, 24 Jun 2026 15:40:27 +0900 Subject: [PATCH 5/6] Use temperature instead of abbreviations and use tolist() comparison for temperature tests per review --- tests/test_driver.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/test_driver.py b/tests/test_driver.py index 3e52fa1..a7340a0 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -105,17 +105,16 @@ def test_fetch_torque(can_mock): def test_fetch_mos_temp(can_mock): driver = SingleArmDriver("right_arm") - temps = driver.fetch_mos_temp(refresh=True) - assert temps == [25] * 8 - driver.fetch_mos_temp(refresh=False) + temps = driver.fetch_mos_temperature(refresh=True) + assert temps.tolist() == [25] * 8 + driver.fetch_mos_temperature(refresh=False) def test_fetch_rotor_temp(can_mock): driver = SingleArmDriver("right_arm") - temps = driver.fetch_rotor_temp(refresh=True) - assert len(temps) == 8 - assert all(t == 30 for t in temps) - driver.fetch_rotor_temp(refresh=False) + temps = driver.fetch_rotor_temperature(refresh=True) + assert temps.tolist() == [30] * 8 + driver.fetch_rotor_temperature(refresh=False) def test_fetch_state(can_mock): From 35614c1ddbb95203cdc0d003bb384d182c309a5a Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Wed, 24 Jun 2026 15:55:19 +0900 Subject: [PATCH 6/6] Follow name changes Co-authored-by: Sutou Kouhei --- tests/test_driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_driver.py b/tests/test_driver.py index a7340a0..24d2ef7 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -103,14 +103,14 @@ def test_fetch_torque(can_mock): driver.fetch_torque(refresh=False) -def test_fetch_mos_temp(can_mock): +def test_fetch_mos_temperature(can_mock): driver = SingleArmDriver("right_arm") temps = driver.fetch_mos_temperature(refresh=True) assert temps.tolist() == [25] * 8 driver.fetch_mos_temperature(refresh=False) -def test_fetch_rotor_temp(can_mock): +def test_fetch_rotor_temperature(can_mock): driver = SingleArmDriver("right_arm") temps = driver.fetch_rotor_temperature(refresh=True) assert temps.tolist() == [30] * 8