Merge branch 'gerasimova-dev' into develop
# Conflicts: # src/components/MyDropMenu.vue
This commit is contained in:
+8
-6
@@ -9,6 +9,11 @@ import ContextMenu from "@imengyu/vue3-context-menu";
|
||||
import CustomButton from '@/components/UI/CustomButton.vue'
|
||||
import CodeView from "@/components/CodeView.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([]);
|
||||
@@ -63,16 +68,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('<<separator>>')
|
||||
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('<<separator>>')
|
||||
QRDetectClass.value = textOfCode[0]
|
||||
QRDetectCode.value += `\t${textOfCode[1].trim()}\n`;
|
||||
@@ -87,8 +90,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("<<main>>", mainCode.value);
|
||||
if (isUsedPlatform) {
|
||||
finallyText.value = finallyText.value.replace("<<ColorDetect>>", colorDetectClass.value);
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# В данной папке хранятся шаблоны кода для автономного полёта:
|
||||
|
||||
## 1. emergency_and_navigate.py
|
||||
|
||||
### Указаны все необходимые импорты, также функция перехвата Ctrl+C (signal_handler), безопасной посадки (emergency_stop), navigate_wait
|
||||
|
||||
## 2. color.py
|
||||
|
||||
### Функция определения цвета платформы. Также показано, как вызывать данную функцию (через подписчика (Subscriber))
|
||||
|
||||
## 3. qr.py
|
||||
|
||||
### Функция считывания и расшифровки qr кода. Также показано, как вызывать данную функцию (через подписчика (Subscriber))
|
||||
@@ -0,0 +1,45 @@
|
||||
export default `def color_detection(data, print_type='str'):
|
||||
'''определение цвета'''
|
||||
|
||||
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)
|
||||
|
||||
cropped_frame = frame[y_start:y_end, x_start:x_end]
|
||||
|
||||
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]))
|
||||
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 + 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 b > 150:
|
||||
color= 'white'
|
||||
else:
|
||||
color = None
|
||||
|
||||
<<separator>>
|
||||
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()`
|
||||
@@ -0,0 +1,105 @@
|
||||
export default `#!/usr/bin/env python3
|
||||
|
||||
import rospy
|
||||
import time
|
||||
import signal
|
||||
import sys
|
||||
from clover import srv
|
||||
from std_srvs.srv import Trigger
|
||||
from cv_bridge import CvBridge
|
||||
from sensor_msgs.msg import Image
|
||||
from pyzbar import pyzbar
|
||||
import numpy as np
|
||||
import math
|
||||
import cv2
|
||||
|
||||
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):
|
||||
"""
|
||||
Летит в указанную точку и ждет, пока дрон туда ДОЛЕТИТ.
|
||||
Следующая команда выполнится ТОЛЬКО после прибытия.
|
||||
"""
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x**2 + telem.y**2 + telem.z**2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
|
||||
rospy.sleep(sleep)
|
||||
|
||||
|
||||
def emergency_stop():
|
||||
|
||||
"""Функция экстренной остановки, срабатывает при нажатии Ctrl + C"""
|
||||
|
||||
print("\n" + "="*50)
|
||||
print("EMERGENCY STOP ACTIVATED!")
|
||||
print("="*50)
|
||||
|
||||
try:
|
||||
print("1. Stopping movement...")
|
||||
try:
|
||||
navigate(x=0, y=0, z=0, frame_id='body', speed=0.5)
|
||||
time.sleep(0.5)
|
||||
except:
|
||||
pass
|
||||
|
||||
print("2. Hovering for safety...")
|
||||
for i in range(3):
|
||||
print(f" Hovering... {3-i} seconds")
|
||||
time.sleep(1.0)
|
||||
|
||||
print("3. Emergency landing...")
|
||||
try:
|
||||
land()
|
||||
time.sleep(2)
|
||||
except:
|
||||
try:
|
||||
telem = get_telemetry(frame_id='aruco_map')
|
||||
navigate(x=telem.x, y=telem.y, z=0.1, frame_id='aruco_map', speed=0.3)
|
||||
time.sleep(5)
|
||||
except:
|
||||
pass
|
||||
|
||||
print("✓ Emergency stop completed")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Warning: {e}")
|
||||
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
|
||||
"""Перехват Ctrl+C: вместо аварийного завершения программы
|
||||
выполняет безопасную посадку дрона."""
|
||||
|
||||
print("\nCtrl+C detected - Emergency stop!")
|
||||
emergency_stop()
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
|
||||
<<qr_function>>
|
||||
<<ColorDetect>>
|
||||
|
||||
def main():
|
||||
navigate_wait(z=1,frame_id='body',auto_arm=True) #должно быть. включает моторы и поднимает дрон на метр вверх
|
||||
#в дальнейшем не передавать переменной auto_arm значение True
|
||||
|
||||
|
||||
<<main>>
|
||||
|
||||
|
||||
land() #посадка
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()`
|
||||
@@ -0,0 +1,12 @@
|
||||
export default `def qr_detection(data):
|
||||
cv_image = bridge.imgmsg_to_cv2(data, 'bgr8')
|
||||
barcodes = pyzbar.decode(cv_image)
|
||||
|
||||
if barcodes:
|
||||
qr_data = barcodes[0].data.decode('utf-8')
|
||||
return qr_data
|
||||
|
||||
<<separator>>
|
||||
qr_sub = rospy.Subscriber('main_camera/image_raw', Image, qr_detection, queue_size=1)
|
||||
rospy.sleep(2)
|
||||
qr_sub.unregister()`
|
||||
Reference in New Issue
Block a user