forked from drone/command-center-dashboard

shuishen
2025-04-17 7d0d0cbc81de9087173dbee4e366c15f347d38b9
Merge branch 'master' of http://139.196.74.78:10010/r/drone/command-center-dashboard
5 files modified
170 ■■■■ changed files
src/api/drc.js 9 ●●●●● patch | view | raw | blame | history
src/components/CurrentTaskDetails/CurrentTaskDetails.vue 21 ●●●● patch | view | raw | blame | history
src/components/CurrentTaskDetails/TaskDetailsRight.vue 4 ●●●● patch | view | raw | blame | history
src/hooks/controlDrone/useManualControl.js 134 ●●●● patch | view | raw | blame | history
src/mqtt/index.js 2 ●●● patch | view | raw | blame | history
src/api/drc.js
@@ -30,6 +30,15 @@
  })
}
// 无人控制
export async function updateDroneQualityApi (data) {
  return request({
    url: '/drone-device-core/manage/api/v1/live/streams/update',
    method: 'post',
    data,
  })
}
// 无人机退出控制
export async function exitController(data) {
  return request({
src/components/CurrentTaskDetails/CurrentTaskDetails.vue
@@ -18,8 +18,8 @@
            <TaskDetailsRight v-if="isAutoControl" />
            <template v-else>
                <TaskDetailsHead />
                <TaskDetailsLeft />
            </template>
            <TaskDetailsLeft />
            <!--    控制面板,里面有方法需要立即执行,不可用v-if        -->
            <ControlPanel v-show="!isAutoControl" />
@@ -45,7 +45,7 @@
import amplifyImg from '@/assets/images/taskManagement/taskIntermediateContent/amplifyImg.png'
import { ElMessage } from 'element-plus'
import EventBus from '@/event-bus'
import { updateDroneQualityApi } from '@/api/drc'
const isAutoControl = ref(true)
const lineQuality = ref(1) //1流畅,2标清
@@ -67,7 +67,7 @@
const currentLiveUrl = ref('')
const isTakeOff = ref(false)
const isMaxMap = ref(false)
let droneWebSocket  //WS实例
let droneWebSocket //WS实例
// 机巢直播
const getDeviceLiveUrl = async () => {
@@ -75,10 +75,19 @@
    currentLiveUrl.value = res.data.data.rtcs_url
}
// 无人机直播画质切换
const changeLineQuality = async () => {
const video_id = ref('')
// 获取无人机直播url
async function getDroneLiveUrl() {
    const res = await liveStart(droneSn.value, lineQuality.value)
    currentLiveUrl.value = res.data.data.rtcs_url
    video_id.value = res.data.data.video_id
}
// 无人机直播画质切换
const changeLineQuality = async () => {
    const res = await updateDroneQualityApi({ video_id: video_id.value, video_quality: lineQuality.value })
    ElMessage.success('切换画质成功')
}
// 设置当前直播地址
@@ -89,7 +98,7 @@
    // 如果还是之前的状态,不切换
    if (isTakeOff.value === currentIsTakeOff) return
    isTakeOff.value = currentIsTakeOff
    isTakeOff.value ? await changeLineQuality() : await getDeviceLiveUrl()
    isTakeOff.value ? await getDroneLiveUrl() : await getDeviceLiveUrl()
}
// 获取任务详情获取航线文件
src/components/CurrentTaskDetails/TaskDetailsRight.vue
@@ -54,6 +54,10 @@
    gap: 25px 0;
    align-items: center;
    .manualControl{
        background: transparent !important;
    }
    .titleImg {
        width: 224px;
        height: 131px;
src/hooks/controlDrone/useManualControl.js
@@ -36,10 +36,18 @@
    }
export function useManualControl(mqttState,deviceTopicInfo, isCurrentFlightController,paramsRef) {
    const activeCodeKey = ref(null)
    let activeCodeKey = null
    let genPortOne = true //是一代机场
    const mqttHooks = useMqtt(mqttState,deviceTopicInfo)
    let seq = 0
    const keysPressed = [
        {key: 'KeyQ', value: false},
        {key: 'KeyW', value: false},
        {key: 'KeyE', value: false},
        {key: 'KeyA', value: false},
        {key: 'KeyS', value: false},
        {key: 'KeyD', value: false},
    ]
    function handlePublish(params) {
        const body = {
@@ -50,7 +58,7 @@
        myInterval = setInterval(() => {
            body.data.seq = seq++
            seq++
            window.console.log('keyCode>>>>', activeCodeKey.value, body)
            window.console.log('keyCode>>>>', activeCodeKey, body)
            mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, { qos: 0 })
        }, 50)
    }
@@ -70,84 +78,132 @@
        const HEIGHT = genPortOne ? 5 : 500; //  check
        const W_SPEED = genPortOne ? 20 : 500 // 机头角速度
        let arrList = []
        if (genPortOne) {
            arrList = [
                { Key: 'KeyQ', category: 'w', value: -W_SPEED },{ Key: 'KeyW',category: 'x', value: SPEED },
                { Key: 'KeyE', category: 'w', value: W_SPEED},{ Key: 'KeyA', category: 'y', value: -SPEED},
                { Key: 'KeyS', category: 'x', value: -SPEED},{ Key: 'KeyD', category: 'y', value: SPEED}
            ]
        } else {
            arrList = [
                { Key: 'KeyQ', category: 'yaw', value: 1024-W_SPEED },{ Key: 'KeyW',category: 'pitch', value: 1024+SPEED },
                { Key: 'KeyE', category: 'yaw', value: 1024+W_SPEED},{ Key: 'KeyA', category: 'roll', value: 1024-SPEED},
                { Key: 'KeyS', category: 'pitch', value: 1024-SPEED},{ Key: 'KeyD', category: 'roll', value: 1024+SPEED}
            ]
        }
        let resultObj = []
        let resultArr = []
        // 遍历被选中得数组
        if (keyCode === 'assemblyKeys') {
            keysPressed.map(key => {
                if (key.value) {
                    let result = arrList.filter(item =>item.Key===key.key)
                    resultObj.push(result[0])
                }
            })
            // 相同属性值进行计算
            resultArr = resultObj.reduce((acc, item) => {
                // 如果累加器中已经有这个 category,则累加 value
                if (acc[item.category]) {
                    // acc[item.category] += item.value;
                    acc[item.category] = genPortOne ? 0 : 1024;
                } else {
                    // 否则,初始化这个 category 的 value
                    acc[item.category] = item.value;
                }
                return acc;
            }, {});
        }
        seq = 0
        switch (keyCode) {
            case 'assemblyKeys': // 针对Q W E A S D 组合键
                if (activeCodeKey === keyCode) return
                handlePublish(resultArr)
                activeCodeKey = keyCode
                break
            case 'KeyQ':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objQ = { yaw: 1024-W_SPEED }
                if (genPortOne) {objQ = {w: -W_SPEED}}
                handlePublish(objQ)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'KeyW':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objW = { pitch: 1024+SPEED }
                if (genPortOne) {objW = {x: SPEED}}
                handlePublish(objW)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'KeyE':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objE = { yaw: 1024+W_SPEED }
                if (genPortOne) {objE = {w: W_SPEED}}
                handlePublish(objE)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'KeyA':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objA = { roll: 1024-SPEED }
                if (genPortOne) {objA = {y: -SPEED}}
                handlePublish(objA)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'KeyS':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objS = { pitch: 1024-SPEED }
                if (genPortOne) {objS = {x: -SPEED}}
                handlePublish(objS)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'KeyD':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objD = { roll: 1024+SPEED }
                if (genPortOne) {objD = {y: SPEED}}
                handlePublish(objD)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'KeyZ':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objZ = { throttle: 1024-HEIGHT }
                if (genPortOne) {objZ = {h: -HEIGHT}}
                handlePublish(objZ)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            // case 'ArrowDown':
            case 'KeyC':
                if (activeCodeKey.value === keyCode) return
                if (activeCodeKey === keyCode) return
                let objC = { throttle: 1024+HEIGHT }
                if (genPortOne) {objC = {h: HEIGHT}}
                handlePublish(objC)
                activeCodeKey.value = keyCode
                activeCodeKey = keyCode
                break
            case 'ArrowUp':
                if (activeCodeKey.value === keyCode) return
                myInterval = setInterval(()=>ptzControl('up'), 50)
                activeCodeKey.value = keyCode
                if (activeCodeKey === keyCode) return
                clearInterval(myInterval)
                myInterval = setInterval(()=>ptzControl('up'), 200)
                activeCodeKey = keyCode
                break
            case 'ArrowDown':
                if (activeCodeKey.value === keyCode) return
                myInterval = setInterval(()=>ptzControl('down'), 50)
                activeCodeKey.value = keyCode
                if (activeCodeKey === keyCode) return
                clearInterval(myInterval)
                myInterval = setInterval(()=>ptzControl('down'), 200)
                activeCodeKey = keyCode
                break
            case 'ArrowLeft':
                if (activeCodeKey.value === keyCode) return
                myInterval = setInterval(()=>ptzControl('left'), 50)
                activeCodeKey.value = keyCode
                if (activeCodeKey === keyCode) return
                clearInterval(myInterval)
                myInterval = setInterval(()=>ptzControl('left'), 200)
                activeCodeKey = keyCode
                break
            case 'ArrowRight':
                if (activeCodeKey.value === keyCode) return
                myInterval = setInterval(()=>ptzControl('right'), 50)
                activeCodeKey.value = keyCode
                if (activeCodeKey === keyCode) return
                clearInterval(myInterval)
                myInterval = setInterval(()=>ptzControl('right'), 200)
                activeCodeKey = keyCode
                break
            default:
                break
@@ -179,7 +235,8 @@
    }
    function resetControlState() {
        activeCodeKey.value = null
        keysPressed.map(item => item.value = false)
        activeCodeKey = null
        seq = 0
        handleClearInterval()
    }
@@ -189,7 +246,16 @@
    }
    function onKeydown(e) {
        handleKeyup(e.code)
        e.preventDefault()
        keysPressed.forEach(item => {
            if(e.code === item.key) item.value = true
        })
        let result = keysPressed.filter(item=>item.value===true)
        if (result && result.length >= 2) {
            handleKeyup('assemblyKeys')
        } else {
            handleKeyup(e.code)
        }
    }
    function startKeyboardManualControl() {
@@ -215,6 +281,10 @@
        { immediate: true }
    )
    onBeforeUnmount(()=>{
        mqttHooks?.d
    })
    onUnmounted(() => {
        closeKeyboardManualControl()
    })
src/mqtt/index.js
@@ -65,7 +65,7 @@
    // 关闭 mqtt 客户端
    destroyed = () => {
        window.console.log('mqtt destroyed')
        window.console.log('mqtt 销毁')
        this._client?.end()
    }