Симулятор УЗИ

Совместно с «Эйдос-медицина» мы реализовали интереснейший проект — симулятор аппарата УЗИ.

У Эйдоса был манекен и электромагнитный шестипозиционный датчик, наша задача — написать софт для симулятора, на котором будущие врачи учились бы проводить УЗ-исследования: работать с датчиком и получать срезы под нужным углом, проводить замеры, находить любые патологии — чего нельзя сделать на живом человеке — и в принципе разобраться с аппаратом УЗИ.

Вот так выглядит комплект симулятора

Казалось бы, ничего сложного — «просто» воспроизвести особенности поведения аналогового УЗИ-аппарата в цифровом виде. Главный технологический вызов, который стоял перед нами — как смоделировать органы и выводить для пользователей картинку, максимально похожую на настоящую эхограмму.

Программную часть симулятора можно разделить на несколько модулей.

Модуль загрузки сторонних моделей. Мы сделали фреймворк, в который трехмерщики и врачи Эйдоса могли сами загружать модели любых органов с любыми патологиями, без нашего участия. Вообще они могли загрузить модели чего угодно — хоть автомобиля — лишь бы эти модели соответствовали нашим гайдлайнам.

Обучающий модуль помогал пользователям освоиться с использованием датчика — как правильно его позиционировать, чтобы получать нужные срезы. Все результаты курсантов фиксировались в базе.

Модуль интеграции с датчиком. От датчика в систему приходит всего шесть чисел — три координаты и три угла наклона, и для их приема было достаточно написать прослойку под Adobe Air, которая обрабатывала данные и передавал их в основное приложение. Поскольку каждый манекен был уникален, было важно скорректировать системы координат. Мы это сделали с помощью матрицы трансформации.

Модуль визуализации эхограммы — главная часть системы. О нем мы расскажем подробнее.

Селезенка и легкие вместо игровых персонажей

Поскольку принцип работы по сравнению с аналоговым аппаратом УЗИ был абсолютно другой, были опасения по качеству эхограммы. Все сложности сводились к тому, чтобы получить хорошую картинку — со всеми шумами, тенями и прочими атрибутами настоящей эхограммы.

«Можно было использовать какой-нибудь игровой движок, потому что он по сути делает то, что нам нужно — рендерит 3D-модели. В играх — модели юнитов, деревьев, текстур и прочих атрибутов, в нашем случае — 3D-модели органов. Но чужой игровой движок не был лучшим вариантом. Готовые решения были рассчитаны, например, на столкновения и другую физику, но не были оптимизированы для получения эхограммы. Отказавшись от ненужных функций, мы могли создать более легкое и производительное решение, спустившись на уровень ниже. Разработка собственного движка и шейдеров была дешевле, чем кастомизация готовых решений.»

Рамиль Аминов
SmartHead, технический директор

Шейдер — это низкоуровневая программа, которая выполняется на видеокарте и генерирует картинку по информации о точке, ее расположению и цвете. При этом шейдер позволяет оперировать не картинкой целиком, а только ее определенной частью. Изображение рендерится быстрее, потому что видеокарта распараллеливает обработку, но из-за этого приходится, если говорить в общих чертах, писать программу под один пиксель.

Когда в модуль визуализации поступает 3D-модель, с ней можно делать практически все, что позволяют функции 3D-редактора. Но нам не была нужна целая модель — нам был нужен срез. Его мы получали так: строили на модели плоскость, и все пиксели, которые математически лежали выше этой плоскости, мы просто не отрисовывали.

Анимированное сердце и акустические тени

Несмотря на то, что мы разрабатывали симулятор, у него было одно значительное преимущество перед настоящим аппаратом УЗИ. Курсант может увидеть все патологии всех органов на одном экране, а может разбираться конкретно с камнями в почках, опухолью в печени или работой сердца. Для того, чтобы пользователи симулятора видели работу клапанов сердца, мы реализовали поддержку анимированных моделей. А поскольку вся 3D-визуализация была низкоуровневая и наша, то и для анимации пришлось разработать свой движок.

Поскольку поверхности органов разные, нам было важно показать, как разные ткани о ображаются на виртуальной эхограмме — не только оттенком серого, но и текстурой. Ее мы подгружали через конфигурационные файлы моделей. Кроме того, на настоящем аппарате УЗИ при движении датчика картинка размывалась. На симуляции это достигнуто благодаря эффектам блюра.

«Еще один вызов для разработчиков — акустические тени, артефакты, которые возникают из-за разницы плотности, например, между камнем и желчью. При работе с реальным аппаратом звук не распространяется за более плотным объектом, и на картинке это выглядит как тень. Нам нужно было получить подобный эффект. Мы снова обратились к опыту разработки игр. Там тени рисуются с помощью виртуальной камеры, которая ставится на место источника „света“. Видеокарта рендерит сцену, и результат сохраняется в буфер в виде карты глубины. После этого мы рендерим сцену развертки модели и заставляем каждый ее пиксель через преобразование матрицы „смотреть“ в буфер. Если пиксель „не проваливается в бесконечность“ в карте глубины, значит он находится в тени.»

Рамиль Аминов
SmartHead, технический директор

В общем, весь наш симулятор учил курсантов использовать реальный аппарат УЗИ, правильно позиционировать датчик и диагностировать патологии. Вся разработка симулятора проходила с августа 2015 по май 2016 года.