From 22eab960605b39dc1738d3aa7d01b5bce9d22cd5 Mon Sep 17 00:00:00 2001 From: alisagerasimova Date: Mon, 2 Mar 2026 21:05:09 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=B2.=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - сделала функцию с кьюар кодом --- public/shablons/emergency_and_navigate.txt | 1 + public/shablons/qr.txt | 12 +--------- src/App.vue | 26 ++++++++++++++++++++++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/public/shablons/emergency_and_navigate.txt b/public/shablons/emergency_and_navigate.txt index 5889c07..f80df0d 100644 --- a/public/shablons/emergency_and_navigate.txt +++ b/public/shablons/emergency_and_navigate.txt @@ -85,6 +85,7 @@ def signal_handler(sig, frame): signal.signal(signal.SIGINT, signal_handler) +<> def main(): navigate_wait(z=1,frame_id='body',auto_arm=True) #должно быть. включает моторы и поднимает дрон на метр вверх diff --git a/public/shablons/qr.txt b/public/shablons/qr.txt index b31ddde..73e211e 100644 --- a/public/shablons/qr.txt +++ b/public/shablons/qr.txt @@ -13,14 +13,4 @@ class QrDetect(): barcodes = pyzbar.decode(cv_image) if barcodes: - self.qr_data = barcodes[0].data.decode('utf-8') - - -#в MAIN для вызова функции необходимо следующее: -#1. создаём и вызываем подписчика, который вызывает функцию чтения кьюаркода -qd = QrDetect() -qr_sub = rospy.Subscriber('main_camera/image_raw',Image, qd.qr_detection,queue_size=1) -#2. задаём время работы подписчика (за 1 секунду примерно 20 раз вызывается функция) -rospy.sleep(2) -#3. выключаем подписчика -qr_sub.unregister() + self.qr_data = barcodes[0].data.decode('utf-8') \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 6f5d21d..46a1257 100644 --- a/src/App.vue +++ b/src/App.vue @@ -11,6 +11,14 @@ const clickCount = ref(1); // Счетчик нажатий const listOfTrips = ref([]); const isModalVisible = ref(false); let finallyText = ""; +const qr_sub_text = [ + "\tqd = QrDetect()\n", + "\tqr_sub = rospy.Subscriber('main_camera/image_raw',Image, qd.qr_detection,queue_size=1)\n", + "\trospy.sleep(2)\n", + "\tqr_sub.unregister()\n" +]; +let is_qr_used = 0; +let head = ""; onMounted(() => { for (let i = 0; i < 100; i++) { @@ -49,13 +57,31 @@ function saveResult() { let navigate_waites = ""; for (const item of listOfTrips.value) { navigate_waites += `\tnavigate_wait(${item.x}, ${item.y})\n`; + if (item.x===1 && item.y === 1) { + navigate_waites += qr_sub_text.join('') + is_qr_used=1 } + } + fetch("/shablons/emergency_and_navigate.txt") .then((response) => response.text()) .then((textOfCode) => { finallyText = textOfCode.replace("<>", navigate_waites); }); isModalVisible.value = true; + if (is_qr_used === 1) { + Qr_head() + is_qr_used +=1 + } +} + +function Qr_head() { + fetch("/shablons/qr.txt") + .then((response) => response.text()) + .then((textOfCode) => { + head = textOfCode; + finallyText = finallyText.replace("<>", head); + }) } function cancel() { From 753963070a8eaa898a2e4788e484bab964d387eb Mon Sep 17 00:00:00 2001 From: alisagerasimova Date: Thu, 5 Mar 2026 14:34:31 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20saveResult?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/shablons/color.txt | 85 ++++++++++------------ public/shablons/emergency_and_navigate.txt | 2 + public/shablons/qr.txt | 21 ++---- src/App.vue | 25 +++---- 4 files changed, 58 insertions(+), 75 deletions(-) diff --git a/public/shablons/color.txt b/public/shablons/color.txt index 6571542..ccd0997 100644 --- a/public/shablons/color.txt +++ b/public/shablons/color.txt @@ -1,54 +1,47 @@ -class ColorDetect(): - def __init__(self): - self.color = None +def color_detection(data, print_type='str'): + '''определение цвета''' - def getColor(self): - return self.color + frame = bridge.imgmsg_to_cv2(data, 'bgr8') + height, width = frame.shape[:2] + y_start = int(height * 0.33) + y_end = int(height * 0.67) + x_start = int(width * 0.31) + x_end = int(width * 0.69) - def detect_color_callback(self, data, print_type='str'): - '''определение цвета''' + cropped_frame = frame[y_start:y_end, x_start:x_end] + + if cropped_frame.size == 0: + return + - frame = bridge.imgmsg_to_cv2(data, 'bgr8') - height, width = frame.shape[:2] - y_start = int(height * 0.33) - y_end = int(height * 0.67) - x_start = int(width * 0.31) - x_end = int(width * 0.69) + if print_type == 'rgb': - cropped_frame = frame[y_start:y_end, x_start:x_end] + mean_bgr = cv2.mean(cropped_frame)[:3] + mean_rgb = (int(mean_bgr[2]), int(mean_bgr[1]), int(mean_bgr[0])) + color = str(mean_rgb) + + + elif print_type == 'str': + + # Получаем средние значения BGR + mean_bgr = cv2.mean(cropped_frame)[:3] + b, g, r = int(mean_bgr[0]), int(mean_bgr[1]), int(mean_bgr[2]) - if cropped_frame.size == 0: - return - - if print_type == 'rgb': - - mean_bgr = cv2.mean(cropped_frame)[:3] - mean_rgb = (int(mean_bgr[2]), int(mean_bgr[1]), int(mean_bgr[0])) - self.color = str(mean_rgb) - - - elif print_type == 'str': - - # Получаем средние значения BGR - mean_bgr = cv2.mean(cropped_frame)[:3] - b, g, r = int(mean_bgr[0]), int(mean_bgr[1]), int(mean_bgr[2]) - - - if b > g and b > r and b > 100: - self.color = 'blue' - elif g > b and g > r and g > 100: - self.color = 'green' - elif r > b and r > g and r > 100: - self.color = 'red' - else: - self.color = None + if b > g + 20 and b > r + 20 and b > 100 + 20: + color = 'blue' + elif g > b + 20 and g > r + 20 and g > 100: + color = 'green' + elif r > b + 20 and r > g + 20 and r > 100: + color = 'red' + elif r > 150 and g > 150 and g > 150: + color= 'white' + else: + color = None #в MAIN для вызова функции должно быть: -# cd = ColorDetect() - #color_sub = rospy.Subscriber('main_camera/image_raw', Image, - #lambda img: cd.detect_color_callback(img, print_type='rgb'), - #queue_size=1) - # print(cd.getColor()) - #rospy.sleep(2) - #color_sub.unregister() +#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() diff --git a/public/shablons/emergency_and_navigate.txt b/public/shablons/emergency_and_navigate.txt index f80df0d..21aff07 100644 --- a/public/shablons/emergency_and_navigate.txt +++ b/public/shablons/emergency_and_navigate.txt @@ -17,6 +17,8 @@ get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry) #сеов navigate = rospy.ServiceProxy('navigate', srv.Navigate) #сервис для полета по указаным координатам land = rospy.ServiceProxy('land', Trigger) #сервис для посадки +rospy.init_node('flight') +bridge = CvBridge() def navigate_wait(x=0, y=0, z=1, speed=0.5, frame_id='aruco_map', auto_arm=False, tolerance=0.2,sleep=2): """ diff --git a/public/shablons/qr.txt b/public/shablons/qr.txt index 73e211e..32220f8 100644 --- a/public/shablons/qr.txt +++ b/public/shablons/qr.txt @@ -1,16 +1,7 @@ -class QrDetect(): - def __init__(self): - self.qr_data = '' - - def getQrData(self): - return self.qr_data +def qr_detection(data): + cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') + barcodes = pyzbar.decode(cv_image) - def qr_detection(self,data): - '''сканирование qr кода''' - if self.qr_data!= '': - return - cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') - barcodes = pyzbar.decode(cv_image) - - if barcodes: - self.qr_data = barcodes[0].data.decode('utf-8') \ No newline at end of file + if barcodes: + qr_data = barcodes[0].data.decode('utf-8') + return qr_data \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 46a1257..368b9e3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -11,14 +11,12 @@ const clickCount = ref(1); // Счетчик нажатий const listOfTrips = ref([]); const isModalVisible = ref(false); let finallyText = ""; -const qr_sub_text = [ - "\tqd = QrDetect()\n", - "\tqr_sub = rospy.Subscriber('main_camera/image_raw',Image, qd.qr_detection,queue_size=1)\n", - "\trospy.sleep(2)\n", - "\tqr_sub.unregister()\n" -]; -let is_qr_used = 0; -let head = ""; +const qr_sub_text = ` + \tqr_sub = rospy.Subscriber('main_camera/image_raw',Image, qr_detection,queue_size=1)\n + \trospy.sleep(2)\n + \tqr_sub.unregister()\n +` +let is_qr__head_used = 0; onMounted(() => { for (let i = 0; i < 100; i++) { @@ -58,8 +56,8 @@ function saveResult() { for (const item of listOfTrips.value) { navigate_waites += `\tnavigate_wait(${item.x}, ${item.y})\n`; if (item.x===1 && item.y === 1) { - navigate_waites += qr_sub_text.join('') - is_qr_used=1 + navigate_waites += qr_sub_text + is_qr__head_used=1 } } @@ -69,9 +67,9 @@ function saveResult() { finallyText = textOfCode.replace("<>", navigate_waites); }); isModalVisible.value = true; - if (is_qr_used === 1) { + if (is_qr__head_used === 1) { Qr_head() - is_qr_used +=1 + is_qr__head_used +=1 } } @@ -79,8 +77,7 @@ function Qr_head() { fetch("/shablons/qr.txt") .then((response) => response.text()) .then((textOfCode) => { - head = textOfCode; - finallyText = finallyText.replace("<>", head); + finallyText = finallyText.replace("<>", textOfCode); }) } From f97d8e80c2c12054ad386e935e0457d31a67b32a Mon Sep 17 00:00:00 2001 From: alisagerasimova Date: Sat, 7 Mar 2026 22:46:41 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D1=8C?= =?UTF-8?q?=D1=8E=D0=B0=D1=80,=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D1=87=D0=B8=D0=BA=D0=B0=20=D0=B8=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2=D0=BE=D0=BC=20=D0=BA=D0=BE=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 19 ++++++------ public/images/qr.jpg | Bin 0 -> 9221 bytes public/shablons/qr.txt | 7 ++++- src/App.vue | 64 +++++++++++++++++++++++++++-------------- 4 files changed, 59 insertions(+), 31 deletions(-) create mode 100644 public/images/qr.jpg diff --git a/package-lock.json b/package-lock.json index 4f5c1ff..2c416e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -616,7 +616,6 @@ "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", @@ -1753,7 +1752,6 @@ "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@inquirer/checkbox": "^3.0.1", "@inquirer/confirm": "^4.0.1", @@ -2912,7 +2910,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2979,7 +2976,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3197,7 +3193,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4504,6 +4499,17 @@ "dev": true, "license": "MIT" }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -8024,7 +8030,6 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -8084,7 +8089,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz", "integrity": "sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.28", "@vue/compiler-sfc": "3.5.28", @@ -8138,7 +8142,6 @@ "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", diff --git a/public/images/qr.jpg b/public/images/qr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61474b161a828c7999b60cb898c01338e8caf6c6 GIT binary patch literal 9221 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 b>+D$snWIKZFkutinRQ^V> + 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 diff --git a/src/App.vue b/src/App.vue index 0c2713a..64395fb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -12,12 +12,6 @@ const clickCount = ref(1); // Счетчик нажатий const listOfTrips = ref([]); const isModalVisible = ref(false); let finallyText = ref(""); -const qr_sub_text = ` - \tqr_sub = rospy.Subscriber('main_camera/image_raw',Image, qr_detection,queue_size=1)\n - \trospy.sleep(2)\n - \tqr_sub.unregister()\n -` -let is_qr__head_used = 0; onMounted(() => { for (let i = 0; i < 100; i++) { @@ -27,6 +21,7 @@ onMounted(() => { y: 9 - Math.floor(i / 10), index: i, isPlatform: false, + isQR: false, BgImg: 'images/ArUco-marker.jpg' }); } @@ -58,8 +53,11 @@ async function saveResult() { finallyText.value = ""; const mainCode = ref(""); const colorDetectClass = ref(""); + const QRDetectClass = ref(""); const colorDetectCode = ref(""); + const QRDetectCode = ref(""); const isUsedPlatform = listOfTrips.value.some(item => item.isPlatform); + const isUsedQR = listOfTrips.value.some(item => item.isQR); if (isUsedPlatform) { const response = await fetch("/shablons/color.txt") @@ -69,11 +67,22 @@ async function saveResult() { colorDetectCode.value += `\t${textOfCode[1].trim()}\n`; } + if (isUsedQR) { + const response = await fetch("/shablons/qr.txt") + let textOfCode = await response.text() + textOfCode = textOfCode.split('<>') + QRDetectClass.value = textOfCode[0] + QRDetectCode.value += `\t${textOfCode[1].trim()}\n`; + } + for (const item of listOfTrips.value) { mainCode.value += `\tnavigate_wait(${item.x}, ${item.y})\n`; - if (isUsedPlatform) { + if (item.isPlatform) { mainCode.value += colorDetectCode.value + '\n' } + if (item.isQR) { + mainCode.value += QRDetectCode.value + '\n' + } } const response = await fetch("/shablons/emergency_and_navigate.txt") let textOfCode = await response.text() @@ -81,20 +90,11 @@ async function saveResult() { if (isUsedPlatform) { finallyText.value = finallyText.value.replace("<>", colorDetectClass.value); } - isModalVisible.value = true; - if (is_qr__head_used === 1) { - Qr_head() - is_qr__head_used +=1 + if (isUsedQR) { + finallyText.value = finallyText.value.replace("<>", QRDetectClass.value); } -} - -function Qr_head() { - fetch("/shablons/qr.txt") - .then((response) => response.text()) - .then((textOfCode) => { - finallyText = finallyText.replace("<>", textOfCode); - }) -} + isModalVisible.value = true;} + function cancel() { @@ -177,6 +177,26 @@ function deletePlatform(item) { clickCount.value-- } +function createQR(item) { + if (!item.isQR) { + listOfTrips.value.push(item) + numbers.value[item.index].variable.push(clickCount.value); + } + item['isQR'] = true + numbers.value[item.index].BgImg = `images/qr.jpg` + clickCount.value++ +} + +function deleteQR(item) { + item['isQR'] = false + const index = listOfTrips.value.indexOf(item); + if (index !== -1) { + listOfTrips.value.splice(index, 1); + } + numbers.value[item.index].BgImg = 'images/ArUco-marker.jpg' + clickCount.value-- +} + function onContextMenu(e, item) { ContextMenu.showContextMenu({ theme: 'mac dark', @@ -209,11 +229,11 @@ function onContextMenu(e, item) { children: [ { label: "Добавить", - onClick: () => alert('Здесь ещё предстоит написать код') + onClick: () => createQR(item) }, { label: "Удалить", - onClick: () => alert('Здесь ещё предстоит написать код') + onClick: () => deleteQR(item) }, ], },