TL;DR: Начал с фантазий про телепортацию из рассказа Стивена Кинга, закончил Python-пакетом для управления сканирующим туннельным микроскопом. 41 тест, симулятор вместо оборудования за $500K, замена LabVIEW на asyncio.
pip install amrl-transport- и можно тренировать RL-агента для манипуляции отдельными атомами, не выходя из дома.
Как все началось
Есть у Кинга рассказ «Долгий Джонт» (The Jaunt). Там телепортация работает так: объект разбирается в точке A и собирается в точке B. Мгновенно. "Джонт горка" все дела.
Я в очередной раз послушал его (спасибо Влад Копп и МДС) и подумал: а что, если не фантазировать, а посмотреть - насколько мы реально близки? Не в смысле «телепортировать человека», а хотя бы «разобрать объект на атомы и собрать заново».
Оказалось — ближе, чем кажется. Просто инструменты застряли в 90-х.
Сканирующий туннельный микроскоп умеет двигать атомы
В 1989 году дядьки из IBM написали слово «IBM» отдельными атомами ксенона. С тех пор прошло 36 лет. STM (сканирующий туннельный микроскоп) умеет:
Сканировать поверхность с атомарным разрешением
Двигать отдельные атомы (lateral manipulation)
Удалять и ставить атомы (vertical manipulation)
Менять химические связи (tip-induced chemistry)
Один атом. За раз. Иголкой толщиной в один атом.
Проблема? Скорость. Один атом - ~10 секунд. Собрать нанострукутру из 100 атомов - полчаса ручной работы ученого за приборной панелью. Масштабирование до «Джонта» - примерно никогда при таком подходе.
RL-агенты: пусть ИИ таскает атомы
В 2018-2020 годах две группы независимо показали, что нейросеть может двигать атомы автономно:
DeepSPM (Krull et al., 2020) - Monash University. Агент на базе deep learning управляет STM: сканирует, оценивает качество поверхности, чистит иглу, повторяет. Опубликовано в Nature Communications.
SINGROUP/Atom_manipulation_with_RL (Aalto University, 2019-2025) - RL-агент (SAC) учится двигать атомы в заданную точку. Обучение на реальном микроскопе.
Все круто, но…
Проблема: каждая лаба пишет свое
DeepSPM работает через LabVIEW-сервер, который общается с контроллером Createc через COM-интерфейс. Windows-only, лицензия ~$3500/год.
SINGROUP написали RealExpEnv — обёртку вокруг того же Createc COM. Тоже Windows, тоже заточено под один бренд.
Если у вас в лабе Nanonis (другой контроллер) — переписывайте все. Если хотите разрабатывать без микроскопа — удачи, симулятора нет. Если хотите запустить несколько микроскопов параллельно — LOL.
Знакомая картина. Я каждый день на работе вижу то же самое, только с бизнес-формулами вместо атомов.
Что я написал
amrl-transport — это три вещи:
1. STMTransport — абстракция над оборудованием
12 методов. Все в физических единицах: нанометры, милливольты, пикоамперы.
from amrl_transport.transport.protocol import STMTransport class STMTransport(ABC): def connect(self) -> None: ... def scan_image(self, size_nm, offset_nm, pixel, bias_mv) -> ScanResult: ... def lateral_manipulation(self, x_start_nm, y_start_nm, x_end_nm, y_end_nm, ...) -> ManipResult: ... def tip_shape(self, x_nm, y_nm, ...) -> bool: ... # ... ещё 8 методов
Реализуешь под свой микроскоп - и все. RL-агент не знает, работает он с Createc, Nanonis или симулятором.
2. Симулятор — микроскоп без микроскопа
Полноценный бэкенд, который эмулирует STM:
Поверхность с гауссовыми «атомами» — как реальные изображения, только без шума лаборатории (ну ладно, шум тоже есть — настраиваемый)
Lateral manipulation с физикой: атом двигается, если ток достаточный
Tip shaping: игла «тупится» и «точится»
from amrl_transport.transport import SimulatorTransport import numpy as np with SimulatorTransport(seed=42) as stm: img = stm.scan_image( size_nm=5.0, offset_nm=np.array([0.0, 0.0]), pixel=128, bias_mv=100, ) # img.img_forward — numpy array 128x128, как с реального прибора
Можно тренировать RL-агента на ноутбуке. Без криогеники, без вакуума, без $500K оборудования.
3. DeepSPM-сервер — убиваем LabVIEW
Это то, чем я горжусь больше всего.
DeepSPM (Nature Communications, 2020) общается с прибором через LabVIEW TCP-сервер. Я разреверсил протокол из исходников и написал замену на чистом Python asyncio.
Протокол оказался простой — 6 команд:
Команда | Формат | Что делает |
|---|---|---|
|
| Сканирование области |
|
| Формирование иглы |
|
| Очистка иглы |
|
| Получить параметр |
|
| Подвод иглы |
|
| Сдвиг области |
Ответ на scan — бинарный: [4B height BE][4B width BE][H*W float32 BE].
# Запуск Python-сервера (вместо LabVIEW) python -m amrl_transport.deepspm --transport simulator # Существующий код DeepSPM подключается к localhost:5556 # Без изменений. Вообще без изменений.
Итог: BSD-3 лицензия LabVIEW ($3500/год, Windows-only) → MIT Python asyncio (бесплатно, кроссплатформенно).
4. Очередь задач — для параллельной работы
RabbitMQ + Redis. Отправляешь задачу «собери треугольник из 3 атомов» — воркер с подключённым STM выполняет.
# Воркер python -m amrl_transport.cli worker --transport simulator --worker-id sim-01 # Задача python -m amrl_transport.cli submit --atoms '[[0,0],[1,0],[0.5,0.866]]'
Зачем? В лабе может быть 3-5 микроскопов. Пока один сканирует, другой двигает. Параллелизм на уровне задач, а не потоков.
TransportEnv — drop-in для SINGROUP
Вот ради чего все затевалось. У SINGROUP есть RealExpEnv — Gym-совместимый environment для обучения. Мой TransportEnv — точная замена:
from amrl_transport.transport import SimulatorTransport from amrl_transport.integration import TransportEnv stm = SimulatorTransport(seed=42) stm.connect() env = TransportEnv( transport=stm, step_nm=0.2, max_mvolt=20, max_pcurrent_to_mvolt_ratio=2850, goal_nm=2.0, ) # Тот же API что у RealExpEnv state, info = env.reset() next_state, reward, done, info = env.step(action)
Обученная модель на симуляторе → подставляешь CreatecTransport → работает на реальном железе. В теории. На практике будет sim-to-real gap, но это уже задача для RL-исследователей, не для инфраструктуры.
Тесты
41 тест. Все проходят без оборудования:
tests/ ├── test_protocol.py # ABC контракты ├── test_simulator.py # Физика симулятора ├── test_createc.py # Мок COM-интерфейса ├── test_deepspm_protocol.py # Wire protocol парсинг ├── test_deepspm_server.py # Asyncio server ├── test_queue_models.py # Pydantic модели ├── test_queue_worker.py # RabbitMQ consumer ├── test_integration.py # TransportEnv └── ...
$ pytest tests/ -v ... 41 passed in 2.34s
Никаких @pytest.mark.skip("needs hardware"). Всё через симулятор и моки.
Архитектура
amrl_transport/ ├── transport/ │ ├── protocol.py # STMTransport ABC (12 методов) │ ├── createc.py # Createc COM адаптер (Windows) │ ├── nanonis.py # Nanonis TCP адаптер (стаб) │ ├── simulator.py # Симулятор с физикой │ └── factory.py # config → transport ├── deepspm/ │ ├── protocol.py # Wire protocol парсер │ ├── server.py # asyncio-сервер (замена LabVIEW) │ ├── client.py # DeepSPMClient + совместимость │ └── __main__.py # python -m amrl_transport.deepspm ├── queue/ │ ├── models.py # ManipulationTask, AtomTarget (Pydantic) │ ├── worker.py # RabbitMQ consumer + backoff + graceful shutdown │ └── client.py # submit() → wait_for_result() ├── integration.py # TransportEnv (drop-in для RealExpEnv) └── cli.py # amrl-worker, amrl-submit
Что дальше
Честно — я backend-разработчик, не физик. Атомную физику знаю на уровне «прочитал 20 papers и исходники трёх репозиториев». Поэтому:
Планирую написать issue в DeepSPM — предложить Python-сервер как замену LabVIEW-зависимости. Проект подморожен с 2020, но авторы из Monash University.
Написал в SINGROUP — предложил transport abstraction для их RL-агента. Они активны, последние коммиты в 2025.
Жду фидбек — если кто-то из STM-лабораторий скажет «это полезно» — буду развивать. Если скажут «ты не понимаешь физику» — буду учиться.
Самое крутое, что может произойти: кто-то в лабе с Nanonis возьмёт amrl-transport, напишет NanonisTransport на 200 строк, и запустит SINGROUP'овский агент на своём железе. Без переписывания RL-кода.
Самое реалистичное: пакет полежит на PyPI с 125 скачиваниями, и я напишу в резюме «published open-source scientific tooling».
Оба варианта меня устраивают.
Установка
pip install amrl-transport
Ссылки
GitHub: github.com/formeo/amrl-transport
DeepSPM (Nature Communications, 2020): github.com/abred/DeepSPM
SINGROUP AMRL (Aalto University): github.com/SINGROUP/Atom_manipulation_with_RL
Предыдущие статьи: audiotools.dev — очистка аудиокниг от шума | Pure Go аудио-конвертер
Серия audiotools.dev продолжается, но иногда хочется чего-то поинтереснее, чем конвертировать WAV в MP3. Например, двигать атомы.
