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,883 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DJI Mini 4 Pro 飞行仿真内核。
|
|
3
|
+
*
|
|
4
|
+
* 这里只做"飞控 + 电池 + 定位"的确定性逻辑,不引用 three,方便单独调参与验证:
|
|
5
|
+
* - 状态机对齐真机流程:上电自检 → 传感器预热 → 地面待机(搜星) → 电机启动 → 自动起飞 →
|
|
6
|
+
* 手动飞行 → 智能返航 / 自动降落 → 停桨;另含遥控失联失效保护、低电量返航。
|
|
7
|
+
* ⚠️ 紧急停桨只在飞行器**落地后**可用(空中停桨会坠机,按需求禁用;空中调用会被拒绝并写警告日志);
|
|
8
|
+
* 空中"动力丧失"状态仅由电池耗尽等真实故障触发。
|
|
9
|
+
* - 摇杆在 GPS / 视觉定位下是"速度指令":松杆由飞控刹停并定点悬停;姿态模式下不保持位置,随风漂移。
|
|
10
|
+
* - 电池按 18.96 Wh 真实容量与分项功耗积分(悬停 33 W → 约 34 分钟,与官方标称一致),
|
|
11
|
+
* 低电量返航 / 严重低电量强制降落按百分比触发。
|
|
12
|
+
* - 风按"空气速度 = 指令 − 风"建模:逆风顶得住就顶,顶不住(超过该档最大空速)才被吹跑。
|
|
13
|
+
*
|
|
14
|
+
* 坐标约定:+X 东、-Z 北、+Y 上(与模型一致,机头朝 -Z),航向 0° = 正北。
|
|
15
|
+
*/
|
|
16
|
+
/** 机型公开规格(Mini 4 Pro) */
|
|
17
|
+
export declare const DRONE_SPEC: {
|
|
18
|
+
readonly name: "DJI Mini 4 Pro";
|
|
19
|
+
readonly weightKg: 0.249;
|
|
20
|
+
readonly batteryWh: 18.96;
|
|
21
|
+
readonly batteryNominalVoltage: 7.32;
|
|
22
|
+
readonly batteryFullVoltage: 8.4;
|
|
23
|
+
readonly batteryEmptyVoltage: 6.9;
|
|
24
|
+
readonly batteryInternalResistance: 0.09;
|
|
25
|
+
readonly maxWindResistance: 10.7;
|
|
26
|
+
readonly hoverPowerWatts: 33;
|
|
27
|
+
readonly idlePowerWatts: 1.6;
|
|
28
|
+
readonly climbWattsPerMps: 3.6;
|
|
29
|
+
readonly levelSpeedPowerGain: 0.55;
|
|
30
|
+
readonly maxFlightTimeMin: 34;
|
|
31
|
+
readonly takeoffAltitude: 1.2;
|
|
32
|
+
readonly rthAltitudeDefault: 20;
|
|
33
|
+
readonly landingSlowAltitude: 2;
|
|
34
|
+
readonly gimbalPitchMin: -90;
|
|
35
|
+
readonly gimbalPitchMax: 60;
|
|
36
|
+
readonly gimbalYawRange: 5;
|
|
37
|
+
};
|
|
38
|
+
/** 飞行挡位:平稳 C / 普通 N / 运动 S */
|
|
39
|
+
export type FlightMode = 'cine' | 'normal' | 'sport';
|
|
40
|
+
/** 单个挡位的性能参数:限速(水平/升降)、姿态倾角与加减速、偏航角速度 */
|
|
41
|
+
export interface ModeSpec {
|
|
42
|
+
label: string;
|
|
43
|
+
horizontalSpeed: number;
|
|
44
|
+
climbSpeed: number;
|
|
45
|
+
descendSpeed: number;
|
|
46
|
+
maxTiltDeg: number;
|
|
47
|
+
accel: number;
|
|
48
|
+
brakeAccel: number;
|
|
49
|
+
yawRateDeg: number;
|
|
50
|
+
}
|
|
51
|
+
/** N / S / C 三档飞行模式(对齐 DJI 飞行挡位参数) */
|
|
52
|
+
export declare const FLIGHT_MODES: Record<FlightMode, ModeSpec>;
|
|
53
|
+
/** 挡位列表(供下拉框渲染的稳定顺序) */
|
|
54
|
+
export declare const FLIGHT_MODE_LIST: Array<{
|
|
55
|
+
key: FlightMode;
|
|
56
|
+
label: string;
|
|
57
|
+
}>;
|
|
58
|
+
/** 飞行速度倍率的取值区间(与面板滑杆一致):数值**本身**就是倍数,0 = 冻结、1 = 真机原速 */
|
|
59
|
+
export declare const SPEED_SCALE_MIN = 0;
|
|
60
|
+
export declare const SPEED_SCALE_MAX = 1000;
|
|
61
|
+
/** 速度倍率缺省值:1 = 真机原速 */
|
|
62
|
+
export declare const DEFAULT_SPEED_SCALE = 1;
|
|
63
|
+
/**
|
|
64
|
+
* 机身**原地自转**的默认角速度(度/秒)。
|
|
65
|
+
*
|
|
66
|
+
* 这是给"机体自己转"用的独立通道(见 `DroneSim.spinTo`):全景扫描的水平覆盖
|
|
67
|
+
* 必须靠它,靠不了云台 —— Mini 4 Pro 云台 Pan 机械行程只有 ±30°
|
|
68
|
+
* (`DRONE_SPEC.gimbalYawRange`),转不出 180°。90°/s 对齐真机全景的转速手感。
|
|
69
|
+
*/
|
|
70
|
+
export declare const BODY_SPIN_RATE_DEG = 90;
|
|
71
|
+
/** 判定"机身自转已对准目标航向"的容差(度):1 帧的转角远大于它,但航向是连续量 */
|
|
72
|
+
export declare const BODY_SPIN_TOLERANCE_DEG = 0.5;
|
|
73
|
+
/** 飞行阶段:上电自检 → 预热 → 待机 → 起飞 → 飞行/航线 → 返航/降落 → 停桨/失效 */
|
|
74
|
+
export type FlightPhase = 'powerOff' | 'selfCheck' | 'warmingUp' | 'standby' | 'motorsOn' | 'takingOff' | 'flying' | 'waypoint' | 'rth' | 'landing' | 'emergency' | 'stopped';
|
|
75
|
+
/** 阶段的中文标签(界面显示用) */
|
|
76
|
+
export declare const PHASE_LABELS: Record<FlightPhase, string>;
|
|
77
|
+
/** 定位来源:GNSS / 视觉 / 姿态模式(无定位) */
|
|
78
|
+
export type PositionSource = 'gps' | 'vision' | 'atti';
|
|
79
|
+
/** 定位来源的中文标签 */
|
|
80
|
+
export declare const POSITION_SOURCE_LABELS: Record<PositionSource, string>;
|
|
81
|
+
/** 四通道摇杆量,每通道取值 -1~1(松杆为 0) */
|
|
82
|
+
export interface StickState {
|
|
83
|
+
/** 左杆上下:升降 -1~1(正 = 上升) */
|
|
84
|
+
throttle: number;
|
|
85
|
+
/** 左杆左右:偏航 -1~1(正 = 右转) */
|
|
86
|
+
yaw: number;
|
|
87
|
+
/** 右杆上下:俯仰 -1~1(正 = 前进) */
|
|
88
|
+
pitch: number;
|
|
89
|
+
/** 右杆左右:横滚 -1~1(正 = 右移) */
|
|
90
|
+
roll: number;
|
|
91
|
+
}
|
|
92
|
+
/** 摇杆回中(全零) */
|
|
93
|
+
export declare const NEUTRAL_STICK: StickState;
|
|
94
|
+
/** 四个电机对应的机臂位置(与 DroneRig 的 ArmPosition 一致,模型节点名同款后缀) */
|
|
95
|
+
export type MotorPosition = 'FrontLeft' | 'FrontRight' | 'RearLeft' | 'RearRight';
|
|
96
|
+
/** 四机臂的固定遍历顺序 */
|
|
97
|
+
export declare const MOTOR_POSITIONS: MotorPosition[];
|
|
98
|
+
/** 故障注入:测试沙盒里用来复现各种真机异常 */
|
|
99
|
+
export interface FaultFlags {
|
|
100
|
+
/** GNSS 卫星丢失(强制进入视觉/姿态模式) */
|
|
101
|
+
gnssLost: boolean;
|
|
102
|
+
/** 指南针受扰(需要校准,否则姿态模式) */
|
|
103
|
+
compassError: boolean;
|
|
104
|
+
/** IMU 异常(禁止起飞) */
|
|
105
|
+
imuError: boolean;
|
|
106
|
+
/** 电机异常:1 个电机动力衰减,导致偏航漂移 */
|
|
107
|
+
motorFailure: boolean;
|
|
108
|
+
/** 遥控器失联(3 秒后触发失效返航) */
|
|
109
|
+
rcLost: boolean;
|
|
110
|
+
/** 下视视觉失效(低空无法视觉定位) */
|
|
111
|
+
visionLost: boolean;
|
|
112
|
+
/** 避障传感器关闭 */
|
|
113
|
+
obstacleAvoidanceOff: boolean;
|
|
114
|
+
}
|
|
115
|
+
/** 全部故障关闭(正常飞行) */
|
|
116
|
+
export declare const NO_FAULTS: FaultFlags;
|
|
117
|
+
/** 沙盒可调参数(限高限距、风、电量阈值、失效动作、时间倍速) */
|
|
118
|
+
export interface SimConfig {
|
|
119
|
+
/** 限高(AGL,米) */
|
|
120
|
+
maxAltitude: number;
|
|
121
|
+
/** 限距(米) */
|
|
122
|
+
maxDistance: number;
|
|
123
|
+
/**
|
|
124
|
+
* 取消高度与距离限制(演示 / 取景用),默认 `false`。
|
|
125
|
+
*
|
|
126
|
+
* `true` 时 `maxAltitude` / `maxDistance` 不再参与任何夹紧:
|
|
127
|
+
* 摇杆升降与水平位移不被截断、航点不被夹回限高面/限距圆、航线校验不再拦超限航点,
|
|
128
|
+
* 面板通过 `getLimits()` 拿到的高度/距离上限变成 `Infinity`。
|
|
129
|
+
*
|
|
130
|
+
* 改回 `false` 时若机体已在限制之外,下一帧就会被夹回边界(高度落到 `maxAltitude`,
|
|
131
|
+
* 位置沿返航点方向缩到 `maxDistance` 圆上),所以这不是"一次性开关"。
|
|
132
|
+
*
|
|
133
|
+
* ⚠️ 只放开**限高 / 限距**这两条人为上限:电池、姿态、避障、GNSS 等物理与失效约束照旧生效。
|
|
134
|
+
*/
|
|
135
|
+
unlimitedFlight: boolean;
|
|
136
|
+
/** 返航高度(米) */
|
|
137
|
+
rthAltitude: number;
|
|
138
|
+
/** 风速 m/s */
|
|
139
|
+
windSpeed: number;
|
|
140
|
+
/** 风"吹向"的罗盘方位角(0=北,90=东) */
|
|
141
|
+
windDirection: number;
|
|
142
|
+
/** 低电量返航阈值 % */
|
|
143
|
+
lowBatteryPercent: number;
|
|
144
|
+
/** 严重低电量阈值 % */
|
|
145
|
+
criticalBatteryPercent: number;
|
|
146
|
+
/** 失效保护:遥控失联后的动作 */
|
|
147
|
+
rcFailsafe: 'rth' | 'hover' | 'land';
|
|
148
|
+
/** 时间倍速(1 = 实时) */
|
|
149
|
+
timeScale: number;
|
|
150
|
+
/**
|
|
151
|
+
* 飞行速度倍率(0 ~ 1000,数值本身就是倍数;1 = 真机原速)。
|
|
152
|
+
*
|
|
153
|
+
* 与 `timeScale` 不是一回事:时间倍速是"整个仿真跑快"(电池、自检、悬停计时一起加速),
|
|
154
|
+
* 而速度倍率**只改机体自己的运动能力**,相当于换了一台"几倍速"的机器 ——
|
|
155
|
+
* 手动摇杆速度、航线巡航速度、智能返航速度、起降速率与转向角速度整体乘这个系数,
|
|
156
|
+
* 挡位表、加速度配平、倾角标定都跟着等比缩放(满舵仍是该挡位的最大倾角)。
|
|
157
|
+
* 0 = 全部速度为 0(机体不动,连自动起飞/降落也会停住)。
|
|
158
|
+
*/
|
|
159
|
+
speedScale: number;
|
|
160
|
+
/** 上电自检时长(秒):默认 0.3,整个上电流程控制在 1 秒内 */
|
|
161
|
+
selfCheckSeconds: number;
|
|
162
|
+
/** 传感器预热时长(秒):默认 0.28 */
|
|
163
|
+
warmupSeconds: number;
|
|
164
|
+
/** 搜星速率(颗/秒):默认 30,上电后约 0.6 秒即达满星 */
|
|
165
|
+
gnssAcquireRate: number;
|
|
166
|
+
}
|
|
167
|
+
/** 出厂默认参数:限高 120 m(合规上限)、限距 500 m、限高限距生效、无风、实时 */
|
|
168
|
+
export declare const DEFAULT_CONFIG: SimConfig;
|
|
169
|
+
/**
|
|
170
|
+
* 单个航点(对齐真机航点任务的字段子集)。
|
|
171
|
+
*
|
|
172
|
+
* 坐标与遥测同一套约定:x 向东、z 向南(与模型坐标一致),altitude 是**相对起飞点高度(AGL)**。
|
|
173
|
+
*/
|
|
174
|
+
export interface MissionWaypoint {
|
|
175
|
+
x: number;
|
|
176
|
+
z: number;
|
|
177
|
+
/** 目标高度(AGL,米) */
|
|
178
|
+
altitude: number;
|
|
179
|
+
/** 过点速度(m/s);0 = 使用任务巡航速度 */
|
|
180
|
+
speed: number;
|
|
181
|
+
/** 到点悬停时间(秒);0 = 不停留,直接飞下一个点 */
|
|
182
|
+
hoverSeconds: number;
|
|
183
|
+
/** 到点后云台俯仰角(度);null = 不动云台 */
|
|
184
|
+
gimbalPitch: number | null;
|
|
185
|
+
/** 到点动作 */
|
|
186
|
+
action: 'none' | 'photo';
|
|
187
|
+
}
|
|
188
|
+
/** 机头朝向策略:auto = 始终机头指向下一航点;fixed = 保持任务开始时的航向 */
|
|
189
|
+
export type MissionHeadingMode = 'auto' | 'fixed';
|
|
190
|
+
/** 过点方式:straight = 到点减速后再走;curved = 圆滑过点(不减速) */
|
|
191
|
+
export type MissionPathMode = 'straight' | 'curved';
|
|
192
|
+
/** 任务结束动作,对齐真机 WaypointMissionFinishedAction */
|
|
193
|
+
export type MissionFinishAction = 'hover' | 'rth' | 'land';
|
|
194
|
+
/** 航线任务的全局设置 */
|
|
195
|
+
export interface MissionConfig {
|
|
196
|
+
/** 巡航速度(m/s):航点未单独指定速度时用它 */
|
|
197
|
+
autoSpeed: number;
|
|
198
|
+
headingMode: MissionHeadingMode;
|
|
199
|
+
pathMode: MissionPathMode;
|
|
200
|
+
/** 全部航点完成后 */
|
|
201
|
+
finishAction: MissionFinishAction;
|
|
202
|
+
/** 循环执行:完成后回到第一个航点继续 */
|
|
203
|
+
loop: boolean;
|
|
204
|
+
}
|
|
205
|
+
/** 任务状态:未执行 / 执行中 / 已暂停 */
|
|
206
|
+
export type MissionStatus = 'idle' | 'running' | 'paused';
|
|
207
|
+
/** 任务状态的中文标签 */
|
|
208
|
+
export declare const MISSION_STATUS_LABELS: Record<MissionStatus, string>;
|
|
209
|
+
/** 任务阶段的中文标签 */
|
|
210
|
+
export declare const MISSION_STAGE_LABELS: Record<MissionStage, string>;
|
|
211
|
+
/**
|
|
212
|
+
* 任务执行阶段。
|
|
213
|
+
*
|
|
214
|
+
* 飞第一个航点前有一段「启航四步」,和智能返航同款的分段机动:
|
|
215
|
+
* 先把高度调到首航点高度(**垂直段只动高度,不产生水平位移**,否则会斜着冲过去) →
|
|
216
|
+
* 再保持该高度水平飞向首航点 → 到了把高度收干净 → 最后原地把机头转到与航线一致,
|
|
217
|
+
* 之后才进入常规的 goto / hover 推进。
|
|
218
|
+
*/
|
|
219
|
+
export type MissionStage = 'idle' | 'depart-climb' | 'depart-cruise' | 'depart-settle' | 'depart-align' | 'goto' | 'hover';
|
|
220
|
+
/** 是否为「启航段」阶段(首航点的分段机动) */
|
|
221
|
+
export declare function isMissionDepartStage(stage: MissionStage): boolean;
|
|
222
|
+
/** 出厂默认任务设置:巡航 6 m/s、机头自动指向下一航点、直线过点、完成后悬停 */
|
|
223
|
+
export declare const DEFAULT_MISSION_CONFIG: MissionConfig;
|
|
224
|
+
/** 出厂示例航线:环绕起飞点一圈(最高 40 m,悬在 13 m 的建筑之上,不会触发避障刹停) */
|
|
225
|
+
export declare const DEFAULT_MISSION: MissionWaypoint[];
|
|
226
|
+
/**
|
|
227
|
+
* 航点高度的**硬上限**(米)。
|
|
228
|
+
*
|
|
229
|
+
* 与 `SimConfig.maxAltitude`(可配置的限高)不是一回事:它是字段归一化的护栏,
|
|
230
|
+
* 挡住外部灌进来的离谱值(比如 1e9),默认 500 m 就已高于合规限高。
|
|
231
|
+
* `unlimitedFlight` 打开时内部会传 `Infinity` 把它一起放开。
|
|
232
|
+
*/
|
|
233
|
+
export declare const MISSION_ALTITUDE_HARD_LIMIT = 500;
|
|
234
|
+
/**
|
|
235
|
+
* 单个航点字段归一化(手输/外部传入都可能越界)。
|
|
236
|
+
*
|
|
237
|
+
* @param maxAltitude 高度上限,默认 {@link MISSION_ALTITUDE_HARD_LIMIT};取消限高时传 `Infinity`
|
|
238
|
+
*/
|
|
239
|
+
export declare function normalizeMissionWaypoint(source: Partial<MissionWaypoint>, maxAltitude?: number): MissionWaypoint;
|
|
240
|
+
/** 航线导出格式 */
|
|
241
|
+
export type MissionExportFormat = 'json' | 'csv';
|
|
242
|
+
/**
|
|
243
|
+
* 航线导出数据(JSON 形态)。
|
|
244
|
+
*
|
|
245
|
+
* 坐标系沿用引擎内部的**局部 ENU**:原点为返航点(起飞点),x 向东、z 向南(负值即向北),
|
|
246
|
+
* 单位米;高度为相对起飞点的 AGL。与面板列表里的 `E x / S z` 读数完全一致 ——
|
|
247
|
+
* 想落到真实经纬度,由宿主拿到 home 的真实经纬度后自行平移。
|
|
248
|
+
*/
|
|
249
|
+
export interface MissionExport {
|
|
250
|
+
/** 文件标识,便于导入方识别 */
|
|
251
|
+
format: 'drone-camera/mission';
|
|
252
|
+
version: number;
|
|
253
|
+
/** 导出时刻(ISO 8601) */
|
|
254
|
+
exportedAt: string;
|
|
255
|
+
/** 坐标约定说明(写进文件,换个工具打开也不至于误读) */
|
|
256
|
+
frame: {
|
|
257
|
+
origin: string;
|
|
258
|
+
unit: string;
|
|
259
|
+
x: string;
|
|
260
|
+
z: string;
|
|
261
|
+
altitude: string;
|
|
262
|
+
};
|
|
263
|
+
/** 返航点(局部坐标原点) */
|
|
264
|
+
home: {
|
|
265
|
+
x: number;
|
|
266
|
+
z: number;
|
|
267
|
+
};
|
|
268
|
+
/** 任务参数 */
|
|
269
|
+
config: MissionConfig;
|
|
270
|
+
/** 概览统计:点数 / 航程 / 预计耗时 / 高度范围 */
|
|
271
|
+
summary: {
|
|
272
|
+
points: number;
|
|
273
|
+
distance: number;
|
|
274
|
+
duration: number;
|
|
275
|
+
altitudeMin: number;
|
|
276
|
+
altitudeMax: number;
|
|
277
|
+
};
|
|
278
|
+
waypoints: MissionWaypoint[];
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 由「航点 + 任务参数 + 返航点」组出导出数据(纯函数,两套渲染后端共用)。
|
|
282
|
+
*
|
|
283
|
+
* 航程按"返航点起飞 → 依次过点"的三维折线累计,耗时按每点自己的速度(0 = 巡航速度)
|
|
284
|
+
* 加上到点悬停折算,和引擎执行时的口径一致。
|
|
285
|
+
*/
|
|
286
|
+
export declare function buildMissionExport(waypoints: MissionWaypoint[], config: MissionConfig, home: {
|
|
287
|
+
x: number;
|
|
288
|
+
z: number;
|
|
289
|
+
}): MissionExport;
|
|
290
|
+
/** 航点表 → CSV(不含 BOM;落盘时由调用方按需添加) */
|
|
291
|
+
export declare function missionToCsv(waypoints: MissionWaypoint[]): string;
|
|
292
|
+
/**
|
|
293
|
+
* 导出航线文本。`json` 是完整存档(含坐标约定、任务参数、概览统计,可再喂回 `setMission`),
|
|
294
|
+
* `csv` 只出航点表 —— 表头中文、CRLF 换行,Excel / WPS 双击即可打开。
|
|
295
|
+
*/
|
|
296
|
+
export declare function exportMissionText(data: MissionExport, format?: MissionExportFormat): string;
|
|
297
|
+
/**
|
|
298
|
+
* 新航点插到哪个位置:取"绕路最少"的那一格(three / Cesium 两个场景内编辑器共用)。
|
|
299
|
+
*
|
|
300
|
+
* 判据是插入后航线增加的长度(prev→新点→next 减去原来的 prev→next),
|
|
301
|
+
* 而不是"离哪一段最近" —— 后者在等距处会出现平手,可能把一个明明贴着前面航段的点
|
|
302
|
+
* 插到后面去,航线就绕了。最小绕路法天然没有这个歧义。
|
|
303
|
+
*/
|
|
304
|
+
export declare function findMissionInsertIndex(list: MissionWaypoint[], x: number, z: number, homeX: number, homeZ: number): number;
|
|
305
|
+
/** 航线任务的实时进度(界面轮询用) */
|
|
306
|
+
export interface MissionSnapshot {
|
|
307
|
+
status: MissionStatus;
|
|
308
|
+
statusLabel: string;
|
|
309
|
+
stage: MissionStage;
|
|
310
|
+
stageLabel: string;
|
|
311
|
+
/** 当前目标航点索引(0 基);-1 = 无 */
|
|
312
|
+
index: number;
|
|
313
|
+
total: number;
|
|
314
|
+
/** 已完成的整圈数 */
|
|
315
|
+
passes: number;
|
|
316
|
+
/** 任务已执行时长(秒) */
|
|
317
|
+
elapsed: number;
|
|
318
|
+
/** 剩余航程(米,含高度差) */
|
|
319
|
+
distanceLeft: number;
|
|
320
|
+
/** 按航程折算的完成度 0~1 */
|
|
321
|
+
progress: number;
|
|
322
|
+
/** 预计剩余时间(秒,含悬停) */
|
|
323
|
+
etaSeconds: number;
|
|
324
|
+
/** 暂停原因 */
|
|
325
|
+
pauseReason: string;
|
|
326
|
+
/** 当前目标航点副本 */
|
|
327
|
+
active: MissionWaypoint | null;
|
|
328
|
+
/** 航线航点列表副本(界面据此渲染) */
|
|
329
|
+
waypoints: MissionWaypoint[];
|
|
330
|
+
config: MissionConfig;
|
|
331
|
+
}
|
|
332
|
+
/** 事件日志级别 */
|
|
333
|
+
export type EventLevel = 'info' | 'warn' | 'error' | 'success';
|
|
334
|
+
/** 一条事件日志 */
|
|
335
|
+
export interface SimEvent {
|
|
336
|
+
id: number;
|
|
337
|
+
time: number;
|
|
338
|
+
level: EventLevel;
|
|
339
|
+
text: string;
|
|
340
|
+
}
|
|
341
|
+
/** 轴对齐包围盒(AABB)障碍物,坐标与飞行位置同一套约定 */
|
|
342
|
+
export interface ObstacleBox {
|
|
343
|
+
name: string;
|
|
344
|
+
minX: number;
|
|
345
|
+
maxX: number;
|
|
346
|
+
minY: number;
|
|
347
|
+
maxY: number;
|
|
348
|
+
minZ: number;
|
|
349
|
+
maxZ: number;
|
|
350
|
+
/** 是否需要绕开(否则只是地面建筑,飞过去即可) */
|
|
351
|
+
solid: boolean;
|
|
352
|
+
}
|
|
353
|
+
/** 当前帧的避障探测结果(机身坐标系六向) */
|
|
354
|
+
export interface ObstacleReport {
|
|
355
|
+
/** 六个方向的最近距离(米),null 表示该方向无障碍 */
|
|
356
|
+
forward: number | null;
|
|
357
|
+
backward: number | null;
|
|
358
|
+
left: number | null;
|
|
359
|
+
right: number | null;
|
|
360
|
+
up: number | null;
|
|
361
|
+
down: number | null;
|
|
362
|
+
/** 本帧是否因避障刹停 */
|
|
363
|
+
braking: boolean;
|
|
364
|
+
/** 触发方向 */
|
|
365
|
+
brakingDirection: 'forward' | 'backward' | 'left' | 'right' | 'up' | 'down' | null;
|
|
366
|
+
}
|
|
367
|
+
/** 起飞前检查项 */
|
|
368
|
+
export interface ChecklistItem {
|
|
369
|
+
id: string;
|
|
370
|
+
label: string;
|
|
371
|
+
ok: boolean;
|
|
372
|
+
detail: string;
|
|
373
|
+
/** 不通过是否阻止起飞 */
|
|
374
|
+
blocking: boolean;
|
|
375
|
+
}
|
|
376
|
+
/** 单向快照:界面/回放读取的全部遥测字段(数组字段已复制,改它不影响仿真) */
|
|
377
|
+
export interface DroneSnapshot {
|
|
378
|
+
phase: FlightPhase;
|
|
379
|
+
phaseLabel: string;
|
|
380
|
+
mode: FlightMode;
|
|
381
|
+
modeLabel: string;
|
|
382
|
+
/** 当前生效的飞行速度倍率(0 ~ 1000,1 = 真机原速;见 SimConfig.speedScale) */
|
|
383
|
+
speedScale: number;
|
|
384
|
+
positionSource: PositionSource;
|
|
385
|
+
positionSourceLabel: string;
|
|
386
|
+
airborne: boolean;
|
|
387
|
+
motorsOn: boolean;
|
|
388
|
+
damaged: boolean;
|
|
389
|
+
batteryPercent: number;
|
|
390
|
+
batteryVoltage: number;
|
|
391
|
+
batteryCurrent: number;
|
|
392
|
+
batteryTemp: number;
|
|
393
|
+
batteryWhLeft: number;
|
|
394
|
+
batteryModeText: string;
|
|
395
|
+
altitude: number;
|
|
396
|
+
altitudeMax: number;
|
|
397
|
+
/** 相对起飞点的水平坐标:x 向东,z 向南(与模型坐标一致) */
|
|
398
|
+
positionX: number;
|
|
399
|
+
positionZ: number;
|
|
400
|
+
horizontalSpeed: number;
|
|
401
|
+
verticalSpeed: number;
|
|
402
|
+
heading: number;
|
|
403
|
+
tiltPitch: number;
|
|
404
|
+
tiltRoll: number;
|
|
405
|
+
distanceToHome: number;
|
|
406
|
+
homeRecorded: boolean;
|
|
407
|
+
altitudeLimitReached: boolean;
|
|
408
|
+
distanceLimitReached: boolean;
|
|
409
|
+
satellites: number;
|
|
410
|
+
hdop: number;
|
|
411
|
+
gpsBars: number;
|
|
412
|
+
rcBars: number;
|
|
413
|
+
visionAvailable: boolean;
|
|
414
|
+
gimbalPitch: number;
|
|
415
|
+
gimbalRoll: number;
|
|
416
|
+
gimbalYaw: number;
|
|
417
|
+
motorLoad: number;
|
|
418
|
+
/** 四电机归一化转速(悬停 ≈ 1):混控差动的读数口,面板/调试可视化用 */
|
|
419
|
+
motorSpeeds: Record<MotorPosition, number>;
|
|
420
|
+
armFold: number;
|
|
421
|
+
stick: StickState;
|
|
422
|
+
windSpeed: number;
|
|
423
|
+
windDirection: number;
|
|
424
|
+
windRelative: string;
|
|
425
|
+
flightTime: number;
|
|
426
|
+
totalTime: number;
|
|
427
|
+
remainingMinutes: number;
|
|
428
|
+
lowBattery: boolean;
|
|
429
|
+
criticalBattery: boolean;
|
|
430
|
+
lowBatteryCountdown: number;
|
|
431
|
+
rthStage: string;
|
|
432
|
+
/** 自动降落的细分阶段:approach=降向低位悬停位 / hold=低位悬停确认 / settle=缓慢触地 */
|
|
433
|
+
landingStage: string;
|
|
434
|
+
rthReason: string;
|
|
435
|
+
warnings: string[];
|
|
436
|
+
events: SimEvent[];
|
|
437
|
+
checklist: ChecklistItem[];
|
|
438
|
+
obstacle: ObstacleReport;
|
|
439
|
+
recording: boolean;
|
|
440
|
+
recordSeconds: number;
|
|
441
|
+
photoCount: number;
|
|
442
|
+
cameraZoom: number;
|
|
443
|
+
/** 航线任务进度 */
|
|
444
|
+
mission: MissionSnapshot;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* 飞控仿真内核(不依赖 three)。
|
|
448
|
+
*
|
|
449
|
+
* 持有全部飞行状态与可调参数:`step(dt)` 按时间片推进状态机、飞行、电池与失效保护;
|
|
450
|
+
* 外部通过 getter / `snapshot()` 只读遥测,通过 powerOn / autoTakeOff / setStick / startMission 等下达指令。
|
|
451
|
+
* 状态字段虽为 public,但正常路径应只经 step 与上述方法修改。
|
|
452
|
+
*/
|
|
453
|
+
export declare class DroneSim {
|
|
454
|
+
config: SimConfig;
|
|
455
|
+
faults: FaultFlags;
|
|
456
|
+
obstacles: ObstacleBox[];
|
|
457
|
+
phase: FlightPhase;
|
|
458
|
+
mode: FlightMode;
|
|
459
|
+
/** 位置:y 为相对起飞点的高度(AGL),x/z 为水平偏移 */
|
|
460
|
+
position: {
|
|
461
|
+
x: number;
|
|
462
|
+
y: number;
|
|
463
|
+
z: number;
|
|
464
|
+
};
|
|
465
|
+
velocity: {
|
|
466
|
+
x: number;
|
|
467
|
+
y: number;
|
|
468
|
+
z: number;
|
|
469
|
+
};
|
|
470
|
+
heading: number;
|
|
471
|
+
tiltPitch: number;
|
|
472
|
+
tiltRoll: number;
|
|
473
|
+
motorLoad: number;
|
|
474
|
+
/**
|
|
475
|
+
* 四电机归一化转速(悬停 ≈ 1.0,0 = 停转):由四旋翼混控得出 ——
|
|
476
|
+
* 总距(整体升力)+ 俯仰差动(前后)+ 横滚差动(左右)+ 偏航反扭矩差动(对角)。
|
|
477
|
+
* 真四旋翼正是靠这四路差动打破/恢复升力平衡来实现全姿态控制的,
|
|
478
|
+
* 渲染层按它给每个桨叶单独转速,不再四桨同速。
|
|
479
|
+
*/
|
|
480
|
+
motorSpeeds: Record<MotorPosition, number>;
|
|
481
|
+
armFold: number;
|
|
482
|
+
damaged: boolean;
|
|
483
|
+
stick: StickState;
|
|
484
|
+
/** 外部(模型侧)提供的检查项,例如机臂是否展开 */
|
|
485
|
+
externalChecks: ChecklistItem[];
|
|
486
|
+
/** 相机状态 */
|
|
487
|
+
recording: boolean;
|
|
488
|
+
recordSeconds: number;
|
|
489
|
+
photoCount: number;
|
|
490
|
+
cameraZoom: number;
|
|
491
|
+
gimbalPitch: number;
|
|
492
|
+
gimbalRoll: number;
|
|
493
|
+
gimbalYaw: number;
|
|
494
|
+
/** 航线任务:航点列表(出厂带一条示例航线,方便一键演示) */
|
|
495
|
+
mission: MissionWaypoint[];
|
|
496
|
+
missionConfig: MissionConfig;
|
|
497
|
+
missionStatus: MissionStatus;
|
|
498
|
+
/** 当前目标航点索引(0 基),-1 表示没有在执行的航点 */
|
|
499
|
+
missionIndex: number;
|
|
500
|
+
/** 当前任务阶段(未执行任务时为 'idle') */
|
|
501
|
+
missionStage: MissionStage;
|
|
502
|
+
events: SimEvent[];
|
|
503
|
+
private time;
|
|
504
|
+
private phaseTime;
|
|
505
|
+
private flightTime;
|
|
506
|
+
/** 本步机身系加速度(米/秒²,由速度差分得出):倾角模型与混控都要用 */
|
|
507
|
+
private accelX;
|
|
508
|
+
private accelZ;
|
|
509
|
+
/** 倾角目标(度):mixer 用"目标 − 当前"衡量飞控正在多用力压杆 */
|
|
510
|
+
private tiltPitchTarget;
|
|
511
|
+
private tiltRollTarget;
|
|
512
|
+
/** 偏航角速度实际值(度/秒,一阶惯性):机身有转动惯量,转速建立/消失都需要时间 */
|
|
513
|
+
private yawRateCurrent;
|
|
514
|
+
/**
|
|
515
|
+
* 机身原地自转的目标方位角(度,绝对罗盘角);null = 没有在自转。
|
|
516
|
+
* 优先级高于摇杆偏航 —— 真机拍全景时偏航通道由飞控接管,人打杆不参与。
|
|
517
|
+
*/
|
|
518
|
+
private spinHeading;
|
|
519
|
+
private spinRateDeg;
|
|
520
|
+
private batteryUsedWh;
|
|
521
|
+
private batteryTemp;
|
|
522
|
+
private satellites;
|
|
523
|
+
private visionAvailable;
|
|
524
|
+
private rcLinkQuality;
|
|
525
|
+
private rcLostTimer;
|
|
526
|
+
private lowBatteryCountdown;
|
|
527
|
+
private rthStage;
|
|
528
|
+
private rthReason;
|
|
529
|
+
private rthStickGrace;
|
|
530
|
+
private home;
|
|
531
|
+
private homeRecorded;
|
|
532
|
+
private altitudeMax;
|
|
533
|
+
private altitudeLimitReached;
|
|
534
|
+
private distanceLimitReached;
|
|
535
|
+
private obstacleReport;
|
|
536
|
+
private eventId;
|
|
537
|
+
private readonly warnedAt;
|
|
538
|
+
private landingTimer;
|
|
539
|
+
/** 降落细分阶段:先降向 1 米悬停位,停一下再缓速触地 */
|
|
540
|
+
private landingStage;
|
|
541
|
+
private landingHoldTimer;
|
|
542
|
+
/** 航线任务:已下发但等起飞完成后才开始执行 */
|
|
543
|
+
private missionPending;
|
|
544
|
+
/** 航线任务:起始航向(headingMode='fixed' 时保持不变) */
|
|
545
|
+
private missionStartHeading;
|
|
546
|
+
/** 航线任务:起步保护期,避免启动瞬间被残留摇杆指令打断 */
|
|
547
|
+
private missionStickGrace;
|
|
548
|
+
private missionHoverTimer;
|
|
549
|
+
/** 当前航点已耗时(超时保护) */
|
|
550
|
+
private missionWaypointTimer;
|
|
551
|
+
private missionElapsed;
|
|
552
|
+
private missionPasses;
|
|
553
|
+
private missionPauseReason;
|
|
554
|
+
/** 暂停前所处的阶段:继续执行时按它决定是接着走启航段还是直接飞航点 */
|
|
555
|
+
private missionPausedStage;
|
|
556
|
+
/** 任务起始时的总航程(米),仅用于进度条 */
|
|
557
|
+
private missionTotalDistance;
|
|
558
|
+
/** 按速度倍率缩放后的挡位参数缓存(见 specFor) */
|
|
559
|
+
private scaledSpec;
|
|
560
|
+
/** 降落细分标签:低位悬停确认是飞手最关心的一步,单独标出来 */
|
|
561
|
+
private get phaseLabel();
|
|
562
|
+
/** 是否已离地(起落架离地即算,含低空悬停) */
|
|
563
|
+
get airborne(): boolean;
|
|
564
|
+
/** 电机是否已启动(空中为 true;停桨后回 false) */
|
|
565
|
+
get motorsOn(): boolean;
|
|
566
|
+
/**
|
|
567
|
+
* 当前生效的限高(米)。`unlimitedFlight` 打开时为 `Infinity`,即不夹。
|
|
568
|
+
*
|
|
569
|
+
* 面板、航线编辑器、场景拖拽都通过 `getLimits()` 拿这个值来夹航点,
|
|
570
|
+
* 所以只要一个开关,UI 侧的输入上限也会同步失效 —— 不会出现"内核放开了但拖不出去"。
|
|
571
|
+
*/
|
|
572
|
+
get altitudeCeiling(): number;
|
|
573
|
+
/** 当前生效的限距(米)。`unlimitedFlight` 打开时为 `Infinity`,即不夹。 */
|
|
574
|
+
get distanceCeiling(): number;
|
|
575
|
+
/**
|
|
576
|
+
* 增量修改仿真配置(限高限距开关 / 风 / 电量阈值等),立即生效,只覆盖传入的字段。
|
|
577
|
+
*
|
|
578
|
+
* 只改配置本身:不清位置、不清电量、不动正在执行的任务。若把 `unlimitedFlight`
|
|
579
|
+
* 从 `true` 改回 `false`,下一帧物理步进就会把机体夹回限高面 / 限距圆。
|
|
580
|
+
*/
|
|
581
|
+
setConfig(patch: Partial<SimConfig>): void;
|
|
582
|
+
/** 当前生效的飞行速度倍率(夹到 0 ~ 1000;非法值退回 1) */
|
|
583
|
+
get speedScale(): number;
|
|
584
|
+
/**
|
|
585
|
+
* 设置飞行速度倍率(0 ~ 1000,数值即倍数)。
|
|
586
|
+
* 非有限值一律按 1(真机原速)处理 —— 面板滑杆中途可能给出空串/NaN。
|
|
587
|
+
*/
|
|
588
|
+
setSpeedScale(scale: number): void;
|
|
589
|
+
/**
|
|
590
|
+
* 挡位参数按速度倍率缩放后的副本。
|
|
591
|
+
*
|
|
592
|
+
* 线性速度、加速度、刹车加速度、偏航角速度一起乘系数 —— 于是"满舵 = 该挡位最大倾角"
|
|
593
|
+
* 的标定关系不变(倾角模型的阻力系数由 horizontalSpeed 反推,自动跟着缩放),
|
|
594
|
+
* 观感就是同一台机器整体快/慢了几倍;`maxTiltDeg` 是物理上限,不缩放。
|
|
595
|
+
* 结果按(挡位, 倍率)缓存,倍率不动时每帧零分配。
|
|
596
|
+
*/
|
|
597
|
+
private specFor;
|
|
598
|
+
/** 当前挡位参数(已按速度倍率缩放):速度上限 / 加速度 / 偏航角速度都取自它 */
|
|
599
|
+
get modeSpec(): ModeSpec;
|
|
600
|
+
/** 电量百分比 0~100(按真实容量积分,非线性掉电) */
|
|
601
|
+
get batteryPercent(): number;
|
|
602
|
+
/** 开路电压(只与电量有关,不依赖电流,避免与电流互为依赖) */
|
|
603
|
+
private get openCircuitVoltage();
|
|
604
|
+
/** 放电电流:按当前功率 / 近似电压估算 */
|
|
605
|
+
get batteryCurrent(): number;
|
|
606
|
+
/** 端电压 = 开路电压 − 内阻压降 */
|
|
607
|
+
get batteryVoltage(): number;
|
|
608
|
+
/** 当前定位来源:GNSS(≥6 星且指南针正常)→ 视觉 → 姿态模式 */
|
|
609
|
+
get positionSource(): PositionSource;
|
|
610
|
+
/** 当前总功耗(W):怠速 + 悬停(含平飞增益)+ 爬升功耗,再乘风速系数 */
|
|
611
|
+
get currentPowerWatts(): number;
|
|
612
|
+
/** 剩余可飞时间(分钟) */
|
|
613
|
+
get remainingMinutes(): number;
|
|
614
|
+
/** 上电:重置飞行状态与电量并进入自检;受损时拒绝 */
|
|
615
|
+
powerOn(): void;
|
|
616
|
+
/** 关机:仅地面可用;顺带作废未起飞的航线任务 */
|
|
617
|
+
powerOff(): void;
|
|
618
|
+
/** 切飞行挡位:'cine' 平稳 / 'normal' 普通 / 'sport' 运动(影响限速与倾角) */
|
|
619
|
+
setMode(mode: FlightMode): void;
|
|
620
|
+
/** 写摇杆连续量(Partial 合并;松杆由飞控刹停并定点悬停) */
|
|
621
|
+
setStick(stick: Partial<StickState>): void;
|
|
622
|
+
/** 内八掰杆启动电机(地面待机时可用) */
|
|
623
|
+
startMotors(): boolean;
|
|
624
|
+
/** 停止电机(仅地面已启动电机的状态可用);返回是否真的停下来了 */
|
|
625
|
+
stopMotors(): boolean;
|
|
626
|
+
/** 起飞:记录返航点并自动爬升到 1.2 米(需已启动电机) */
|
|
627
|
+
takeOff(): boolean;
|
|
628
|
+
/** 一键起飞(地面待机时自动完成电机启动 + 起飞) */
|
|
629
|
+
autoTakeOff(): boolean;
|
|
630
|
+
/** 触发自动降落(会先中止正在执行的航线任务) */
|
|
631
|
+
startLanding(): boolean;
|
|
632
|
+
/** 触发智能返航(reason 用于日志与快照);返航优先级高于航线,会中止任务 */
|
|
633
|
+
startRth(reason: string): boolean;
|
|
634
|
+
/** 取消正在执行的智能返航,转入手动飞行 */
|
|
635
|
+
cancelRth(reason?: string): void;
|
|
636
|
+
/**
|
|
637
|
+
* 紧急停桨(停桨保护)。
|
|
638
|
+
* ⚠️ **只在飞行器落地后允许**:空中停桨会直接导致坠机,本沙盒按用户要求禁止,
|
|
639
|
+
* 必须先把飞行器降落下来。空中调用会被拒绝(不改变任何飞行状态),只写一条警告日志。
|
|
640
|
+
*/
|
|
641
|
+
emergencyStop(): boolean;
|
|
642
|
+
/** 重置到可再次起飞的状态(用于沙盒反复测试) */
|
|
643
|
+
reset(): void;
|
|
644
|
+
/** 推进一个仿真时间片(dtSeconds 秒;负值不推进,过大的值会被夹到单步上限) */
|
|
645
|
+
step(dtSeconds: number): void;
|
|
646
|
+
/** 分阶段推进:自检 → 预热 → 待机;起飞/降落/返航的自动段也在这里 */
|
|
647
|
+
private updatePhaseMachine;
|
|
648
|
+
/** 按下降落:高于悬停位则先降向 1 米,已经贴地则直接缓降 */
|
|
649
|
+
private beginLandingDescent;
|
|
650
|
+
/**
|
|
651
|
+
* 自动降落:降向 1 米悬停位 → 稳住一下 → 缓慢触地。
|
|
652
|
+
* 真机不会从巡航高度一路匀速直插地面;低位那一下停顿既是确认落点,也是留给飞手接管的时间。
|
|
653
|
+
*/
|
|
654
|
+
private updateLanding;
|
|
655
|
+
/** 进入 1 米悬停位(手动降落与返航下降段共用) */
|
|
656
|
+
private enterLandingHold;
|
|
657
|
+
private finishLanding;
|
|
658
|
+
private applyGravityFall;
|
|
659
|
+
/** 水平速度归零(GPS/视觉保持位置,姿态模式保留风漂移) */
|
|
660
|
+
private settleHorizontal;
|
|
661
|
+
private updateFlight;
|
|
662
|
+
private updateGnssPositionFlight;
|
|
663
|
+
private integratePosition;
|
|
664
|
+
private applyYaw;
|
|
665
|
+
/**
|
|
666
|
+
* 机体倾斜:四旋翼靠"总升力矢量倾斜"产生水平分力,所以倾角由水平方向
|
|
667
|
+
* 需要的力决定 —— 稳态巡航时是气动阻力(∝ v²),加减速时叠加惯性力(m·a):
|
|
668
|
+
* tan θ = (k·v² + m·a) / (m·g)
|
|
669
|
+
* 用挡位上限标定 k:满速平飞时倾角恰好 = maxTiltDeg。低速时倾角远小于
|
|
670
|
+
* 线性模型(真实阻力随速度平方增长),打杆瞬间则因惯性力额外下压机头、
|
|
671
|
+
* 刹车时反向抬头"拉飘" —— 与真机的加减速姿态一致。
|
|
672
|
+
* 采用航空惯例:俯仰正 = 抬头,横滚正 = 右倾。姿态模式叠加轻微摆动。
|
|
673
|
+
*/
|
|
674
|
+
private updateTilt;
|
|
675
|
+
/**
|
|
676
|
+
* 四旋翼混控:把"总升力 + 三路姿态差动"分配到四个电机。
|
|
677
|
+
*
|
|
678
|
+
* - 总距:motorLoad(含爬升/平飞的负载)已经承载整体转速;
|
|
679
|
+
* 机体倾斜 θ 后总升力还要除以 cos θ 才能托住重力,转速按推力开方折算。
|
|
680
|
+
* - 俯仰差动:前倾(前进)由后侧两桨加速、前侧两桨减速产生 —— 机尾抬升、
|
|
681
|
+
* 机头下压,总升力的水平分力驱动前飞。差动量 ∝ 飞控正在施加的俯仰力矩,
|
|
682
|
+
* 即"目标倾角 − 当前倾角":打杆瞬间四桨差动最大,稳态匀速时回到近似同速
|
|
683
|
+
* (只剩对抗气动俯仰力矩的微小配平)。
|
|
684
|
+
* - 横滚差动:同理,向右压坡由左侧两桨加速、右侧两桨减速产生(右侧加速
|
|
685
|
+
* 会让右端抬起,是向左横滚)。
|
|
686
|
+
* - 偏航差动:相邻桨反转、对角同向(本模型 前左/后右 = 顺时针)。桨旋转时
|
|
687
|
+
* 气动阻力给机身反扭矩,加速一组对角桨、减速另一组,总升力不变而净反扭矩
|
|
688
|
+
* 驱动原地转向 —— 差动量 ∝ 实际偏航角速度(转动全程都需要净扭矩)。
|
|
689
|
+
*/
|
|
690
|
+
private updateMotorSpeeds;
|
|
691
|
+
private updateMotorLoad;
|
|
692
|
+
private updateRth;
|
|
693
|
+
private turnToward;
|
|
694
|
+
/**
|
|
695
|
+
* 航线内部的航点归一化:在字段护栏之外,把高度上限跟 `unlimitedFlight` 对齐。
|
|
696
|
+
*
|
|
697
|
+
* 默认仍是 {@link MISSION_ALTITUDE_HARD_LIMIT}(500 m);取消限高时传 `Infinity`,
|
|
698
|
+
* 否则会出现"限高放开了、航点却被 500 m 静默夹住"的矛盾。
|
|
699
|
+
*/
|
|
700
|
+
private normalizeWaypoint;
|
|
701
|
+
/** 设置航点列表(执行中禁止修改,与真机"上传后不可改"一致) */
|
|
702
|
+
setMission(waypoints: Array<Partial<MissionWaypoint>>): boolean;
|
|
703
|
+
/**
|
|
704
|
+
* 只改一个航点(列表编辑与场景内拖拽共用)。
|
|
705
|
+
*
|
|
706
|
+
* 与 `setMission` 的区别:不整表替换、不重排,因此执行进度、其他航点的引用都保持原样 ——
|
|
707
|
+
* 场景里拖动航点时每帧都要下发一次,用整表替换会连带重建整套三维标记。
|
|
708
|
+
*
|
|
709
|
+
* 返回值是**归一化并夹紧后**的航点(限高/限距),调用方拿它当权威值,别用自己算的原始值。
|
|
710
|
+
*/
|
|
711
|
+
updateMissionWaypoint(index: number, patch: Partial<MissionWaypoint>): MissionWaypoint | null;
|
|
712
|
+
/**
|
|
713
|
+
* 插入一个航点(场景内双击地面新增)。index 越界则追加到末尾,返回实际插入位置。
|
|
714
|
+
* 与真机一致:新航点的高度默认取相邻航点,避免插一个 0 米高、撞地的点。
|
|
715
|
+
*/
|
|
716
|
+
addMissionWaypoint(waypoint: Partial<MissionWaypoint>, index?: number): number;
|
|
717
|
+
/** 删除一个航点,返回是否删掉了 */
|
|
718
|
+
removeMissionWaypoint(index: number): boolean;
|
|
719
|
+
/**
|
|
720
|
+
* 把一个航点夹进可执行范围:高度不超限高,水平距离不超限距(超出则沿返航点方向缩回)。
|
|
721
|
+
*
|
|
722
|
+
* `unlimitedFlight` 打开时两步都跳过(上限为 `Infinity`),只有"不低于 1 m"仍保留。
|
|
723
|
+
*/
|
|
724
|
+
private constrainMissionWaypoint;
|
|
725
|
+
/** 增量更新航线任务的全局设置(只覆盖传入的字段) */
|
|
726
|
+
setMissionConfig(patch: Partial<MissionConfig>): void;
|
|
727
|
+
/** 恢复出厂示例航线 */
|
|
728
|
+
resetMissionToDefault(): void;
|
|
729
|
+
/**
|
|
730
|
+
* 启动航线任务。
|
|
731
|
+
* - 地面待机时先自动起飞,到 1.2 米后自动接上航线(对应 Pilot 里的"执行航线");
|
|
732
|
+
* - 已在空中则直接飞向第一个航点(正在返航会先中止返航);
|
|
733
|
+
* - 姿态模式(无定位)拒绝执行 —— 航点任务依赖 GNSS,真机同样如此。
|
|
734
|
+
*/
|
|
735
|
+
startMission(): boolean;
|
|
736
|
+
/** 进入航线执行态(已在空中的入口) */
|
|
737
|
+
/**
|
|
738
|
+
* 进入航线执行态(已在空中 / 起飞到位后的入口)。
|
|
739
|
+
* 无论是地面起飞接上航线还是空中直接下发,都先从「启航四步」走起 ——
|
|
740
|
+
* 垂直调整到首航点高度 → 水平飞过去 → 高度收尾 → 对准航线方向,然后才开始推航点。
|
|
741
|
+
*/
|
|
742
|
+
private beginMissionPath;
|
|
743
|
+
/** 暂停任务:交回手动控制并原地悬停,航点进度保留 */
|
|
744
|
+
pauseMission(reason?: string): boolean;
|
|
745
|
+
/** 继续任务:回到当前目标航点(首航点还没走完启航段的话接着走) */
|
|
746
|
+
resumeMission(): boolean;
|
|
747
|
+
/** 停止任务:飞机原地悬停,航线归零(真机"停止任务"不返航) */
|
|
748
|
+
stopMission(reason?: string): boolean;
|
|
749
|
+
/** 中止任务(内部使用:返航/降落等更高优先级动作会走到这里) */
|
|
750
|
+
private abortMission;
|
|
751
|
+
/** 航点合法性校验(限高限距):真机在上传航线时就会拦下这类航点;`unlimitedFlight` 打开时整段跳过 */
|
|
752
|
+
private validateMission;
|
|
753
|
+
/**
|
|
754
|
+
* 航线任务每帧推进。
|
|
755
|
+
*
|
|
756
|
+
* 真机飞航线的三个观感要点都在这里:
|
|
757
|
+
* - **先对准再前进**:headingMode='auto' 时机头没转到航向之前原地悬停转向,否则会飞出一条弧线;
|
|
758
|
+
* - **到点减速**:直线模式下按刹车距离提前收油,过点不甩过头;曲线模式则保持巡航速度、
|
|
759
|
+
* 距航点 3 米就切下一个点,形成圆滑切角;
|
|
760
|
+
* - **打杆即暂停**:执行中拨动摇杆 → 任务暂停并交回手动控制(与 Pilot 行为一致)。
|
|
761
|
+
*/
|
|
762
|
+
private updateMission;
|
|
763
|
+
/**
|
|
764
|
+
* 启航段:飞往首航点的四步分段机动(与智能返航同款的分段逻辑)。
|
|
765
|
+
*
|
|
766
|
+
* 1. `depart-climb` 垂直调整到首航点高度 —— 这一段**只动高度**,水平速度锁死;
|
|
767
|
+
* 2. `depart-cruise` 保持该高度水平飞向首航点,机头朝行进方向;
|
|
768
|
+
* 3. `depart-settle` 到达后把高度收干净(水平位置锁死);
|
|
769
|
+
* 4. `depart-align` 原地把机头转到与航线一致,然后才交回常规航点推进。
|
|
770
|
+
*/
|
|
771
|
+
private updateMissionDepart;
|
|
772
|
+
/**
|
|
773
|
+
* 暂停后按当前位置反推启航段走到了哪一步(幂等,可反复调用)。
|
|
774
|
+
* 判定顺序与启航四步一致:高度不对 → 先垂直;水平没到 → 再水平;高度没干净 → 收高度;否则对准。
|
|
775
|
+
*/
|
|
776
|
+
private resolveMissionDepartStage;
|
|
777
|
+
/**
|
|
778
|
+
* 航线在某个航点处的「出航方向」(罗盘角)。
|
|
779
|
+
* 取该航点 → 下一个航点的方位;末航点没有出航段,退回上一段的方向(末点保持入航向)。
|
|
780
|
+
*/
|
|
781
|
+
private missionRouteHeading;
|
|
782
|
+
private bearingBetween;
|
|
783
|
+
/** 到点:执行航点动作(云台 / 拍照 / 悬停),然后飞下一个点 */
|
|
784
|
+
private arriveWaypoint;
|
|
785
|
+
/** 推进到下一个航点;已到末尾则按结束动作收尾或循环 */
|
|
786
|
+
private advanceMission;
|
|
787
|
+
/** 全部航点执行完毕:按配置悬停 / 返航 / 降落 */
|
|
788
|
+
private finishMission;
|
|
789
|
+
/**
|
|
790
|
+
* 航线是否处于"已下发、等待起飞到位"状态。
|
|
791
|
+
* 地面点「执行航线」时 missionStatus 仍是 idle,真正的执行要等自动起飞到 1.2 米 ——
|
|
792
|
+
* 这段时间里航点列表同样不许改(改了下发的还是旧航线),所以外部需要这个判据。
|
|
793
|
+
*/
|
|
794
|
+
get missionPendingStart(): boolean;
|
|
795
|
+
/** 剩余航程(米):沿剩余航点折线累计,含高度差 */
|
|
796
|
+
get missionDistanceLeft(): number;
|
|
797
|
+
private computeMissionDistanceLeft;
|
|
798
|
+
/** 航点完成度 0~1(按航程折算,暂停期间保持不变) */
|
|
799
|
+
get missionProgress(): number;
|
|
800
|
+
/** 预计剩余时间(秒):剩余航程 / 巡航速度 + 剩余悬停时间 */
|
|
801
|
+
get missionEtaSeconds(): number;
|
|
802
|
+
private updateGnss;
|
|
803
|
+
/** 水平精度因子(越小越好);无星时返回 99 表示不可用 */
|
|
804
|
+
get hdop(): number;
|
|
805
|
+
/** GPS 信号格数 0~5(按卫星数与 hdop 折算,面板显示用) */
|
|
806
|
+
get gpsBars(): number;
|
|
807
|
+
/** 遥控信号格数 0~5(按链路质量折算,面板显示用) */
|
|
808
|
+
get rcBars(): number;
|
|
809
|
+
/** 距返航点水平距离(米) */
|
|
810
|
+
get distanceToHome(): number;
|
|
811
|
+
/** 返航点(起飞点)水平坐标 */
|
|
812
|
+
get homePosition(): {
|
|
813
|
+
x: number;
|
|
814
|
+
z: number;
|
|
815
|
+
};
|
|
816
|
+
/** 是否已记录返航点(起飞那一刻记下)。界面据此决定画不画 H 标记与距离读数 */
|
|
817
|
+
get homeReady(): boolean;
|
|
818
|
+
/** 面板调试用:直接把电量设成某个百分比 */
|
|
819
|
+
forceBatteryLevel(percent: number): void;
|
|
820
|
+
private updateBattery;
|
|
821
|
+
/** 是否触发低电量(将进入智能返航) */
|
|
822
|
+
get lowBattery(): boolean;
|
|
823
|
+
/** 是否触发严重低电量(将强制降落) */
|
|
824
|
+
get criticalBattery(): boolean;
|
|
825
|
+
private updateFailsafe;
|
|
826
|
+
private applyObstacleBrake;
|
|
827
|
+
/**
|
|
828
|
+
* 让机身**原地自转**到绝对方位角 `headingDeg`(度,罗盘角);传 `null` 停止自转。
|
|
829
|
+
*
|
|
830
|
+
* 为什么需要它:Mini 4 Pro 的云台 Pan 机械行程只有 ±30°,靠云台转不出 180° 水平视野。
|
|
831
|
+
* 真机拍 180°/360° 全景是**机体原地自转**补水平、云台只做俯仰分层
|
|
832
|
+
* (见 `drone-panorama`),所以水平网格必须施加在机身上,而不是取景相机上。
|
|
833
|
+
*
|
|
834
|
+
* 只改航向:`applyYaw` 里自转优先于摇杆偏航,位置照常由定点保持锁住 —— 转的过程中
|
|
835
|
+
* 机体不位移("原地"的含义)。角速度同样吃 `speedScale`(倍率 0 时自转也停住)。
|
|
836
|
+
*/
|
|
837
|
+
spinTo(headingDeg: number | null, rateDeg?: number): void;
|
|
838
|
+
/** 自转目标方位角(度,罗盘角);没有在自转时返回 null */
|
|
839
|
+
get spinTarget(): number | null;
|
|
840
|
+
/** 是否正在自转(目标未清除即为是,到位后目标仍在,直到调用方 `spinTo(null)`) */
|
|
841
|
+
get spinning(): boolean;
|
|
842
|
+
/** 自转是否已对准目标(容差 0.5°;没有自转时恒为 true) */
|
|
843
|
+
get spinAligned(): boolean;
|
|
844
|
+
/** 手动云台俯仰增量(度),正 = 抬头 */
|
|
845
|
+
nudgeGimbal(deltaPitch: number, deltaYaw?: number): void;
|
|
846
|
+
/** 设置云台俯仰角(度,正 = 抬头),自动夹到机型行程内 */
|
|
847
|
+
setGimbalPitch(pitch: number): void;
|
|
848
|
+
private updateCamera;
|
|
849
|
+
/** 切换录像开关;返回切换后是否在录 */
|
|
850
|
+
toggleRecording(): void;
|
|
851
|
+
/**
|
|
852
|
+
* 录像状态的唯一写入口(UI/引擎都走这里):
|
|
853
|
+
* 只负责状态、计时与事件日志;真正的录制(MediaRecorder)在 drone-fly 层,
|
|
854
|
+
* 由它按本状态启动/收尾,避免两处状态打架。
|
|
855
|
+
*/
|
|
856
|
+
setRecordingState(active: boolean): void;
|
|
857
|
+
/** 停止录像并收尾成片(已在录才有效) */
|
|
858
|
+
stopRecording(): void;
|
|
859
|
+
/** 拍照:计数 +1 并记一条事件(实际成像由引擎层负责) */
|
|
860
|
+
takePhoto(): void;
|
|
861
|
+
/** 设置变焦倍数,夹在 1~4 倍之间 */
|
|
862
|
+
setZoom(zoom: number): void;
|
|
863
|
+
/** 起飞前检查项列表(外部注入项 + 内置项),每次读取即时构造 */
|
|
864
|
+
get checklist(): ChecklistItem[];
|
|
865
|
+
/** 是否满足起飞条件:阶段为待机/电机已启动,且所有阻塞项都通过 */
|
|
866
|
+
get canTakeOff(): boolean;
|
|
867
|
+
/** 当前生效的警告文案列表(界面红条用) */
|
|
868
|
+
get warnings(): string[];
|
|
869
|
+
private warnOnce;
|
|
870
|
+
private damageCheck;
|
|
871
|
+
/** 追加一条事件(面板事件流;level 决定颜色) */
|
|
872
|
+
pushEvent(level: EventLevel, text: string): void;
|
|
873
|
+
private pushEventInternal;
|
|
874
|
+
private formatDuration;
|
|
875
|
+
private windVector;
|
|
876
|
+
/** 风向相对机头的描述,例如"正逆风" */
|
|
877
|
+
get windRelative(): string;
|
|
878
|
+
/** 生成完整遥测快照(数组字段已复制,见 DroneSnapshot) */
|
|
879
|
+
snapshot(): DroneSnapshot;
|
|
880
|
+
/** 仿真累计时长(秒):含地面上电时间,与飞行时长 flightTime 不同 */
|
|
881
|
+
get elapsed(): number;
|
|
882
|
+
}
|
|
883
|
+
//# sourceMappingURL=drone-sim.d.ts.map
|