moved auto alignment methods from client to rt server
This commit is contained in:
@@ -162,104 +162,106 @@ class OMNY_rt_client:
|
||||
|
||||
|
||||
def _omny_interferometer_openloop_steps(self, channel, steps, amplitude):
|
||||
if channel not in range(3,5):
|
||||
raise OMNY_rt_clientError(f"invalid channel number {channel}.")
|
||||
dev.rtx.controller._omny_interferometer_openloop_steps(channel, steps, amplitude)
|
||||
|
||||
if amplitude > 4090:
|
||||
amplitude = 4090
|
||||
elif amplitude < 10:
|
||||
amplitude = 10
|
||||
# if channel not in range(3,5):
|
||||
# raise OMNY_rt_clientError(f"invalid channel number {channel}.")
|
||||
|
||||
dev.oshield.controller.move_open_loop_steps(
|
||||
channel, steps, amplitude=amplitude, frequency=500
|
||||
)
|
||||
time.sleep(0.01)
|
||||
while dev.oshield.controller.is_axis_moving(channel):
|
||||
time.sleep(0.002)
|
||||
# if amplitude > 4090:
|
||||
# amplitude = 4090
|
||||
# elif amplitude < 10:
|
||||
# amplitude = 10
|
||||
|
||||
# dev.oshield.controller.move_open_loop_steps(
|
||||
# channel, steps, amplitude=amplitude, frequency=500
|
||||
# )
|
||||
# time.sleep(0.01)
|
||||
# while dev.oshield.controller.is_axis_moving(channel):
|
||||
# time.sleep(0.002)
|
||||
|
||||
|
||||
def _omny_interferometer_optimize(self, mirror_channel, channel):
|
||||
if mirror_channel == -1:
|
||||
raise OMNY_rt_clientError("no mirror channel selected")
|
||||
#mirror channel is mirror number and channel is smaract channel, i.e. axis of the mirror
|
||||
if channel == 3:
|
||||
steps_pos = self.mirror_parameters[mirror_channel]["opt_steps1_pos"]
|
||||
steps_neg = self.mirror_parameters[mirror_channel]["opt_steps1_neg"]
|
||||
opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude1_pos"]
|
||||
opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude1_neg"]
|
||||
elif channel == 4:
|
||||
steps_pos = self.mirror_parameters[mirror_channel]["opt_steps2_pos"]
|
||||
steps_neg = self.mirror_parameters[mirror_channel]["opt_steps2_neg"]
|
||||
opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude2_pos"]
|
||||
opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude2_neg"]
|
||||
else:
|
||||
raise OMNY_rt_clientError(f"invalid channel number {channel}.")
|
||||
# def _omny_interferometer_optimize(self, mirror_channel, channel):
|
||||
# if mirror_channel == -1:
|
||||
# raise OMNY_rt_clientError("no mirror channel selected")
|
||||
# #mirror channel is mirror number and channel is smaract channel, i.e. axis of the mirror
|
||||
# if channel == 3:
|
||||
# steps_pos = self.mirror_parameters[mirror_channel]["opt_steps1_pos"]
|
||||
# steps_neg = self.mirror_parameters[mirror_channel]["opt_steps1_neg"]
|
||||
# opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude1_pos"]
|
||||
# opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude1_neg"]
|
||||
# elif channel == 4:
|
||||
# steps_pos = self.mirror_parameters[mirror_channel]["opt_steps2_pos"]
|
||||
# steps_neg = self.mirror_parameters[mirror_channel]["opt_steps2_neg"]
|
||||
# opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude2_pos"]
|
||||
# opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude2_neg"]
|
||||
# else:
|
||||
# raise OMNY_rt_clientError(f"invalid channel number {channel}.")
|
||||
|
||||
previous_signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
# previous_signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
|
||||
min_begin = self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]
|
||||
if previous_signal < min_begin:
|
||||
#raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.")
|
||||
print(f"\rMinimum signal for auto alignment {min_begin} not reached.")
|
||||
return
|
||||
elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]:
|
||||
print(f"\rInterferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.")
|
||||
return
|
||||
else:
|
||||
direction = 1
|
||||
cycle_counter=0
|
||||
cycle_max=20
|
||||
reversal_counter=0
|
||||
reversal_max=4
|
||||
self.mirror_amplitutde_increase=0
|
||||
# min_begin = self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]
|
||||
# if previous_signal < min_begin:
|
||||
# #raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.")
|
||||
# print(f"\rMinimum signal for auto alignment {min_begin} not reached.")
|
||||
# return
|
||||
# elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]:
|
||||
# print(f"\rInterferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.")
|
||||
# return
|
||||
# else:
|
||||
# direction = 1
|
||||
# cycle_counter=0
|
||||
# cycle_max=20
|
||||
# reversal_counter=0
|
||||
# reversal_max=4
|
||||
# self.mirror_amplitutde_increase=0
|
||||
|
||||
current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
max=current_sample
|
||||
# current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
# max=current_sample
|
||||
|
||||
while current_sample < self.mirror_parameters[mirror_channel]["opt_signal_stop"] and cycle_counter<cycle_max and reversal_counter < reversal_max:
|
||||
# if current_sample < self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]:
|
||||
# raise OMNY_rt_clientError("error2") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.")
|
||||
# while current_sample < self.mirror_parameters[mirror_channel]["opt_signal_stop"] and cycle_counter<cycle_max and reversal_counter < reversal_max:
|
||||
# # if current_sample < self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]:
|
||||
# # raise OMNY_rt_clientError("error2") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.")
|
||||
|
||||
if direction>0:
|
||||
self._omny_interferometer_openloop_steps(channel, steps_pos, opt_amplitude_pos)
|
||||
verbose_str = f"channel {channel}, steps {steps_pos}"
|
||||
else:
|
||||
self._omny_interferometer_openloop_steps(channel, -steps_neg, opt_amplitude_neg)
|
||||
verbose_str = f"auto action {channel}, steps {-steps_pos}"
|
||||
#print(f"Aligning axis ") #{self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}")
|
||||
# if direction>0:
|
||||
# self._omny_interferometer_openloop_steps(channel, steps_pos, opt_amplitude_pos)
|
||||
# verbose_str = f"channel {channel}, steps {steps_pos}"
|
||||
# else:
|
||||
# self._omny_interferometer_openloop_steps(channel, -steps_neg, opt_amplitude_neg)
|
||||
# verbose_str = f"auto action {channel}, steps {-steps_pos}"
|
||||
# #print(f"Aligning axis ") #{self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}")
|
||||
|
||||
current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
# current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
|
||||
opt_mirrorname = self.mirror_parameters[self.mirror_channel]["opt_mirrorname"]
|
||||
# opt_mirrorname = self.mirror_parameters[self.mirror_channel]["opt_mirrorname"]
|
||||
|
||||
info_str = f"\rAuto aligning Channel {self.mirror_channel}, {opt_mirrorname}, Current signal: {current_sample:.0f}"
|
||||
filling = " " * (50-len(info_str))
|
||||
# Calculate the number of filled and unfilled segments
|
||||
length = 30
|
||||
percentage = current_sample / max
|
||||
filled_length = int(length * percentage)
|
||||
unfilled_length = length - filled_length
|
||||
bar = '#' * filled_length + '-' * unfilled_length
|
||||
print(info_str + filling + " " + bar + f" {max:.0f} "+verbose_str+" (q)uit \r", end='')
|
||||
# info_str = f"\rAuto aligning Channel {self.mirror_channel}, {opt_mirrorname}, Current signal: {current_sample:.0f}"
|
||||
# filling = " " * (50-len(info_str))
|
||||
# # Calculate the number of filled and unfilled segments
|
||||
# length = 30
|
||||
# percentage = current_sample / max
|
||||
# filled_length = int(length * percentage)
|
||||
# unfilled_length = length - filled_length
|
||||
# bar = '#' * filled_length + '-' * unfilled_length
|
||||
# print(info_str + filling + " " + bar + f" {max:.0f} "+verbose_str+" (q)uit \r", end='')
|
||||
|
||||
|
||||
|
||||
if previous_signal>current_sample:
|
||||
if direction<0:
|
||||
steps_pos=int(steps_pos/2)
|
||||
steps_neg=int(steps_neg/2)
|
||||
if steps_pos<1:
|
||||
steps_pos=1
|
||||
if steps_neg<1:
|
||||
steps_neg=1
|
||||
direction=direction*(-1)
|
||||
reversal_counter+=1
|
||||
previous_signal=current_sample
|
||||
cycle_counter+=1
|
||||
# if previous_signal>current_sample:
|
||||
# if direction<0:
|
||||
# steps_pos=int(steps_pos/2)
|
||||
# steps_neg=int(steps_neg/2)
|
||||
# if steps_pos<1:
|
||||
# steps_pos=1
|
||||
# if steps_neg<1:
|
||||
# steps_neg=1
|
||||
# direction=direction*(-1)
|
||||
# reversal_counter+=1
|
||||
# previous_signal=current_sample
|
||||
# cycle_counter+=1
|
||||
|
||||
print(f"\r\nFinished aligning channel {channel} of mirror {mirror_channel}\n\r") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}")
|
||||
# print(f"\r\nFinished aligning channel {channel} of mirror {mirror_channel}\n\r") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}")
|
||||
|
||||
def omny_tweak_interferometer(self):
|
||||
def interferometer_tweaking(self):
|
||||
self._tweak_interferometer()
|
||||
|
||||
def _tweak_interferometer(self):
|
||||
@@ -321,6 +323,8 @@ class OMNY_rt_client:
|
||||
autostop = self.mirror_parameters[self.mirror_channel]['opt_signal_stop']
|
||||
averaging_time = self.mirror_parameters[self.mirror_channel]["opt_averaging_time"]
|
||||
print(f"\nSelected mirror channel {self.mirror_channel}: {opt_mirrorname}. Autostop {autostop}. Signal averaging time: {averaging_time}\r")
|
||||
if int(key) == 6:
|
||||
dev.rtx.controller.laser_tracker_on()
|
||||
dev.rtx.controller._omny_interferometer_switch_channel(self.mirror_channel)
|
||||
max=0
|
||||
printit=True
|
||||
@@ -332,10 +336,10 @@ class OMNY_rt_client:
|
||||
self.mirror_amplitutde_increase-=100
|
||||
elif key == 'a':
|
||||
if self.mirror_channel != -1:
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=3)
|
||||
dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=4)
|
||||
dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=3)
|
||||
dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=4)
|
||||
if self.mirror_channel != -1 and printit:
|
||||
printit = False
|
||||
signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"])
|
||||
@@ -408,41 +412,43 @@ class OMNY_rt_client:
|
||||
dev.rtx.controller.laser_tracker_show_all
|
||||
|
||||
def omny_interferometer_align_tracking(self):
|
||||
self.mirror_channel=6
|
||||
signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"])
|
||||
dev.rtx.controller.omny_interferometer_align_tracking()
|
||||
# self.mirror_channel=6
|
||||
# signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"])
|
||||
|
||||
if signal > self.mirror_parameters[self.mirror_channel]["opt_signal_stop"]:
|
||||
print(f"Interferometer signal of axis {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} is good, no alignment needed.")
|
||||
else:
|
||||
dev.rtx.controller._omny_interferometer_switch_channel(self.mirror_channel)
|
||||
time.sleep(0.1)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
dev.rtx.controller._omny_interferometer_switch_alloff()
|
||||
dev.rtx.controller.show_signal_strength_interferometer()
|
||||
# if signal > self.mirror_parameters[self.mirror_channel]["opt_signal_stop"]:
|
||||
# print(f"Interferometer signal of axis {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} is good, no alignment needed.")
|
||||
# else:
|
||||
# dev.rtx.controller._omny_interferometer_switch_channel(self.mirror_channel)
|
||||
# time.sleep(0.1)
|
||||
# self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
# self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
# self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
# self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
# dev.rtx.controller._omny_interferometer_switch_alloff()
|
||||
# dev.rtx.controller.show_signal_strength_interferometer()
|
||||
|
||||
self.mirror_channel=-1
|
||||
# self.mirror_channel=-1
|
||||
|
||||
def laser_tracker_check_and_wait_for_signalstrength(self):
|
||||
#first check on target
|
||||
dev.rtx.controller.laser_tracker_wait_on_target()
|
||||
signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1)
|
||||
min_signal = self.OMNYTools._get_user_param_safe("rtx","min_signal")
|
||||
low_signal = self.OMNYTools._get_user_param_safe("rtx","low_signal")
|
||||
wait_counter = 0
|
||||
while signal < min_signal and wait_counter<10:
|
||||
print(
|
||||
f"The signal of the tracker {signal} is below the minimum required signal of {min_signal}. Waiting..."
|
||||
)
|
||||
wait_counter+=1
|
||||
time.sleep(0.4)
|
||||
self.feedback_get_status_and_ssi()
|
||||
signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1)
|
||||
dev.rtx.controller.laser_tracker_check_and_wait_for_signalstrength()
|
||||
# #first check on target
|
||||
# dev.rtx.controller.laser_tracker_wait_on_target()
|
||||
# signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1)
|
||||
# min_signal = self.OMNYTools._get_user_param_safe("rtx","min_signal")
|
||||
# low_signal = self.OMNYTools._get_user_param_safe("rtx","low_signal")
|
||||
# wait_counter = 0
|
||||
# while signal < min_signal and wait_counter<10:
|
||||
# print(
|
||||
# f"The signal of the tracker {signal} is below the minimum required signal of {min_signal}. Waiting..."
|
||||
# )
|
||||
# wait_counter+=1
|
||||
# time.sleep(0.4)
|
||||
# self.feedback_get_status_and_ssi()
|
||||
# signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1)
|
||||
|
||||
if signal < low_signal:
|
||||
print(
|
||||
f"\x1b[91mThe signal of the tracker {signal} is below the low limit of {low_signal}. Auto readjustment...\x1b[0m"
|
||||
)
|
||||
self.omny_interferometer_align_tracking()
|
||||
# if signal < low_signal:
|
||||
# print(
|
||||
# f"\x1b[91mThe signal of the tracker {signal} is below the low limit of {low_signal}. Auto readjustment...\x1b[0m"
|
||||
# )
|
||||
# self.omny_interferometer_align_tracking()
|
||||
@@ -70,8 +70,8 @@ rtx:
|
||||
readOnly: false
|
||||
readoutPriority: on_request
|
||||
userParameter:
|
||||
low_signal: 11000
|
||||
min_signal: 10000
|
||||
low_signal: 8500
|
||||
min_signal: 8000
|
||||
rty:
|
||||
description: OMNY rt
|
||||
deviceClass: csaxs_bec.devices.omny.rt.rt_omny_ophyd.RtOMNYMotor
|
||||
|
||||
@@ -37,6 +37,9 @@ logger = bec_logger.logger
|
||||
class RtOMNY_mirror_switchbox_Error(Exception):
|
||||
pass
|
||||
|
||||
class RtOMNY_Error(Exception):
|
||||
pass
|
||||
|
||||
class RtOMNYController(Controller):
|
||||
_axes_per_controller = 3
|
||||
red = "\x1b[91m"
|
||||
@@ -71,6 +74,11 @@ class RtOMNYController(Controller):
|
||||
"laser_tracker_print_intensity_for_otrack_tweaking",
|
||||
"laser_tracker_check_on_target",
|
||||
"laser_tracker_wait_on_target",
|
||||
"get_mirror_parameters",
|
||||
"laser_tracker_check_and_wait_for_signalstrength",
|
||||
"omny_interferometer_align_tracking",
|
||||
"_omny_interferometer_openloop_steps",
|
||||
"_omny_interferometer_optimize",
|
||||
]
|
||||
|
||||
def __init__(
|
||||
@@ -99,6 +107,137 @@ class RtOMNYController(Controller):
|
||||
self.ssi = {}
|
||||
self._min_scan_buffer_reached = False
|
||||
self.switchbox_socket = socket.socket()
|
||||
self.mirror_parameters = {
|
||||
1: {
|
||||
"opt_signalchannel": "ssi_5",
|
||||
"opt_mirrorname": "Inc Angle",
|
||||
"opt_averaging_time": 0.1,
|
||||
"opt_steps1_pos": 1,
|
||||
"opt_steps1_neg": 1,
|
||||
"opt_steps2_pos": 10,
|
||||
"opt_steps2_neg": 10,
|
||||
"opt_signal_stop": 2400,
|
||||
"opt_signal_min_begin": 1000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 2000,
|
||||
"opt_amplitude1_neg": 2000,
|
||||
"opt_amplitude2_pos": 2000,
|
||||
"opt_amplitude2_neg": 2000,
|
||||
},
|
||||
2: {
|
||||
"opt_signalchannel": "ssi_2",
|
||||
"opt_mirrorname": "Inc ST OSA Y",
|
||||
"opt_averaging_time": 0.1,
|
||||
"opt_steps1_pos": 1,
|
||||
"opt_steps1_neg": 1,
|
||||
"opt_steps2_pos": 1,
|
||||
"opt_steps2_neg": 1,
|
||||
"opt_signal_stop": 5000,
|
||||
"opt_signal_min_begin": 2000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 2000,
|
||||
"opt_amplitude1_neg": 2000,
|
||||
"opt_amplitude2_pos": 2000,
|
||||
"opt_amplitude2_neg": 2000,
|
||||
},
|
||||
3: {
|
||||
"opt_signalchannel": "ssi_1",
|
||||
"opt_mirrorname": "Inc OSA FZP Y",
|
||||
"opt_averaging_time": 0.25,
|
||||
"opt_steps1_pos": 1,
|
||||
"opt_steps1_neg": 2,
|
||||
"opt_steps2_pos": 1,
|
||||
"opt_steps2_neg": 3,
|
||||
"opt_signal_stop": 7200,
|
||||
"opt_signal_min_begin": 3000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 2500,
|
||||
"opt_amplitude1_neg": 2500,
|
||||
"opt_amplitude2_pos": 2500,
|
||||
"opt_amplitude2_neg": 2500,
|
||||
},
|
||||
4: {
|
||||
"opt_signalchannel": "ssi_2",
|
||||
"opt_mirrorname": "OSA Y",
|
||||
"opt_averaging_time": 0.1,
|
||||
"opt_steps1_pos": 1,
|
||||
"opt_steps1_neg": 1,
|
||||
"opt_steps2_pos": 1,
|
||||
"opt_steps2_neg": 1,
|
||||
"opt_signal_stop": 5000,
|
||||
"opt_signal_min_begin": 2000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 3000,
|
||||
"opt_amplitude1_neg": 3000,
|
||||
"opt_amplitude2_pos": 3000,
|
||||
"opt_amplitude2_neg": 3000,
|
||||
},
|
||||
5: {
|
||||
"opt_signalchannel": "ssi_1",
|
||||
"opt_mirrorname": "FZP Y",
|
||||
"opt_averaging_time": 0.2,
|
||||
"opt_steps1_pos": 6,
|
||||
"opt_steps1_neg": 6,
|
||||
"opt_steps2_pos": 8,
|
||||
"opt_steps2_neg": 4,
|
||||
"opt_signal_stop": 8000,
|
||||
"opt_signal_min_begin": 3000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 3000,
|
||||
"opt_amplitude1_neg": 3000,
|
||||
"opt_amplitude2_pos": 3000,
|
||||
"opt_amplitude2_neg": 3000,
|
||||
},
|
||||
6: {
|
||||
"opt_signalchannel": "ssi_4",
|
||||
"opt_mirrorname": "OSA X",
|
||||
"opt_averaging_time": 0.2,
|
||||
"opt_steps1_pos": 2,
|
||||
"opt_steps1_neg": 1,
|
||||
"opt_steps2_pos": 1,
|
||||
"opt_steps2_neg": 1,
|
||||
"opt_signal_stop": 8850,
|
||||
"opt_signal_min_begin": 3000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 3000,
|
||||
"opt_amplitude1_neg": 3000,
|
||||
"opt_amplitude2_pos": 3700,
|
||||
"opt_amplitude2_neg": 2500,
|
||||
},
|
||||
7: {
|
||||
"opt_signalchannel": "ssi_3",
|
||||
"opt_mirrorname": "FZP X",
|
||||
"opt_averaging_time": 0.2,
|
||||
"opt_steps1_pos": 4,
|
||||
"opt_steps1_neg": 4,
|
||||
"opt_steps2_pos": 4,
|
||||
"opt_steps2_neg": 4,
|
||||
"opt_signal_stop": 8000,
|
||||
"opt_signal_min_begin": 4000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 2500,
|
||||
"opt_amplitude1_neg": 2500,
|
||||
"opt_amplitude2_pos": 2500,
|
||||
"opt_amplitude2_neg": 2500,
|
||||
},
|
||||
8: {
|
||||
"opt_signalchannel": "ssi_1",
|
||||
"opt_mirrorname": "OSA Y USING SIGNAL OSA FZP",
|
||||
"opt_averaging_time": 0.2,
|
||||
"opt_steps1_pos": 1,
|
||||
"opt_steps1_neg": 1,
|
||||
"opt_steps2_pos": 1,
|
||||
"opt_steps2_neg": 1,
|
||||
"opt_signal_stop": 5000,
|
||||
"opt_signal_min_begin": 2000,
|
||||
"opt_step_divider": 1,
|
||||
"opt_amplitude1_pos": 3000,
|
||||
"opt_amplitude1_neg": 3000,
|
||||
"opt_amplitude2_pos": 3000,
|
||||
"opt_amplitude2_neg": 3000,
|
||||
}
|
||||
}
|
||||
self.mirror_channel = -1
|
||||
|
||||
# def is_axis_moving(self, axis_Id) -> bool:
|
||||
# # this checks that axis is on target
|
||||
@@ -124,6 +263,151 @@ class RtOMNYController(Controller):
|
||||
|
||||
threading.Thread(target=send_positions, args=(self, positions), daemon=True).start()
|
||||
|
||||
def get_mirror_parameters(self, mirror_number):
|
||||
return self.mirror_parameters[mirror_number]
|
||||
|
||||
|
||||
def laser_tracker_check_and_wait_for_signalstrength(self):
|
||||
print("Checking laser tracker...")
|
||||
if not self.laser_tracker_check_enabled():
|
||||
print("laser_tracker_check_and_wait_for_signalstrength: The laser tracker is not even enabled.")
|
||||
return
|
||||
#first check on target
|
||||
self.laser_tracker_wait_on_target()
|
||||
#when on target, check interferometer signal
|
||||
signal = self._omny_interferometer_get_signalsample("ssi_4",0.1)
|
||||
rtx = self.get_device_manager().devices.rtx
|
||||
min_signal = rtx.user_parameter.get("min_signal")
|
||||
low_signal = rtx.user_parameter.get("low_signal")
|
||||
wait_counter = 0
|
||||
while signal < min_signal and wait_counter<10:
|
||||
self.get_device_manager().connector.send_client_info(f"The signal of the tracker {signal} is below the minimum required signal of {min_signal}. Waiting...", scope="laser_tracker_check_and_wait_for_signalstrength", show_asap=True)
|
||||
|
||||
wait_counter+=1
|
||||
time.sleep(0.2)
|
||||
signal = self._omny_interferometer_get_signalsample("ssi_4",0.1)
|
||||
|
||||
if signal < low_signal:
|
||||
self.get_device_manager().connector.send_client_info(f"\x1b[91mThe signal of the tracker {signal} is below the low limit of {low_signal}. Auto readjustment...\x1b[0m", scope="laser_tracker_check_and_wait_for_signalstrength", show_asap=True)
|
||||
|
||||
self.omny_interferometer_align_tracking()
|
||||
print("Checking laser tracker completed.")
|
||||
|
||||
def omny_interferometer_align_tracking(self):
|
||||
self.mirror_channel=6
|
||||
signal = self._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"])
|
||||
|
||||
if signal > self.mirror_parameters[self.mirror_channel]["opt_signal_stop"]:
|
||||
print(f"Interferometer signal of axis {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} is good, no alignment needed.")
|
||||
else:
|
||||
self._omny_interferometer_switch_channel(self.mirror_channel)
|
||||
time.sleep(0.1)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 3)
|
||||
self._omny_interferometer_optimize(self.mirror_channel, 4)
|
||||
self._omny_interferometer_switch_alloff()
|
||||
self.show_signal_strength_interferometer()
|
||||
|
||||
self.mirror_channel=-1
|
||||
|
||||
def _omny_interferometer_openloop_steps(self, channel, steps, amplitude):
|
||||
if channel not in range(3,5):
|
||||
raise RtOMNY_Error(f"invalid channel number {channel}.")
|
||||
|
||||
if amplitude > 4090:
|
||||
amplitude = 4090
|
||||
elif amplitude < 10:
|
||||
amplitude = 10
|
||||
|
||||
oshield = self.get_device_manager().devices.oshield
|
||||
|
||||
oshield.obj.controller.move_open_loop_steps(
|
||||
channel, steps, amplitude=amplitude, frequency=500
|
||||
)
|
||||
time.sleep(0.01)
|
||||
while oshield.obj.controller.is_axis_moving(channel):
|
||||
time.sleep(0.002)
|
||||
|
||||
def _omny_interferometer_optimize(self, mirror_channel, channel):
|
||||
if mirror_channel == -1:
|
||||
raise RtOMNY_Error("no mirror channel selected")
|
||||
#mirror channel is mirror number and channel is smaract channel, i.e. axis of the mirror
|
||||
if channel == 3:
|
||||
steps_pos = self.mirror_parameters[mirror_channel]["opt_steps1_pos"]
|
||||
steps_neg = self.mirror_parameters[mirror_channel]["opt_steps1_neg"]
|
||||
opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude1_pos"]
|
||||
opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude1_neg"]
|
||||
elif channel == 4:
|
||||
steps_pos = self.mirror_parameters[mirror_channel]["opt_steps2_pos"]
|
||||
steps_neg = self.mirror_parameters[mirror_channel]["opt_steps2_neg"]
|
||||
opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude2_pos"]
|
||||
opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude2_neg"]
|
||||
else:
|
||||
raise RtOMNY_Error(f"invalid channel number {channel}.")
|
||||
|
||||
previous_signal = self._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
|
||||
min_begin = self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]
|
||||
if previous_signal < min_begin:
|
||||
#raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.")
|
||||
print(f"\rMinimum signal for auto alignment {min_begin} not reached.")
|
||||
return
|
||||
elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]:
|
||||
print(f"\rInterferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.")
|
||||
return
|
||||
else:
|
||||
direction = 1
|
||||
cycle_counter=0
|
||||
cycle_max=20
|
||||
reversal_counter=0
|
||||
reversal_max=4
|
||||
self.mirror_amplitutde_increase=0
|
||||
|
||||
current_sample = self._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
max=current_sample
|
||||
|
||||
while current_sample < self.mirror_parameters[mirror_channel]["opt_signal_stop"] and cycle_counter<cycle_max and reversal_counter < reversal_max:
|
||||
# if current_sample < self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]:
|
||||
# raise OMNY_rt_clientError("error2") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.")
|
||||
|
||||
if direction>0:
|
||||
self._omny_interferometer_openloop_steps(channel, steps_pos, opt_amplitude_pos)
|
||||
verbose_str = f"channel {channel}, steps {steps_pos}"
|
||||
else:
|
||||
self._omny_interferometer_openloop_steps(channel, -steps_neg, opt_amplitude_neg)
|
||||
verbose_str = f"auto action {channel}, steps {-steps_pos}"
|
||||
#print(f"Aligning axis ") #{self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}")
|
||||
|
||||
current_sample = self._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"])
|
||||
|
||||
opt_mirrorname = self.mirror_parameters[mirror_channel]["opt_mirrorname"]
|
||||
|
||||
info_str = f"\rAuto aligning Channel {mirror_channel}, {opt_mirrorname}, Current signal: {current_sample:.0f}"
|
||||
message=info_str +" (q)uit \r"
|
||||
self.get_device_manager().connector.send_client_info(message, scope="_omny_interferometer_optimize", show_asap=True)
|
||||
|
||||
|
||||
|
||||
if previous_signal>current_sample:
|
||||
if direction<0:
|
||||
steps_pos=int(steps_pos/2)
|
||||
steps_neg=int(steps_neg/2)
|
||||
if steps_pos<1:
|
||||
steps_pos=1
|
||||
if steps_neg<1:
|
||||
steps_neg=1
|
||||
direction=direction*(-1)
|
||||
reversal_counter+=1
|
||||
previous_signal=current_sample
|
||||
cycle_counter+=1
|
||||
|
||||
print(f"\r\nFinished aligning channel {channel} of mirror {mirror_channel}\n\r") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def move_to_zero(self):
|
||||
self.socket_put("pa0,0")
|
||||
self.get_axis_by_name("rtx").user_setpoint.setpoint = 0
|
||||
|
||||
Reference in New Issue
Block a user