hpp-lang 0.6.0
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 +29 -0
- package/dist/ast.d.ts +89 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/capabilities.d.ts +75 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +181 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/examples.d.ts +9 -0
- package/dist/examples.d.ts.map +1 -0
- package/dist/examples.js +780 -0
- package/dist/examples.js.map +1 -0
- package/dist/extensions/line/index.d.ts +45 -0
- package/dist/extensions/line/index.d.ts.map +1 -0
- package/dist/extensions/line/index.js +99 -0
- package/dist/extensions/line/index.js.map +1 -0
- package/dist/extensions/maze/index.d.ts +37 -0
- package/dist/extensions/maze/index.d.ts.map +1 -0
- package/dist/extensions/maze/index.js +43 -0
- package/dist/extensions/maze/index.js.map +1 -0
- package/dist/extensions/soccer/index.d.ts +8 -0
- package/dist/extensions/soccer/index.d.ts.map +1 -0
- package/dist/extensions/soccer/index.js +93 -0
- package/dist/extensions/soccer/index.js.map +1 -0
- package/dist/hardware.d.ts +44 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +2 -0
- package/dist/hardware.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/interpreter.d.ts +88 -0
- package/dist/interpreter.d.ts.map +1 -0
- package/dist/interpreter.js +795 -0
- package/dist/interpreter.js.map +1 -0
- package/dist/lexer.d.ts +21 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +175 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +60 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +569 -0
- package/dist/parser.js.map +1 -0
- package/dist/robotics/actions.d.ts +13 -0
- package/dist/robotics/actions.d.ts.map +1 -0
- package/dist/robotics/actions.js +38 -0
- package/dist/robotics/actions.js.map +1 -0
- package/dist/robotics/contracts.d.ts +88 -0
- package/dist/robotics/contracts.d.ts.map +1 -0
- package/dist/robotics/contracts.js +31 -0
- package/dist/robotics/contracts.js.map +1 -0
- package/dist/robotics/index.d.ts +21 -0
- package/dist/robotics/index.d.ts.map +1 -0
- package/dist/robotics/index.js +19 -0
- package/dist/robotics/index.js.map +1 -0
- package/dist/robotics/motion.d.ts +139 -0
- package/dist/robotics/motion.d.ts.map +1 -0
- package/dist/robotics/motion.js +248 -0
- package/dist/robotics/motion.js.map +1 -0
- package/dist/robotics/sensors.d.ts +15 -0
- package/dist/robotics/sensors.d.ts.map +1 -0
- package/dist/robotics/sensors.js +12 -0
- package/dist/robotics/sensors.js.map +1 -0
- package/dist/robotics/snapshot.d.ts +12 -0
- package/dist/robotics/snapshot.d.ts.map +1 -0
- package/dist/robotics/snapshot.js +9 -0
- package/dist/robotics/snapshot.js.map +1 -0
- package/dist/robotics/types.d.ts +12 -0
- package/dist/robotics/types.d.ts.map +1 -0
- package/dist/robotics/types.js +9 -0
- package/dist/robotics/types.js.map +1 -0
- package/dist/runtime.d.ts +81 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +150 -0
- package/dist/runtime.js.map +1 -0
- package/dist/tokens.d.ts +33 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +97 -0
- package/dist/tokens.js.map +1 -0
- package/dist/version.d.ts +14 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Capability } from '../capabilities.js';
|
|
2
|
+
/**
|
|
3
|
+
* Contratos da camada **HPP Robotics Motion** (§4 do plano multidomínio).
|
|
4
|
+
*
|
|
5
|
+
* ```text
|
|
6
|
+
* H++ → Lexer → Parser → AST → Interpreter → HppRuntime → Robotics → Capabilities
|
|
7
|
+
* ↓
|
|
8
|
+
* Domain Adapter (soccer/line/maze)
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Estes tipos são a fronteira entre o Core (que só sabe "executar uma ação")
|
|
12
|
+
* e os adapters (que sabem como transformar a ação em física). Nada aqui
|
|
13
|
+
* importa domínio, Three.js, sensores ou motores concretos.
|
|
14
|
+
*
|
|
15
|
+
* Princípio: **primitiva ≠ comportamento ≠ domínio** (§19). Um `MotionCommand`
|
|
16
|
+
* é um movimento; `SEGUIR_PAREDE` é comportamento (extensão); `CHUTAR` é
|
|
17
|
+
* domínio (extensão soccer).
|
|
18
|
+
*/
|
|
19
|
+
/** Ação de movimento pedida ao hardware, em forma normalizada. */
|
|
20
|
+
export interface MotionCommand {
|
|
21
|
+
/** Verbo canônico (mesmo vocabulário do `ActionName` de movimento). */
|
|
22
|
+
readonly action: MotionAction;
|
|
23
|
+
/** Parâmetro normalizado -1..1 (velocidade/steer), quando houver. */
|
|
24
|
+
readonly value?: number;
|
|
25
|
+
/** Segundos, para comandos temporais (`ANDAR_POR`, `ESPERAR`…). */
|
|
26
|
+
readonly duration?: number;
|
|
27
|
+
/** Metros, para `ANDAR_METROS`/`VOLTAR_METROS`. */
|
|
28
|
+
readonly distance?: number;
|
|
29
|
+
/** Graus, para `GIRAR_GRAUS`. */
|
|
30
|
+
readonly degrees?: number;
|
|
31
|
+
/** Segundo eixo/roda, para comandos de dois valores (`MOTORES`, `CURVA`). */
|
|
32
|
+
readonly value2?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Verbos de movimento da camada Robotics (subconjunto do `ActionName`).
|
|
36
|
+
* É o vocabulário compartilhado: todo domínio pode usá-los.
|
|
37
|
+
*/
|
|
38
|
+
export type MotionAction = 'drive' | 'reverse' | 'stop' | 'turn' | 'turnLeft' | 'turnRight' | 'driveFor' | 'reverseFor' | 'turnFor' | 'stopFor' | 'wait' | 'driveMeters' | 'reverseMeters' | 'turnDegrees' | 'motor' | 'motorLeft' | 'motorRight' | 'motors' | 'curve' | 'moveLateral' | 'moveXY';
|
|
39
|
+
/** O que o hardware sabe fazer de movimento. */
|
|
40
|
+
export interface MotionCapabilities {
|
|
41
|
+
/** Movimento contínuo básico (`ANDAR`, `GIRAR`, `PARAR`). */
|
|
42
|
+
basic: boolean;
|
|
43
|
+
/** Comandos temporais não bloqueantes (`ANDAR_POR`, `ESPERAR`…). */
|
|
44
|
+
timed: boolean;
|
|
45
|
+
/** Movimento por distância/ângulo (exige `encoder`/`odometry`). */
|
|
46
|
+
spatial: boolean;
|
|
47
|
+
/** Curva combinando throttle + steer (`CURVA`). */
|
|
48
|
+
curve: boolean;
|
|
49
|
+
/** Movimento holonômico lateral/XY (exige `holonomic_drive`). */
|
|
50
|
+
holonomic: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** Controle de motores: NÃO é propriedade universal do robô (§10). */
|
|
53
|
+
export interface MotorCapabilities {
|
|
54
|
+
/** Existe ao menos uma saída de motor. */
|
|
55
|
+
present: boolean;
|
|
56
|
+
/** Quantidade de saídas endereçáveis (0 = desconhecido/não endereçável). */
|
|
57
|
+
count: number;
|
|
58
|
+
/** `MOTOR id, v` — motor individual por índice. */
|
|
59
|
+
individual: boolean;
|
|
60
|
+
/** `MOTOR_ESQUERDO v` */
|
|
61
|
+
left: boolean;
|
|
62
|
+
/** `MOTOR_DIREITO v` */
|
|
63
|
+
right: boolean;
|
|
64
|
+
}
|
|
65
|
+
/** Odometria: base dos comandos por distância/ângulo (§8). */
|
|
66
|
+
export interface EncoderCapabilities {
|
|
67
|
+
/** Encoder de distância (metros percorridos). */
|
|
68
|
+
encoder: boolean;
|
|
69
|
+
/** Odometria combinada (distância + ângulo). */
|
|
70
|
+
odometry: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** Tipos de locomoção suportados pelo chassi (§10–§12). */
|
|
73
|
+
export interface LocomotionCapabilities {
|
|
74
|
+
/** Duas rodas com steering equivalente (diferencial). */
|
|
75
|
+
differential: boolean;
|
|
76
|
+
/** Omnidirecional (move lateral sem girar). */
|
|
77
|
+
holonomic: boolean;
|
|
78
|
+
}
|
|
79
|
+
/** Perfil completo derivado das `Capability[]` declaradas pelo hardware. */
|
|
80
|
+
export interface RoboticsProfile {
|
|
81
|
+
motion: MotionCapabilities;
|
|
82
|
+
motors: MotorCapabilities;
|
|
83
|
+
encoders: EncoderCapabilities;
|
|
84
|
+
locomotion: LocomotionCapabilities;
|
|
85
|
+
}
|
|
86
|
+
/** Deriva o perfil de movimento a partir das capabilities declaradas. */
|
|
87
|
+
export declare function roboticsProfile(caps: Capability[]): RoboticsProfile;
|
|
88
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/robotics/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AAEH,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAChE,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAC1D,aAAa,GAAG,eAAe,GAAG,aAAa,GAC/C,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,GAC/C,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEvC,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,yBAAyB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,YAAY,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAID,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,eAAe,CA2BnE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const has = (caps, c) => caps.includes(c);
|
|
2
|
+
/** Deriva o perfil de movimento a partir das capabilities declaradas. */
|
|
3
|
+
export function roboticsProfile(caps) {
|
|
4
|
+
const encoder = has(caps, 'encoder');
|
|
5
|
+
const odometry = has(caps, 'odometry');
|
|
6
|
+
const left = has(caps, 'motor_left');
|
|
7
|
+
const right = has(caps, 'motor_right');
|
|
8
|
+
const individual = has(caps, 'motor_individual');
|
|
9
|
+
return {
|
|
10
|
+
motion: {
|
|
11
|
+
basic: has(caps, 'motor'),
|
|
12
|
+
timed: true, // relógio do runtime: sempre disponível no núcleo
|
|
13
|
+
spatial: encoder || odometry,
|
|
14
|
+
curve: has(caps, 'motor') || has(caps, 'differential_drive'),
|
|
15
|
+
holonomic: has(caps, 'holonomic_drive')
|
|
16
|
+
},
|
|
17
|
+
motors: {
|
|
18
|
+
present: has(caps, 'motor'),
|
|
19
|
+
count: individual ? 2 : left || right ? 1 : has(caps, 'differential_drive') ? 2 : 0,
|
|
20
|
+
individual,
|
|
21
|
+
left,
|
|
22
|
+
right
|
|
23
|
+
},
|
|
24
|
+
encoders: { encoder, odometry },
|
|
25
|
+
locomotion: {
|
|
26
|
+
differential: has(caps, 'differential_drive'),
|
|
27
|
+
holonomic: has(caps, 'holonomic_drive')
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/robotics/contracts.ts"],"names":[],"mappings":"AAmGA,MAAM,GAAG,GAAG,CAAC,IAAkB,EAAE,CAAa,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAE7E,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACjD,OAAO;QACL,MAAM,EAAE;YACN,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;YACzB,KAAK,EAAE,IAAI,EAAE,kDAAkD;YAC/D,OAAO,EAAE,OAAO,IAAI,QAAQ;YAC5B,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC;YAC5D,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC;SACxC;QACD,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;YAC3B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,UAAU;YACV,IAAI;YACJ,KAAK;SACN;QACD,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC/B,UAAU,EAAE;YACV,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC;YAC7C,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC;SACxC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HPP Robotics Motion — camada de movimento robótico universal da H++.
|
|
3
|
+
*
|
|
4
|
+
* ```text
|
|
5
|
+
* H++
|
|
6
|
+
* │
|
|
7
|
+
* ┌───────┴────────┐
|
|
8
|
+
* Robotics Core (só linguagem)
|
|
9
|
+
* │
|
|
10
|
+
* ┌──────┼──────────┐
|
|
11
|
+
* Soccer Line Maze
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Nenhum arquivo desta pasta importa domínio, simulador, Three.js, bola,
|
|
15
|
+
* campo ou gol — provado por `tests/isolation.test.ts`.
|
|
16
|
+
*/
|
|
17
|
+
export { HPP_ROBOTICS_VERSION, MOTION_ACTIONS, TIMED_ACTIONS, SPATIAL_ACTIONS, MOTION_REQUIREMENTS, MOTION_STATE_SENSORS, ENCODER_SENSORS, HEADING_SENSORS, isMotionAction, missingMotionCapability, motionCapabilityError, MotionState } from './motion.js';
|
|
18
|
+
export type { TimedKind, TimedPending, SpatialPending, PendingMotion } from './motion.js';
|
|
19
|
+
export { roboticsProfile } from './contracts.js';
|
|
20
|
+
export type { MotionCommand, MotionAction, MotionCapabilities, MotorCapabilities, EncoderCapabilities, LocomotionCapabilities, RoboticsProfile } from './contracts.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/robotics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HPP Robotics Motion — camada de movimento robótico universal da H++.
|
|
3
|
+
*
|
|
4
|
+
* ```text
|
|
5
|
+
* H++
|
|
6
|
+
* │
|
|
7
|
+
* ┌───────┴────────┐
|
|
8
|
+
* Robotics Core (só linguagem)
|
|
9
|
+
* │
|
|
10
|
+
* ┌──────┼──────────┐
|
|
11
|
+
* Soccer Line Maze
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Nenhum arquivo desta pasta importa domínio, simulador, Three.js, bola,
|
|
15
|
+
* campo ou gol — provado por `tests/isolation.test.ts`.
|
|
16
|
+
*/
|
|
17
|
+
export { HPP_ROBOTICS_VERSION, MOTION_ACTIONS, TIMED_ACTIONS, SPATIAL_ACTIONS, MOTION_REQUIREMENTS, MOTION_STATE_SENSORS, ENCODER_SENSORS, HEADING_SENSORS, isMotionAction, missingMotionCapability, motionCapabilityError, MotionState } from './motion.js';
|
|
18
|
+
export { roboticsProfile } from './contracts.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/robotics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Capability } from '../capabilities.js';
|
|
2
|
+
import type { ActionName } from '../tokens.js';
|
|
3
|
+
import type { MotionAction } from './contracts.js';
|
|
4
|
+
/**
|
|
5
|
+
* Núcleo da camada **HPP Robotics Motion**: vocabulário compartilhado,
|
|
6
|
+
* exigências de capability e a máquina de estados de movimento.
|
|
7
|
+
*
|
|
8
|
+
* Regras de ouro (§6/§28):
|
|
9
|
+
* - nenhum `sleep`/`setTimeout`/`await`/busy-wait: o tempo vem do relógio
|
|
10
|
+
* determinístico do runtime (`dt` por ciclo);
|
|
11
|
+
* - a operação temporal **sobrevive entre ciclos** (o programa é suspenso,
|
|
12
|
+
* não o runtime — o robô nunca congela o simulador);
|
|
13
|
+
* - nunca fingir que uma distância/ângulo foi atingido: sem `encoder`/
|
|
14
|
+
* `odometry` (e sem a leitura real) o comando falha em português.
|
|
15
|
+
*/
|
|
16
|
+
/** Versão da camada Robotics (independente do Core e das extensões). */
|
|
17
|
+
export declare const HPP_ROBOTICS_VERSION = "0.1.0";
|
|
18
|
+
/** Todos os verbos de movimento universais (§33 — conjunto compartilhado). */
|
|
19
|
+
export declare const MOTION_ACTIONS: readonly MotionAction[];
|
|
20
|
+
/** É uma primitiva de movimento Robotics (logo, vale em qualquer domínio)? */
|
|
21
|
+
export declare function isMotionAction(name: ActionName): boolean;
|
|
22
|
+
/** Ações temporais: exigem o relógio do runtime e suspendem o programa. */
|
|
23
|
+
export declare const TIMED_ACTIONS: ReadonlySet<ActionName>;
|
|
24
|
+
/** Ações espaciais: distância/ângulo reais (nunca simulados). */
|
|
25
|
+
export declare const SPATIAL_ACTIONS: ReadonlySet<ActionName>;
|
|
26
|
+
/**
|
|
27
|
+
* Capacidades exigidas por ação, com semântica **"basta uma delas" (OU)**.
|
|
28
|
+
* Escolhemos OU porque um hardware pode oferecer `encoder` puro ou
|
|
29
|
+
* `odometry` completa — o programa não deve saber qual adapter está por
|
|
30
|
+
* baixo. Ações de domínio (kick/dribble/radio…) ficam no `requires` da
|
|
31
|
+
* própria extensão; aqui mora só o que é compartilhado por todo robô.
|
|
32
|
+
*/
|
|
33
|
+
export declare const MOTION_REQUIREMENTS: Readonly<Partial<Record<MotionAction, Capability[]>>>;
|
|
34
|
+
/** Capacidades (OU) que faltam para `action`, ou null se pode executar. */
|
|
35
|
+
export declare function missingMotionCapability(action: ActionName, have: Capability[]): Capability[] | null;
|
|
36
|
+
/**
|
|
37
|
+
* Mensagem didática em português quando falta capability (§21).
|
|
38
|
+
* Retorna null quando a ação pode executar neste hardware.
|
|
39
|
+
*/
|
|
40
|
+
export declare function motionCapabilityError(action: ActionName, have: Capability[]): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Sensores genéricos de estado de movimento (§14). O interpretador os injeta
|
|
43
|
+
* a cada ciclo; `velocidade`/`velocidade_angular` vêm do adapter quando o
|
|
44
|
+
* hardware os suporta (nunca inventados pelo Core).
|
|
45
|
+
*/
|
|
46
|
+
export declare const MOTION_STATE_SENSORS: readonly string[];
|
|
47
|
+
/** Sensores de odometria aceitos pelos comandos por distância. */
|
|
48
|
+
export declare const ENCODER_SENSORS: readonly string[];
|
|
49
|
+
/** Sensores de orientação aceitos pelo `GIRAR_GRAUS`. */
|
|
50
|
+
export declare const HEADING_SENSORS: readonly string[];
|
|
51
|
+
/** Tipo do movimento temporal em andamento. */
|
|
52
|
+
export type TimedKind = 'drive' | 'reverse' | 'turn' | 'stop' | 'wait';
|
|
53
|
+
/** Estado de um comando temporal (§6 — sobrevive entre ciclos). */
|
|
54
|
+
export interface TimedPending {
|
|
55
|
+
mode: 'timed';
|
|
56
|
+
kind: TimedKind;
|
|
57
|
+
/** Parâmetro normalizado -1..1 (0 para `stop`/`wait`). */
|
|
58
|
+
value: number;
|
|
59
|
+
/** Segundos totais. */
|
|
60
|
+
duration: number;
|
|
61
|
+
/** Segundos já decorridos (soma de `dt` a cada ciclo). */
|
|
62
|
+
elapsed: number;
|
|
63
|
+
}
|
|
64
|
+
/** Estado de um comando espacial (§8 — distância/ângulo reais). */
|
|
65
|
+
export interface SpatialPending {
|
|
66
|
+
mode: 'spatial';
|
|
67
|
+
action: MotionAction;
|
|
68
|
+
/** Rótulo PT do comando (mensagens). */
|
|
69
|
+
label: string;
|
|
70
|
+
/** Sensores candidatos, em ordem de preferência. */
|
|
71
|
+
sensors: string[];
|
|
72
|
+
kind: 'distance' | 'degrees';
|
|
73
|
+
/** Leitura inicial no momento do comando. */
|
|
74
|
+
start: number;
|
|
75
|
+
/** Leitura do ciclo anterior (para acumular giros > 180°). */
|
|
76
|
+
prev: number;
|
|
77
|
+
/** Acumulado até agora (metros ou graus, sempre ≥ 0). */
|
|
78
|
+
accum: number;
|
|
79
|
+
/** Valor absoluto a percorrer. */
|
|
80
|
+
target: number;
|
|
81
|
+
/** Velocidade comandada (-1..1) enquanto percorre. */
|
|
82
|
+
drive: number;
|
|
83
|
+
/** Steer comandado (-1..1) enquanto gira. */
|
|
84
|
+
turn: number;
|
|
85
|
+
}
|
|
86
|
+
export type PendingMotion = TimedPending | SpatialPending;
|
|
87
|
+
/**
|
|
88
|
+
* Máquina de estados do movimento, mantida **entre ciclos** pelo
|
|
89
|
+
* interpretador. Registra o último comando contínuo para alimentar os
|
|
90
|
+
* sensores `esta_andando`/`esta_parado`/`esta_girando`.
|
|
91
|
+
*
|
|
92
|
+
* Os valores são **leitura de comando**, não física do robô: o Core não
|
|
93
|
+
* calcula cinemática (isso é trabalho do adapter).
|
|
94
|
+
*/
|
|
95
|
+
export declare class MotionState {
|
|
96
|
+
/** Comando em andamento (null = programa executando solto). */
|
|
97
|
+
pending: PendingMotion | null;
|
|
98
|
+
/** Verdadeiro só no ciclo em que um movimento terminou. */
|
|
99
|
+
justCompleted: boolean;
|
|
100
|
+
/** Último avanço comandado (-1..1; 0 = parado). */
|
|
101
|
+
driveValue: number;
|
|
102
|
+
/** Último giro comandado (-1..1; 0 = sem giro). */
|
|
103
|
+
turnValue: number;
|
|
104
|
+
/** Última velocidade da roda individual esquerda (-1..1). */
|
|
105
|
+
leftValue: number;
|
|
106
|
+
/** Última velocidade da roda individual direita (-1..1). */
|
|
107
|
+
rightValue: number;
|
|
108
|
+
/** Último deslocamento lateral holonômico (-1..1). */
|
|
109
|
+
lateralValue: number;
|
|
110
|
+
/** Inicia um movimento temporal (o comando já foi enviado ao hardware). */
|
|
111
|
+
beginTimed(kind: TimedKind, value: number, duration: number): void;
|
|
112
|
+
/** Inicia um movimento por distância/ângulo. */
|
|
113
|
+
beginSpatial(spec: Omit<SpatialPending, 'mode'>): void;
|
|
114
|
+
/**
|
|
115
|
+
* Avança o relógio de um movimento TEMPORAL. Devolve o que terminou neste
|
|
116
|
+
* tick (ou null). Nunca bloqueia: apenas soma `dt`.
|
|
117
|
+
*/
|
|
118
|
+
tickTimed(dt: number): TimedPending | null;
|
|
119
|
+
/** Conclui o movimento espacial atual (meta de distância/ângulo atingida). */
|
|
120
|
+
finishSpatial(): void;
|
|
121
|
+
/** Desiste do movimento espacial (sensor ausente) sem fingir chegada. */
|
|
122
|
+
abortSpatial(): void;
|
|
123
|
+
noteDrive(value: number): void;
|
|
124
|
+
noteTurn(value: number): void;
|
|
125
|
+
noteMotorLeft(value: number): void;
|
|
126
|
+
noteMotorRight(value: number): void;
|
|
127
|
+
noteMotors(left: number, right: number): void;
|
|
128
|
+
noteLateral(value: number): void;
|
|
129
|
+
noteStopped(): void;
|
|
130
|
+
/**
|
|
131
|
+
* Avanço comandado diferente de zero (qualquer sinal: `VOLTAR -0.5` e
|
|
132
|
+
* `ANDAR -0.5` são andar para trás — continuam "andando").
|
|
133
|
+
*/
|
|
134
|
+
isDriving(): boolean;
|
|
135
|
+
isTurning(): boolean;
|
|
136
|
+
isStopped(): boolean;
|
|
137
|
+
reset(): void;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../../src/robotics/motion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;;;;GAWG;AAEH,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C,8EAA8E;AAC9E,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAMjD,CAAC;AAIF,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAExD;AAED,2EAA2E;AAC3E,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,UAAU,CAEhD,CAAC;AAEH,iEAAiE;AACjE,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,CAElD,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,CAWrF,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAKnG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,CAQ3F;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAMjD,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAAyC,CAAC;AAEvF,yDAAyD;AACzD,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAA2B,CAAC;AAEzE,+CAA+C;AAC/C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvE,mEAAmE;AACnE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAE1D;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,+DAA+D;IAC/D,OAAO,EAAE,aAAa,GAAG,IAAI,CAAQ;IACrC,2DAA2D;IAC3D,aAAa,UAAS;IACtB,mDAAmD;IACnD,UAAU,SAAK;IACf,mDAAmD;IACnD,SAAS,SAAK;IACd,6DAA6D;IAC7D,SAAS,SAAK;IACd,4DAA4D;IAC5D,UAAU,SAAK;IACf,sDAAsD;IACtD,YAAY,SAAK;IAEjB,2EAA2E;IAC3E,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOlE,gDAAgD;IAChD,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,IAAI;IAStD;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAU1C,8EAA8E;IAC9E,aAAa,IAAI,IAAI;IAMrB,yEAAyE;IACzE,YAAY,IAAI,IAAI;IAKpB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC,WAAW,IAAI,IAAI;IAQnB;;;OAGG;IACH,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,OAAO;IAKpB,SAAS,IAAI,OAAO;IAOpB,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { ACTION_PT } from '../tokens.js';
|
|
2
|
+
/**
|
|
3
|
+
* Núcleo da camada **HPP Robotics Motion**: vocabulário compartilhado,
|
|
4
|
+
* exigências de capability e a máquina de estados de movimento.
|
|
5
|
+
*
|
|
6
|
+
* Regras de ouro (§6/§28):
|
|
7
|
+
* - nenhum `sleep`/`setTimeout`/`await`/busy-wait: o tempo vem do relógio
|
|
8
|
+
* determinístico do runtime (`dt` por ciclo);
|
|
9
|
+
* - a operação temporal **sobrevive entre ciclos** (o programa é suspenso,
|
|
10
|
+
* não o runtime — o robô nunca congela o simulador);
|
|
11
|
+
* - nunca fingir que uma distância/ângulo foi atingido: sem `encoder`/
|
|
12
|
+
* `odometry` (e sem a leitura real) o comando falha em português.
|
|
13
|
+
*/
|
|
14
|
+
/** Versão da camada Robotics (independente do Core e das extensões). */
|
|
15
|
+
export const HPP_ROBOTICS_VERSION = '0.1.0';
|
|
16
|
+
/** Todos os verbos de movimento universais (§33 — conjunto compartilhado). */
|
|
17
|
+
export const MOTION_ACTIONS = [
|
|
18
|
+
'drive', 'reverse', 'stop', 'turn', 'turnLeft', 'turnRight',
|
|
19
|
+
'driveFor', 'reverseFor', 'turnFor', 'stopFor', 'wait',
|
|
20
|
+
'driveMeters', 'reverseMeters', 'turnDegrees',
|
|
21
|
+
'motor', 'motorLeft', 'motorRight', 'motors',
|
|
22
|
+
'curve', 'moveLateral', 'moveXY'
|
|
23
|
+
];
|
|
24
|
+
const MOTION_SET = new Set(MOTION_ACTIONS);
|
|
25
|
+
/** É uma primitiva de movimento Robotics (logo, vale em qualquer domínio)? */
|
|
26
|
+
export function isMotionAction(name) {
|
|
27
|
+
return MOTION_SET.has(name);
|
|
28
|
+
}
|
|
29
|
+
/** Ações temporais: exigem o relógio do runtime e suspendem o programa. */
|
|
30
|
+
export const TIMED_ACTIONS = new Set([
|
|
31
|
+
'driveFor', 'reverseFor', 'turnFor', 'stopFor', 'wait'
|
|
32
|
+
]);
|
|
33
|
+
/** Ações espaciais: distância/ângulo reais (nunca simulados). */
|
|
34
|
+
export const SPATIAL_ACTIONS = new Set([
|
|
35
|
+
'driveMeters', 'reverseMeters', 'turnDegrees'
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* Capacidades exigidas por ação, com semântica **"basta uma delas" (OU)**.
|
|
39
|
+
* Escolhemos OU porque um hardware pode oferecer `encoder` puro ou
|
|
40
|
+
* `odometry` completa — o programa não deve saber qual adapter está por
|
|
41
|
+
* baixo. Ações de domínio (kick/dribble/radio…) ficam no `requires` da
|
|
42
|
+
* própria extensão; aqui mora só o que é compartilhado por todo robô.
|
|
43
|
+
*/
|
|
44
|
+
export const MOTION_REQUIREMENTS = {
|
|
45
|
+
driveMeters: ['encoder', 'odometry'],
|
|
46
|
+
reverseMeters: ['encoder', 'odometry'],
|
|
47
|
+
turnDegrees: ['encoder', 'odometry', 'compass', 'imu'],
|
|
48
|
+
motor: ['motor_individual'],
|
|
49
|
+
motorLeft: ['motor_left'],
|
|
50
|
+
motorRight: ['motor_right'],
|
|
51
|
+
motors: ['differential_drive'],
|
|
52
|
+
curve: ['motor'],
|
|
53
|
+
moveLateral: ['holonomic_drive'],
|
|
54
|
+
moveXY: ['holonomic_drive']
|
|
55
|
+
};
|
|
56
|
+
/** Capacidades (OU) que faltam para `action`, ou null se pode executar. */
|
|
57
|
+
export function missingMotionCapability(action, have) {
|
|
58
|
+
if (!isMotionAction(action))
|
|
59
|
+
return null;
|
|
60
|
+
const need = MOTION_REQUIREMENTS[action];
|
|
61
|
+
if (!need || need.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
return need.some((c) => have.includes(c)) ? null : [...need];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Mensagem didática em português quando falta capability (§21).
|
|
67
|
+
* Retorna null quando a ação pode executar neste hardware.
|
|
68
|
+
*/
|
|
69
|
+
export function motionCapabilityError(action, have) {
|
|
70
|
+
const missing = missingMotionCapability(action, have);
|
|
71
|
+
if (!missing)
|
|
72
|
+
return null;
|
|
73
|
+
const label = ACTION_PT[action] ?? String(action);
|
|
74
|
+
return (`A ação ${label} requer a capacidade ${missing.join(' ou ')}. ` +
|
|
75
|
+
`Este robô não possui essa capacidade.`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Sensores genéricos de estado de movimento (§14). O interpretador os injeta
|
|
79
|
+
* a cada ciclo; `velocidade`/`velocidade_angular` vêm do adapter quando o
|
|
80
|
+
* hardware os suporta (nunca inventados pelo Core).
|
|
81
|
+
*/
|
|
82
|
+
export const MOTION_STATE_SENSORS = [
|
|
83
|
+
'esta_andando', 'is_moving',
|
|
84
|
+
'esta_parado', 'is_stopped',
|
|
85
|
+
'esta_girando', 'is_turning',
|
|
86
|
+
'movimento_ativo', 'motion_active',
|
|
87
|
+
'movimento_concluido', 'motion_done'
|
|
88
|
+
];
|
|
89
|
+
/** Sensores de odometria aceitos pelos comandos por distância. */
|
|
90
|
+
export const ENCODER_SENSORS = ['encoder', 'odometria', 'odometry'];
|
|
91
|
+
/** Sensores de orientação aceitos pelo `GIRAR_GRAUS`. */
|
|
92
|
+
export const HEADING_SENSORS = ['bussola', 'compass'];
|
|
93
|
+
/**
|
|
94
|
+
* Máquina de estados do movimento, mantida **entre ciclos** pelo
|
|
95
|
+
* interpretador. Registra o último comando contínuo para alimentar os
|
|
96
|
+
* sensores `esta_andando`/`esta_parado`/`esta_girando`.
|
|
97
|
+
*
|
|
98
|
+
* Os valores são **leitura de comando**, não física do robô: o Core não
|
|
99
|
+
* calcula cinemática (isso é trabalho do adapter).
|
|
100
|
+
*/
|
|
101
|
+
export class MotionState {
|
|
102
|
+
constructor() {
|
|
103
|
+
/** Comando em andamento (null = programa executando solto). */
|
|
104
|
+
Object.defineProperty(this, "pending", {
|
|
105
|
+
enumerable: true,
|
|
106
|
+
configurable: true,
|
|
107
|
+
writable: true,
|
|
108
|
+
value: null
|
|
109
|
+
});
|
|
110
|
+
/** Verdadeiro só no ciclo em que um movimento terminou. */
|
|
111
|
+
Object.defineProperty(this, "justCompleted", {
|
|
112
|
+
enumerable: true,
|
|
113
|
+
configurable: true,
|
|
114
|
+
writable: true,
|
|
115
|
+
value: false
|
|
116
|
+
});
|
|
117
|
+
/** Último avanço comandado (-1..1; 0 = parado). */
|
|
118
|
+
Object.defineProperty(this, "driveValue", {
|
|
119
|
+
enumerable: true,
|
|
120
|
+
configurable: true,
|
|
121
|
+
writable: true,
|
|
122
|
+
value: 0
|
|
123
|
+
});
|
|
124
|
+
/** Último giro comandado (-1..1; 0 = sem giro). */
|
|
125
|
+
Object.defineProperty(this, "turnValue", {
|
|
126
|
+
enumerable: true,
|
|
127
|
+
configurable: true,
|
|
128
|
+
writable: true,
|
|
129
|
+
value: 0
|
|
130
|
+
});
|
|
131
|
+
/** Última velocidade da roda individual esquerda (-1..1). */
|
|
132
|
+
Object.defineProperty(this, "leftValue", {
|
|
133
|
+
enumerable: true,
|
|
134
|
+
configurable: true,
|
|
135
|
+
writable: true,
|
|
136
|
+
value: 0
|
|
137
|
+
});
|
|
138
|
+
/** Última velocidade da roda individual direita (-1..1). */
|
|
139
|
+
Object.defineProperty(this, "rightValue", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
configurable: true,
|
|
142
|
+
writable: true,
|
|
143
|
+
value: 0
|
|
144
|
+
});
|
|
145
|
+
/** Último deslocamento lateral holonômico (-1..1). */
|
|
146
|
+
Object.defineProperty(this, "lateralValue", {
|
|
147
|
+
enumerable: true,
|
|
148
|
+
configurable: true,
|
|
149
|
+
writable: true,
|
|
150
|
+
value: 0
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/** Inicia um movimento temporal (o comando já foi enviado ao hardware). */
|
|
154
|
+
beginTimed(kind, value, duration) {
|
|
155
|
+
this.pending = { mode: 'timed', kind, value, duration: Math.max(0, duration), elapsed: 0 };
|
|
156
|
+
if (kind === 'drive' || kind === 'reverse')
|
|
157
|
+
this.driveValue = value;
|
|
158
|
+
else if (kind === 'turn')
|
|
159
|
+
this.turnValue = value;
|
|
160
|
+
else if (kind === 'stop')
|
|
161
|
+
this.noteStopped();
|
|
162
|
+
}
|
|
163
|
+
/** Inicia um movimento por distância/ângulo. */
|
|
164
|
+
beginSpatial(spec) {
|
|
165
|
+
this.pending = { ...spec, mode: 'spatial' };
|
|
166
|
+
this.driveValue = spec.drive;
|
|
167
|
+
this.turnValue = spec.turn;
|
|
168
|
+
this.leftValue = 0;
|
|
169
|
+
this.rightValue = 0;
|
|
170
|
+
this.lateralValue = 0;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Avança o relógio de um movimento TEMPORAL. Devolve o que terminou neste
|
|
174
|
+
* tick (ou null). Nunca bloqueia: apenas soma `dt`.
|
|
175
|
+
*/
|
|
176
|
+
tickTimed(dt) {
|
|
177
|
+
const p = this.pending;
|
|
178
|
+
if (!p || p.mode !== 'timed')
|
|
179
|
+
return null;
|
|
180
|
+
p.elapsed += dt;
|
|
181
|
+
if (p.elapsed + 1e-9 < p.duration)
|
|
182
|
+
return null;
|
|
183
|
+
this.pending = null;
|
|
184
|
+
this.justCompleted = true;
|
|
185
|
+
return p;
|
|
186
|
+
}
|
|
187
|
+
/** Conclui o movimento espacial atual (meta de distância/ângulo atingida). */
|
|
188
|
+
finishSpatial() {
|
|
189
|
+
if (this.pending?.mode !== 'spatial')
|
|
190
|
+
return;
|
|
191
|
+
this.pending = null;
|
|
192
|
+
this.justCompleted = true;
|
|
193
|
+
}
|
|
194
|
+
/** Desiste do movimento espacial (sensor ausente) sem fingir chegada. */
|
|
195
|
+
abortSpatial() {
|
|
196
|
+
if (this.pending?.mode !== 'spatial')
|
|
197
|
+
return;
|
|
198
|
+
this.pending = null;
|
|
199
|
+
}
|
|
200
|
+
noteDrive(value) {
|
|
201
|
+
this.driveValue = value;
|
|
202
|
+
}
|
|
203
|
+
noteTurn(value) {
|
|
204
|
+
this.turnValue = value;
|
|
205
|
+
}
|
|
206
|
+
noteMotorLeft(value) {
|
|
207
|
+
this.leftValue = value;
|
|
208
|
+
}
|
|
209
|
+
noteMotorRight(value) {
|
|
210
|
+
this.rightValue = value;
|
|
211
|
+
}
|
|
212
|
+
noteMotors(left, right) {
|
|
213
|
+
this.leftValue = left;
|
|
214
|
+
this.rightValue = right;
|
|
215
|
+
}
|
|
216
|
+
noteLateral(value) {
|
|
217
|
+
this.lateralValue = value;
|
|
218
|
+
}
|
|
219
|
+
noteStopped() {
|
|
220
|
+
this.driveValue = 0;
|
|
221
|
+
this.turnValue = 0;
|
|
222
|
+
this.leftValue = 0;
|
|
223
|
+
this.rightValue = 0;
|
|
224
|
+
this.lateralValue = 0;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Avanço comandado diferente de zero (qualquer sinal: `VOLTAR -0.5` e
|
|
228
|
+
* `ANDAR -0.5` são andar para trás — continuam "andando").
|
|
229
|
+
*/
|
|
230
|
+
isDriving() {
|
|
231
|
+
return this.driveValue !== 0 || this.leftValue !== 0 || this.rightValue !== 0 || this.lateralValue !== 0;
|
|
232
|
+
}
|
|
233
|
+
isTurning() {
|
|
234
|
+
if (this.turnValue !== 0)
|
|
235
|
+
return true;
|
|
236
|
+
return this.leftValue !== this.rightValue && (this.leftValue !== 0 || this.rightValue !== 0);
|
|
237
|
+
}
|
|
238
|
+
isStopped() {
|
|
239
|
+
return (!this.isDriving() &&
|
|
240
|
+
this.turnValue === 0);
|
|
241
|
+
}
|
|
242
|
+
reset() {
|
|
243
|
+
this.pending = null;
|
|
244
|
+
this.justCompleted = false;
|
|
245
|
+
this.noteStopped();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../../src/robotics/motion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H++ Robotics — sensores.
|
|
3
|
+
*
|
|
4
|
+
* Convenção de snapshot (preservada do simulador):
|
|
5
|
+
* - o ambiente fornece uma "foto" `Record<string, SensorValue>` por ciclo;
|
|
6
|
+
* - chaves são normalizadas para minúsculas (o interpretador faz o mesmo);
|
|
7
|
+
* - o `HppRuntime` injeta `ciclo`/`cycle` (relógio determinístico do núcleo);
|
|
8
|
+
* - o H++ NUNCA recebe posição absoluta do mundo — só percepção relativa
|
|
9
|
+
* (exceção documentada: `celula_x`/`cell_z` no domínio maze).
|
|
10
|
+
*/
|
|
11
|
+
import type { SensorValue } from '../hardware.js';
|
|
12
|
+
export type { SensorValue, Hardware } from '../hardware.js';
|
|
13
|
+
/** Uma foto dos sensores num ciclo de controle. */
|
|
14
|
+
export type SensorSnapshot = Record<string, SensorValue>;
|
|
15
|
+
//# sourceMappingURL=sensors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensors.d.ts","sourceRoot":"","sources":["../../src/robotics/sensors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE5D,mDAAmD;AACnD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H++ Robotics — sensores.
|
|
3
|
+
*
|
|
4
|
+
* Convenção de snapshot (preservada do simulador):
|
|
5
|
+
* - o ambiente fornece uma "foto" `Record<string, SensorValue>` por ciclo;
|
|
6
|
+
* - chaves são normalizadas para minúsculas (o interpretador faz o mesmo);
|
|
7
|
+
* - o `HppRuntime` injeta `ciclo`/`cycle` (relógio determinístico do núcleo);
|
|
8
|
+
* - o H++ NUNCA recebe posição absoluta do mundo — só percepção relativa
|
|
9
|
+
* (exceção documentada: `celula_x`/`cell_z` no domínio maze).
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=sensors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensors.js","sourceRoot":"","sources":["../../src/robotics/sensors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H++ Robotics — ciclo de execução e snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Espelha exatamente a normalização que o `Interpreter.run()` aplica ao
|
|
5
|
+
* snapshot a cada ciclo (chaves em minúsculas), para que adapters e
|
|
6
|
+
* ferramentas externas compartilhem a mesma regra sem duplicar lógica.
|
|
7
|
+
*/
|
|
8
|
+
import type { SensorValue } from '../hardware.js';
|
|
9
|
+
import type { SensorSnapshot } from './sensors.js';
|
|
10
|
+
/** Normaliza as chaves de um snapshot para minúsculas (regra do núcleo). */
|
|
11
|
+
export declare function normalizeSnapshotKeys(snap: Record<string, SensorValue>): SensorSnapshot;
|
|
12
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/robotics/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAChC,cAAc,CAMhB"}
|