11import { 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