Роботизация карьерной техники – процесс довольно специфический и по своей природе почти всегда дистанционный. Не у каждого во дворе есть карьерный самосвал, экскаватор или буровой станок. А на карьере не всегда есть офис со смузи и лавандовым латте не до тестирований роботов, там нужно делать показатели по добыче. И хотя дистанционка в робототехнике уже тоже нередко встречается, карьерная робототехника тут на переднем крае.
К тому же, карьер более организован, чем дороги общего пользования, и ограничен правилами предприятия, что делает внедрение роботизированной техники коммерчески привлекательным уже сейчас. Наш первый автономный буровой станок был запущен в Бурятии. А недавно мы сдали проект в Перу. Там буровой станок работает на высокогорном месторождении меди и молибдена.
Надеюсь, рассказ, как мы в «Цифра роботикс» автоматизируем буровой станок, и что он может, будет интересен широкому кругу робототехников и сочувствующих.
Если вам больше нравится формат видео, то вот вебинар от нашего разработчика Даниила Виноградова о проекте с обстоятельным рассказом и классными демками:
Взрывная робототехника
Когда я начинал знакомиться с проектом, я, кажется, и не представлял подробностей, что за буровой станок, почему станок ездит (станки ж на заводе обычно стоят), и зачем он, собственно, бурит. Так что вот ответы для меня несколько лет назад и вообще для новичка.
Майнинг он не только биткойна и дата-, но и, по олдскулу, добыча полезных ископаемых. Нас интересуют открытый способ и добыча, в основном угля и руд цветных металлов. И в этом процессе участвует взрывчатка.
Собственно, есть слой породы, который мы хотим снять. И буровой станок должен сделать много отверстий – скважин (так чтобы их дно было в одной плоскости), в скважины заливается взрывчатка, потом делается большой ба-бах (drill & blasting), и работают бульдозер, самосвал и экскаватор, чтобы снять и увезти добытый слой. И так шаг за шагом.
На словах просто, но в планировании этого процесса много своей науки: как часто делать скважины, на какую глубину, сколько заложить взрывчатки, чтоб экономить и не взорвать все в труху, но при этом достаточно, чтобы не осталось слишком крупных фрагментов.
Проект бурения нам дается из специализированного софта (например, Геомикс или Blast Maker), а мы уже по нему в своем интерфейсе диспетчера делаем план робота.
Задача робота состоит в том, чтобы последовательно:
-
Переместиться к месту новой скважины, точно спозиционировать бур;
-
Горизонтироваться на домкратах;
-
Выполнить бурение (возможно, с накручиванием дополнительных буровых штанг или с наклоном);
-
Выполнить обратную последовательность действий: поднять буровой став (с разбором дополнительных штанг, если они были), встать с домкратов и ехать дальше.
Мне в этой работе особенно нравится, что робот не только ездит, но и активно взаимодействует с окружающей средой – делает скважины. Нужно не только управлять движением (ни во что не врезавшись), но и кучей других исполнительных механизмов – домкратами, подачей и оборотами, люнетом, шторкой, ключём и т.п. (см. подробности, что это всё такое, далее).
Дрель на гусеницах
Основной буровой станок, с которым мы работали на практике к настоящему времени, Pit Viper 271, станок для вращательного шарошечного бурения скважин диаметром от 171 мм до 270 мм. Он имеет массу 75 тонн, длину 12 м, высоту с поднятой мачтой 26,5 м, огромную скорость движения до 0,49 м/с (очень удачный объект для роботизации), усилие подачи до 31,7 тонн, может бурить скважины до 16,7 м глубиной без наращивания и до 32 м с дополнительными штангами.
В целом станки можно классифицировать на шарошечные и с пневмоударником (DTH, down-the-hole hammer) по тому как они бурят, на дизельные и электрические (ездят с кабелем следом), платформенные и с отдельной «мачтой-рукой». Есть побольше и поменьше, сильнее и слабее. Есть для подземного бурения, но это отдельная история. Стоит такая штука как суперкар, дизель потребляет тоннами – если дизельный (или сотни кВт, если электрический), работает в 2 смены днем и ночью.
Некоторые подробности про устройство станка с акцентом на то, чем мы в нём управляем, далее на примере нашего PV 271.
По-крупному станок состоит из:
-
шасси с гусеницами и домкратами, здесь же крепятся баки топлива и воды, а также нас интересует управляемая противопылевая шторка;
-
палубы (платформы), по которой можно ходить, и на которой стоят двигатель и основные электрические, пневматические и гидравлические системы;
-
кабины, которая пустая, когда работает робот, но возможность ручного управления (функциональность всех приборов и органов управления) остается;
-
и мачты, на которой размещены все основные компоненты, необходимые для бурения.
Мачту нужно рассмотреть детальнее, на ней основные исполнительные механизмы для бурения. Она может подниматься для бурения и опускается для режима движения с помощью двух гидравлических цилиндров и фиксируется на месте с помощью гидравлических штифтов блокировки с каждой стороны. Также можно наклонять мачту для бурения под углом. В этом случае ось вращения другая, а штифты позволяют зафиксировать мачту с шагом 5º в диапазоне углов от 0 до 20º.
На мачте установлен вращатель, который обеспечивает вращательное усилие при бурении, и может двигаться вдоль мачты по направляющим вниз и вверх.
Подъем и опускание вращателя и величина усилия, действующего на буровое долото, контролируются системой подачи, которая представляет собой систему блоков (почти как на физике в школе: подвижные и неподвижные блоки, тросы, грузы).
Бурильная колонна (буровой став) состоит из буровых штанг, вспомогательных доборов и долота, соединенных резьбовыми соединениями
Можно использовать одну штангу или несколько, соединенные вместе, если требуется большая глубина.
Буровые штанги представляют собой круглые полые металлические трубы (массой примерно 1,5 тонны). Штанги имеют специальные плоские лыски на каждом конце, чтобы их можно было зажимать и удерживать «вилкой» (см. далее) при накручивании и раскручивании. Штанги полые, чтоб при бурении подавать воздух в скважину под давлением.
Буровое долото расположено в нижней части бурильной колонны. Трехшарошечное долото, используемое на нашем станке, имеет твердосплавные зубья, которые вдавливаются в землю и бурят скважину при достаточном давлении и крутящем моменте. Альтернативно применяют и пневмоударное буровое долото.
Люнет на мачте нужен, чтоб поддерживать буровую штангу при раскручивании и накручивании, замене долот и при начале бурения новой скважины. Он подводится к буровой штанге и отводится от нее с помощью гидравлического цилиндра.
Вилка расположена внизу мачты, где буровая штанга проходит через отверстие в палубе. С помощью гидравлических цилиндров ее также можно перемещать по направлению к буровой штанге и от нее. Вилка удерживает (в специальных лысках) часть бурильной колонны, которая находится ниже нее, при накручивании или откручивании штанг. Вилка также удерживают втулку палубы в нужном положении.
Ключ расположен в передней части мачты над вилкой и используется вместе с ней для разделения штанг бурильной колонны путем захвата и вращения в обратном направлении для ослабления резьбы. Почти робот-манипулятор на борту.
Самый интересный (по названию) компонент, карусель, – это поворотный барабан для дополнительных штанг (у PV 271 их две). С помощью карусели дополнительную штангу можно подводить для накручивания к вращателю и увеличения глубины бурения. Кстати, штанги на карусели вставлены в стаканы (еще одно интересное название). Управлений здесь два – приведение и отведение основной оси карусели к оси вращателя и выбор штанги (индекс).
Пылезащитная шторка установлена вокруг бурильной колонны между нижней частью буровой палубы и землей и нужна для удержания пыли внутри (уменьшая ее количество вокруг).
Итак, основное из того, чем нужно управлять на станке:
-
главный дизельный двигатель (здесь управления немного – переключение между рабочим режимом и режимом ожидания, ну и заглушить можно, если что);
-
гусеницы;
-
домкраты;
-
скорость подачи и давление на став;
-
вращатель – обороты и момент вращения;
-
подача воздуха в скважину;
-
подача воды в скважину (против пыли);
-
закрытие (тоже чтобы пыль меньше летела при бурении) и открытие (чтобы не мешали при езде) шторок;
-
открытие и закрытие люнета («руки», которая поддерживает штангу сверху);
-
устройства наращивания и разборки бурового става – ключ страгивания резьбы, вилка, фиксирующая штангу, карусель, на которой располагаются дополнительные штанги.
Как правило, все приводы гидравлические и управляются по скорости в некотором допустимом диапазоне.
Ретрофит
Чтобы сделать роботизированный буровой станок нужно
1) работать с autonomous-ready моделями в партнерстве с заводом (ну или самим быть заводом)
или
2) немного вмешаться в уже имеющиеся на карьере буровые станки.
Преимущество первого варианта (с завода) – не нужно изобретать хаки, можно сделать все по уму. Недостатки – ограничение по модели и комплектации станка, невозможность роботизировать уже имеющиеся на карьере станки.
Второй, самый доступный способ роботизации буровых станков, называют «ретрофит», и он состоит в том, чтобы приделать к старой дрели мозги. Берется имеющийся на предприятии буровой станок и путем установки на него наших бортового компьютера, контроллеров и датчиков и подключения к его исполнительным механизмам обеспечивается возможность автономного управления с сохранением всех функций ручного управления. Где-то можно подключиться по CAN, где-то приходится включаться в аналоговые линии. Часть штатных датчиков можно использовать для роботизации, часть доустанавливаем своих.
На схеме то, над чем трудятся наши инженеры: что и куда поставить на станке, да так, чтобы это работало и в жару, и в холод, и в пыль, и в дождь.
Ингредиенты (архитектура системы)
У нашей системы 3 основных компонента:
-
бортовая система управления, работающая непосредственно на станке,
-
сервер диспетчеризации,
-
рабочее место оператора (РМО).
Понятно, что эти элементы связаны между собой беспроводной сетью передачи данных.
HAL
Главный скайнет в нашем роботизированном комплексе назван HAL, по мотивам другого фантастического произведения (HAL 9000, не путать с hardware abstraction layer). Это сервер, который выдает задания буровым станкам и обеспечивает интерфейс диспетчера.
Смысл такой централизации состоит как раз в том, чтобы управлять парком роботов и всех их отслеживать. В таком подходе буровой станок делает элементарные задания (как правило, на уровне скважины), а сервер отвечает за проекты и планы бурения и выдает эти задания станкам, отслеживая их работу и формируя отчеты.
Grandpa-friendly рабочее место оператора
Рабочее место в удобном вагончике без вибраций и шумов, с мягким креслом, 3-мя мониторами и сенсорной панелью, на которых выводятся показания датчиков, состояние робота и изображения с камер, а также с 3-мя джойстиками, с помощью которых, выбрав нужный режим, можно управлять всеми операциями дистанционно вручную.
Вероятно, в светлом будущем роботы будут работать совсем самостоятельно и эта часть будет не нужна. Но сейчас, во-первых, отпускать роботов вообще без мониторинга как-то страшно, а во-вторых, есть ситуации, когда нужно вмешаться человеку, например, для заправки топливом и водой, ручных операций (смена шарошки и др.), в нештатных ситуациях.
РМО, так же как и сервер HAL, рассчитано на одновременную работу с несколькими машинами (рекомендуем до 3 – 4). В один момент времени оператор наблюдает за одной машиной и может переключаться между ними, когда они запросят ручное управление при необходимости.
Для нас важно, чтобы операторы робота, среди которых немало людей с длительным опытом работы на буровом станке, могли быстро адаптироваться к удаленному рабочему месту. При проектировании интерфейса мы учитывали интерфейс ручного управления самого станка. Как показала практика, это у нас неплохо получилось, а РМО получило неофициальный бейдж «grandpa-friendly». Также мы сделали, чтобы действия по движению джойстиков зависели от выбранного режима (движение, горизонтирование, бурение, работа с механизмами).
Борт
На борту у нас шкаф с двумя компьютерами (один основной, другой для СТЗ – системы технического зрения), низкоуровневым контроллером (для реализации кучи аналоговых интерфейсов) и множество датчиков, расставленных по станку – система локализации, лидары и камеры, датчики оборотов, концевики и линейные потенциометры, IMU и инклинометры – всё, что показано на схеме в разделе «Ретрофит» выше.
Тренируемся на кошках: Симулятор
Надеюсь, к настоящему моменту примерно понятно, что мы девелопим. Следующий вопрос, как это отлаживать. Может быть, есть разработчики, которые сразу пишут рабочий код, не запуская, но слабо в это верю. Все же как-то нужно тренироваться и отлаживать код. Станок, как уже упоминалось, во дворе не стоит, да и на карьере особо не поотлаживаешь. Вопросов много, реальных ответов только три два – стенды и стимуляторы.
Собственно, симуляторов в робототехнике много – от базового Gazebo до специализированных, таких как AirSim или Carla. Мы решили пойти по пути создания своего симулятора, т.к. у нас слишком специфичный объект и окружение, а также нам была важна реалистичность визуализации (с чем, например, у Gazebo не очень) как для работы систем технического зрения, так и для обучения операторов.
Наш симулятор на уровне программных интерфейсов является полным цифровым двойником станка, имеет все те же виртуальные датчики, исполнительные механизмы и похожее поведение.
Он реализован в Unity3d, в начале мы впечатлялись открытым кодом LGSVL, но делали свою физику – модели гидравлики + кинематика движений рабочих органов (для сложных объектов джойнты Unity3d не рекомендую, слишком нестабильные).
Для тестирования различных ситуаций мы разработали трехмерную модель карьера с несколькими рабочими площадками с разными условиями (наклоны, неровности, форма, препятствия, валы и т.п.).
Кроме простых датчиков, у нас симулируются трехмерные лидары (с выдачей облаков точек) и камеры кругового обзора (с выдачей видеопотоков, как настоящие, по rtsp).
А еще использование симулятора позволяет делать то, что не будешь делать с реальным станком – симулировать отказы (датчиков и исполнительных механизмов), или опасные ситуации (застревания при бурении, большие углы наклона, работа у обрыва и др.). Для автоматизации мы реализовали API и интегрировали с тестами.
Итак, симулятор позволяет все удобно потестить, а также продемонстрировать красивенько без потеков масла и слоев пыли и глины, как это работает, чем и займемся далее.
Создание плана
Планирование взрыва, как уже я упоминал, отдельная история со своими инструментами (предприятия используют такие CAD системы, как Геомикс, BlastMaker или другие). Мы в итоге получаем через систему диспетчеризации так называемый проект (или паспорт) бурения – расчетные положения скважин и их глубину, границы участка.
На основе этих данных оператор нашей системы, примеряя на себя роль диспетчера робота, составляет рабочий план – индивидуальное задание для каждого робота на блоке. Основная работа тут – определение последовательности бурения скважин и задание границ работы робота.
Готовый план диспетчер назначает конкретному буровому станку и запускает выполнение. Далее сервер HAL взаимодействует со станком, последовательно выдавая ему скважины для работы.
Архитектура бортового софта (Много стиральных машин)
Так как дальше я буду рассказывать про реализацию функций робота, которые обеспечиваются бортовым софтом, думаю, будет уместно описать основные принципы, как этот бортовой софт организуется.
Первый момент. Модульность, то есть реализация отдельных программных частей в отдельных процессах и использование межпроцессного обмена (publisher/subscriber и rpc), в общем ROS, робототехники знают. Мы сделали свою надстройку со стандартными проверками данных (на валидность, задержки) на уровне подписчиков, прокинули во все модули использование флага разрешения движения и режима робота, встроили интегрированную с РМО систему событий, а также реализовали ноды (отдельные программы в ROS) как конечные автоматы.
Второй момент. Способ организации логики программы. Можно, конечно, писать кучу if/else или switch, но при сколько-нибудь сложной логике код становится запутанным и сложно модифицируемым. Поэтому нужны подходы к описанию логики работы системы и ее реализации в программе. Применительно к роботам я знаю два часто встречающихся подхода – это конечные автоматы (Finite-state machine, FSM) и деревья поведения (Behavior Tree).
Конечные автоматы – это база, 101, то, как работают стиральные машины и множество других автоматов. Есть конечное число состояний системы и в каждом состоянии выполняются соответствующие команды (действия). При заданных условиях выполняется переход из одного состояния в следующее. В конечном итоге такая структура позволяет реализовать сложную функциональность автомата, обеспечивая лучшую читаемость блоков кода, упрощая разработку и отладку.
Деревья поведения (см. статью) – более модерновый подход, больше похожий на сценарии. Основные особенности – это ветвление и возможность реализации сложного сценария как набора более простых.
Но и с конечными автоматами тоже есть подход так называемых вложенных или иерархических конечных автоматов, когда мы группируем «мелкие» состояния в отдельных конечных автоматах, а над ними ставим еще один, который уже работает с более укрупненными состояниями.
Много здесь рассуждать не буду, FSM vs Behavior Tree – это тема для отдельных статей и холиваров. Но на мой вкус, вложенные конечные автоматы все же лучше укладываются в модульную архитектуру ROS.
В нашем роботе большинство нод – это конечный автомат и есть несколько уровней этих автоматов:
-
главный автомат, отвечающий за цепочку технологических операций: подъехать к месту новой скважины, горизонтироваться, пробурить, двигаться к следующей;
-
автоматы, отвечающие за отдельные операции: при горизонтировании есть состояния касания земли домкратами, подъема, выравнивания; для движение к скважине выполняется построение маневра, затем само движение и точное позиционирование над скважиной; при бурении есть подсостояния забуривания, непосредственно бурение, протяжки и другие;
-
более низкоуровневые, отвечающие за управление отдельными исполнительными механизмами, например, вилкой, ключем и люнетом (с простыми состояниями типа открыт, закрыт, открывается и контролем исполнения команд по датчикам обратной связи).
Высокоуровневый главный автомат раздает задания (экшены, actions) автоматам, отвечающим за отдельную операцию, а те – автоматам, отвечающим за исполнительные механизмы. С некоторыми упрощениями и нарушив все нотации UML, я постарался изобразить это на схеме ниже.
Таким образом сохраняется простота отдельных конечных автоматов (в них нет огромного количества состояний и условий переходов между ними). А «вложенность» этих автоматов, их взаимодействие реализуется в обычной парадигме ROS.
Движение
Перед тем как бурить скважину, робот должен точно подъехать и спозиционировать бур в ее координатах.
Классическая система навигации в мобильных роботах состоит из локализации (определения своего положения в пространстве), планирования движения (по какой траектории проехать из текущей точки в целевую, ни во что не врезавшись и, желательно, побыстрее) и регулятора (управление колесами или в нашем случае гусеницами так, чтобы следовать спланированной траектории).
Условия большинства открытых карьеров позволяют использовать высокоточную навигацию RTK, которая позволяет получить сантиметровую точность спутниковой навигации с использованием наземной станции поправок. Эти системы активно используются и без роботизации, так что в части реализации локализации для нашего робота нам сильно повезло и использование сложных (и не всегда надежных) SLAM-алгоритмов на практике нужно разве что в случаях кратковременной потери связи.
Основной задачей в части планирования является построение траектории маневра от текущего положения к месту новой скважины, минуя известные препятствия (к которым относятся и пробуренные скважины, по которым нельзя ехать, чтобы их не засыпать). Для этого используем алгоритм Дейкстры и кривые Дубинса.
Для движения по спланированной траектории тоже используем вполне классические ПИД-регуляторы. По достижении целевой точки есть этап точного наведения на скважину, когда робот работает на пониженной скорости, отдавая приоритет точности позиционирования буровой колонны.
Обнаружение препятствий
На карьере, как правило, совсем посторонней техники на площадке не бывает. Тем не менее, для полноценного автономного движения роботу все равно нужно уметь распознавать препятствия на пути, например, машину-заправщик, пикап обслуживающей команды или человека. Также важно определять границы участка, обозначенные специальными предохранительными валами (насыпями). Для целей безопасности важно анализировать проходимость поверхности, видеть «стенку» из скалы и обрыв.
Для этого мы используем, прежде всего, 3D-лидары. Они установлены спереди и сзади (т.к. робот движется и вперед, и назад – как быстрее) так, чтобы в область их видимости попадала поверхность вблизи робота и препятствия по пути движения.
Программное обеспечение на борту робота анализирует облака точек, поступающие с лидаров, и для каждого «кадра» выполняет сегментацию на основе геометрических дескрипторов, определяя к чему относится та или иная точка — поверхности земли, предохранительному валу (по которому строится граница участка) или препятствию.
Также робот оборудован системой камер для кругового обзора. Они используются как оператором при дистанционном управлении и для контроля за обстановкой, так и роботом, который детектирует на изображениях известные объекты. Мы дообучили Yolo на наиболее часто встречающиеся типы объектов — люди, техника (бульдозеры, самосвалы, грузовики-заправщики, авто).
При обнаружении препятствий на критическом расстоянии по лидарным данным или объектов в заданных зонах на изображениях с камер робот останавливается и запрашивает дистанционное управление. Автоматический объезд в большинстве случаев не нужен, потому что в норме рядом с роботом никого не должно быть, и само появление препятствия настолько близко — уже нештатная ситуация.
Горизонтирование
Горизонтирование – поднятие и выравнивание станка по углам на домкратах – нужно для подготовки к бурению.
Честно говоря, я недооценивал сложность этого модуля. Вроде бы 3 домкрата и 2 желаемых угла (нули по roll и pitch), но столько нюансов. Даже если поверхность ровная и не нужно горизонтироваться, все равно домкраты обязательно должны упираться в землю для устойчивости при бурении. Нельзя поднимать станок на домкратах слишком высоко, а также нужно учитывать ограниченность длин домкратов. Для оптимизации времени горизонтирования желательно управлять всеми домкратами одновременно, и при этом важно в любой момент не увеличивать наклон станка. А еще могут быть станки с датчиком касания земли и без него, с информацией о длинах выдвинутых домкратов и без.
Бурение
У нашей «дрели» есть следующие управления:
-
подача бура: движение вращателя относительно мачты вверх/вниз и усилие, с которым давить на породу при бурении;
-
вращения бура: скорость и ограничение на крутящий момент;
-
подача воздуха в скважину, чтобы выдувать смолотую породу, и подача воды, чтобы было меньше пыли, шторка от пыли и даже пылесос (если есть).
Наш алгоритм бурения непрерывно управляет всеми узлами бурового станка, регулируя давление воздуха, давление на забой, движение бурового става, скорость и силу вращения в реальном времени. Главная магия – в соотношении давлений на забой и оборотов вращения. Здесь есть оптимальная величина, которая позволяет бурить быстрее. Найти ее проще всего на исторических данных на данном карьере, но также можно пытаться оценивать математически, в том числе с использованием данных гранулометрического анализа после взрывных работ.
Также для адаптации к различным условиям карьера мы разработали систему «профилей бурения». Каждый профиль – это набор настроек, определяющих параметры работы, такие как максимальное усилие или частота протяжек. Оператор может выбирать профиль в зависимости от типа породы: трещиноватая, обводненная, твердая.
Для предупреждения застреваний модуль регулярно выполняет протяжки става – короткие и длинные. Это помогает очищать скважину и поддерживать эффективность бурения.
Наращивание и разборка бурового става
Это просто танец конечных автоматов – тут задействовано и движение става, и вращение, и вилка, и ключ, и карусель, и люнет.
О чем вообще речь? Длина буровой колонны (сборной штанги, внизу которой бур, а вверху вращатель) ограничена размерами буровой мачты. Она и так метров 20, больше уже возить тяжело. А если хочется бурить скважины глубже, чем длина буровой колонны, то нужно… эту длину нарастить. Но сначала пробурить сколько можем имеющейся, а потом, оставив ее в скважине, прикрутить сверху еще одну штангу и продолжить бурить дальше. После бурения, буровую колонну нужно разбирать (иначе ее часть так и останется в скважине, даже при максимальном поднятии вращателя) и укладывать обратно на карусели.
Fin
Ответ на вопрос из заголовка, как разрабатывать софт автономного бурового станка, представлен выше. Если кратко, нужен симулятор и ssh для накатывания обновлений и человек на месте, который откатит все обратно, если что 🙂 На самом деле, все несколько сложнее: нужно понимание процессов, инженерное обследование на карьере, без этого никуда. Потом, уже после установки оборудования, нужно проводить калибровки и прочую пусконаладку, замечать и устранять возможные несоответствия между симулятором и реальностью. А остальную работу по софту по большей части действительно можно делать на симуляторе, внедряя робота и обновления уже в хорошей степени подготовленные и протестированные.
В завершение вот несколько фото и видео с карьеров.
В целом наша область богата на экзотические места внедрения, такие как Бурятия, наша первая точка.
Внедрение в Перу выделяется положительными температурами, большой высотой над уровнем моря и частыми штормовыми предупреждениями, когда людям работать нельзя, а роботу можно и разрешить. Кроме того, это позволило поработать в условиях, когда широта и долгота со знаком минус.
Спасибо за внимание! Надеюсь, мне удалось показать, что роботы могут помогать в действительно физически тяжелой работе, а не только заменить человека в творческих специальностях.
Напоминаю, что рассказ о нашем проекте также доступен в формате видео.