Merge #2
@@ -44,10 +44,6 @@ class ColorDetect():
|
||||
else:
|
||||
self.color = None
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#в MAIN для вызова функции должно быть:
|
||||
# cd = ColorDetect()
|
||||
#color_sub = rospy.Subscriber('main_camera/image_raw', Image,
|
||||
@@ -56,4 +52,3 @@ class ColorDetect():
|
||||
# print(cd.getColor())
|
||||
#rospy.sleep(2)
|
||||
#color_sub.unregister()
|
||||
|
||||
@@ -18,8 +18,6 @@ navigate = rospy.ServiceProxy('navigate', srv.Navigate) #сервис для п
|
||||
land = rospy.ServiceProxy('land', Trigger) #сервис для посадки
|
||||
|
||||
|
||||
|
||||
|
||||
def navigate_wait(x=0, y=0, z=1, speed=0.5, frame_id='aruco_map', auto_arm=False, tolerance=0.2,sleep=2):
|
||||
"""
|
||||
Летит в указанную точку и ждет, пока дрон туда ДОЛЕТИТ.
|
||||
@@ -36,9 +34,6 @@ def navigate_wait(x=0, y=0, z=1, speed=0.5, frame_id='aruco_map', auto_arm=False
|
||||
rospy.sleep(sleep)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def emergency_stop():
|
||||
|
||||
"""Функция экстренной остановки, срабатывает при нажатии Ctrl + C"""
|
||||
@@ -78,8 +73,6 @@ def emergency_stop():
|
||||
print(f"Warning: {e}")
|
||||
|
||||
|
||||
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
|
||||
"""Перехват Ctrl+C: вместо аварийного завершения программы
|
||||
@@ -98,9 +91,7 @@ def main():
|
||||
#в дальнейшем не передавать переменной auto_arm значение True
|
||||
|
||||
|
||||
# тут будут navigate_wait и подписчики
|
||||
# navigate_wait(x=3,z=1,sleep=1)
|
||||
# navigate_wait(y=5,x=2,z=1,sleep = 4)
|
||||
<<navigate_wait>>
|
||||
|
||||
|
||||
land() #посадка
|
||||
@@ -0,0 +1,26 @@
|
||||
class QrDetect():
|
||||
def __init__(self):
|
||||
self.qr_data = ''
|
||||
|
||||
def getQrData(self):
|
||||
return self.qr_data
|
||||
|
||||
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')
|
||||
|
||||
|
||||
#в 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()
|
||||
@@ -1,26 +0,0 @@
|
||||
qr_data=''
|
||||
|
||||
def qr_detection(data):
|
||||
'''сканирование qr кода'''
|
||||
global qr_data
|
||||
if qr_data!= '':
|
||||
return
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
#в MAIN для вызова функции необходимо следующее:
|
||||
#1. создаём и вызываем подписчика, который вызывает функцию чтения кьюаркода
|
||||
qr_sub = rospy.Subscriber('main_camera/image_raw',Image, qr_detection,queue_size=1)
|
||||
#2. задаём время работы подписчика (за 1 секунду примерно 20 раз вызывается функция)
|
||||
rospy.sleep(2)
|
||||
#3. выключаем подписчика
|
||||
qr_sub.unregister()
|
||||
|
||||
+20
-12
@@ -13,7 +13,6 @@ const isModalVisible = ref(false)
|
||||
let finallyText = '';
|
||||
|
||||
onMounted(()=>{
|
||||
|
||||
for (let i = 0; i < 100; i++) {
|
||||
numbers.value.push({
|
||||
variable: [],
|
||||
@@ -43,7 +42,10 @@ function setNumber(item) {
|
||||
//если нажимаем на ранее отмеченную клетку (не последнюю), то выводится ошибка
|
||||
listOfTrips.value.push(item)
|
||||
if (numbers.value[item.index].variable.at(-1) === clickCount.value-1) {
|
||||
izitoast.error({title:'Ошибка', message:'Нельзя выбирать один и тот же aruco маркер 2 раза подряд'})
|
||||
izitoast.error({
|
||||
title:'Ошибка',
|
||||
message:'Нельзя выбирать один и тот же aruco маркер 2 раза подряд'
|
||||
})
|
||||
return
|
||||
}
|
||||
numbers.value[item.index].variable.push(clickCount.value)
|
||||
@@ -53,13 +55,14 @@ function setNumber(item) {
|
||||
}
|
||||
|
||||
function saveResult() {
|
||||
let navigate_waites = ''
|
||||
for (const item of listOfTrips.value) {
|
||||
finallyText += `navigate_wait(${item.x}, ${item.y})\n`;
|
||||
navigate_waites += `navigate_wait(${item.x}, ${item.y})\n\t`;
|
||||
}
|
||||
console.log(finallyText);
|
||||
izitoast.info({
|
||||
title: 'Информация',
|
||||
message: "Посмотри в консоли путь дрона. Ctrl + Shift + I или F12"
|
||||
fetch('/shablons/emergency_and_navigate.txt')
|
||||
.then(response => response.text())
|
||||
.then(textOfCode => {
|
||||
finallyText = textOfCode.replace('<<navigate_wait>>', navigate_waites);
|
||||
});
|
||||
isModalVisible.value = true
|
||||
}
|
||||
@@ -92,6 +95,14 @@ const handleKeydown = (event) => {
|
||||
}
|
||||
};
|
||||
useEventListener('keydown', handleKeydown);
|
||||
|
||||
function copyAndToast(text){
|
||||
copyToclipboard(text)
|
||||
izitoast.success({
|
||||
title:'Успешно',
|
||||
message:'Код скопирован в буфер обмена'
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -119,16 +130,13 @@ useEventListener('keydown', handleKeydown);
|
||||
<strong v-else>Код не готов!</strong>
|
||||
</template>
|
||||
<template #body>
|
||||
<p v-if="listOfTrips.length">Это тело модального окна.
|
||||
{{ finallyText }}
|
||||
|
||||
</p>
|
||||
<p v-if="listOfTrips.length">Скопируйте или скачайте ваш код</p>
|
||||
<p v-else>Выстройте маршрут перед сохранением кода.
|
||||
</p>
|
||||
</template>
|
||||
<template #footer>
|
||||
<button type="button" class="btn-green" @click="isModalVisible = false">Скачать код</button>
|
||||
<button type="button" class="btn-green" @click="copyToclipboard(finallyText)">Скопировать код</button>
|
||||
<button type="button" class="btn-green" @click="copyAndToast(finallyText)">Скопировать код</button>
|
||||
<button type="button" class="btn-green" @click="isModalVisible = false">ОК</button>
|
||||
</template>
|
||||
</MyDialog>
|
||||
|
||||
@@ -94,6 +94,12 @@ function closeModal() {
|
||||
padding: 5px;
|
||||
margin: 0 5px;
|
||||
}
|
||||
.btn-green:hover {
|
||||
background-color: #0fa386;
|
||||
}
|
||||
.btn-green:active {
|
||||
background-color: #65ebd2;
|
||||
}
|
||||
|
||||
.modal-fade-enter,
|
||||
.modal-fade-leave-active {
|
||||
|
||||
Reference in New Issue
Block a user