Skip to content

Commit 14052a6

Browse files
fixed doc typo, removed temp benchmarking from controller.
1 parent a391616 commit 14052a6

3 files changed

Lines changed: 4 additions & 74 deletions

File tree

catkit2/services/physik_stage_controller/physik_stage_controller.py

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import numpy as np
22
import threading
3-
import time
43
from catkit2.testbed.service import Service
54
from pipython import GCSDevice, pitools
65

@@ -126,89 +125,19 @@ def _submit_positions(self):
126125

127126
def _target_positions_worker(self):
128127
"""Worker thread to handle move_to commands from the target_positions data stream."""
129-
# Benchmarking variables
130-
iteration_count = 0
131-
benchmark_start = time.perf_counter()
132-
total_mov_time = 0.0
133-
# total_mutex_wait_time = 0.0
134-
last_frame_time = None
135-
frame_intervals = []
136-
137128
while not self.should_shut_down:
138129
try:
139130
frame = self.target_positions.get_next_frame(wait_time_in_ms=250)
140-
loop_start = time.perf_counter()
141-
142-
# Track time between frames
143-
if last_frame_time is not None:
144-
frame_intervals.append(loop_start - last_frame_time)
145-
last_frame_time = loop_start
146-
147131
data = frame.data
148-
149132
positions = {
150133
self.axis_num_to_name[num]: float(data[idx])
151134
for idx, num in enumerate(sorted(self.axis_map.values()))
152135
}
153-
154-
# Benchmark move_to (includes mutex acquisition and MOV command)
155-
mov_start = time.perf_counter()
156-
self._move_to_internal(positions, benchmark_times=True)
157-
mov_end = time.perf_counter()
158-
total_mov_time += (mov_end - mov_start)
159-
160-
iteration_count += 1
161-
162-
# Log benchmark every 500 iterations
163-
if iteration_count % 500 == 0:
164-
elapsed = time.perf_counter() - benchmark_start
165-
avg_rate = iteration_count / elapsed
166-
avg_mov_time = (total_mov_time / iteration_count) * 1000 # ms
167-
168-
if frame_intervals:
169-
avg_interval = (sum(frame_intervals) / len(frame_intervals)) * 1000 # ms
170-
min_interval = min(frame_intervals) * 1000
171-
max_interval = max(frame_intervals) * 1000
172-
else:
173-
avg_interval = min_interval = max_interval = 0
174-
175-
self.log.info(
176-
f'[BENCHMARK] iterations={iteration_count}, '
177-
f'avg_rate={avg_rate:.1f} Hz, '
178-
f'avg_MOV={avg_mov_time:.2f}ms, '
179-
f'frame_interval: avg={avg_interval:.2f}ms min={min_interval:.2f}ms max={max_interval:.2f}ms'
180-
)
181-
182-
# Reset for next window
183-
frame_intervals = []
184-
iteration_count = 0
185-
benchmark_start = time.perf_counter()
186-
total_mov_time = 0.0
187-
136+
self.move_to(positions)
188137
self.sleep(0)
189138
except RuntimeError:
190139
pass
191140

192-
def _move_to_internal(self, positions, benchmark_times=False):
193-
"""
194-
Internal move_to used by worker thread with optional benchmarking.
195-
Bypasses initialization check since worker only runs after init.
196-
"""
197-
axis_positions = {}
198-
for name, value in positions.items():
199-
if name in self.axis_map:
200-
axis_num = self.axis_map[name]
201-
axis_positions[axis_num] = float(value)
202-
203-
if not axis_positions:
204-
return
205-
206-
with self.mutex:
207-
self.pidevice.MOV(axis_positions)
208-
209-
self.is_moving = True
210-
self.move_event.set()
211-
212141
def main(self):
213142
"""Main loop - polls for move completion and updates telemetry when motion stops."""
214143
while not self.should_shut_down:

catkit2/services/physik_stage_controller_sim/physik_stage_controller_sim.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def open(self):
3838
# Create data streams
3939
num_axes = len(self.axis_map)
4040
self.positions = self.make_data_stream('positions', 'float64', [num_axes], 20)
41-
self.target_positions = self.make_data_stream('target_positions', 'float64', [num_axes], 20)
41+
self.target_positions = self.make_data_stream('target_positions', 'float64', [num_axes], 1)
4242

4343
# Precompute reverse map
4444
self.axis_num_to_name = {num: name for name, num in self.axis_map.items()}
@@ -126,6 +126,7 @@ def move_to(self, positions):
126126
"""Move to absolute positions (instantaneous)."""
127127
if not self.is_initialized:
128128
raise RuntimeError("Controller not initialized")
129+
self.log.info(f"Moving to positions: {positions}")
129130
axis_positions = {self.axis_map[name]: float(value) for name, value in positions.items() if name in self.axis_map}
130131
if axis_positions:
131132
with self.mutex:

docs/services/physik_stage_controller.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Commands
9595

9696
.. code-block:: python
9797
98-
# Example of using get_positions by a command call
98+
# Example of using stop_motion by a command call
9999
# stage is the service instance for the Physik stage controller
100100
stage.stop_motion()
101101
# Server Log:[physik_stage_controller] Motion stopped

0 commit comments

Comments
 (0)