@horizon36596/zenith-core 0.1.1

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.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +18 -0
  3. package/README.md +16 -0
  4. package/dist/canonicalize.d.ts +25 -0
  5. package/dist/canonicalize.d.ts.map +1 -0
  6. package/dist/canonicalize.js +199 -0
  7. package/dist/canonicalize.js.map +1 -0
  8. package/dist/check.d.ts +26 -0
  9. package/dist/check.d.ts.map +1 -0
  10. package/dist/check.js +231 -0
  11. package/dist/check.js.map +1 -0
  12. package/dist/checks/heading.d.ts +17 -0
  13. package/dist/checks/heading.d.ts.map +1 -0
  14. package/dist/checks/heading.js +78 -0
  15. package/dist/checks/heading.js.map +1 -0
  16. package/dist/checks/intake.d.ts +28 -0
  17. package/dist/checks/intake.d.ts.map +1 -0
  18. package/dist/checks/intake.js +131 -0
  19. package/dist/checks/intake.js.map +1 -0
  20. package/dist/checks/motion.d.ts +28 -0
  21. package/dist/checks/motion.d.ts.map +1 -0
  22. package/dist/checks/motion.js +252 -0
  23. package/dist/checks/motion.js.map +1 -0
  24. package/dist/checks/schedule.d.ts +29 -0
  25. package/dist/checks/schedule.d.ts.map +1 -0
  26. package/dist/checks/schedule.js +166 -0
  27. package/dist/checks/schedule.js.map +1 -0
  28. package/dist/checks/season.d.ts +6 -0
  29. package/dist/checks/season.d.ts.map +1 -0
  30. package/dist/checks/season.js +126 -0
  31. package/dist/checks/season.js.map +1 -0
  32. package/dist/continuity.d.ts +38 -0
  33. package/dist/continuity.d.ts.map +1 -0
  34. package/dist/continuity.js +69 -0
  35. package/dist/continuity.js.map +1 -0
  36. package/dist/diff.d.ts +37 -0
  37. package/dist/diff.d.ts.map +1 -0
  38. package/dist/diff.js +258 -0
  39. package/dist/diff.js.map +1 -0
  40. package/dist/edit/command.d.ts +4 -0
  41. package/dist/edit/command.d.ts.map +1 -0
  42. package/dist/edit/command.js +16 -0
  43. package/dist/edit/command.js.map +1 -0
  44. package/dist/edit/errors.d.ts +9 -0
  45. package/dist/edit/errors.d.ts.map +1 -0
  46. package/dist/edit/errors.js +12 -0
  47. package/dist/edit/errors.js.map +1 -0
  48. package/dist/edit/fields.d.ts +40 -0
  49. package/dist/edit/fields.d.ts.map +1 -0
  50. package/dist/edit/fields.js +150 -0
  51. package/dist/edit/fields.js.map +1 -0
  52. package/dist/edit/finish.d.ts +15 -0
  53. package/dist/edit/finish.d.ts.map +1 -0
  54. package/dist/edit/finish.js +36 -0
  55. package/dist/edit/finish.js.map +1 -0
  56. package/dist/edit/groups.d.ts +66 -0
  57. package/dist/edit/groups.d.ts.map +1 -0
  58. package/dist/edit/groups.js +277 -0
  59. package/dist/edit/groups.js.map +1 -0
  60. package/dist/edit/ids.d.ts +39 -0
  61. package/dist/edit/ids.d.ts.map +1 -0
  62. package/dist/edit/ids.js +76 -0
  63. package/dist/edit/ids.js.map +1 -0
  64. package/dist/edit/index.d.ts +22 -0
  65. package/dist/edit/index.d.ts.map +1 -0
  66. package/dist/edit/index.js +22 -0
  67. package/dist/edit/index.js.map +1 -0
  68. package/dist/edit/meta.d.ts +15 -0
  69. package/dist/edit/meta.d.ts.map +1 -0
  70. package/dist/edit/meta.js +13 -0
  71. package/dist/edit/meta.js.map +1 -0
  72. package/dist/edit/path.d.ts +36 -0
  73. package/dist/edit/path.d.ts.map +1 -0
  74. package/dist/edit/path.js +135 -0
  75. package/dist/edit/path.js.map +1 -0
  76. package/dist/edit/steps.d.ts +53 -0
  77. package/dist/edit/steps.d.ts.map +1 -0
  78. package/dist/edit/steps.js +0 -0
  79. package/dist/edit/steps.js.map +1 -0
  80. package/dist/edit/template.d.ts +18 -0
  81. package/dist/edit/template.d.ts.map +1 -0
  82. package/dist/edit/template.js +30 -0
  83. package/dist/edit/template.js.map +1 -0
  84. package/dist/edit/timing.d.ts +11 -0
  85. package/dist/edit/timing.d.ts.map +1 -0
  86. package/dist/edit/timing.js +23 -0
  87. package/dist/edit/timing.js.map +1 -0
  88. package/dist/edit/tree.d.ts +32 -0
  89. package/dist/edit/tree.d.ts.map +1 -0
  90. package/dist/edit/tree.js +90 -0
  91. package/dist/edit/tree.js.map +1 -0
  92. package/dist/estimate.d.ts +48 -0
  93. package/dist/estimate.d.ts.map +1 -0
  94. package/dist/estimate.js +443 -0
  95. package/dist/estimate.js.map +1 -0
  96. package/dist/findingHelp.d.ts +18 -0
  97. package/dist/findingHelp.d.ts.map +1 -0
  98. package/dist/findingHelp.js +114 -0
  99. package/dist/findingHelp.js.map +1 -0
  100. package/dist/fix.d.ts +21 -0
  101. package/dist/fix.d.ts.map +1 -0
  102. package/dist/fix.js +180 -0
  103. package/dist/fix.js.map +1 -0
  104. package/dist/footprint.d.ts +33 -0
  105. package/dist/footprint.d.ts.map +1 -0
  106. package/dist/footprint.js +71 -0
  107. package/dist/footprint.js.map +1 -0
  108. package/dist/geometry/angle.d.ts +13 -0
  109. package/dist/geometry/angle.d.ts.map +1 -0
  110. package/dist/geometry/angle.js +21 -0
  111. package/dist/geometry/angle.js.map +1 -0
  112. package/dist/geometry/curve.d.ts +24 -0
  113. package/dist/geometry/curve.d.ts.map +1 -0
  114. package/dist/geometry/curve.js +78 -0
  115. package/dist/geometry/curve.js.map +1 -0
  116. package/dist/geometry/path.d.ts +29 -0
  117. package/dist/geometry/path.d.ts.map +1 -0
  118. package/dist/geometry/path.js +61 -0
  119. package/dist/geometry/path.js.map +1 -0
  120. package/dist/geometry/quadrature.d.ts +13 -0
  121. package/dist/geometry/quadrature.d.ts.map +1 -0
  122. package/dist/geometry/quadrature.js +57 -0
  123. package/dist/geometry/quadrature.js.map +1 -0
  124. package/dist/geometry/sat.d.ts +40 -0
  125. package/dist/geometry/sat.d.ts.map +1 -0
  126. package/dist/geometry/sat.js +86 -0
  127. package/dist/geometry/sat.js.map +1 -0
  128. package/dist/geometry/vec.d.ts +27 -0
  129. package/dist/geometry/vec.d.ts.map +1 -0
  130. package/dist/geometry/vec.js +30 -0
  131. package/dist/geometry/vec.js.map +1 -0
  132. package/dist/heading.d.ts +77 -0
  133. package/dist/heading.d.ts.map +1 -0
  134. package/dist/heading.js +164 -0
  135. package/dist/heading.js.map +1 -0
  136. package/dist/headingRanges.d.ts +48 -0
  137. package/dist/headingRanges.d.ts.map +1 -0
  138. package/dist/headingRanges.js +132 -0
  139. package/dist/headingRanges.js.map +1 -0
  140. package/dist/index.d.ts +41 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +41 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/kinematics.d.ts +63 -0
  145. package/dist/kinematics.d.ts.map +1 -0
  146. package/dist/kinematics.js +71 -0
  147. package/dist/kinematics.js.map +1 -0
  148. package/dist/ledger.d.ts +49 -0
  149. package/dist/ledger.d.ts.map +1 -0
  150. package/dist/ledger.js +136 -0
  151. package/dist/ledger.js.map +1 -0
  152. package/dist/load.d.ts +12 -0
  153. package/dist/load.d.ts.map +1 -0
  154. package/dist/load.js +12 -0
  155. package/dist/load.js.map +1 -0
  156. package/dist/mirror.d.ts +81 -0
  157. package/dist/mirror.d.ts.map +1 -0
  158. package/dist/mirror.js +282 -0
  159. package/dist/mirror.js.map +1 -0
  160. package/dist/plan.d.ts +29 -0
  161. package/dist/plan.d.ts.map +1 -0
  162. package/dist/plan.js +159 -0
  163. package/dist/plan.js.map +1 -0
  164. package/dist/prBody.d.ts +24 -0
  165. package/dist/prBody.d.ts.map +1 -0
  166. package/dist/prBody.js +112 -0
  167. package/dist/prBody.js.map +1 -0
  168. package/dist/provenance.d.ts +21 -0
  169. package/dist/provenance.d.ts.map +1 -0
  170. package/dist/provenance.js +46 -0
  171. package/dist/provenance.js.map +1 -0
  172. package/dist/render.d.ts +18 -0
  173. package/dist/render.d.ts.map +1 -0
  174. package/dist/render.js +464 -0
  175. package/dist/render.js.map +1 -0
  176. package/dist/resolve.d.ts +39 -0
  177. package/dist/resolve.d.ts.map +1 -0
  178. package/dist/resolve.js +172 -0
  179. package/dist/resolve.js.map +1 -0
  180. package/dist/season.d.ts +65 -0
  181. package/dist/season.d.ts.map +1 -0
  182. package/dist/season.js +16 -0
  183. package/dist/season.js.map +1 -0
  184. package/dist/sim/commands.d.ts +97 -0
  185. package/dist/sim/commands.d.ts.map +1 -0
  186. package/dist/sim/commands.js +185 -0
  187. package/dist/sim/commands.js.map +1 -0
  188. package/dist/sim/curves.d.ts +37 -0
  189. package/dist/sim/curves.d.ts.map +1 -0
  190. package/dist/sim/curves.js +187 -0
  191. package/dist/sim/curves.js.map +1 -0
  192. package/dist/sim/follower.d.ts +124 -0
  193. package/dist/sim/follower.d.ts.map +1 -0
  194. package/dist/sim/follower.js +472 -0
  195. package/dist/sim/follower.js.map +1 -0
  196. package/dist/sim/ideal.d.ts +103 -0
  197. package/dist/sim/ideal.d.ts.map +1 -0
  198. package/dist/sim/ideal.js +393 -0
  199. package/dist/sim/ideal.js.map +1 -0
  200. package/dist/sim/index.d.ts +11 -0
  201. package/dist/sim/index.d.ts.map +1 -0
  202. package/dist/sim/index.js +10 -0
  203. package/dist/sim/index.js.map +1 -0
  204. package/dist/sim/params.d.ts +91 -0
  205. package/dist/sim/params.d.ts.map +1 -0
  206. package/dist/sim/params.js +195 -0
  207. package/dist/sim/params.js.map +1 -0
  208. package/dist/sim/pedroPath.d.ts +41 -0
  209. package/dist/sim/pedroPath.d.ts.map +1 -0
  210. package/dist/sim/pedroPath.js +191 -0
  211. package/dist/sim/pedroPath.js.map +1 -0
  212. package/dist/sim/plant.d.ts +59 -0
  213. package/dist/sim/plant.d.ts.map +1 -0
  214. package/dist/sim/plant.js +128 -0
  215. package/dist/sim/plant.js.map +1 -0
  216. package/dist/sim/residuals.d.ts +36 -0
  217. package/dist/sim/residuals.d.ts.map +1 -0
  218. package/dist/sim/residuals.js +86 -0
  219. package/dist/sim/residuals.js.map +1 -0
  220. package/dist/sim/simulate.d.ts +27 -0
  221. package/dist/sim/simulate.d.ts.map +1 -0
  222. package/dist/sim/simulate.js +924 -0
  223. package/dist/sim/simulate.js.map +1 -0
  224. package/dist/sim/types.d.ts +209 -0
  225. package/dist/sim/types.d.ts.map +1 -0
  226. package/dist/sim/types.js +2 -0
  227. package/dist/sim/types.js.map +1 -0
  228. package/dist/tokens.d.ts +93 -0
  229. package/dist/tokens.d.ts.map +1 -0
  230. package/dist/tokens.js +93 -0
  231. package/dist/tokens.js.map +1 -0
  232. package/dist/trace.d.ts +89 -0
  233. package/dist/trace.d.ts.map +1 -0
  234. package/dist/trace.js +187 -0
  235. package/dist/trace.js.map +1 -0
  236. package/dist/types.d.ts +219 -0
  237. package/dist/types.d.ts.map +1 -0
  238. package/dist/types.js +2 -0
  239. package/dist/types.js.map +1 -0
  240. package/dist/unimplemented.d.ts +8 -0
  241. package/dist/unimplemented.d.ts.map +1 -0
  242. package/dist/unimplemented.js +11 -0
  243. package/dist/unimplemented.js.map +1 -0
  244. package/package.json +59 -0
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Pedro Pathing v3's two curve kinds, as the follower sees them: `paths/curves/Line.java` and
3
+ * `paths/curves/bezier/BezierCurve.java` in core-3.0.0-20260828.185437-17. The closest-point search
4
+ * is Pedro's own (a coarse grid, then Newton on the squared distance), because where the follower
5
+ * thinks it is on the path decides everything it does next, and a better search would be a
6
+ * different follower.
7
+ *
8
+ * Written for speed, since the follower calls these several times a tick: the Bezier is kept in
9
+ * power-basis coefficients (Pedro caches the same product of its characteristic matrix and control
10
+ * points) and evaluated by Horner's rule.
11
+ */
12
+ /** The chords the arc-length table is built from. Pedro subdivides adaptively to 1e-5 in. */
13
+ const LENGTH_TABLE_STEPS = 256;
14
+ /** `PathBuilder.SAMPLES_PER_SEGMENT`: the runtime's own segment lengths, which markers use. */
15
+ export const RUNTIME_LENGTH_SAMPLES = 64;
16
+ /** Newton iterations in `BezierCurve.closestT` (`SEARCH_LIMIT`). */
17
+ const SEARCH_LIMIT = 10;
18
+ /** The grid `BezierCurve.closestT` starts from, before its initial guess is added. */
19
+ const SEARCH_GRID = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];
20
+ const clamp01 = (t) => (t < 0 ? 0 : t > 1 ? 1 : t);
21
+ /** Binomial coefficient, as `Utils.binomial`. */
22
+ function binomial(n, k) {
23
+ if (k < 0 || k > n)
24
+ return 0;
25
+ if (k === 0 || k === n)
26
+ return 1;
27
+ const kk = Math.min(k, n - k);
28
+ let result = 1;
29
+ for (let i = 1; i <= kk; i += 1)
30
+ result = (result * (n - (kk - i))) / i;
31
+ return result;
32
+ }
33
+ function unit(dx, dy, fallback) {
34
+ const length = Math.hypot(dx, dy);
35
+ if (length * length < 1e-9)
36
+ return fallback;
37
+ return { x: dx / length, y: dy / length };
38
+ }
39
+ export function makeLine(start, end) {
40
+ const dx = end.x - start.x;
41
+ const dy = end.y - start.y;
42
+ const lengthIn = Math.hypot(dx, dy);
43
+ const lengthSquared = dx * dx + dy * dy;
44
+ const tangentVector = lengthIn === 0 ? { x: 1, y: 0 } : { x: dx / lengthIn, y: dy / lengthIn };
45
+ return {
46
+ start,
47
+ end,
48
+ lengthIn,
49
+ runtimeLengthIn: lengthIn,
50
+ get: (t) => ({ x: start.x + dx * t, y: start.y + dy * t }),
51
+ derivative: () => ({ x: dx, y: dy }),
52
+ tangent: () => tangentVector,
53
+ closestT: (x, y) => lengthSquared === 0 ? 0 : clamp01((dx * (x - start.x) + dy * (y - start.y)) / lengthSquared),
54
+ remainingDistance: (t) => (1 - t) * lengthIn,
55
+ };
56
+ }
57
+ /** A Bezier of any degree from its control polygon, start and end included. */
58
+ export function makeBezier(points) {
59
+ const n = points.length - 1;
60
+ // Power-basis coefficients: B(u) = sum_j c_j u^j with
61
+ // c_j = C(n, j) * sum_{i <= j} (-1)^(j - i) C(j, i) P_i.
62
+ const cx = new Float64Array(n + 1);
63
+ const cy = new Float64Array(n + 1);
64
+ for (let j = 0; j <= n; j += 1) {
65
+ let sx = 0;
66
+ let sy = 0;
67
+ for (let i = 0; i <= j; i += 1) {
68
+ const sign = (j - i) % 2 === 0 ? 1 : -1;
69
+ const weight = sign * binomial(j, i);
70
+ const point = points[i];
71
+ sx += weight * point.x;
72
+ sy += weight * point.y;
73
+ }
74
+ const scale = binomial(n, j);
75
+ cx[j] = scale * sx;
76
+ cy[j] = scale * sy;
77
+ }
78
+ const dcx = new Float64Array(Math.max(n, 1));
79
+ const dcy = new Float64Array(Math.max(n, 1));
80
+ for (let j = 1; j <= n; j += 1) {
81
+ dcx[j - 1] = j * cx[j];
82
+ dcy[j - 1] = j * cy[j];
83
+ }
84
+ const ddcx = new Float64Array(Math.max(n - 1, 1));
85
+ const ddcy = new Float64Array(Math.max(n - 1, 1));
86
+ for (let j = 2; j <= n; j += 1) {
87
+ ddcx[j - 2] = j * (j - 1) * cx[j];
88
+ ddcy[j - 2] = j * (j - 1) * cy[j];
89
+ }
90
+ const horner = (c, degree, u) => {
91
+ let value = c[degree];
92
+ for (let j = degree - 1; j >= 0; j -= 1)
93
+ value = value * u + c[j];
94
+ return value;
95
+ };
96
+ const px = (u) => horner(cx, n, u);
97
+ const py = (u) => horner(cy, n, u);
98
+ const dx = (u) => horner(dcx, n - 1, u);
99
+ const dy = (u) => horner(dcy, n - 1, u);
100
+ const ddx = (u) => (n < 2 ? 0 : horner(ddcx, n - 2, u));
101
+ const ddy = (u) => (n < 2 ? 0 : horner(ddcy, n - 2, u));
102
+ const start = points[0];
103
+ const end = points[n];
104
+ const chord = unit(end.x - start.x, end.y - start.y, { x: 1, y: 0 });
105
+ // Cumulative chord length at LENGTH_TABLE_STEPS + 1 values of t, the stand-in for Pedro's
106
+ // adaptive completion map.
107
+ const table = new Float64Array(LENGTH_TABLE_STEPS + 1);
108
+ let previousX = start.x;
109
+ let previousY = start.y;
110
+ for (let i = 1; i <= LENGTH_TABLE_STEPS; i += 1) {
111
+ const u = i / LENGTH_TABLE_STEPS;
112
+ const x = px(u);
113
+ const y = py(u);
114
+ table[i] = table[i - 1] + Math.hypot(x - previousX, y - previousY);
115
+ previousX = x;
116
+ previousY = y;
117
+ }
118
+ const lengthIn = table[LENGTH_TABLE_STEPS];
119
+ let runtimeLengthIn = 0;
120
+ previousX = start.x;
121
+ previousY = start.y;
122
+ for (let i = 1; i <= RUNTIME_LENGTH_SAMPLES; i += 1) {
123
+ const u = i / RUNTIME_LENGTH_SAMPLES;
124
+ const x = px(u);
125
+ const y = py(u);
126
+ runtimeLengthIn += Math.hypot(x - previousX, y - previousY);
127
+ previousX = x;
128
+ previousY = y;
129
+ }
130
+ const lengthAt = (t) => {
131
+ const scaled = clamp01(t) * LENGTH_TABLE_STEPS;
132
+ const index = Math.min(Math.floor(scaled), LENGTH_TABLE_STEPS - 1);
133
+ const a = table[index];
134
+ const b = table[index + 1];
135
+ return a + (b - a) * (scaled - index);
136
+ };
137
+ const closestT = (x, y, initialGuess) => {
138
+ let best = 1e18;
139
+ let guess = 0;
140
+ for (let i = 0; i <= SEARCH_GRID.length; i += 1) {
141
+ const t = i < SEARCH_GRID.length ? SEARCH_GRID[i] : initialGuess;
142
+ const ex = px(t) - x;
143
+ const ey = py(t) - y;
144
+ const d = ex * ex + ey * ey;
145
+ if (d < best) {
146
+ best = d;
147
+ guess = t;
148
+ }
149
+ }
150
+ for (let i = 0; i < SEARCH_LIMIT; i += 1) {
151
+ const lastX = px(guess);
152
+ const lastY = py(guess);
153
+ const d1x = dx(guess);
154
+ const d1y = dy(guess);
155
+ const d2x = ddx(guess);
156
+ const d2y = ddy(guess);
157
+ const deltaX = lastX - x;
158
+ const deltaY = lastY - y;
159
+ const first = 2 * (deltaX * d1x + deltaY * d1y);
160
+ const second = 2 * (deltaX * d2x + deltaY * d2y + d1x * d1x + d1y * d1y);
161
+ guess = clamp01(guess - first / (second + 1e-9));
162
+ if (Math.hypot(px(guess) - lastX, py(guess) - lastY) < 0.1)
163
+ break;
164
+ }
165
+ return guess;
166
+ };
167
+ return {
168
+ start,
169
+ end,
170
+ lengthIn,
171
+ runtimeLengthIn,
172
+ get: (t) => ({ x: px(t), y: py(t) }),
173
+ derivative: (t) => ({ x: dx(t), y: dy(t) }),
174
+ tangent: (t) => unit(dx(t), dy(t), chord),
175
+ closestT,
176
+ remainingDistance: (t) => (lengthIn === 0 ? 0 : (1 - lengthAt(t) / lengthIn) * lengthIn),
177
+ };
178
+ }
179
+ /** A line for two points, a Bezier for three or more, the way `PathBuilder.geometry` chooses. */
180
+ export function makeSimCurve(points) {
181
+ if (points.length < 2)
182
+ throw new Error("A segment needs at least two points.");
183
+ if (points.length === 2)
184
+ return makeLine(points[0], points[1]);
185
+ return makeBezier(points);
186
+ }
187
+ //# sourceMappingURL=curves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.js","sourceRoot":"","sources":["../../src/sim/curves.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { type SimPath } from "./pedroPath.js";
2
+ import type { FollowerParams } from "./types.js";
3
+ /**
4
+ * Pedro Pathing v3's follower as biobuzz runs it: `follower/Follower.java`,
5
+ * `algorithm/ForesightV3.java` and `algorithm/ForesightPowerAllocator.java` from
6
+ * core-3.0.0-20260828.185437-17, and the power maths of `revhub/drivetrains/Mecanum.java` and
7
+ * `CachedMotor.java` from the matching revhub jar. Ported line for line where it decides anything;
8
+ * the ADR lists the few places it is not.
9
+ *
10
+ * ForesightV3 is not the drive/translational/heading/centripetal PIDF follower of Pedro v1 and v2.
11
+ * It projects where the robot would stop if it braked now (a per-axis brake model, linear plus
12
+ * quadratic in speed), finds the closest point on the path to that projected pose, and drives along
13
+ * the tangent there at full feedforward until the projected stop passes the end, then brakes. The
14
+ * translational and heading terms are P controllers on the projected pose. V3 passes a zero vector
15
+ * where Foresight v1 put its centripetal term, so there is none.
16
+ */
17
+ /** Robot-frame drive powers: forward, strafe left, turn counter-clockwise. */
18
+ export interface DrivePowers {
19
+ forward: number;
20
+ strafe: number;
21
+ turn: number;
22
+ }
23
+ /**
24
+ * What the localizer hands the follower: `MotionState`. The pose heading is in [0, 2pi) as Pedro's
25
+ * `Pose` keeps it; the velocity is field-frame and the twist is the same velocity in the robot frame.
26
+ */
27
+ export interface MotionState {
28
+ x: number;
29
+ y: number;
30
+ heading: number;
31
+ vx: number;
32
+ vy: number;
33
+ omega: number;
34
+ twistX: number;
35
+ twistY: number;
36
+ }
37
+ export type FollowerMode = "FOLLOW" | "HOLD" | "IDLE";
38
+ /** `DiamondDrivetrainModel.interpolateVelocity`. */
39
+ export declare const diamondVelocity: (xRadius: number, yRadius: number, thetaRad: number) => number;
40
+ /** `Utils.solveQuadratic`: the two roots of a x^2 + b x + c, in the numerically stable form. */
41
+ export declare function solveQuadratic(a: number, b: number, c: number): [number, number];
42
+ /** `Control.clampBrakingPower`: cap power that opposes the motion at `maxBrakingPower`. */
43
+ export declare function clampBrakingPower(power: number, directionOfMotion: number, max: number): number;
44
+ /** `Mecanum.computeWheelPowersUnnormalized`, in [FL, FR, BL, BR] order. */
45
+ export declare function wheelPowers(p: DrivePowers, out?: number[]): number[];
46
+ /** `Mecanum.maxScaling`: the largest share of `delta` that keeps every wheel inside [-1, 1]. */
47
+ export declare function mecanumMaxScaling(current: DrivePowers, delta: DrivePowers): number;
48
+ /** Everything the follower carries between ticks, so a checkpoint can copy it. */
49
+ export interface FollowerState {
50
+ mode: FollowerMode;
51
+ path: SimPath | null;
52
+ segmentIndex: number;
53
+ /** `maxVelocityConstraint` while the path's `setPathSpeed` modifier is applied. */
54
+ maxVelocityInPerS: number;
55
+ holdPose: {
56
+ x: number;
57
+ y: number;
58
+ heading: number;
59
+ } | null;
60
+ closestT: number;
61
+ projectedClosestT: number;
62
+ curveCompletion: number;
63
+ remainingDistance: number;
64
+ tangentialSpeed: number;
65
+ closestTangentX: number;
66
+ closestTangentY: number;
67
+ translationalError: number;
68
+ headingError: number;
69
+ busy: boolean;
70
+ /** Pedro's hold `Timer`, as the time the hold's timer started, or null before its first tick. */
71
+ holdTimerStartS: number | null;
72
+ }
73
+ export declare const initialFollowerState: () => FollowerState;
74
+ export declare const copyFollowerState: (state: FollowerState) => FollowerState;
75
+ export declare class PedroFollower {
76
+ readonly params: FollowerParams;
77
+ readonly forwardVel: number;
78
+ readonly strafeVel: number;
79
+ /** `Follower.holdEnd`: hold the end pose when a path finishes, rather than stop. */
80
+ readonly holdEnd: boolean;
81
+ state: FollowerState;
82
+ constructor(params: FollowerParams, forwardVel: number, strafeVel: number, holdEnd: boolean);
83
+ follow(path: SimPath, speedFraction: number): void;
84
+ hold(pose: {
85
+ x: number;
86
+ y: number;
87
+ heading: number;
88
+ }): void;
89
+ stop(): void;
90
+ private clear;
91
+ /** `ForesightV3.reset`. */
92
+ private reset;
93
+ get following(): boolean;
94
+ /** `PathTracker.remainingPaths`. */
95
+ private remaining;
96
+ /**
97
+ * `Follower.update(deltaTime)`: the powers to write this tick, or null when Pedro writes none and
98
+ * the motors keep what they were last given (the tick a finished path hands over to the hold).
99
+ */
100
+ update(motion: MotionState, nowS: number): DrivePowers | null;
101
+ /** How far along the current path the follower says it is, as `PathMarkers.Runner` reads it. */
102
+ distanceAlongIn(): number;
103
+ /** Pedro's hold end constraints, which `settledS` reports. */
104
+ endConstraintsMet(): boolean;
105
+ /** `ForesightV3.getBrakeDisplacement`: where braking now would leave the robot, relative to it. */
106
+ private brakeDisplacement;
107
+ /** `ForesightV3.getVelocityToBrakeInTime`. */
108
+ private velocityToBrakeInTime;
109
+ /** `ForesightV3.translationalCorrection`: [error, field-frame power vector]. */
110
+ private translationalCorrection;
111
+ /** `ForesightPowerAllocator.getDrivePowers`. */
112
+ private drivePowers;
113
+ /** `ForesightPowerAllocator.allocatePowers` and `clampPowers`. */
114
+ private allocate;
115
+ /** `ForesightV3.calculatePath`, with Pedro's recursion on advancing a segment as a loop. */
116
+ private calculatePath;
117
+ /** `ForesightPowerAllocator.getDriveScalar`. */
118
+ private driveScalar;
119
+ /** `ForesightV3.drive` and `coast`, with no acceleration or deceleration constraint set. */
120
+ private drivePower;
121
+ /** `ForesightV3.calculateHold`, without the optional hold scaling (`hold(pose)` passes false). */
122
+ private calculateHold;
123
+ }
124
+ //# sourceMappingURL=follower.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follower.d.ts","sourceRoot":"","sources":["../../src/sim/follower.ts"],"names":[],"mappings":"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"}