From 39e8166ae914f49a0d90aea5b1495a283c36e70c Mon Sep 17 00:00:00 2001 From: alisagerasimova Date: Sun, 22 Mar 2026 19:14:17 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/MyDropMenu.vue | 52 +++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/components/MyDropMenu.vue b/src/components/MyDropMenu.vue index b255953..53e65d1 100644 --- a/src/components/MyDropMenu.vue +++ b/src/components/MyDropMenu.vue @@ -68,58 +68,76 @@ function openInfoCard(obj) { const links = [ { title: 'ROS', - body: 'ROS (Robot Operating System) — экосистема для программирования роботов с открытым исходным кодом', + body: 'ROS (Robot Operating System) — экосистема для программирования роботов. В приложении через ROS дрон получает команды, передает телеметрию и данные с камеры.', hrefToDoc: 'https://www.ros.org/', hrefToCourse: 'https://stepik.org/lesson/2260739/step/1?unit=2294748' }, { title: 'OpenCV', - body: 'OpenCV (Open Source Computer Vision Library) — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом.', + body: 'OpenCV (Open Source Computer Vision Library) — библиотека компьютерного зрения. С её помощью дрон распознает цвета платформ и считывает QR-коды.', hrefToDoc: 'https://opencv.org/', hrefToCourse: 'https://stepik.org/lesson/2272700/step/1?unit=2306893' }, { title: 'navigate_wait', - body: 'Navigate_wait — функция в библиотеке CLOVER, которая ожидает, пока дрон долетит до целевой точки, перед выполнением следующей команды. Это полезно, так как функция navigate сразу возвращает управление: скрипт продолжает выполняться, даже если дрон ещё летит к цели. ', + body: 'Navigate_wait — функция из библиотеки Clover. Отправляет дрон в точку и ждёт, пока он туда долетит, и только потом выполняет следующую команду. Это важно, потому что обычная команда navigate не ждет: дрон ещё летит, а скрипт уже бежит дальше — из-за этого следующие команды могут выполняться раньше времени.', hrefToDoc: 'https://clover.coex.tech/ru/snippets.html', hrefToCourse: 'https://stepik.org/lesson/2264712/step/1?unit=2298803' }, { - title: 'Topic', - body: 'Топик (Topic) в ROS — это именованный канал передачи данных, через который ноды обмениваются сообщениями.', - hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', - hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' - }, - { - title: 'Нода', - body: 'Нода в ROS - исполняемая программа, которая выполняет одну задачу. ', + title: 'Нода (Node)', + body: 'Нода (Node/узел) в ROS - исполняемая программа, которая выполняет одну конкретную задачу. В сгенерированном коде вся логика полета и обработки камеры находится внутри одной ноды. Это позволяет запускать, останавливать и отлаживать программу как единое целое. ', hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', hrefToCourse: 'https://stepik.org/lesson/2261765/step/1?unit=2295758' }, { - title: 'Издатель', - body: 'Издатель (Publisher) в ROS — это узел, который производит данные. Он может публиковать сообщения определённого типа в заданной теме и делать их доступными для других узлов (подписчиков). ', + title: 'Топик (Topic)', + body: 'Топик (Topic) в ROS — канал обмена данными. Например, камера публикует изображение в топик, а ваш скрипт подписывается на него и получает кадры.', hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' }, { - title: 'Подписчик', - body: 'Подписчик (Subscriber) в ROS — это узел, который получает сообщения и информацию, публикуемые в определённой теме (канале) ROS.', + title: 'Издатель (Publisher)', + body: 'Издатель (Publisher) в ROS — часть программы, которая отправляет данные в топик. Например, если нужно передать команду другому узлу или опубликовать координаты дрона — создается издатель, который публикует сообщения в нужный канал. Подписчики других узлов могут эти данные получать. ', + hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', + hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' + }, + { + title: 'Подписчик (Subscriber)', + body: 'Подписчик (Subscriber) в ROS — часть программы, которая получает данные из топика. Например, чтобы дрон "видел" изображение с камеры или считывал свои координаты, создаётся подписчик на соответствующий топик. Как только в топике появляются новые данные, подписчик автоматически их обрабатывает.', hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' }, { title: 'Сервис', - body: 'Сервис в ROS - это функция, которую мы можем вызвать, чтобы либо дать команду роботу,либо получить от него какую-то информацию.', + body: 'Сервис в ROS - способ вызвать функцию робота и сразу получить ответ. В отличие от топика, где данные идут постоянно, сервис работает по принципу "запрос — ответ". Например, команда navigate — это сервис: вы отправляете координаты, а робот отвечает "команда принята". Команда get_telemetry возвращает текущие координаты дрона.', hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', hrefToCourse: 'https://stepik.org/lesson/2263182/step/1?unit=2297206' }, { title: 'Системы координат', - body: 'Системы координат в Clover позволяют определять местоположение дрона относительно разных точек отсчёта, что важно для автономного полёта, навигации и других задач. Наиболее часто используемые: aruco_map и body', + body: 'Определяют, откуда отсчитывать координаты дрона. body — относительно самого дрона (вперед/назад/влево/вправо). aruco_map — относительно карты с ArUco-метками, где координаты привязаны к неподвижным маркерам. Выбор правильной системы координат позволяет дрону точно выполнять команды: лететь относительно себя для коротких маневров или по глобальной карте для точной навигации.', hrefToCourse: 'https://stepik.org/lesson/2264336/step/1?unit=2298407', hrefToDoc: 'https://clover.coex.tech/ru/frames.html' }, + { + title: 'ArUco-маркер', + body: 'ArUco-маркер — квадратный визуальный маркер, который камера дрона может распознавать. Используется для навигации: по положению маркера дрон определяет свои координаты в пространстве.', + hrefToCourse: 'https://stepik.org/lesson/2264336/step/1?unit=2298407', + hrefToDoc: 'https://klever-doc.tech/ROS1/ru/aruco.html' + }, + { + title: 'Симулятор (Gazebo)', + body: 'Симулятор (Gazebo) — виртуальная среда, где дрон ведет себя как в реальности. Позволяет безопасно тестировать полетные задания перед запуском на реальном дроне.', + hrefToCourse: 'https://stepik.org/lesson/2278310/step/1?unit=2312564', + hrefToDoc: 'https://klever-doc.tech/ROS1/ru/simulation.html' + }, + { + title: 'unregister()', + body: 'unregister() — метод, который отключает подписчика от топика. Используется, чтобы перестать получать данные, когда они больше не нужны (например, после сканирования QR-кода).', + hrefToCourse: 'https://stepik.org/lesson/2272845/step/1?unit=2307058', + hrefToDoc: 'https://docs.ros.org/en/diamondback/api/rospy/html/rospy.topics.Subscriber-class.html' + }, ] // Экспортируем методы, если захотим управлять меню извне From 8cf2f8bd06ccf817255c08b14c039d48b7a6ede0 Mon Sep 17 00:00:00 2001 From: alisagerasimova Date: Tue, 24 Mar 2026 13:35:03 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B=20=D1=88?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 14 ++++++++------ {public => src}/shablons/README.md | 0 public/shablons/color.txt => src/shablons/color.js | 4 ++-- .../shablons/emergency_and_navigate.js | 4 ++-- public/shablons/qr.txt => src/shablons/qr.js | 4 ++-- 5 files changed, 14 insertions(+), 12 deletions(-) rename {public => src}/shablons/README.md (100%) rename public/shablons/color.txt => src/shablons/color.js (93%) rename public/shablons/emergency_and_navigate.txt => src/shablons/emergency_and_navigate.js (98%) rename public/shablons/qr.txt => src/shablons/qr.js (82%) diff --git a/src/App.vue b/src/App.vue index 333ad51..88c3d2f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,6 +8,11 @@ import copyToclipboard from "@/shared/copyToclipboard"; import ContextMenu from "@imengyu/vue3-context-menu"; import CustomButton from '@/components/UI/CustomButton.vue' +import emergencyAndNavigate from './shablons/emergency_and_navigate.js' +import color from './shablons/color.js' +import qr from './shablons/qr.js' + + const numbers = ref([]); // Инициализируем массив с пустыми строками const clickCount = ref(1); // Счетчик нажатий const listOfTrips = ref([]); @@ -61,16 +66,14 @@ async function saveResult() { const isUsedQR = listOfTrips.value.some(item => item.isQR); if (isUsedPlatform) { - const response = await fetch("/shablons/color.txt") - let textOfCode = await response.text() + let textOfCode = color textOfCode = textOfCode.split('<>') colorDetectClass.value = textOfCode[0] colorDetectCode.value += `\t${textOfCode[1].trim()}\n`; } if (isUsedQR) { - const response = await fetch("/shablons/qr.txt") - let textOfCode = await response.text() + let textOfCode = qr textOfCode = textOfCode.split('<>') QRDetectClass.value = textOfCode[0] QRDetectCode.value += `\t${textOfCode[1].trim()}\n`; @@ -85,8 +88,7 @@ async function saveResult() { mainCode.value += QRDetectCode.value + '\n' } } - const response = await fetch("/shablons/emergency_and_navigate.txt") - let textOfCode = await response.text() + let textOfCode = emergencyAndNavigate finallyText.value = textOfCode.replace("<
>", mainCode.value); if (isUsedPlatform) { finallyText.value = finallyText.value.replace("<>", colorDetectClass.value); diff --git a/public/shablons/README.md b/src/shablons/README.md similarity index 100% rename from public/shablons/README.md rename to src/shablons/README.md diff --git a/public/shablons/color.txt b/src/shablons/color.js similarity index 93% rename from public/shablons/color.txt rename to src/shablons/color.js index 71cdb2c..5ff4784 100644 --- a/public/shablons/color.txt +++ b/src/shablons/color.js @@ -1,4 +1,4 @@ -def color_detection(data, print_type='str'): +export default `def color_detection(data, print_type='str'): '''определение цвета''' frame = bridge.imgmsg_to_cv2(data, 'bgr8') @@ -42,4 +42,4 @@ def color_detection(data, print_type='str'): <> color_sub = rospy.Subscriber('main_camera/image_raw', Image, lambda img: color_detection(img, print_type='rgb'), queue_size=1) rospy.sleep(2) - color_sub.unregister() \ No newline at end of file + color_sub.unregister()` \ No newline at end of file diff --git a/public/shablons/emergency_and_navigate.txt b/src/shablons/emergency_and_navigate.js similarity index 98% rename from public/shablons/emergency_and_navigate.txt rename to src/shablons/emergency_and_navigate.js index 1114350..1e8546c 100644 --- a/public/shablons/emergency_and_navigate.txt +++ b/src/shablons/emergency_and_navigate.js @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +export default `#!/usr/bin/env python3 import rospy import time @@ -102,4 +102,4 @@ def main(): land() #посадка if __name__ == "__main__": - main() + main()` diff --git a/public/shablons/qr.txt b/src/shablons/qr.js similarity index 82% rename from public/shablons/qr.txt rename to src/shablons/qr.js index c877557..46c5e82 100644 --- a/public/shablons/qr.txt +++ b/src/shablons/qr.js @@ -1,4 +1,4 @@ -def qr_detection(data): +export default `def qr_detection(data): cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') barcodes = pyzbar.decode(cv_image) @@ -9,4 +9,4 @@ def qr_detection(data): <> qr_sub = rospy.Subscriber('main_camera/image_raw', Image, qr_detection, queue_size=1) rospy.sleep(2) - qr_sub.unregister() \ No newline at end of file + qr_sub.unregister()` \ No newline at end of file