+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/CodeView.vue b/src/components/CodeView.vue
new file mode 100644
index 0000000..d26ecfc
--- /dev/null
+++ b/src/components/CodeView.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+ Вернуться к сохранению сгенерированного кода
+
+
+
+
+ Вернуться к сохранению сгенерированного кода
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/MovementButtons.vue b/src/components/MovementButtons.vue
new file mode 100644
index 0000000..1d5ee6d
--- /dev/null
+++ b/src/components/MovementButtons.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/MyDialog.vue b/src/components/MyDialog.vue
index c27b895..e8b95c7 100644
--- a/src/components/MyDialog.vue
+++ b/src/components/MyDialog.vue
@@ -1,21 +1,22 @@
-
+
-
+ Заголовок по умолчанию
-
- Тело по умолчанию
+ Тело по умолчанию
-
@@ -24,20 +25,42 @@
\ No newline at end of file
+
+/* Начало появления: ниже и прозрачный */
+.modal-fade-enter-from {
+ opacity: 0;
+}
+
+/* Конец появления: на месте и видим */
+.modal-fade-enter-to {
+ opacity: 1;
+}
+
+/* Начало исчезания: на месте и видим */
+.modal-fade-leave-from {
+ opacity: 1;
+}
+
+/* Конец исчезания: выше и прозрачный */
+.modal-fade-leave-to {
+ opacity: 0;
+}
+
+/* Общие настройки анимации (скорость + плавность) */
+.modal-fade-enter-active,
+.modal-fade-leave-active {
+ transition: transform 0.5s cubic-bezier(.22, .9, .31, 1), opacity 0.5s ease;
+ will-change: transform, opacity;
+}
+
\ No newline at end of file
diff --git a/src/components/MyDropMenu.vue b/src/components/MyDropMenu.vue
index 679e06c..90b7ba7 100644
--- a/src/components/MyDropMenu.vue
+++ b/src/components/MyDropMenu.vue
@@ -1,120 +1,200 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+ {{ infoCard.title }}
+
+
+
{{ infoCard.body }}
+
+
+
+
+
+
diff --git a/src/components/UI/CustomButton.vue b/src/components/UI/CustomButton.vue
new file mode 100644
index 0000000..cf2f853
--- /dev/null
+++ b/src/components/UI/CustomButton.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/UI/svg/Back.vue b/src/components/UI/svg/Back.vue
new file mode 100644
index 0000000..8af36c8
--- /dev/null
+++ b/src/components/UI/svg/Back.vue
@@ -0,0 +1,6 @@
+
+
+
\ No newline at end of file
diff --git a/src/components/UI/svg/Preview.vue b/src/components/UI/svg/Preview.vue
new file mode 100644
index 0000000..84fba1f
--- /dev/null
+++ b/src/components/UI/svg/Preview.vue
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/components/UI/svg/Save.vue b/src/components/UI/svg/Save.vue
new file mode 100644
index 0000000..0e8af8d
--- /dev/null
+++ b/src/components/UI/svg/Save.vue
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/components/UI/svg/Trash.vue b/src/components/UI/svg/Trash.vue
new file mode 100644
index 0000000..33a5ab3
--- /dev/null
+++ b/src/components/UI/svg/Trash.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/data/informationForDirectory.js b/src/data/informationForDirectory.js
new file mode 100644
index 0000000..adc9a74
--- /dev/null
+++ b/src/data/informationForDirectory.js
@@ -0,0 +1,74 @@
+export default [
+ {
+ title: 'ROS',
+ 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) — библиотека компьютерного зрения. С её помощью дрон распознает цвета платформ и считывает QR-коды.',
+ hrefToDoc: 'https://opencv.org/',
+ hrefToCourse: 'https://stepik.org/lesson/2272700/step/1?unit=2306893'
+ },
+ {
+ title: 'navigate_wait',
+ body: 'Navigate_wait — функция из библиотеки Clover. Отправляет дрон в точку и ждёт, пока он туда долетит, и только потом выполняет следующую команду. Это важно, потому что обычная команда navigate не ждет: дрон ещё летит, а скрипт уже бежит дальше — из-за этого следующие команды могут выполняться раньше времени.',
+ hrefToDoc: 'https://clover.coex.tech/ru/snippets.html',
+ hrefToCourse: 'https://stepik.org/lesson/2264712/step/1?unit=2298803'
+ },
+ {
+ 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: 'Топик (Topic)',
+ body: 'Топик (Topic) в ROS — канал обмена данными. Например, камера публикует изображение в топик, а ваш скрипт подписывается на него и получает кадры.',
+ hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html',
+ hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866'
+ },
+ {
+ 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 - способ вызвать функцию робота и сразу получить ответ. В отличие от топика, где данные идут постоянно, сервис работает по принципу "запрос — ответ". Например, команда navigate — это сервис: вы отправляете координаты, а робот отвечает "команда принята". Команда get_telemetry возвращает текущие координаты дрона.',
+ hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html',
+ hrefToCourse: 'https://stepik.org/lesson/2263182/step/1?unit=2297206'
+ },
+ {
+ title: 'Системы координат',
+ 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'
+ },
+]
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
index 8668dab..676d8c5 100644
--- a/src/main.js
+++ b/src/main.js
@@ -15,10 +15,12 @@ const createWindow = () => {
const mainWindow = new BrowserWindow({
width: width,
height: height,
+ icon: './public/images/logo32x32.jpg',
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
},
});
+ mainWindow.menuBarVisible = false;
// and load the index.html of the app.
if (MAIN_WINDOW_VITE_DEV_SERVER_URL) {
diff --git a/src/renderer.js b/src/renderer.js
index 4099886..c191d27 100644
--- a/src/renderer.js
+++ b/src/renderer.js
@@ -29,5 +29,9 @@
import { createApp } from 'vue';
import App from './App.vue';
import '@imengyu/vue3-context-menu/lib/vue3-context-menu.css'
+import Prism from 'prismjs'
+import 'prismjs/themes/prism-okaidia.css'
+
+
import ContextMenu from '@imengyu/vue3-context-menu'
createApp(App).use(ContextMenu).mount('#app');
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 90%
rename from public/shablons/color.txt
rename to src/shablons/color.js
index b61e0f9..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')
@@ -34,7 +34,7 @@ def color_detection(data, print_type='str'):
color = 'green'
elif r > b + 20 and r > g + 20 and r > 100:
color = 'red'
- elif r > 150 and g > 150 and g > 150:
+ elif r > 150 and g > 150 and b > 150:
color= 'white'
else:
color = None
@@ -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
diff --git a/src/shared/izitoast.js b/src/shared/izitoast.js
index 91a9911..133c879 100644
--- a/src/shared/izitoast.js
+++ b/src/shared/izitoast.js
@@ -1,7 +1,7 @@
import iziToast from 'iziToast';
iziToast.settings({
- timeout: 3000,
+ timeout: 2500,
closeOnEscape: true,
closeOnClick : true,
resetOnHover: false,