Skip to content

Commit 339aed0

Browse files
controller runs but crashes
1 parent 5ea3f95 commit 339aed0

File tree

1 file changed

+35
-53
lines changed

1 file changed

+35
-53
lines changed

controller.js

Lines changed: 35 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { vec3, vec4, mat4, quat } from 'https://esm.sh/gl-matrix';
22

3-
export default class Controller{
4-
constructor(){
5-
}
6-
evaluate_step(state){
7-
const q_des = [0, 0, 0, 1];
3+
export default class Controller {
4+
constructor() { }
5+
6+
evaluate_step(state) {
87
const stateDict = JSON.parse(state.get_state());
98
const params = JSON.parse(state.get_parameters());
109

@@ -24,76 +23,59 @@ export default class Controller{
2423
const k_q = params['dynamics']['rotor_torque_constants'][0];
2524
const [a, b, c] = params['dynamics']['rotor_thrust_coefficients'][0];
2625

26+
// Gains
2727
const k_p = 3.0;
2828
const k_d = 2.0;
2929
const k_R = 1.0;
3030
const k_omega = 0.1;
3131

32+
// Desired states
3233
const p_des = vec3.fromValues(0, 0, 0);
3334
const v_des = vec3.fromValues(0, 0, 0);
35+
const q_des = quat.fromValues(0, 0, 0, 1);
3436

35-
const e_p = vec3.create();
36-
vec3.subtract(e_p, p, p_des);
37-
const e_v = vec3.create();
38-
vec3.subtract(e_v, v, v_des);
39-
40-
const a_des = vec3.create();
41-
vec3.scale(a_des, e_p, -k_p);
42-
const temp = vec3.create();
43-
vec3.scale(temp, e_v, -k_d);
44-
vec3.add(a_des, a_des, temp);
37+
const e_p = vec3.subtract(vec3.create(), p, p_des);
38+
const e_v = vec3.subtract(vec3.create(), v, v_des);
4539

46-
const T = m * (a_des[2] + g);
47-
48-
const q_des_conj = quat.create();
49-
quat.conjugate(q_des_conj, q_des);
50-
const q_err = quat.create();
51-
quat.multiply(q_err, q_des_conj, q);
52-
53-
if (q_err[3] < 0){
54-
quat.scale(q_err, q_err, -1);
55-
}
40+
const a_fb = vec3.add(
41+
vec3.create(),
42+
vec3.scale(vec3.create(), e_p, -k_p),
43+
vec3.scale(vec3.create(), e_v, -k_d)
44+
);
5645

57-
const e_R = vec3.fromValues(q_err[0], q_err[1], q_err[2]);
58-
vec3.scale(e_R, e_R, 2);
46+
const F_des = vec3.fromValues(0, 0, m * g);
47+
vec3.add(F_des, F_des, vec3.scale(vec3.create(), a_fb, m));
5948

60-
const tau = vec3.create();
61-
vec3.scale(tau, e_R, -k_R);
62-
const temp2 = vec3.create();
63-
vec3.scale(temp2, omega, -k_omega);
64-
vec3.add(tau, tau, temp2);
49+
const A = mat4.fromValues(
50+
1, 1, 1, 1,
51+
-l, -l, l, l,
52+
-l, l, l, -l,
53+
-k_q, k_q, -k_q, k_q
54+
);
55+
const A_inv = mat4.invert(mat4.create(), A);
6556

66-
const A_inv = mat4.fromValues(
67-
1/4, -1/(4*l), -1/(4*l), -1/(4*k_q),
68-
1/4, -1/(4*l), 1/(4*l), 1/(4*k_q),
69-
1/4, 1/(4*l), 1/(4*l), -1/(4*k_q),
70-
1/4, 1/(4*l), -1/(4*l), 1/(4*k_q)
57+
const T = vec3.dot(F_des, vec3.transformQuat(vec3.create(), [0, 0, 1], q));
58+
const tau = vec3.add(
59+
vec3.create(),
60+
vec3.scale(vec3.create(), omega, -k_omega),
61+
vec3.scale(vec3.create(), e_p, -k_R)
7162
);
63+
7264
const controlInputs = vec4.fromValues(T, tau[0], tau[1], tau[2]);
73-
const f = vec4.create();
74-
vec4.transformMat4(f, controlInputs, A_inv);
65+
const f = vec4.transformMat4(vec4.create(), controlInputs, A_inv);
7566

76-
const f_clipped = [
77-
Math.max(0, f[0]),
78-
Math.max(0, f[1]),
79-
Math.max(0, f[2]),
80-
Math.max(0, f[3])
81-
];
67+
const f_clipped = f.map(fi => Math.max(0, fi));
8268

8369
function solveRPM(fi) {
8470
const discriminant = b * b - 4 * a * (c - fi);
85-
if (discriminant < 0 || fi < c) {
86-
return 0.0;
87-
}
71+
if (discriminant < 0 || fi < c) return 0.0;
8872
const rpm = (-b + Math.sqrt(discriminant)) / (2 * a);
8973
return Math.max(0.0, Math.min(1.0, rpm));
9074
}
9175

92-
const action = f_clipped.map(solveRPM);
93-
94-
return action;
95-
}
96-
reset() {
76+
return f_clipped.map(solveRPM);
9777
}
78+
79+
reset() { }
9880
}
9981

0 commit comments

Comments
 (0)