Zypherix & FixItFella
FixItFella FixItFella
Привет, Зиферикс. Я тут ковырялся с одним ключом, который сам регулирует крутящий момент в зависимости от сопротивления материала — подумал, если добавить немного прогностического кода, он станет умнее. Поможешь мне его откалибровать?
Zypherix Zypherix
Конечно, давай скормим ему данные, подкрутим цикл, добавим немного прогнозного кода и посмотрим, как механизм сам выучит, как справляться с препятствиями.
FixItFella FixItFella
Отлично, начнём с чистого набора данных и пишем код попроще, чтобы гаечный ключ сам подстроился. Помни, это наш счастливый ключ, он остаётся в мастерской — к нему никто не прикасается. Я всё записываю в обычную тетрадь, без каких-либо наклеек, только числа и короткая заметка к каждой проверке. Времени терять не будем, за работу.
Zypherix Zypherix
Вот набросок, который ты сможешь вставить в файл, запустить с Python и подавать ему данные, которые ты записываешь. Он будет считать скользящее среднее отклонения между тем, как ты хочешь, чтобы гаечный ключ ощущался (это "желаемый момент") и тем, что показывает датчик, а потом будет немного подкручивать целевой момент. ```python # simple_wrench_calib.py import csv import time # -------------- configuration -------------- DATA_FILE = 'log.csv' # твой блокнот экспортирован как csv (время, измеренное, желаемое) TOLERANCE = 0.02 # насколько близко мы хотим добиться ошибки (в каких-то единицах) LEARNING = 0.005 # насколько мы корректируем целевое значение в каждой итерации MAX_LOOPS = 200 # безопасный предел # -------------- helper -------------- def read_log(file_path): """ Ожидаемые столбцы: timestamp, measured, desired Возвращает список кортежей (измеренное, желаемое) """ entries = [] with open(file_path, newline='') as f: reader = csv.reader(f) next(reader) # пропускаем заголовок, если он есть for row in reader: try: m = float(row[1]) d = float(row[2]) entries.append((m, d)) except ValueError: continue return entries # -------------- core loop -------------- def calibrate(): error_accum = 0.0 count = 0 target_offset = 0.0 # насколько мы смещаем "целевой" момент гаечного ключа while count < MAX_LOOPS: data = read_log(DATA_FILE) if not data: print("Данных пока нет, подожди немного…") time.sleep(2) continue # вычисляем ошибку на основе последнего образца measured, desired = data[-1] error = desired - measured + target_offset error_accum += error count += 1 print(f"Итерация {count:3d} | Изм: {measured:6.2f} | Желаемое: {desired:6.2f} | Ошибка: {error:6.3f}") # если ошибка достаточно мала, мы довольны if abs(error) < TOLERANCE: print("Цель достигнута, стабилизируюсь…") break # немного корректируем целевое значение target_offset -= LEARNING * error print(f"Корректировка смещения целевого значения до {target_offset:6.4f}") # ждем следующего измерения time.sleep(1) print(f"Калибровка завершена после {count} итераций. Окончательное смещение: {target_offset:6.4f}") # -------------- run -------------- if __name__ == "__main__": calibrate() ``` **Как использовать:** 1. Записывай каждый тест в `log.csv` со столбцами: `timestamp, measured, desired`. 2. Держи ключ под напряжением и позволь датчику записывать значение `measured` каждый раз. 3. Запускай скрипт; он будет читать самую новую строку, вычислять ошибку и немного подкручивать целевое значение ключа. 4. Когда ошибка перестанет колебаться в пределах `TOLERANCE`, она остановится. Можешь по желанию подстраивать `LEARNING` или `TOLERANCE` для более быстрой или более щадящей сходимости. Всё – просто, итеративно и достаточно, чтобы счастливый ключ научился своему ритму. Удачи с хакингом!
FixItFella FixItFella
Отлично! Только убедись, что единицы измерения датчика совпадают с шкалой крутящего момента ключом, а то смещение пойдёт. Держи лог в порядке, без пропусков строк — у каждого запуска должен быть свой временной штамп. Как только ошибка меньше 0.02, можешь зафиксировать цель и дай ключу отдохнуть. Удачи, и помни: к нему никто больше не прикасается.
Zypherix Zypherix
Понял, буду следить за синхронизацией модулей и приведу логи в порядок. Как только ошибка упадёт ниже 0.02, заморожу цель и пусть этот счастливый гаечный ключ отдохнёт. Удачи, и только тебе разрешено видеть, как это работает.
FixItFella FixItFella
Звучит надёжно – просто следи за последними показаниями, чтобы не было сбоя. Как только станет стабильно, заклей этот параметр на наклейке на ключе; чтобы я знал, что ничего не сдвинулось. Удачи с калибровкой, и дай знать, если всё ещё будет казаться неуклюжим.
Zypherix Zypherix
Отлично, договорились. Следи за последними показаниями – вдруг начнёт шататься. Зафиксируй смещение с этой меткой, и у нас будет стабильный, живой ключ, который сможет держать только ты. Сообщи, если всё ещё будет немного дрожать.
FixItFella FixItFella
Ладно, я сохраню лог и проверю маркировку. Если опять будет шалить, достану старый динамометр и проведу ещё тестов. Будь на связи.
Zypherix Zypherix
Понял, следи за журналом, маркировка чёткая, манометр готов. Буду смотреть за потоком данных – дай знать, если этот танец ещё повторяется.
FixItFella FixItFella
Понял—журнал в порядке, маркировка на месте, датчик готов. Если этот танец опять затормозит, подкручу фазу, чтобы заработал как надо. Следи за любыми колебаниями. Понял—журнал в порядке, маркировка на месте, датчик готов. Если этот танец опять затормозит, подкручу фазу, чтобы заработал как надо. Следи за любыми колебаниями.