Modbus TCP, а также переключение видеопотоков

Однажды в ходе развертывания решения, основанного на Viinex Foundation 1.4, мы столкнулись с необходимостью реализовать не совсем обычную логику для управления распознаванием номерами ЖД вагонов. А именно, -- речь шла о регистрации вагонов на ЖД весах. На "въезде" и на "выезде" с весов было установлено по столбу, на каждом из которых смонтировано по паре камер и по оптическому датчику для разделения вагонов. Предполагалось, что программная система должна понимать, с какой стороны ЖД состав въезжает на весы, переключать систему распознавания на соответствующую пару камер, и процесс распознавания должен был управляться оптическим датчиком, установленным на соответствующем столбе. Видопотоки от камер и сигналы от датчика, установленных на другом столбе, при этом должны игнорироваться.

Для решения такой задачи мы решили совместить видеоаналитику, встроенную в Viinex Foundation 1.4, с функциональностью, реализованной в Viinex 2.0. Для этого, в первую очередь, мы реализовали прямо в Viinex 2.0 поддержку протокола Modbus TCP. Теперь устройства, совместимые с Modbus TCP (например, семейство контроллеров Moxa ioLogic), могут быть использованы в Viinex 2.0 как источники событий. События от таких устройств выглядят в Viinex 2.0 так же, как аналогичные события от ONVIF-совместимых IP камер (они помечены значением "DigitalInput" в поле "topic"). Мы добавили новый тип объекта Viinex 2.0, "modbus", -- объект такого типа реализует сетевое взаимодействие между Viinex и сетевыми контроллерами Modbus TCP.

После этого мы планировали реализовать всю логику в скрипте, который принимал бы события от GPIO-контроллера с Ethernet интерфейсом, обрабатывал такие события, и управлял бы объектом "Video Renderer", чтобы переключать его вывод на нужный видеоканал.

Мы реализовали такой подход, с управлением video renderer-ом из скрипта, и в тестах он неплохо себя показал. Скрипт отображал две камеры (с "левого" и "правого" столба) в одном видеопотоке, когда состава на весах не было, и переключался на видеопоток с "ведущего" столба, когда состав приезжал.

Тем не менее, нас такое решение не очень устроило по той причине, что video renderer осуществляет декодирование и последующее кодирование видеопотока. Эти шаги требуют вычислительных ресурсов, которые есть на что потратить с бОльшей пользой в системе для распознавания номеров ЖД вагонов. Для экономии вычислительных ресурсов мы решили реализовать легковесный объект, который мог бы принимать несколько видеопотоков на вход, и на выходе выдавать один из них, при этом давая возможность программно управлять тем, какой именно входной видеопоток будет попадать на выход. Это не требует декодирования и кодирования видеопотока. Видеопоток на выходе из такого объекта будет являться обычным источником видео с точки зрения Viinex 2.0, -- то есть, его можно ретранслировать по RTSP или HLS, записывать в видеархив, и т.д. Новый тип объекта Viinex, реализующего указанную функциональность, получил название "streamswitch".

Также выяснилось, что самый удобный способ управления распознаванием номеров ЖД вагонов в Viinex Foundation 1.4 из Viinex 2.0 -- это взаимодействие, реализованное в Viinex 2.0 при помощи "внешнего процесса" (тип объекта "process"), получающего управляющие события о замыкании и размыкании эмулируемого датчика (в соответствии с описанной выше логикой) от главного скрипта, исполняемого Viinex 2.0. Почему внешний процесс? Потому что ему необходимо также взаимодействовать с Viinex Foundation 1.4, используя специфичный для последнего нативный 32-разрядный интерфейс, существующий только под Windows, -- и мы не хотели бы появления каких-либо следов этого интерфейса в Viinex 2.0. Функциональность внешнего процесса в Viinex 2.0 предоставляет универсальный механизм интеграции, основанной на обмене событиями, с практически любой внешней подсистемой.

Для справки и в целях иллюстрации мы опубликовали конфигурацию Viinex 2.0, описанную выше, и исходный код управляющего скрипта в общедоступном репозитории на github.

Комментариев еще нет.

Leave a Reply

Вы должны войти Авторизованы чтобы оставить комментарий.