drone-camera 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +157 -2
- package/index.d.ts +51 -0
- package/index.d.ts.map +1 -0
- package/index.js +20474 -0
- package/index.js.map +1 -0
- package/index.umd.cjs +1361 -0
- package/index.umd.cjs.map +1 -0
- package/lib/drone-capture-manifest.d.ts +169 -0
- package/lib/drone-capture-manifest.d.ts.map +1 -0
- package/lib/drone-capture-panel.d.ts +135 -0
- package/lib/drone-capture-panel.d.ts.map +1 -0
- package/lib/drone-capture.d.ts +380 -0
- package/lib/drone-capture.d.ts.map +1 -0
- package/lib/drone-cesium-mission.d.ts +120 -0
- package/lib/drone-cesium-mission.d.ts.map +1 -0
- package/lib/drone-cesium-rig.d.ts +50 -0
- package/lib/drone-cesium-rig.d.ts.map +1 -0
- package/lib/drone-cesium.d.ts +519 -0
- package/lib/drone-cesium.d.ts.map +1 -0
- package/lib/drone-control.d.ts +188 -0
- package/lib/drone-control.d.ts.map +1 -0
- package/lib/drone-engine.d.ts +70 -0
- package/lib/drone-engine.d.ts.map +1 -0
- package/lib/drone-exif.d.ts +64 -0
- package/lib/drone-exif.d.ts.map +1 -0
- package/lib/drone-fly.d.ts +545 -0
- package/lib/drone-fly.d.ts.map +1 -0
- package/lib/drone-gallery.d.ts +146 -0
- package/lib/drone-gallery.d.ts.map +1 -0
- package/lib/drone-husky-model.d.ts +22 -0
- package/lib/drone-husky-model.d.ts.map +1 -0
- package/lib/drone-image-utils.d.ts +67 -0
- package/lib/drone-image-utils.d.ts.map +1 -0
- package/lib/drone-image-viewer.d.ts +97 -0
- package/lib/drone-image-viewer.d.ts.map +1 -0
- package/lib/drone-lights.d.ts +194 -0
- package/lib/drone-lights.d.ts.map +1 -0
- package/lib/drone-minimap.d.ts +155 -0
- package/lib/drone-minimap.d.ts.map +1 -0
- package/lib/drone-panel.d.ts +265 -0
- package/lib/drone-panel.d.ts.map +1 -0
- package/lib/drone-panorama-viewer.d.ts +162 -0
- package/lib/drone-panorama-viewer.d.ts.map +1 -0
- package/lib/drone-panorama.d.ts +242 -0
- package/lib/drone-panorama.d.ts.map +1 -0
- package/lib/drone-photogrammetry.d.ts +207 -0
- package/lib/drone-photogrammetry.d.ts.map +1 -0
- package/lib/drone-radar.d.ts +136 -0
- package/lib/drone-radar.d.ts.map +1 -0
- package/lib/drone-reconstruction-preview.d.ts +84 -0
- package/lib/drone-reconstruction-preview.d.ts.map +1 -0
- package/lib/drone-rig.d.ts +385 -0
- package/lib/drone-rig.d.ts.map +1 -0
- package/lib/drone-sim.d.ts +883 -0
- package/lib/drone-sim.d.ts.map +1 -0
- package/lib/drone-stitch.d.ts +84 -0
- package/lib/drone-stitch.d.ts.map +1 -0
- package/lib/drone-world.d.ts +194 -0
- package/lib/drone-world.d.ts.map +1 -0
- package/lib/mission-editor.d.ts +116 -0
- package/lib/mission-editor.d.ts.map +1 -0
- package/lib/mission-panel.d.ts +173 -0
- package/lib/mission-panel.d.ts.map +1 -0
- package/package.json +61 -4
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import type { ExifData } from './drone-exif';
|
|
2
|
+
import type { CaptureManifest, CaptureManifestOptions, CaptureValidationReport, CaptureValidatorOptions } from './drone-capture-manifest';
|
|
3
|
+
/** 影像来源:场景渲染图 / 真实相机照片 */
|
|
4
|
+
export type ImageSource = 'virtual-camera' | 'real-camera';
|
|
5
|
+
/** 相机位姿所在的坐标框架 */
|
|
6
|
+
export type CoordinateFrame = 'ecef' | 'local-enu' | 'project-local';
|
|
7
|
+
/**
|
|
8
|
+
* 相机内参。
|
|
9
|
+
*
|
|
10
|
+
* `calibrationSource` 不是装饰字段:重建时「内参是已知的」和「内参是猜的」要用完全不同的
|
|
11
|
+
* 策略(SfM 可以固定内参、也可以让内参参与优化),混在一起必然出精度问题,所以必须逐张带上。
|
|
12
|
+
*/
|
|
13
|
+
export interface CameraIntrinsics {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
fx?: number;
|
|
17
|
+
fy?: number;
|
|
18
|
+
cx?: number;
|
|
19
|
+
cy?: number;
|
|
20
|
+
horizontalFovDeg?: number;
|
|
21
|
+
verticalFovDeg?: number;
|
|
22
|
+
distortion?: number[];
|
|
23
|
+
calibrationSource: 'known' | 'exif' | 'estimated' | 'unknown';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 相机位姿。
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ 两个隐性契约,换实现前必须一致:
|
|
29
|
+
* - `rotation` 是四元数,**分量顺序固定 `[x, y, z, w]`**(与 three 一致);
|
|
30
|
+
* - `coordinateFrame` 说明这套数字在哪个系里。库内约定:
|
|
31
|
+
* · `local-enu` = 以起飞点(返航点)为原点,**x 东 / y 北 / z 上**,单位米;
|
|
32
|
+
* · `ecef` = 地心地固坐标,单位米(Cesium 后端)。
|
|
33
|
+
* 四元数表示「相机自身的 x 轴(光轴)指向」在该系中的旋转。
|
|
34
|
+
*/
|
|
35
|
+
export interface CameraPose {
|
|
36
|
+
position: [number, number, number];
|
|
37
|
+
/** 四元数 [x, y, z, w] */
|
|
38
|
+
rotation: [number, number, number, number];
|
|
39
|
+
coordinateFrame: CoordinateFrame;
|
|
40
|
+
}
|
|
41
|
+
/** 影像校验结论 */
|
|
42
|
+
export interface ImageValidation {
|
|
43
|
+
status: 'pending' | 'valid' | 'warning' | 'invalid';
|
|
44
|
+
messages: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 取景**俯仰**覆盖 —— 让取景相机临时偏离"云台当前俯仰"的常态。
|
|
48
|
+
*
|
|
49
|
+
* ⚠️ 这里**故意没有水平偏航**:水平视野覆盖不能靠云台转。DJI Mini 4 Pro 的云台 Pan
|
|
50
|
+
* 机械行程只有 ±30°(本库 `DRONE_SPEC.gimbalYawRange` 按 ±5° 建模),
|
|
51
|
+
* 靠云台转不出 180° 全景 —— 真机 180°/360° 是**机体原地自转**补水平、云台只做俯仰分层。
|
|
52
|
+
* 水平网格因此走 `VirtualCaptureProvider.spinBodyTo`(转机身),而不是在这里塞一个偏航角。
|
|
53
|
+
*
|
|
54
|
+
* 与库内"稳像 = 模型不动、相机侧解耦"是同一套思路 —— 不动飞控、不动用户视角,
|
|
55
|
+
* 只改这一张的取景俯仰,因此取景帧、拍照成片与记录的位姿天然同源。
|
|
56
|
+
*/
|
|
57
|
+
export interface CaptureViewOverride {
|
|
58
|
+
/**
|
|
59
|
+
* 俯仰(度):**替代**云台俯仰 —— 即该张照片相对水平面的绝对俯仰角。
|
|
60
|
+
* 不给则沿用云台当前俯仰。全景网格给的是绝对值,否则用户把云台压到 -90° 后全景会全朝地面。
|
|
61
|
+
*/
|
|
62
|
+
pitch?: number;
|
|
63
|
+
}
|
|
64
|
+
/** 影像在一次全景扫描里的定位(写进 `metadata.panorama`) */
|
|
65
|
+
export interface PanoramaShotRef {
|
|
66
|
+
/** 全景组 id:同一次扫描共用一个,拼接时按它聚合 */
|
|
67
|
+
group: string;
|
|
68
|
+
/** 全景模式标识(`pano-wide` / `pano-180` / `pano-360`);这里用 string 以免形成循环依赖 */
|
|
69
|
+
mode: string;
|
|
70
|
+
/** 组内序号(1 起) */
|
|
71
|
+
index: number;
|
|
72
|
+
/** 组内总张数 */
|
|
73
|
+
total: number;
|
|
74
|
+
/** 网格行列(0 起):row = 俯仰层, col = 机身水平方位 */
|
|
75
|
+
row: number;
|
|
76
|
+
col: number;
|
|
77
|
+
/** 该张的**机身航向偏移**(度,相对本组起始航向;正值 = 向右/顺时针) */
|
|
78
|
+
bodyYaw: number;
|
|
79
|
+
/** 该张的取景俯仰(度,绝对) */
|
|
80
|
+
pitch: number;
|
|
81
|
+
}
|
|
82
|
+
/** 虚拟采集的附加参数 */
|
|
83
|
+
export interface VirtualCaptureOptions {
|
|
84
|
+
/** 本次取景的俯仰覆盖(用完自动复位;见 CaptureViewOverride) */
|
|
85
|
+
view?: CaptureViewOverride | null;
|
|
86
|
+
/** 本次取景属于哪个全景组 */
|
|
87
|
+
panorama?: PanoramaShotRef;
|
|
88
|
+
}
|
|
89
|
+
/** 统一影像条目(虚拟采集与真实导入共用) */
|
|
90
|
+
export interface CapturedImage {
|
|
91
|
+
id: string;
|
|
92
|
+
source: ImageSource;
|
|
93
|
+
fileName: string;
|
|
94
|
+
mimeType: string;
|
|
95
|
+
sizeBytes: number;
|
|
96
|
+
/** ISO 8601;虚拟采集是快门时刻,真实照片优先取 EXIF 拍摄时间 */
|
|
97
|
+
capturedAt: string;
|
|
98
|
+
/** 预览地址:虚拟 = PNG data URL,真实 = Blob URL(仅浏览器内有效) */
|
|
99
|
+
imageUrl?: string;
|
|
100
|
+
/** 只用于浏览器内短期数据流,**不得写入服务端数据库**(见模块头) */
|
|
101
|
+
localBlob?: Blob;
|
|
102
|
+
cameraIntrinsics?: CameraIntrinsics;
|
|
103
|
+
cameraPose?: CameraPose;
|
|
104
|
+
metadata: {
|
|
105
|
+
latitude?: number;
|
|
106
|
+
longitude?: number;
|
|
107
|
+
altitude?: number;
|
|
108
|
+
cameraModel?: string;
|
|
109
|
+
sceneId?: string;
|
|
110
|
+
sceneVersion?: string;
|
|
111
|
+
dronePoseId?: string;
|
|
112
|
+
gimbalRotation?: [number, number, number, number];
|
|
113
|
+
gpsAccuracyMeters?: number;
|
|
114
|
+
rtkFixed?: boolean;
|
|
115
|
+
/** 虚拟影像的产出后端(three / cesium),便于区分同页两套后端的采集结果 */
|
|
116
|
+
engine?: string;
|
|
117
|
+
/** 全景扫描定位(属于某次 180°/360° 拍摄时才有) */
|
|
118
|
+
panorama?: PanoramaShotRef;
|
|
119
|
+
/** 真实照片的原始 EXIF(保留原始字段,避免二次解析丢信息) */
|
|
120
|
+
exif?: ExifData;
|
|
121
|
+
};
|
|
122
|
+
validation: ImageValidation;
|
|
123
|
+
}
|
|
124
|
+
/** 采集会话参数 */
|
|
125
|
+
export interface CaptureSessionOptions {
|
|
126
|
+
source: ImageSource;
|
|
127
|
+
name: string;
|
|
128
|
+
/** 自动采集的时间间隔(毫秒);0 / 缺省 = 不按时间触发 */
|
|
129
|
+
captureIntervalMs?: number;
|
|
130
|
+
/** 自动采集的距离间隔(米);0 / 缺省 = 不按距离触发 */
|
|
131
|
+
distanceIntervalMeters?: number;
|
|
132
|
+
includeCameraMetadata?: boolean;
|
|
133
|
+
/** 虚拟场景标识(便于回溯「这批影像出自哪个版本的场景」) */
|
|
134
|
+
sceneId?: string;
|
|
135
|
+
sceneVersion?: string;
|
|
136
|
+
/** 地理参考原点:给了它,局部 ENU 坐标同时能换算成经纬度 */
|
|
137
|
+
georeference?: GeoreferenceOrigin;
|
|
138
|
+
}
|
|
139
|
+
/** 局部坐标 → 经纬高的原点(局部 ENU 的 (0,0,0) 落在这里) */
|
|
140
|
+
export interface GeoreferenceOrigin {
|
|
141
|
+
longitude: number;
|
|
142
|
+
latitude: number;
|
|
143
|
+
altitude?: number;
|
|
144
|
+
}
|
|
145
|
+
/** 采集会话状态 */
|
|
146
|
+
export type CaptureSessionStatus = 'created' | 'capturing' | 'paused' | 'finished' | 'failed';
|
|
147
|
+
/** 采集会话 */
|
|
148
|
+
export interface CaptureSession {
|
|
149
|
+
id: string;
|
|
150
|
+
options: CaptureSessionOptions;
|
|
151
|
+
status: CaptureSessionStatus;
|
|
152
|
+
images: CapturedImage[];
|
|
153
|
+
createdAt: string;
|
|
154
|
+
updatedAt: string;
|
|
155
|
+
/** 产出后端(虚拟采集时由 provider 提供) */
|
|
156
|
+
engine?: string;
|
|
157
|
+
/** 自动采集是否进行中 */
|
|
158
|
+
autoCapturing: boolean;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 取景成片的结构契约。
|
|
162
|
+
*
|
|
163
|
+
* 故意只声明结构、不从 drone-fly 引类型:这样 `drone-capture` 不依赖任何渲染模块
|
|
164
|
+
* (drone-fly / drone-cesium 反过来 `import type` 本模块,依赖方向单向,无循环)。
|
|
165
|
+
*/
|
|
166
|
+
export interface VirtualShot {
|
|
167
|
+
dataUrl: string;
|
|
168
|
+
width: number;
|
|
169
|
+
height: number;
|
|
170
|
+
/** 可选的同一渲染帧相机快照。渲染后端应优先提供它。 */
|
|
171
|
+
camera?: CaptureCameraState;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 虚拟取景相机状态 —— 由渲染后端提供(见 `VirtualCaptureProvider`)。
|
|
175
|
+
* 注意这必须是**取景相机**(云台镜头)而不是机身:两者朝向可能完全不同。
|
|
176
|
+
*/
|
|
177
|
+
export interface CaptureCameraState {
|
|
178
|
+
pose: CameraPose;
|
|
179
|
+
intrinsics: CameraIntrinsics;
|
|
180
|
+
/** 成片画幅(像素) */
|
|
181
|
+
frame: {
|
|
182
|
+
width: number;
|
|
183
|
+
height: number;
|
|
184
|
+
};
|
|
185
|
+
/** 场景标识 */
|
|
186
|
+
scene?: {
|
|
187
|
+
id?: string;
|
|
188
|
+
version?: string;
|
|
189
|
+
};
|
|
190
|
+
/** 机体真值(诊断 / 复现用) */
|
|
191
|
+
drone?: {
|
|
192
|
+
position: [number, number, number];
|
|
193
|
+
heading: number;
|
|
194
|
+
tiltPitch: number;
|
|
195
|
+
tiltRoll: number;
|
|
196
|
+
gimbalPitch: number;
|
|
197
|
+
gimbalYaw: number;
|
|
198
|
+
};
|
|
199
|
+
/** 相机的地理位置(地理坐标系后端提供;纯局部场景没有这个值) */
|
|
200
|
+
geo?: {
|
|
201
|
+
longitude: number;
|
|
202
|
+
latitude: number;
|
|
203
|
+
altitude: number;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 宿主渲染后端向采集服务暴露的能力。
|
|
208
|
+
*
|
|
209
|
+
* `DroneFly`(three)与 `CesiumDroneAdapter` 都天然满足:`requestPhoto()` 是既有的拍照入口,
|
|
210
|
+
* `getCaptureCamera()` 是为采集新增的只读快照。**采集服务不创建第二个 Viewer** ——
|
|
211
|
+
* 无论虚拟影像来自哪套后端,取景帧与相机状态都只有这一个来源。
|
|
212
|
+
*/
|
|
213
|
+
export interface VirtualCaptureProvider {
|
|
214
|
+
/** 后端标识,写进影像元数据 */
|
|
215
|
+
readonly engine?: string;
|
|
216
|
+
/** 取当前云台取景的一帧(与拍照完全同一条路径) */
|
|
217
|
+
requestPhoto(): Promise<VirtualShot | null>;
|
|
218
|
+
/** 取景相机的位姿与内参快照;模型 / 云台未就绪时返回 null */
|
|
219
|
+
getCaptureCamera(): CaptureCameraState | null;
|
|
220
|
+
/**
|
|
221
|
+
* 设置取景**俯仰**覆盖(全景分层用);传 `null` 复位。
|
|
222
|
+
*
|
|
223
|
+
* 可选方法:只做单张采集的后端可以不实现 —— 此时全景扫描仍会按预设逐张请求,
|
|
224
|
+
* 只是每张都沿用云台当前俯仰(采不到俯仰网格)。
|
|
225
|
+
*/
|
|
226
|
+
setCaptureView?(override: CaptureViewOverride | null): void;
|
|
227
|
+
/**
|
|
228
|
+
* 让**机体原地自转**到绝对方位角 `headingDeg`(度,罗盘角);`null` 停止自转。
|
|
229
|
+
*
|
|
230
|
+
* 全景扫描的**水平**覆盖只有这条路可走:云台 Pan 机械行程只有 ±30°,
|
|
231
|
+
* 转不出 180°(见 `CaptureViewOverride` 的说明)。后端只负责下达目标,
|
|
232
|
+
* "转到位了没"由调用方用 `getBodyHeading()` 比对 —— 这样各后端不必各自实现等待逻辑。
|
|
233
|
+
*/
|
|
234
|
+
spinBodyTo?(headingDeg: number | null): void;
|
|
235
|
+
/** 机体当前方位角(度,罗盘角);没实现的后端返回 undefined */
|
|
236
|
+
getBodyHeading?(): number;
|
|
237
|
+
}
|
|
238
|
+
/** 会话汇总(面板与导出共用) */
|
|
239
|
+
export interface CaptureSessionSummary {
|
|
240
|
+
total: number;
|
|
241
|
+
valid: number;
|
|
242
|
+
warning: number;
|
|
243
|
+
invalid: number;
|
|
244
|
+
pending: number;
|
|
245
|
+
/** 真实照片里带 GPS 的张数 */
|
|
246
|
+
withGps: number;
|
|
247
|
+
/** 虚拟影像里带完整相机位姿的张数 */
|
|
248
|
+
withPose: number;
|
|
249
|
+
}
|
|
250
|
+
/** 导出格式 */
|
|
251
|
+
export type CaptureExportFormat = 'json' | 'csv' | 'manifest';
|
|
252
|
+
/** 会话导出文件标识 */
|
|
253
|
+
export declare const CAPTURE_EXPORT_FORMAT = "drone-camera/capture-session";
|
|
254
|
+
/** 导出结构版本 */
|
|
255
|
+
export declare const CAPTURE_EXPORT_VERSION = 1;
|
|
256
|
+
/** 逐张影像的校验规则 */
|
|
257
|
+
export declare function validateCapturedImage(image: CapturedImage): ImageValidation;
|
|
258
|
+
/** 会话汇总 */
|
|
259
|
+
export declare function summarizeSession(session: CaptureSession): CaptureSessionSummary;
|
|
260
|
+
/**
|
|
261
|
+
* 由 EXIF 推相机内参。
|
|
262
|
+
*
|
|
263
|
+
* 换算依据是 **35mm 等效焦距**:全画幅成像面宽 36mm,故水平视场角
|
|
264
|
+
* `fovX = 2·atan(36 / (2·f35))`,再按像素宽度反推 `fx = width / (2·tan(fovX/2))`。
|
|
265
|
+
* 像素为正方形,所以 `fx = fy`;主点按像面中心。
|
|
266
|
+
*
|
|
267
|
+
* 只有实际焦距而没有 35mm 等效值时无法反推传感器尺寸,此时返回 `unknown`
|
|
268
|
+
* —— 宁可让用户看到「内参未知」,也不要编一个假内参把误差带进重建。
|
|
269
|
+
*/
|
|
270
|
+
export declare function intrinsicsFromExif(exif: ExifData | null | undefined, width: number, height: number): CameraIntrinsics;
|
|
271
|
+
/** `CaptureService` 构造选项 */
|
|
272
|
+
export interface CaptureServiceOptions {
|
|
273
|
+
/** 虚拟取景帧来源(渲染后端) */
|
|
274
|
+
provider?: VirtualCaptureProvider | null;
|
|
275
|
+
/** 时间源,便于测试注入 */
|
|
276
|
+
now?: () => Date;
|
|
277
|
+
/** id 生成器,便于测试注入 */
|
|
278
|
+
createId?: () => string;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 影像采集服务:管理采集会话、把两类影像归一成 `CapturedImage`、并支持导出。
|
|
282
|
+
*
|
|
283
|
+
* ```ts
|
|
284
|
+
* const capture = new CaptureService({ provider: fly })
|
|
285
|
+
* const session = capture.createSession({ source: 'virtual-camera', name: '厂区绕飞' })
|
|
286
|
+
* await capture.captureVirtualImage(session.id) // 手动拍一张
|
|
287
|
+
* capture.startAutoCapture(session.id, { intervalMs: 2000 }) // 或按时间自动连拍
|
|
288
|
+
* capture.importRealImages(session.id, files) // 真实照片导入
|
|
289
|
+
* const csv = capture.exportSession(session.id, 'csv')
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
export declare class CaptureService {
|
|
293
|
+
private readonly sessions;
|
|
294
|
+
private readonly listeners;
|
|
295
|
+
private readonly now;
|
|
296
|
+
private readonly createId;
|
|
297
|
+
private provider;
|
|
298
|
+
/** 自动采集句柄:按会话各存一份 */
|
|
299
|
+
private readonly auto;
|
|
300
|
+
/** 构造采集服务:管理拍摄会话与自动采集(每会话独立相册) */
|
|
301
|
+
constructor(options?: CaptureServiceOptions);
|
|
302
|
+
/** 换绑定后端(机体切换 / 引擎重建后重新挂) */
|
|
303
|
+
setProvider(provider: VirtualCaptureProvider | null): void;
|
|
304
|
+
/** 读取当前取景相机内参(未就绪或后端未提供时返回 null)。 */
|
|
305
|
+
getCaptureIntrinsics(): CameraIntrinsics | null;
|
|
306
|
+
/** 将浏览器会话转换为可交给离线重建任务的 CaptureManifest。 */
|
|
307
|
+
buildManifest(sessionId: string, options?: CaptureManifestOptions): CaptureManifest | null;
|
|
308
|
+
/** 导出文档约定的 manifest.json 文本。影像二进制仍由宿主按 file/imageUrl 落盘。 */
|
|
309
|
+
exportManifest(sessionId: string, options?: CaptureManifestOptions, space?: number): string;
|
|
310
|
+
/** 在提交离线重建前运行 Manifest 质量门禁。 */
|
|
311
|
+
validateSession(sessionId: string, options?: CaptureManifestOptions & CaptureValidatorOptions): CaptureValidationReport | null;
|
|
312
|
+
/** 新建拍摄会话(指定覆盖俯仰/张数等,返回会话) */
|
|
313
|
+
createSession(options: CaptureSessionOptions): CaptureSession;
|
|
314
|
+
/** 按 id 取会话(不存在返回 null) */
|
|
315
|
+
getSession(id: string): CaptureSession | null;
|
|
316
|
+
/** 列全部会话(按创建时间) */
|
|
317
|
+
listSessions(): CaptureSession[];
|
|
318
|
+
/** 当前会话(最近创建 / 最近操作的那个);面板默认展示它 */
|
|
319
|
+
get activeSession(): CaptureSession | null;
|
|
320
|
+
/** 暂停会话的自动采集 */
|
|
321
|
+
pauseSession(id: string): void;
|
|
322
|
+
/** 续跑被暂停的会话 */
|
|
323
|
+
resumeSession(id: string): void;
|
|
324
|
+
/** 结束会话(停止采集,照片保留;返回被结束的会话) */
|
|
325
|
+
finishSession(id: string): CaptureSession | null;
|
|
326
|
+
/** 删除会话及其全部照片 */
|
|
327
|
+
removeSession(id: string): void;
|
|
328
|
+
/** 移除单张影像(无效照片的常规处置) */
|
|
329
|
+
removeImage(sessionId: string, imageId: string): boolean;
|
|
330
|
+
/** 清空会话内全部照片(会话保留) */
|
|
331
|
+
clearImages(sessionId: string): void;
|
|
332
|
+
/** 订阅会话变更(面板用);返回退订函数 */
|
|
333
|
+
subscribe(listener: (session: CaptureSession) => void): () => void;
|
|
334
|
+
/**
|
|
335
|
+
* 采集一张虚拟影像。
|
|
336
|
+
*
|
|
337
|
+
* 顺序有讲究:先 `requestPhoto()` 拿到成片,再读相机状态 —— 因为渲染后端是**按帧**推进的,
|
|
338
|
+
* 成片用的是「取景那一帧」的机体真值;等 promise 落地时仿真还没走到下一帧,此刻读到的
|
|
339
|
+
* 位姿正好就是那张照片的位姿(反过来先读就会差一帧)。
|
|
340
|
+
*
|
|
341
|
+
* `options.view` 给的是**本次取景**的俯仰覆盖(全景分层用):设置 → 拍照 → 读位姿 →
|
|
342
|
+
* 无条件复位,全程在同一个 try/finally 里,调用方不可能忘记还原。
|
|
343
|
+
*/
|
|
344
|
+
captureVirtualImage(sessionId: string, options?: VirtualCaptureOptions): Promise<CapturedImage | null>;
|
|
345
|
+
/** 后端是否支持"机体原地自转" —— 全景的水平覆盖只有它做得出来 */
|
|
346
|
+
get canSpinBody(): boolean;
|
|
347
|
+
/** 机体当前方位角(度,罗盘角);后端不支持时返回 null */
|
|
348
|
+
getBodyHeading(): number | null;
|
|
349
|
+
/** 让机体原地自转到绝对方位角 `headingDeg`;`null` 停止自转(后端不支持则什么都不做) */
|
|
350
|
+
spinBodyTo(headingDeg: number | null): void;
|
|
351
|
+
private buildVirtualImage;
|
|
352
|
+
/**
|
|
353
|
+
* 开始自动采集:在一条 200ms 的心跳上同时评估**时间**与**距离**两个触发条件,
|
|
354
|
+
* 谁先满足就先拍一张,并同时刷新两个基准 —— 避免时间与距离各自计时导致的重复连拍。
|
|
355
|
+
*/
|
|
356
|
+
startAutoCapture(sessionId: string, options?: {
|
|
357
|
+
intervalMs?: number;
|
|
358
|
+
distanceMeters?: number;
|
|
359
|
+
}): boolean;
|
|
360
|
+
private tickAuto;
|
|
361
|
+
/** 停止会话的自动采集(会话与照片都保留) */
|
|
362
|
+
stopAutoCapture(sessionId: string): void;
|
|
363
|
+
/** 会话是否正在自动采集(定时按间隔拍照) */
|
|
364
|
+
isAutoCapturing(sessionId: string): boolean;
|
|
365
|
+
/**
|
|
366
|
+
* 导入真实照片。**尽力保留原始信息**:EXIF 全读,读不到就明确标记缺失,
|
|
367
|
+
* 但绝不因此拒绝文件 —— 「有没有元数据」本身是需要展示的信息(见 validateCapturedImage)。
|
|
368
|
+
*/
|
|
369
|
+
importRealImages(sessionId: string, files: File[] | FileList): Promise<CapturedImage[]>;
|
|
370
|
+
private buildRealImage;
|
|
371
|
+
/** 导出会话清单为 JSON(完整存档)或 CSV(表格式,可直接进 Excel) */
|
|
372
|
+
exportSession(sessionId: string, format?: CaptureExportFormat): string;
|
|
373
|
+
private toJson;
|
|
374
|
+
/** 导出用的影像视图:剥掉 Blob / data URL(它们只对当前浏览器会话有意义) */
|
|
375
|
+
private toExportImage;
|
|
376
|
+
private toCsv;
|
|
377
|
+
private touch;
|
|
378
|
+
private emit;
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=drone-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-capture.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { DroneSim, MissionWaypoint } from './drone-sim';
|
|
2
|
+
import type { MissionEditLimits, MissionEditState } from './mission-editor';
|
|
3
|
+
/** Cesium 由 /Cesium/Cesium.js 以全局脚本注入,这里只做一层薄封装取引用 */
|
|
4
|
+
type CesiumNS = Record<string, any>;
|
|
5
|
+
/**
|
|
6
|
+
* 编辑器依赖的宿主接口(由 CesiumDroneAdapter 实现):
|
|
7
|
+
* 航点数据以仿真内核为权威源,编辑器只通过它读写,不含任何渲染细节。
|
|
8
|
+
*/
|
|
9
|
+
export interface CesiumMissionHost {
|
|
10
|
+
/** 飞行内核:读 missionIndex(执行目标)等真值 */
|
|
11
|
+
readonly sim: DroneSim;
|
|
12
|
+
/** 当前是否可编辑:观察者视角 + 航线未在执行 */
|
|
13
|
+
canEdit(): boolean;
|
|
14
|
+
/** 航点列表(权威源 = 仿真内核) */
|
|
15
|
+
getWaypoints(): MissionWaypoint[];
|
|
16
|
+
/** 宿主查询当前选中航点索引(无选中返回 -1) */
|
|
17
|
+
getSelected(): number;
|
|
18
|
+
/** 宿主同步选中航点(编辑器点击/面板列表双向联动) */
|
|
19
|
+
setSelected(index: number): void;
|
|
20
|
+
/** 整表提交(新增 / 删除) */
|
|
21
|
+
commitWaypoints(waypoints: Array<Partial<MissionWaypoint>>, selected: number): void;
|
|
22
|
+
/** 拖动中的单点实时更新,返回夹紧后的航点(限高限距由宿主/内核生效) */
|
|
23
|
+
moveWaypoint(index: number, patch: Partial<MissionWaypoint>): MissionWaypoint | null;
|
|
24
|
+
/** 新航点的默认参数(高度与速度继承相邻航点) */
|
|
25
|
+
newWaypointTemplate(index: number): Partial<MissionWaypoint>;
|
|
26
|
+
/** 取编辑限制(限高/限距/返航点,供夹紧与插入位计算) */
|
|
27
|
+
getLimits(): MissionEditLimits;
|
|
28
|
+
/** sim 本地米坐标(x 东 / z 南 / y 为 AGL)→ ECEF 世界坐标 */
|
|
29
|
+
localToWorld(x: number, y: number, z: number): CesiumNS;
|
|
30
|
+
/** ECEF 世界坐标 → sim 本地水平坐标(双击拾取用);打不中返回 null */
|
|
31
|
+
worldToLocalXZ(world: CesiumNS): {
|
|
32
|
+
x: number;
|
|
33
|
+
z: number;
|
|
34
|
+
} | null;
|
|
35
|
+
/** 拖拽期间收起 / 恢复 Cesium 相机漫游输入 */
|
|
36
|
+
setCameraInputEnabled(enabled: boolean): void;
|
|
37
|
+
/** 编辑日志出口(宿主接到 sim.pushEvent) */
|
|
38
|
+
log(level: 'info' | 'warn', text: string): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Cesium 航线编辑器:航点/航线实体渲染 + 场景内拖拽编辑。
|
|
42
|
+
*
|
|
43
|
+
* 用法:构造传入宿主 → 每帧 `update()` → 面板开关 `setEnabled()` → 卸载 `destroy()`。
|
|
44
|
+
* 交互约定与 three 版 MissionEditor 一致,见文件头。
|
|
45
|
+
*/
|
|
46
|
+
export declare class CesiumMissionEditor {
|
|
47
|
+
private readonly host;
|
|
48
|
+
private readonly C;
|
|
49
|
+
private readonly viewer;
|
|
50
|
+
/** 事件挂在 viewer.container 的捕获段(见文件头"事件拦截") */
|
|
51
|
+
private readonly container;
|
|
52
|
+
private readonly canvas;
|
|
53
|
+
private enabled;
|
|
54
|
+
private hoverIndex;
|
|
55
|
+
private drag;
|
|
56
|
+
/** 在空白处按下:抬手时若没拖动过就取消选中 */
|
|
57
|
+
private emptyClick;
|
|
58
|
+
/** 上次同步过的航点签名:没变就不碰实体 */
|
|
59
|
+
private waypointSignature;
|
|
60
|
+
/** 上次同步过的返航点(起飞后才固定,之前可能还是 0,0) */
|
|
61
|
+
private homeKey;
|
|
62
|
+
/** 状态视觉(选中/执行目标)上次的值,变了才改实体 */
|
|
63
|
+
private lastSelected;
|
|
64
|
+
private lastActive;
|
|
65
|
+
private lastHover;
|
|
66
|
+
private disposed;
|
|
67
|
+
constructor(host: CesiumMissionHost, C: CesiumNS, viewer: CesiumNS);
|
|
68
|
+
/** 编辑模式是否开启(开启时点场景可加/拖航点) */
|
|
69
|
+
get isEnabled(): boolean;
|
|
70
|
+
/** 开关编辑模式;关闭时取消拖动、归还相机输入、清悬停 */
|
|
71
|
+
setEnabled(enabled: boolean): void;
|
|
72
|
+
/** 编辑器对外状态快照(面板"场景内编辑"区块据此渲染) */
|
|
73
|
+
getEditState(): MissionEditState;
|
|
74
|
+
private editable;
|
|
75
|
+
/** 每帧调用:签名变了才重建实体位置,选中/执行目标变化才改配色 */
|
|
76
|
+
update(): void;
|
|
77
|
+
/** 航点签名(坐标串)或返航点变了才动实体,避免逐帧重写 */
|
|
78
|
+
private syncEntities;
|
|
79
|
+
private rebuildWaypointEntities;
|
|
80
|
+
private rebuildPathEntity;
|
|
81
|
+
private rebuildHomeEntity;
|
|
82
|
+
/** 选中 / 执行目标 / 悬停 → 颜色与大小(只在变化时写实体) */
|
|
83
|
+
private syncStateVisuals;
|
|
84
|
+
/** 航点标记 + 航线折线总显隐(由宿主的 setMissionVisible 转发) */
|
|
85
|
+
setVisible(visible: boolean): void;
|
|
86
|
+
/** 航点标记显隐(不影响任务执行) */
|
|
87
|
+
setWaypointsVisible(visible: boolean): void;
|
|
88
|
+
/** 航线折线显隐 */
|
|
89
|
+
setPathVisible(visible: boolean): void;
|
|
90
|
+
private readonly onPointerDown;
|
|
91
|
+
private readonly onPointerMove;
|
|
92
|
+
private readonly onPointerUp;
|
|
93
|
+
private readonly onPointerLeave;
|
|
94
|
+
/** 双击地面新增航点(双击已有航点不处理,避免误插一个重合点) */
|
|
95
|
+
private readonly onDoubleClick;
|
|
96
|
+
private readonly onKeyDown;
|
|
97
|
+
/** 删除一个航点(面板按钮与 Delete 键共用) */
|
|
98
|
+
deleteWaypoint(index: number): boolean;
|
|
99
|
+
private createDrag;
|
|
100
|
+
private applyDrag;
|
|
101
|
+
/** 屏幕像素增量 → ENU 米增量(再换算成 sim 的 x 东 / z 南) */
|
|
102
|
+
private screenDeltaToLocal;
|
|
103
|
+
/** 拖拽起点处"一个屏幕像素"对应多少米 */
|
|
104
|
+
private metersPerPixel;
|
|
105
|
+
/**
|
|
106
|
+
* 屏幕坐标 → 命中的航点序号;没命中返回 -1。
|
|
107
|
+
*
|
|
108
|
+
* 几何法:每个航点投到屏幕,取指针 PICK_RADIUS_PX 内最近的那个(见文件头"拾取")。
|
|
109
|
+
* 相机背后的航点投影会 undefined / 跑飞,一律跳过。
|
|
110
|
+
*/
|
|
111
|
+
private pickWaypoint;
|
|
112
|
+
/** 屏幕坐标 → 椭球上的世界点(双击插入用;瞄到天空返回 undefined) */
|
|
113
|
+
private pickEllipsoid;
|
|
114
|
+
/** client 坐标 → Cesium 的窗口坐标(相对画布左上角) */
|
|
115
|
+
private toWindowPosition;
|
|
116
|
+
private cancelDrag;
|
|
117
|
+
destroy(): void;
|
|
118
|
+
}
|
|
119
|
+
export {};
|
|
120
|
+
//# sourceMappingURL=drone-cesium-mission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-cesium-mission.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-cesium-mission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { DroneSim } from './drone-sim';
|
|
2
|
+
type CesiumNS = Record<string, any>;
|
|
3
|
+
export declare class CesiumDroneRig {
|
|
4
|
+
private readonly sim;
|
|
5
|
+
private readonly C;
|
|
6
|
+
private joints;
|
|
7
|
+
/** 灯珠发光 shader(attach 时创建一次;每帧只改 uniform 颜色) */
|
|
8
|
+
private lightShader;
|
|
9
|
+
/** 当前绑定的模型(detach 时要摘掉 customShader) */
|
|
10
|
+
private modelRef;
|
|
11
|
+
/** 当前机体是否有语义节点(只有 DJI 机体启用本层) */
|
|
12
|
+
private enabled;
|
|
13
|
+
private timeMs;
|
|
14
|
+
/**
|
|
15
|
+
* @param sim 飞控内核(与适配器共用同一个实例,读到的永远是同一份真值)
|
|
16
|
+
* @param cesium Cesium 命名空间;缺省取 window.Cesium(全局脚本注入方式)
|
|
17
|
+
*/
|
|
18
|
+
/** Cesium 机体表现层:把 DroneSim 真值映射到 Model 关节(桨叶自转/起落架/灯光) */
|
|
19
|
+
constructor(sim: DroneSim, cesium?: CesiumNS);
|
|
20
|
+
/**
|
|
21
|
+
* 绑定新机体:重绑自转关节、挂灯珠发光 shader。旧机体的关节矩阵先复位。
|
|
22
|
+
*/
|
|
23
|
+
attach(model: CesiumNS): void;
|
|
24
|
+
/**
|
|
25
|
+
* 灯珠发光 shader:按 positionMC(GLB 原始 Y-up 坐标,实测见 probe-pmc-axis)判定
|
|
26
|
+
* 片元是否落在灯珠网格内,是则把 uniform 颜色写进 emissive。
|
|
27
|
+
* 灭灯 = uniform 为 0 = emissive 0 = 原贴图灯罩本色,与 three 版"换自发光材质"一致。
|
|
28
|
+
* 每帧只改 uniform 值,shader 本体在 attach 时创建一次。
|
|
29
|
+
*/
|
|
30
|
+
private attachLightShader;
|
|
31
|
+
/** 拆卸:复位关节矩阵(含钟罩补偿)、摘掉发光 shader 与光晕集合 */
|
|
32
|
+
detach(): void;
|
|
33
|
+
/** 停止每帧同步并解除与 primitive 的绑定 */
|
|
34
|
+
dispose(): void;
|
|
35
|
+
/**
|
|
36
|
+
* 每帧驱动。调用时机:adapter 已推进 sim 并写完 model.modelMatrix ——
|
|
37
|
+
* 桨叶关节矩阵直接改模型内部节点,光晕位置复用同一份世界矩阵。
|
|
38
|
+
*/
|
|
39
|
+
update(deltaSeconds: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* 桨叶自转。转速公式与 three 版 DroneRig.updateProps 完全一致:
|
|
42
|
+
* 每分钟转速 = (3.8 + 负载×7) 转/秒,对角反转由 PROP_SPIN_SIGN 给出,
|
|
43
|
+
* 负载表直接取 DroneSim 的四电机混控输出(悬停 ≈ 1,前飞时后桨快前桨慢)。
|
|
44
|
+
*/
|
|
45
|
+
private updateProps;
|
|
46
|
+
/** 灯光:灯珠 Mesh 本体发光(只写 shader uniform),灯语时序与 three 版同源 */
|
|
47
|
+
private updateLights;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=drone-cesium-rig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-cesium-rig.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-cesium-rig.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AA+GnC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAU;IAE5B,OAAO,CAAC,MAAM,CAAkB;IAChC,gDAAgD;IAChD,OAAO,CAAC,WAAW,CAAwB;IAC3C,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAwB;IACxC,iCAAiC;IACjC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAI;IAElB;;;OAGG;IACH,0DAA0D;gBAC9C,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ;IAW5C;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IA2D7B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA+CzB,yCAAyC;IACzC,MAAM,IAAI,IAAI;IAiBd,+BAA+B;IAC/B,OAAO,IAAI,IAAI;IAMf;;;OAGG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IASlC;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAiCnB,yDAAyD;IACzD,OAAO,CAAC,YAAY;CA0DrB"}
|