From 3d954cd30c42279fa50e3f52a46b06a19afe3369 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Mon, 01 Apr 2024 15:46:36 +0800
Subject: [PATCH] update:参数和相机直播问题修改
---
src/components/GMap.vue | 10 +
src/pages/page-web/projects/wayline.vue | 1
src/components/waylinetool/event-edit.vue | 8 +
src/components/waylinetool/component/interval-shoot.vue | 234 +++++++++++++++++++++++++++++++++++++++
src/api/drone-control/drone.ts | 6
src/components/g-map/DroneControlPanel.vue | 43 ++++++
src/components/waylinetool/component/take-photo.vue | 10 +
src/components/waylinetool/route-profile.vue | 2
src/types/drone-control.ts | 14 ++
9 files changed, 316 insertions(+), 12 deletions(-)
diff --git a/src/api/drone-control/drone.ts b/src/api/drone-control/drone.ts
index 7539a4d..3542bf1 100644
--- a/src/api/drone-control/drone.ts
+++ b/src/api/drone-control/drone.ts
@@ -48,7 +48,11 @@
max_speed: number; // flyto过程中能达到的最大速度, 单位m/s 跟飞机档位有关
rc_lost_action: LostControlActionInCommandFLight; // 失控行为
rth_altitude: number; // 返航高度
- exit_wayline_when_rc_lost: WaylineLostControlActionInCommandFlight
+ exit_wayline_when_rc_lost: WaylineLostControlActionInCommandFlight,
+ rth_mode?: number,
+ commander_mode_lost_action?: number,
+ commander_flight_mode?: number,
+ commander_flight_height?: number
}
// 一键起飞
diff --git a/src/components/GMap.vue b/src/components/GMap.vue
index ea0312a..f725564 100644
--- a/src/components/GMap.vue
+++ b/src/components/GMap.vue
@@ -585,7 +585,7 @@
type="primary"
size="small"
@click="openAircra(1)">
- M30T相机
+ {{ osdVisible.model || 'M30T' }}相机
</a-button>
</a-col>
</a-row>
@@ -1167,7 +1167,13 @@
vadeosList: v.videos_list,
}
})
- aircraSelected.value = aircraftList.value[index].value
+ // 展示这样写, fpv有问题
+ if (aircraftList.value[index]) {
+ aircraSelected.value = aircraftList.value[index].value
+ } else {
+ const i = aircraftList.value.length - 1
+ aircraSelected.value = aircraftList.value[i].value
+ }
flyOnStart()
} else {
showAircraft.value = false
diff --git a/src/components/g-map/DroneControlPanel.vue b/src/components/g-map/DroneControlPanel.vue
index c09cc48..a0bf699 100644
--- a/src/components/g-map/DroneControlPanel.vue
+++ b/src/components/g-map/DroneControlPanel.vue
@@ -135,6 +135,34 @@
<a-input-number v-model:value="takeoffToPointPopoverData.rthAltitude"/>
</div>
<div>
+ <span class="form-label">指点飞行高度(m):</span>
+ <a-input-number :min="2" :max="8000" v-model:value="takeoffToPointPopoverData.commanderFlightHeight"/>
+ </div>
+ <div>
+ <span class="form-label">返航模式:</span>
+ <a-select
+ v-model:value="takeoffToPointPopoverData.rthMode"
+ style="width: 120px"
+ :options="RthModeOptions"
+ ></a-select>
+ </div>
+ <div>
+ <span class="form-label">指点飞行模式:</span>
+ <a-select
+ v-model:value="takeoffToPointPopoverData.commanderFlightMode"
+ style="width: 120px"
+ :options="CommanderFlightModeOptions"
+ ></a-select>
+ </div>
+ <div>
+ <span class="form-label">指点飞行失控动作:</span>
+ <a-select
+ v-model:value="takeoffToPointPopoverData.commanderModeLostAction"
+ style="width: 120px"
+ :options="CommanderModeLostActionOptions"
+ ></a-select>
+ </div>
+ <div>
<span class="form-label">失控操作:</span>
<a-select
v-model:value="takeoffToPointPopoverData.rcLostAction"
@@ -308,6 +336,9 @@
} from '/@/api/drone-control/drone'
import { useDroneControl } from './use-drone-control'
import {
+ RthModeOptions,
+ CommanderModeLostActionOptions,
+ CommanderFlightModeOptions,
GimbalResetMode,
GimbalResetModeOptions,
LostControlActionInCommandFLightOptions,
@@ -429,7 +460,11 @@
maxSpeed: MAX_SPEED,
rthAltitude: 100 as null | number,
rcLostAction: LostControlActionInCommandFLight.RETURN_HOME,
- exitWaylineWhenRcLost: WaylineLostControlActionInCommandFlight.EXEC_LOST_ACTION
+ exitWaylineWhenRcLost: WaylineLostControlActionInCommandFlight.EXEC_LOST_ACTION,
+ rthMode: 0 as number,
+ commanderModeLostAction: 1 as number,
+ commanderFlightMode: 0 as number,
+ commanderFlightHeight: 100 as number
})
function onShowTakeoffToPointPopover () {
@@ -462,7 +497,11 @@
rth_altitude: takeoffToPointPopoverData.rthAltitude,
max_speed: takeoffToPointPopoverData.maxSpeed,
rc_lost_action: takeoffToPointPopoverData.rcLostAction,
- exit_wayline_when_rc_lost: takeoffToPointPopoverData.exitWaylineWhenRcLost
+ exit_wayline_when_rc_lost: takeoffToPointPopoverData.exitWaylineWhenRcLost,
+ rth_mode: takeoffToPointPopoverData.rthMode,
+ commander_mode_lost_action: takeoffToPointPopoverData.commanderModeLostAction,
+ commander_flight_mode: takeoffToPointPopoverData.commanderFlightMode,
+ commander_flight_height: takeoffToPointPopoverData.commanderFlightHeight
})
} catch (error) {
}
diff --git a/src/components/waylinetool/component/interval-shoot.vue b/src/components/waylinetool/component/interval-shoot.vue
new file mode 100644
index 0000000..a6bda31
--- /dev/null
+++ b/src/components/waylinetool/component/interval-shoot.vue
@@ -0,0 +1,234 @@
+<!--
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-27 15:15:50
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-03-28 09:36:06
+ * @FilePath: /drone-web/src/components/waylinetool/component/interval-shoot.vue
+ * @Description: 航点事件-单拍
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+-->
+
+<template>
+ <div class="container">
+ <div :class="['fileSuffix', isInputShow && 'no-select']">
+ <span>DJI_YYYYMMDDhhmm_XXX_</span>
+ <span class="icon" @click="isInputShow = !isInputShow"><EditOutlined /></span>
+ </div>
+ <div class="fileSuffix-input" v-if="isInputShow">
+ <a-input v-model:value="fileSuffix" placeholder="请输入文件后缀名称" size="small"></a-input>
+ <a-button type="primary" shape="circle" size="small" @click="confirmInput">
+ <template #icon>
+ <CheckOutlined />
+ </template>
+ </a-button>
+ <a-button type="danger" shape="circle" size="small" @click="cencalInput">
+ <template #icon>
+ <CloseOutlined />
+ </template>
+ </a-button>
+ </div>
+ <ul class="btn-group">
+ <li
+ :class="[
+ 'btn',
+ isGlobalPhotoFormat && 'disabled-btn',
+ !defaultParams.payloadLensIndex?.['#text'].includes('wide') && 'no-btn-selected',
+ ]"
+ @click="!isGlobalPhotoFormat && addFormatEvent('wide')">
+ 广角照片
+ </li>
+ <li
+ :class="[
+ 'btn',
+ isGlobalPhotoFormat && 'disabled-btn',
+ !defaultParams.payloadLensIndex?.['#text'].includes('zoom') && 'no-btn-selected',
+ ]"
+ @click="!isGlobalPhotoFormat && addFormatEvent('zoom')">
+ 变焦照片
+ </li>
+ <li :class="['btn', !isGlobalPhotoFormat && 'no-btn-selected']" @click="addFormatEvent('global')">跟随全局</li>
+ </ul>
+ </div>
+</template>
+
+<script lang="ts" setup>
+import _ from 'lodash'
+import { defineProps, ref } from 'vue'
+import { template as xmlJson } from '/@/utils/cesium/use-kmz-tsa'
+import { EditOutlined, CheckOutlined, CloseOutlined } from '@ant-design/icons-vue'
+import { message } from 'ant-design-vue'
+
+interface serialProp {
+ placemark: number
+ action: number
+}
+
+interface text {
+ '#text': any
+}
+
+interface takePhoto {
+ fileSuffix?: text
+ payloadLensIndex: text
+ payloadPositionIndex: text
+ useGlobalPayloadLensIndex: text
+}
+
+const isInputShow = ref<boolean>(false)
+
+const fileSuffix = ref<string>('')
+
+const defaultParams = ref<takePhoto | any>({
+ fileSuffix: { '#text': null },
+ payloadLensIndex: { '#text': null },
+ payloadPositionIndex: { '#text': null },
+ useGlobalPayloadLensIndex: { '#text': null },
+})
+
+const confirmInput = () => {
+ defaultParams.value.fileSuffix['#text'] = fileSuffix.value
+ message.success('修改拍摄照片文件后缀成功!!')
+}
+
+const cencalInput = () => {
+ fileSuffix.value = defaultFileSuffix.value
+ defaultParams.value.fileSuffix['#text'] = defaultFileSuffix.value
+ message.success('恢复初始拍摄照片文件后缀成功!!')
+}
+
+const props = defineProps<{
+ serial: serialProp
+}>()
+
+const defaultFileSuffix = ref<string>('')
+const getDefaultParams = (serial: serialProp) => {
+ const placemarkJson = xmlJson.value.Folder.Placemark[serial.placemark]
+ let action = placemarkJson.actionGroup.action
+ if (Array.isArray(action)) {
+ action = action[serial.action]
+ }
+ const actionActuatorFuncParam = action.actionActuatorFuncParam
+ defaultParams.value = actionActuatorFuncParam
+ fileSuffix.value = actionActuatorFuncParam.fileSuffix?.['#text'] || ''
+ defaultFileSuffix.value = _.cloneDeep(fileSuffix.value)
+ isInputShow.value = !!defaultParams.value.fileSuffix
+}
+
+// 判断当前是否使用全局照片设置
+const isGlobalPhotoFormat = computed(() => Number(defaultParams.value.useGlobalPayloadLensIndex['#text']))
+
+// 照片格式
+const addFormatEvent = (value: string) => {
+ if (value === 'global') {
+ defaultParams.value.useGlobalPayloadLensIndex['#text'] = Number(!isGlobalPhotoFormat.value)
+ if (!isGlobalPhotoFormat.value) {
+ defaultParams.value.payloadLensIndex = { '#text': 'zoom,wide' }
+ } else {
+ delete defaultParams.value.payloadLensIndex
+ }
+ } else {
+ if (!defaultParams.value.payloadLensIndex) {
+ defaultParams.value.payloadLensIndex = { '#text': '' }
+ }
+ const payloadLensIndex = defaultParams.value.payloadLensIndex['#text']
+ const payloadLensIndexArr = payloadLensIndex.split(',')
+ if (!payloadLensIndex) {
+ defaultParams.value.payloadLensIndex['#text'] = value
+ } else {
+ const index = payloadLensIndexArr.findIndex((item: string) => item === value)
+ if (index === -1) {
+ payloadLensIndexArr.push(value)
+ } else {
+ payloadLensIndexArr.splice(index, 1)
+ }
+ defaultParams.value.payloadLensIndex['#text'] = payloadLensIndexArr.join(',')
+ }
+ }
+}
+
+// 最新值
+watch(
+ () => defaultParams.value,
+ (newParams) => {
+ console.log(xmlJson.value)
+ },
+ {
+ deep: true,
+ },
+)
+
+// 默认值
+watch(
+ () => props.serial,
+ (newVal: serialProp) => {
+ getDefaultParams(newVal)
+ },
+ {
+ deep: true,
+ immediate: true,
+ },
+)
+</script>
+
+<style lang="scss" scoped>
+.container {
+ width: 100%;
+ height: 100%;
+ .fileSuffix {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ .icon {
+ cursor: pointer;
+ &:hover {
+ color: #409eff;
+ }
+ }
+ }
+ .fileSuffix-input {
+ margin-top: 10px;
+ display: flex;
+ input {
+ background-color: transparent;
+ color: #fff;
+ }
+ .ant-btn {
+ margin-left: 10px;
+ }
+ }
+ .btn-group {
+ list-style-type: none;
+ margin: 15px 0 0 0;
+ padding: 0;
+ display: flex;
+ gap: 10px;
+ justify-content: flex-start;
+ .btn {
+ font-size: 13px;
+ padding: 2px 10px;
+ background-color: #409eff;
+ border-radius: 999px;
+ cursor: pointer;
+ font-weight: bold;
+ &:last-child {
+ margin-left: auto;
+ }
+ }
+ }
+}
+
+.no-select {
+ color: hsla(0, 0%, 100%, 0.45);
+}
+
+.no-btn-selected {
+ background-color: hsla(0, 0%, 100%, 0.45) !important;
+ border: hsla(0, 0%, 100%, 0.45) !important;
+}
+.disabled-btn {
+ cursor: not-allowed !important;
+ background-color: #314768 !important;
+ border: #314768 !important;
+ color: #ccc;
+}
+</style>
diff --git a/src/components/waylinetool/component/take-photo.vue b/src/components/waylinetool/component/take-photo.vue
index 25dbdf5..f1c2dbd 100644
--- a/src/components/waylinetool/component/take-photo.vue
+++ b/src/components/waylinetool/component/take-photo.vue
@@ -2,7 +2,7 @@
* @Author: GuLiMmo 2820890765@qq.com
* @Date: 2024-03-27 15:15:50
* @LastEditors: GuLiMmo 2820890765@qq.com
- * @LastEditTime: 2024-03-27 17:31:10
+ * @LastEditTime: 2024-03-28 09:30:55
* @FilePath: /drone-web/src/components/waylinetool/component/take-photo.vue
* @Description: 航点事件-单拍
* Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
@@ -55,6 +55,7 @@
</template>
<script lang="ts" setup>
+import _ from 'lodash'
import { defineProps, ref } from 'vue'
import { template as xmlJson } from '/@/utils/cesium/use-kmz-tsa'
import { EditOutlined, CheckOutlined, CloseOutlined } from '@ant-design/icons-vue'
@@ -94,6 +95,7 @@
const cencalInput = () => {
fileSuffix.value = defaultFileSuffix.value
+ defaultParams.value.fileSuffix['#text'] = defaultFileSuffix.value
message.success('恢复初始拍摄照片文件后缀成功!!')
}
@@ -110,8 +112,8 @@
}
const actionActuatorFuncParam = action.actionActuatorFuncParam
defaultParams.value = actionActuatorFuncParam
- fileSuffix.value = actionActuatorFuncParam.fileSuffix['#text']
- defaultFileSuffix.value = actionActuatorFuncParam.fileSuffix['#text']
+ fileSuffix.value = actionActuatorFuncParam.fileSuffix?.['#text'] || ''
+ defaultFileSuffix.value = _.cloneDeep(fileSuffix.value)
isInputShow.value = !!defaultParams.value.fileSuffix
}
@@ -151,7 +153,7 @@
watch(
() => defaultParams.value,
(newParams) => {
- console.log(newParams)
+ console.log(xmlJson.value)
},
{
deep: true,
diff --git a/src/components/waylinetool/event-edit.vue b/src/components/waylinetool/event-edit.vue
index a9b1b8b..89c6c36 100644
--- a/src/components/waylinetool/event-edit.vue
+++ b/src/components/waylinetool/event-edit.vue
@@ -11,8 +11,13 @@
<span @click="handleDelAction"><DeleteOutlined /></span>
</div>
</div>
+ {{ currentPointEvent.aciton }}
<div class="event-edit">
- <takePhoto v-model:serial="serial" v-if="currentPointEvent.aciton.key === 'takePhoto'" />
+ <take-photo
+ v-model:serial="serial"
+ v-if="['takePhoto', 'startRecord'].includes(currentPointEvent.aciton.key)"
+ />
+ <interval-shoot v-model:serial="serial" />
</div>
</div>
<div class="map-box"></div>
@@ -25,6 +30,7 @@
import { useMyStore } from '/@/store'
import { template as xmlTemplate } from '/@/utils/cesium/use-kmz-tsa'
import takePhoto from './component/take-photo.vue'
+import intervalShoot from './component/interval-shoot.vue'
const store = useMyStore()
// 事件编辑是否显示
diff --git a/src/components/waylinetool/route-profile.vue b/src/components/waylinetool/route-profile.vue
index b141b7f..2e45b7c 100644
--- a/src/components/waylinetool/route-profile.vue
+++ b/src/components/waylinetool/route-profile.vue
@@ -26,7 +26,7 @@
const details = ref<any>([])
const route = useRoute()
-const isShow = computed(() => !kmlStr.value && isWaylineRoute && author.fileName && author.author && details.value.length > 0)
+const isShow = computed(() => !kmlStr.value && isWaylineRoute.value && author.fileName && author.author && details.value.length > 0)
watch(
() => fileAuthor,
diff --git a/src/pages/page-web/projects/wayline.vue b/src/pages/page-web/projects/wayline.vue
index d015952..c7c6b09 100644
--- a/src/pages/page-web/projects/wayline.vue
+++ b/src/pages/page-web/projects/wayline.vue
@@ -264,7 +264,6 @@
pagination.page++
getWaylines()
}, 1000)
- console.log(workspaceId.value)
})
onUnmounted(() => {
diff --git a/src/types/drone-control.ts b/src/types/drone-control.ts
index be48bb4..27d9e5b 100644
--- a/src/types/drone-control.ts
+++ b/src/types/drone-control.ts
@@ -52,6 +52,20 @@
{ label: '着陆', value: LostControlActionInCommandFLight.Land }
]
+export const RthModeOptions = [
+ { label: '智能高度', value: 0 },
+ { label: '设定高度', value: 1 }
+]
+
+export const CommanderModeLostActionOptions = [
+ { label: '继续执行指点飞行任务', value: 0 },
+ { label: '退出指点飞行任务,执行普通失控行为', value: 1 },
+]
+
+export const CommanderFlightModeOptions = [
+ { label: '智能高度飞行', value: 0 },
+ { label: '设定高度飞行', value: 1 }
+]
// 云台重置模式
export enum GimbalResetMode {
Recenter = 0,
--
Gitblit v1.9.3