main
徐景良 3 months ago
parent 9da15fbc9c
commit 50d545d920

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

@ -7,6 +7,8 @@ enum Api{
AddTask = '/api/Manage/AddTask',
EditTask = '/api/Manage/EditTask',
DeleteTask = '/api/Manage/DeleteTask',
ExecuteFlyTask = '/api/Manage/ExecuteFlyTask',
PendingFlyTask = '/api/Manage/PendingFlyTask',
// 无人机
GetUavPageList = '/api/Manage/GetUavPageList',
@ -37,6 +39,15 @@ export function deleteTask(params){
return defHttp.post({ url: Api.DeleteTask+"?id="+params.id, params });
}
export function executeFlyTask(params){
return defHttp.post({ url: Api.ExecuteFlyTask+"?taskId="+params.id, params });
}
export function pendingFlyTask(params){
return defHttp.post({ url: Api.PendingFlyTask+"?taskId="+params.id, params });
}
// 无人机
export function getUavPageList(params) {
return defHttp.get({ url: Api.GetUavPageList, params });

@ -23,7 +23,7 @@
import { ref, onMounted, defineEmits, defineProps } from 'vue';
import Icon from '@/components/Icon/Icon.vue';
import CloudQueryModal from './CloudQueryModal/index.vue';
import { useCloudQueryStore } from '@/store/modules/cloudquery';
// import { useCloudQueryStore } from '@/store/modules/cloudquery';
import { LoadCloudQueryById } from '@/api/demo/cloudQuery';
const useCloudQuery = useCloudQueryStore();

@ -335,7 +335,10 @@
import { getAppEnvConfig } from '@/utils/env';
import { message, Modal } from 'ant-design-vue';
import { useCloudQueryStore } from '@/store/modules/cloudquery';
// import { useCloudQueryStore } from '@/store/modules/cloudquery';
const useCloudQueryStore = function(){
return {};
}
//
import { splitAndCalTubanArea,splitTubanBackYuan } from '@/api/sys/layerManagement';
import { CalTubanAreaModel } from '@/api/sys/model/layerModel';

@ -46,7 +46,7 @@
import { Tooltip } from 'ant-design-vue';
import { useI18n } from '@/hooks/web/useI18n';
import { CloudOutlined } from '@ant-design/icons-vue';
import { useCloudQueryStore } from '@/store/modules/cloudquery';
// import { useCloudQueryStore } from '@/store/modules/cloudquery';
import { getAppEnvConfig } from '@/utils/env';
import { useMessage } from '@/hooks/web/useMessage';
import axios from 'axios';

@ -78,7 +78,7 @@
</div>
</div>
<div class="ari-line" v-for="(item,index) in ariLineList" :key="index"
@click="checkAriLine(item)"
>
<div class="title">
<div style="flex:1;">
@ -91,12 +91,15 @@
<MoreOutlined />
<template #overlay>
<a-menu>
<a-menu-item>
<a href="javascript:;">编辑</a>
</a-menu-item>
<a-menu-item @click="deletePlan(item.id)">
<a href="javascript:;">删除</a>
</a-menu-item>
<a-menu-item @click="checkAriLine(item)" >
<a href="javascript:;">选择</a>
</a-menu-item>
<a-menu-item>
<a href="javascript:;">编辑</a>
</a-menu-item>
<a-menu-item @click="deletePlan(item.id)">
<a href="javascript:;">删除</a>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
@ -106,7 +109,12 @@
<img src="/public/iocn/uav.png" alt="">
{{item.uavId}}
</div>
<div class="time">更新时间{{item.createTime}}</div>
<div class="time">
<div>
更新时间{{item.createTime}}
</div>
</div>
</div>
</div>
</div>
@ -446,6 +454,8 @@
.ari-line .time{
font-size: 12px;
color:#ccc;
display:flex;
line-height:24px;
}
.import-airline{

@ -1,17 +1,17 @@
<template>
<div class="containner">
<div class="title">
<LeftOutlined />
<LeftOutlined @click="backPage" />
<div>航点航线</div>
<SaveOutlined @click="saveAirLine"/>
<a-button type="primary" @click="areaOptionsShow = !areaOptionsShow">
<a-button type="primary" size="middle" @click="areaOptionsShow = !areaOptionsShow">
航线设置
<DownOutlined />
<ControlOutlined />
</a-button>
<div style="flex:1;">
<a-input size="middle" placeholder="航线名称" />
<a-input size="middle" v-model:value="submitForm.airLineName" placeholder="航线名称" />
</div>
</div>
@ -200,19 +200,20 @@
</div>
</div>
</template>
<script lang="ts" setup>
import {ref,defineEmits,defineProps} from 'vue'
import { SaveOutlined,LeftOutlined,AppstoreOutlined,DownOutlined} from '@ant-design/icons-vue';
import { SaveOutlined,LeftOutlined,AppstoreOutlined,DownOutlined,ControlOutlined} from '@ant-design/icons-vue';
import { XMLParser, XMLBuilder } from 'fast-xml-parser';
import {uploadXmlFile} from '@/api/sys/workplan';
import {uploadXmlFile,addAirLine} from '@/api/sys/workplan';
import { Modal, message } from 'ant-design-vue';
import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts';
const emits = defineEmits(["setFlyPoint","checkPoint"])
const emits = defineEmits(["setFlyPoint","checkPoint","exitDraw"])
const props = defineProps(["airPoints","airInfo","polygonAirForm"])
@ -350,11 +351,11 @@ const handlerPointInfo = ()=>{
"executeHeight": item.alt,
"waypointSpeed": 10,
"waypointHeadingParam": {
"waypointHeadingMode": "followWayline",
"waypointHeadingAngle": 0,
"waypointPoiPoint": "0.000000,0.000000,0.000000",
"waypointHeadingMode": "followWayline", //
"waypointHeadingAngle": 0, // [-180, 180] wpml:waypointHeadingModesmoothTransition
"waypointPoiPoint": "0.000000,0.000000,0.000000", // wpml:waypointHeadingModetowardPOI
"waypointHeadingAngleEnable": 0,
"waypointHeadingPathMode": "followBadArc",
"waypointHeadingPathMode": "followBadArc", //
"waypointHeadingPoiIndex": 0
},
"waypointTurnParam": {
@ -407,9 +408,9 @@ const handlerPointInfo = ()=>{
}
]
},
"waypointGimbalHeadingParam": {
"waypointGimbalPitchAngle": 0,
"waypointGimbalYawAngle": 0
"waypointGimbalHeadingParam": { //
"waypointGimbalPitchAngle": 0, // [-90, -30]
"waypointGimbalYawAngle": 0 //
},
"isRisky": 0,
"waypointWorkType": 0
@ -430,6 +431,11 @@ const waylinesJson = ref(
}
)
// 退
const backPage = ()=>{
emits("exitDraw")
}
// 线
const saveAirLine = ()=>{
@ -449,9 +455,8 @@ const saveAirLine = ()=>{
console.log("xmlString3",xmlString3);
alert(xmlString3);
return null;
return null;
handlerCreateFile(xmlString3);
}
@ -475,12 +480,31 @@ const handlerPrefixWpml = (obj) => {
}
}
obj[key] = newAttrs;
}
}
return obj;
}
//
const submitForm = ref({
"id": "",
"airLineName": null,
"airLineType": "waypoint",
"uavId": "",
"flyToFirstPointMode": "",
"safeTakeoffAltitude": 0,
"safeTakeoffSpeed": 0,
"globalRouteSpeed": 0,
"taskCompletionAction": "",
"outOfControlOption": "",
"typeOfOutOfControlAction": "",
"globalWayPointType": "",
"ptzControlMode": "",
"aircraftYawAngleMode": "",
"wpml": ""
})
// xml
const handlerCreateFile =async (content)=>{
@ -489,16 +513,29 @@ const handlerCreateFile =async (content)=>{
// FormData
const formData = new FormData();
console.log("blob",blob);
formData.append('xmlFile', blob);
let res = await uploadXmlFile(formData);
if(res){
if(res){
}
submitForm.value.wpml = res.path;
let addAirLineRes =await addAirLine(submitForm.value);
if(addAirLineRes){
message.success("操作成功!");
backPage();
}else{
message.error("操作失败!");
}
}else{
message.error("操作失败!");
}
}
@ -516,7 +553,7 @@ const handlerCreateFile =async (content)=>{
color:#ffffff;
display:flex;
gap:12px;
line-height:24px;
line-height:32px;
}
.area-info{

@ -1,7 +1,7 @@
<template>
<div class="containner">
<div class="title">
<LeftOutlined />
<LeftOutlined @click="backPage" />
<div>面状航线</div>
<SaveOutlined/>
@ -32,7 +32,8 @@
</div>
<div class="area-options">
<div class="area-options" >
<div class="item">
<div class="label">参考起飞点</div>
<div class="content">
@ -42,76 +43,120 @@
</a-button>
</div>
</div>
<div class="item flex-column">
<div class="label">选择镜头</div>
<div class="label">飞向首航点模式</div>
<div class="content">
<a-radio-group button-style="solid" v-model:value="props.polygonAirForm.lensMode">
<a-radio-button :value="1">红外</a-radio-button>
<a-radio-button :value="2">可见光</a-radio-button>
</a-radio-group>
<div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.flyToWaylineMode" :key="index"
:class=" missionConfig.flyToWaylineMode == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.flyToWaylineMode = item.value"
>
{{item.label}}
</div>
</div>
</div>
<div class="description">
<img src="/map/flyToWaylineMode.png" alt="">
</div>
</div>
<div class="item flex-column">
<div class="label">采集方式</div>
<div class="item">
<div class="label">安全起飞高度</div>
<div class="content">
<a-radio-group button-style="solid" v-model:value="props.polygonAirForm.gatherMode">
<a-radio-button :value="1">正射采集</a-radio-button>
<a-radio-button :value="2">倾斜采集</a-radio-button>
</a-radio-group>
<a-input style="width:100px;" placeholder="" v-model:value="missionConfig.takeOffSecurityHeight"></a-input>
</div>
<div class="unit"> m</div>
</div>
<div class="item">
<div class="label">智能摆动拍摄</div>
<div class="label">全局航线过渡速度</div>
<div class="content">
<a-input style="width:100px;" placeholder="" v-model:value="missionConfig.globalTransitionalSpeed"></a-input>
</div>
<div class="unit"> m/s</div>
</div>
<div class="item flex-column">
<div class="label">航线高度模式</div>
<div class="item">
<div class="label">全局返航高度</div>
<div class="content">
<a-radio-group button-style="solid" v-model:value="props.polygonAirForm.heightMode">
<a-radio-button :value="1">海拔高度</a-radio-button>
<a-radio-button :value="2">相对起点高度</a-radio-button>
<a-radio-button :value="3">相对地形高度</a-radio-button>
</a-radio-group>
<div style="margin-top:12px;">
<a-input-number v-model:value="props.polygonAirForm.height" :min="1" :max="100000" />
</div>
<a-input style="width:100px;" placeholder="" v-model:value="missionConfig.droneInfo.droneEnumValue"></a-input>
</div>
<div class="unit"> m</div>
</div>
<div class="item flex-column">
<div class="label">航线结束动作</div>
<div class="content">
<div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.finishAction" :key="index"
:class=" missionConfig.finishAction == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.finishAction = item.value"
>
{{item.label}}
</div>
</div>
</div>
</div>
<div class="item">
<div class="label">全局航线速度</div>
<div class="item flex-column">
<div class="label">失控是否继续执行航线</div>
<div class="content">
<a-input-number style="width:160px" v-model:value="props.polygonAirForm.speed" :min="1" :max="20" />
<div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.exitOnRCLost" :key="index"
:class=" missionConfig.exitOnRCLost == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.exitOnRCLost = item.value"
>
{{item.label}}
</div>
</div>
</div>
</div>
<div class="item">
<div class="label"> 主航线角度</div>
<div class="item flex-column" v-if="missionConfig.exitOnRCLost == 'executeLostAction'">
<div class="label">失控动作类型</div>
<div class="content">
<a-input-number width="160px" v-model:value="props.polygonAirForm.angle" :min="0" :max="180" />
<div class="radio-box">
<div v-for="(item,index) in missionConfigOptions.executeRCLostAction" :key="index"
:class=" missionConfig.executeRCLostAction == item.value ? 'radio-item-active':'radio-item'"
@click="missionConfig.executeRCLostAction = item.value"
>
{{item.label}}
</div>
</div>
</div>
</div>
<div class="item">
<div class="label"> 高程优化</div>
<div class="item flex-column">
<div class="label">高度模式</div>
<div class="content">
<div class="radio-box">
<div v-for="(item,index) in folderConfigOptions.executeHeightMode" :key="index"
:class=" folder.executeHeightMode == item.value ? 'radio-item-active':'radio-item'"
@click="folder.executeHeightMode = item.value"
>
{{item.label}}
</div>
</div>
</div>
<div class="description">
<img src="/map/executeHeightMode.png" alt="">
</div>
</div>
<div class="item">
<div class="label"> 完成动作</div>
<div class="label">全局航线飞行速度</div>
<div class="content">
<a-select
ref="select"
style="width:160px;"
v-model:value="props.polygonAirForm.complete"
>
<a-select-option :value="1">自动返航</a-select-option>
<a-select-option :value="2">返回航线起始点悬停</a-select-option>
<a-select-option :value="3">退出航线模式</a-select-option>
<a-select-option :value="4">原地降落</a-select-option>
</a-select>
<a-input style="width:100px;" placeholder="" v-model:value="folder.autoFlightSpeed"></a-input>
</div>
<div class="unit"> m/s</div>
</div>
</div>
@ -120,7 +165,9 @@
<script lang="ts" setup>
import {ref,defineEmits,defineProps} from 'vue'
import { SaveOutlined,LeftOutlined } from '@ant-design/icons-vue';
const emits = defineEmits(["setFlyPoint"])
import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts';
const emits = defineEmits(["setFlyPoint","exitDraw"])
const props = defineProps(["airInfo","polygonAirForm"])
@ -135,6 +182,46 @@ const setFlyPoint = ()=>{
emits("setFlyPoint");
}
// 线
const missionConfig = ref(
{
"flyToWaylineMode": "safely",
"finishAction": "goHome",
"exitOnRCLost": "executeLostAction",
"executeRCLostAction": "goBack",
"takeOffSecurityHeight": 20,
"globalTransitionalSpeed": 15,
"globalRTHHeight": 100,
"droneInfo": {
"droneEnumValue": 100,
"droneSubEnumValue": 1
},
"waylineAvoidLimitAreaMode": 0,
"payloadInfo": {
"payloadEnumValue": 99,
"payloadSubEnumValue": 2,
"payloadPositionIndex": 0
}
}
)
//
const folder = ref({
"templateId": 0,
"executeHeightMode": "WGS84",
"waylineId": 0,
"distance": 410.047576904297,
"duration": 80.3239784240723,
"autoFlightSpeed": 10,
"Placemark": []
})
// 退
const backPage = ()=>{
emits("exitDraw")
}
</script>
<style scoped>
.container{
@ -195,6 +282,32 @@ const setFlyPoint = ()=>{
gap:10px;
}
.radio-box{
width:100%;
display: flex;
overflow: hidden;
border:0.5px solid #3B4154 ;
font-size:12px;
}
.radio-box .radio-item{
flex:1;
color:#8A92A6 ;
text-align: center;
background:#222738 ;
cursor:pointer;
}
.radio-box .radio-item-active{
flex:1;
color:#fff;
text-align: center;
background:#3A57E8 ;
cursor:pointer;
}
::v-deep .ant-radio-group {
display: block;
width: 100%;

@ -3,12 +3,12 @@
<!-- 航点航线 -->
<div v-if="props.airRoute.airLineType == '航点航线'" class="air-container">
<airPoint :airPoints="airPoints" @setFlyPoint="setFlyPoint" :airInfo="lineInfo" :polygonAirForm="polygonAirForm" @checkPoint="checkPoint"></airPoint>
<airPoint :airPoints="airPoints" @setFlyPoint="setFlyPoint" @exitDraw="exitDraw" :airInfo="lineInfo" :polygonAirForm="polygonAirForm" @checkPoint="checkPoint"></airPoint>
</div>
<!-- 航面航线 -->
<div v-if="props.airRoute.airLineType == '面状航线'" class="airpolygon-container">
<airPolygon @setFlyPoint="setFlyPoint" :airInfo="airInfo" :polygonAirForm="polygonAirForm"></airPolygon>
<airPolygon @setFlyPoint="setFlyPoint" :airInfo="airInfo" :polygonAirForm="polygonAirForm" @exitDraw="exitDraw"></airPolygon>
</div>
<!-- 航点航线配置 -->
@ -19,7 +19,7 @@
</div>
</template>
<script lang="ts" setup>
import {ref,onMounted,defineProps,watch} from 'vue'
import {ref,onMounted,defineProps,watch,defineEmits} from 'vue'
import { message } from 'ant-design-vue';
import { GeojsonToWkt } from '@/components/MapboxMaps/src/WktGeojsonTransform';
import {buildUUID} from '@/utils/uuid'
@ -32,7 +32,7 @@ import * as turf from '@turf/turf'
import airPolygon from './airPolygon.vue'
import airPointConfig from './airPointConfig.vue'
const props = defineProps(["airRoute"]);
const props = defineProps(["airRoute","flyToTherePosition"]);
watch(
()=> props.airRoute,
@ -41,6 +41,8 @@ watch(
}
)
const emits = defineEmits(["exitDraw","flyToThere"])
@ -74,6 +76,8 @@ const checkPoint = (e)=>{
let map: mars3d.Map; //
let graphicLayer:mars3d.layer.GraphicLayer;
let uavGraphicLayer:mars3d.layer.GraphicLayer;
// 线
let polygonGraphicLayer:mars3d.layer.GraphicLayer;
@ -81,6 +85,19 @@ let polygonLineGraphicLayer:mars3d.layer.GeoJsonLayer;
let graphic = null;
const exitDraw = () => {
//
graphicLayer ? graphicLayer.clear() : null;
polygonGraphicLayer ? polygonGraphicLayer.clear() : null;
polygonLineGraphicLayer ? polygonLineGraphicLayer.clear() : null;
airPoints.value = [];
props.airRoute.airLineType = null;
airPointConfigShow.value = false;
emits("exitDraw");
}
// 线
const lineInfo = ref({
count:0,
@ -346,7 +363,7 @@ const initMap = ()=>{
graphicLayer.bindContextMenu([
{
text: "删除航点",
text: "删除",
icon: "fa fa-camera-retro", // font-class
callback: (e) => {
deleteAirPoint(e);
@ -375,6 +392,14 @@ const initMap = ()=>{
//
const handlerBindMapMenus = ()=>{
const mapContextmenuItems = [
{
text: "飞行到此处",
icon: "fa fa-camera-retro", // font-class
callback: (e) => {
flyToThere(e);
}
},
{
text: "添加航点",
icon: "fa fa-camera-retro", // font-class
@ -443,8 +468,8 @@ const handlerDrawPoint = (e) => {
style: {
angle1: 30, // 1
angle2: 30, // 2
length: 50, //
rayEllipsoid: true,
length: 10, //
rayEllipsoid: false,
color: "rgba(0,255,255,0.3)",
outline: true,
topShow: true,
@ -452,12 +477,9 @@ const handlerDrawPoint = (e) => {
flat: true,
cameraHpr: true,
heading: 0,
pitch: 180,
roll: 0, //
clippingPlanes: [{
distance: 0, // 0
normal: new Cesium.Cartesian3(0, 0, -1) //
}]
pitch: 90, // 0 - 360
roll: 0,
}
})
graphicLayer.addGraphic(rectSensor)
@ -901,6 +923,66 @@ const deleteAirPoint = (e)=>{
// 线
handlerDrawLine()
}
//
const flyToThere = (e) => {
if(!uavGraphicLayer){
uavGraphicLayer = new mars3d.layer.GraphicLayer({
isAutoEditing: true //
});
map.addLayer(uavGraphicLayer);
uavGraphicLayer.bindContextMenu([
])
}
let position = mars3d.LngLatPoint.fromCartesian(e.position);
emits("flyToThere",position)
let mark = graphicLayer.getGraphicById("flytothere");
if(mark){
graphicLayer.removeGraphic(mark);
}
//
const graphic = new mars3d.graphic.BillboardEntity({
id:"flytothere",
name: "标点",
position: [position._lng,position._lat,position._alt],
style: {
image: "/map/start-point.png",
scale: 0.5,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
label: {
text: "标点",
font_size: 14,
color: "#ffffff",
outline: true,
outlineColor: "#000000",
pixelOffsetY: -40
}
},
})
const pointEdit = new mars3d.thing.MatrixMove2({
position: graphic.position
})
map.addThing(pointEdit)
pointEdit.on(mars3d.EventType.change, (event) => {
graphic.position = event.position
})
uavGraphicLayer.addGraphic(graphic);
}
</script>

@ -1,7 +1,7 @@
<template>
<div>
<div style="width:100%;height: calc( 100vh - 80px);" >
<Map :airRoute="airRoute"></Map>
<Map :airRoute="airRoute" @exitDraw="exitDraw" @flyToThere="flyToThere"></Map>
</div>
<!-- 工作计划列表 -->
@ -43,6 +43,15 @@ import AirPolygon from './components/airPolygon.vue';
const airRoute = ref({})
const flyToTherePosition = ref({
lng:null,
lat:null,
alt:null,
})
const flyToThere = (e)=>{
console.log(e);
}
const planListShow = ref(true);
const workPlanFormShow = ref(false);
const ariLineShow = ref(false);
@ -116,4 +125,12 @@ const successCreatePlan = ()=>{
aircraftShow.value = false;
planListShow.value = true;
}
// 线退
const exitDraw = ()=>{
planListShow.value = false;
workPlanFormShow.value = true;
ariLineShow.value = true;
}
</script>

@ -114,4 +114,31 @@ export const folderConfigOptions = {
value:"realTimeFollowSurface"
}
]
}
// 飞行器信息
export const pointConfigOptions = {
waypointHeadingMode:[ // 飞行器偏航角模式
{
label:"沿航线方向",
value:"followWayline"
},{
label:"手动控制",
value:"manually"
},{
label:"锁定当前偏航角",
value:"smoothTransition"
},{
label:"自定义",
value:"smoothTransition",
},{
label:"朝向兴趣点",
value:"towardPOI",
}
],
waypointHeadingPathMode:[ // 飞行器偏航角转动方向
],
}

@ -129,40 +129,40 @@
"actionTriggerType": "reachPoint"
},
"action": [
{
"actionId": 0,
"actionActuatorFunc": "rotateYaw",
"actionActuatorFuncParam": {
"aircraftHeading": 0,
"aircraftPathMode": "counterClockwise"
{
"actionId": 0,
"actionActuatorFunc": "rotateYaw",
"actionActuatorFuncParam": {
"aircraftHeading": 0,
"aircraftPathMode": "counterClockwise"
}
},
{
"actionId": 1,
"actionActuatorFunc": "gimbalRotate",
"actionActuatorFuncParam": {
"gimbalHeadingYawBase": "north",
"gimbalRotateMode": "absoluteAngle",
"gimbalPitchRotateEnable": 1,
"gimbalPitchRotateAngle": 0,
"gimbalRollRotateEnable": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateEnable": 0,
"gimbalYawRotateAngle": 0,
"gimbalRotateTimeEnable": 0,
"gimbalRotateTime": 0,
"payloadPositionIndex": 0
}
},
{
"actionId": 2,
"actionActuatorFunc": "zoom",
"actionActuatorFuncParam": {
"focalLength": 24,
"isUseFocalFactor": 0,
"payloadPositionIndex": 0
}
}
},
{
"actionId": 1,
"actionActuatorFunc": "gimbalRotate",
"actionActuatorFuncParam": {
"gimbalHeadingYawBase": "north",
"gimbalRotateMode": "absoluteAngle",
"gimbalPitchRotateEnable": 1,
"gimbalPitchRotateAngle": 0,
"gimbalRollRotateEnable": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateEnable": 0,
"gimbalYawRotateAngle": 0,
"gimbalRotateTimeEnable": 0,
"gimbalRotateTime": 0,
"payloadPositionIndex": 0
}
},
{
"actionId": 2,
"actionActuatorFunc": "zoom",
"actionActuatorFuncParam": {
"focalLength": 24,
"isUseFocalFactor": 0,
"payloadPositionIndex": 0
}
}
]
},
"waypointGimbalHeadingParam": {

Loading…
Cancel
Save