From d3fc51f8cbc5b4ae45f3cd57c2897827369d1bfa Mon Sep 17 00:00:00 2001 From: cuishu <979962021@qq.com> Date: Sat, 13 Dec 2025 23:51:10 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B5=B7=E9=A3=9E?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3,=E5=B9=B6=E5=A4=84=E7=90=86=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/App.vue | 17 +++++++++-------- src/utils/request.js | 1 + vite.config.js | 3 +++ 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 6272289..105ebf4 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@amap/amap-jsapi-loader": "^1.0.1", - "DroneCtrl": "1.0.1", + "DroneCtrl": "1.0.2", "axios": "^1.13.2", "element-plus": "^2.12.0", "gcoord": "^1.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9adf3f..c9f9014 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^1.0.1 version: 1.0.1 DroneCtrl: - specifier: 1.0.1 - version: 1.0.1 + specifier: 1.0.2 + version: 1.0.2 axios: specifier: ^1.13.2 version: 1.13.2 @@ -245,8 +245,8 @@ packages: '@vueuse/shared@9.13.0': resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} - DroneCtrl@1.0.1: - resolution: {integrity: sha512-3ibzb0sXZGXAkbSTg4Zb8heTx6ASBkWaI2yAO8V+4/Y2ygULruPCzb8o3c89wWlnfQQ/AALWlNmkpVV/ezBujQ==} + DroneCtrl@1.0.2: + resolution: {integrity: sha512-EQWN1q8S4mN64gMlBQkQyJIYSBVE75YLPsYI+L/67TPypOyGWnI/kxCYMPY1hNVB8sIxJO0Z3DU3wlKxwg4Qiw==} async-validator@4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} @@ -770,7 +770,7 @@ snapshots: - '@vue/composition-api' - vue - DroneCtrl@1.0.1: {} + DroneCtrl@1.0.2: {} async-validator@4.2.5: {} diff --git a/src/App.vue b/src/App.vue index 1b478b0..472bcdb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -262,15 +262,16 @@ const initWebSocket = () => { // 起飞处理 const handleTakeoff = () => { // 检查是否已有围栏 - if (fences.value.length === 0) { - ElMessage.warning('请先绘制电子围栏后再起飞') - return - } + // if (fences.value.length === 0) { + // ElMessage.warning('请先绘制电子围栏后再起飞') + // return + // } - // 如果未连接,先连接 - if (!wsConnected.value) { - initWebSocket() - } + // // 如果未连接,先连接 + // if (!wsConnected.value) { + // initWebSocket() + // } + ctrl.TakeoffAndAutoExecTask({}); // 设置飞行状态 isFlying.value = true diff --git a/src/utils/request.js b/src/utils/request.js index e67a9c9..ed7957c 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -98,6 +98,7 @@ function upload(url, params) { } // export let host = `${window.location.protocol}//${window.location.host}`; +// export let host = "http://192.168.43.97:5678"; export let host = "http://192.168.3.81:5678"; export const getConfig = () => { diff --git a/vite.config.js b/vite.config.js index 01fe5bd..b3001e7 100644 --- a/vite.config.js +++ b/vite.config.js @@ -5,4 +5,7 @@ import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], base: "/web/", + optimizeDeps: { + exclude: ['DroneCtrl'] + } }) From f7ef53acb69128ffdb93411b5c144d93c7e382bc Mon Sep 17 00:00:00 2001 From: cuishu <979962021@qq.com> Date: Sun, 14 Dec 2025 01:09:20 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BE=A6=E6=9F=A5?= =?UTF-8?q?=E9=A3=9E=E6=9C=BA=E7=BB=8F=E7=BA=AC=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.vue b/src/App.vue index 472bcdb..e3344ec 100644 --- a/src/App.vue +++ b/src/App.vue @@ -300,6 +300,7 @@ const toggleWebSocket = () => { conn = ctrl.Message(); conn.onDroneGPS = (data) => { console.log(data); + droneMarker.value.setPosition([data.longitude, data.latitude]) }; } } From 6a1b23b25e4ffcb027805fd89ef83e409bc4ea81 Mon Sep 17 00:00:00 2001 From: cuishu <979962021@qq.com> Date: Wed, 17 Dec 2025 19:23:31 +0800 Subject: [PATCH 3/3] bug fix --- src/App.vue | 95 ++++++++++++++++++++++++++++++++++---------- src/utils/request.js | 3 +- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/src/App.vue b/src/App.vue index e3344ec..9883c12 100644 --- a/src/App.vue +++ b/src/App.vue @@ -159,6 +159,7 @@ const wsConnected = ref(false) const droneData = ref(null) const isFlying = ref(false) const droneMarker = ref(null) +const drone2Marker = ref(null) let wsClient = null let mockDataGenerator = null const isInFence = ref(true) @@ -235,28 +236,28 @@ let conn = null; // 初始化WebSocket连接 const initWebSocket = () => { // 使用模拟数据生成器(因为目前没有真实WebSocket服务器) - mockDataGenerator = new MockWebSocketDataGenerator({ - interval: 500, // 内部500ms生成一次数据(用于平滑) - startLat: 39.90923, // 北京天安门附近 - startLng: 116.397428, - speed: 0.00005 // 移动速度 - }) + // mockDataGenerator = new MockWebSocketDataGenerator({ + // interval: 500, // 内部500ms生成一次数据(用于平滑) + // startLat: 39.90923, // 北京天安门附近 + // startLng: 116.397428, + // speed: 0.00005 // 移动速度 + // }) - // 监听数据(使用节流,大幅降低更新频率) - mockDataGenerator.start((data) => { - const now = Date.now() - // 只更新数据状态,不触发地图更新 - droneData.value = data + // // 监听数据(使用节流,大幅降低更新频率) + // mockDataGenerator.start((data) => { + // const now = Date.now() + // // 只更新数据状态,不触发地图更新 + // droneData.value = data - // 节流:降低地图更新频率 - if (now - lastUpdateTime >= UPDATE_INTERVAL) { - lastUpdateTime = now - handleDroneData(data) - } - }) + // // 节流:降低地图更新频率 + // if (now - lastUpdateTime >= UPDATE_INTERVAL) { + // lastUpdateTime = now + // handleDroneData(data) + // } + // }) wsConnected.value = true - ElMessage.success('无人机数据连接成功(模拟模式)') + ElMessage.success('无人机数据连接成功') } // 起飞处理 @@ -299,8 +300,22 @@ const toggleWebSocket = () => { initWebSocket() conn = ctrl.Message(); conn.onDroneGPS = (data) => { - console.log(data); - droneMarker.value.setPosition([data.longitude, data.latitude]) + // console.log(data); + const drone1 = data.drone_1; + const drone2 = data.drone_2; + const point = gcoord.transform( + [drone1.longitude, drone1.latitude], + gcoord.WGS84, // 当前坐标系 + gcoord.GCJ02, // 目标坐标系 + ); + const point2 = gcoord.transform( + [drone2.longitude, drone2.latitude], + gcoord.WGS84, // 当前坐标系 + gcoord.GCJ02, // 目标坐标系 + ); + console.log(point, point2); + // updateDroneMarker(point[0], point[1], drone1.heading); + // updateDrone2Marker(point2[0], point2[1], drone2.heading); }; } } @@ -366,6 +381,42 @@ const updateDroneMarker = (lng, lat, heading = 0) => { map.setCenter([lng, lat]) } +// 更新无人机marker +const updateDrone2Marker = (lng, latheading = 0) => { + if (!map || !AMap) return + + if (!drone2Marker.value) { + // 创建无人机图标 + const icon = new AMap.Icon({ + image: droneImage, + size: new AMap.Size(40, 40), + imageSize: new AMap.Size(40, 40), + imageOffset: new AMap.Pixel(0, 0) + }) + + // 创建marker + drone2Marker.value = new AMap.Marker({ + position: [lng, lat], + icon: icon, + zIndex: 100, + title: '侦查机', + offset: new AMap.Pixel(-20, -20), + // 优化:禁用动画,减少性能消耗 + animation: 'AMAP_ANIMATION_NONE' + }) + + map.add(drone2Marker.value) + } else { + // 更新位置 + drone2Marker.value.setPosition([lng, lat]) + + // 更新旋转角度(如果有heading数据) + if (heading !== undefined) { + drone2Marker.value.setAngle(heading) + } + } +} + // 检测点是否在多边形内(射线法) const isPointInPolygon = (point, polygon) => { const [x, y] = point @@ -1076,6 +1127,10 @@ onUnmounted(() => { map?.remove(droneMarker.value) droneMarker.value = null } + if (drone2Marker.value) { + map?.remove(drone2Marker.value) + drone2Marker.value = null + } if (mouseTool) { mouseTool.close() diff --git a/src/utils/request.js b/src/utils/request.js index ed7957c..f7d2f3b 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -98,8 +98,9 @@ function upload(url, params) { } // export let host = `${window.location.protocol}//${window.location.host}`; -// export let host = "http://192.168.43.97:5678"; +// export let host = "http://192.168.43.98:5678"; export let host = "http://192.168.3.81:5678"; +// export let host = "http://127.0.0.1:5678"; export const getConfig = () => { return {