From d2ecff231612ef9eb6c718ab24980ac9e68ae3e4 Mon Sep 17 00:00:00 2001 From: Philippe Pastor <philippe.pastor@isae.fr> Date: Tue, 1 Oct 2024 16:50:58 +0200 Subject: [PATCH] 1er commit sur phil --- drone/__pycache__/drone_env.cpython-311.pyc | Bin 4741 -> 4678 bytes drone/__pycache__/drone_model.cpython-311.pyc | Bin 5833 -> 5607 bytes drone/drone_env.py | 2 +- drone/drone_model.py | 20 +++++++++------- drone/main.py | 22 +++++------------- mavion/mavion_env.py | 1 - 6 files changed, 18 insertions(+), 27 deletions(-) diff --git a/drone/__pycache__/drone_env.cpython-311.pyc b/drone/__pycache__/drone_env.cpython-311.pyc index f8a960b9f5f4a46e6d430e0a89bdd889752e2fb5..4fbfcf59f7b588a04139d6fc6c1f88b32cbc0a54 100644 GIT binary patch delta 235 zcmZowJ*L9DoR^o20SL~s{z;46$ScXm#R}vx1M%k@lMVPxg=!eGKs+#524t;fo;;UN znvrGlPCnIokXkSRs=~^yVqsuNVax`rsb#KVE@Dby%wtSps%1gZ!BWGV!ko#F#v06^ z$>LYU4pd*n1SH%v*@{Gf^evX+lGK7C4Uo7fh;RfEnv-+*BjrJcH!$1~k(lB&-G7q* a0+%IT8`yTR?BTd5;&?^Gaq~O==}Z9WL@s9l delta 290 zcmX@6(yGe4oR^o20SE-2{7y^T$ScXm#SY{#1M%m7lMVPxLrOq=D9B=gu~Hb9F)}c$ z24V=PVaQ^Iv6lf=t%j?tWvXGSVTfmf$<{C|V4EDmqgoF)7pNC2y9#JV3R5;%V=Z$H za}iStQyyaqb1e&s4wf3`6qZbeG}d4SO;*1mUZDCSka<NQE8R3XibR0)EtcYv)Pf=n wkhmC#P@k;9pTSr<c_P1v$X=#B90vq<a_`|j5OO5qqKMxW5x>pr`KL1h06U8@e*gdg diff --git a/drone/__pycache__/drone_model.cpython-311.pyc b/drone/__pycache__/drone_model.cpython-311.pyc index e0b739228ad83fa0adf9aeadf660a82692989f3f..8ed2baa184362bf487378913b8d226fb07a0ec34 100644 GIT binary patch delta 1552 zcmaKsO>7fK6vt;~ckT7Z+TO--4PK=Vgb>$_NkW^Vri#;wA_O8;n$VUM1dbP@A`>^W zt`u3jiVq;1E7K~biiBIC)QDVAxp8R^J#eY8<U`~`uN6I1Mo<Y=Rn<4^j}Vn~wEN$A zZ{EJ0`OTYsIQ&~&`Cd`n2-<-3cjnkV<%|=5$1XVsR?4{Czb=-SD(ZUvrl*ps;@f&H z{Cah!y0kf03y*Gv`zrmF_ihhV)#~VG@Y{GToOro!&;KWCI)%{TCrD7<e8#1On=%Th zD<zrkgK4D&KDl=Dz?0igMS{>8GSTJE2(kpQaL2Snupp+@EXl+=*2y)pr{hAF1AIgm zcKDp&6LgXLY$iO~lG(3v<e+d#*nsqRyPwb<rdWUp<@u!A&2&KQhuFmuu3;>(v#z(_ zl1<5!3nD@rFrB;IDHR|;_gZe#X?b)x-_yx~5M=qq6~Qw5-L)Tkna};I(_?x~m+5A2 zxJy2TY7pDN%k&UD+0X7HqQX1Gv(GsM9pfLw;+~&=XnL|Z=l};#{qzRN*JKT?k_uZ= zf)ZL4Rtftt5MtMq0Q<}3Td^>wv`vWf*<lGgEOFb)h_fgrP1B?B4SE>lF=z7F3v!3h z_qlfjBqq{9cr=K<Y%hVn1C{|0P&8UBGRt@1;0N531bJRWTWarG_(r(gU!J=)|IK_A z-#oW|uBOK8YMgEP652@!qg{dId_oPWaFON=7WMDNC)k943@6#5|9Bs9jW*FP@~6z| z{t*_Dy{DXz!Y;4{=v+tF0a%HYP=@IEs%(k*?(V}bi8?Wb3~80jrnDi!{=(gAP;wGW z1tvTngKcvcZ0_tqAkJy;pG9}@G(8TZF|mR34Q$wOY%pymY*0Pqn1%@BHTIdh*HP2P z>)JT8)ME!6+W<RE^YjFSHUuM=HTbSyh_XM_h<1v<ZxiK6{o{{bxLE9!u@%n0)4I!_ z1P?4<faMFjE#Jf@;U{QQ{O{83dPsMx9kRLLwhNIT*)|a9A@(Jd--AHJN1!xKWa8F2 zVSOaTInB=^ItO8GQuH+MbEXX`lg`uZi@b_O8s)>EfD|G}X>Rdi!ub43;@xa6oyr=M z&`Dic&{LDM5MadF!yfJQy@~r1wV`BvC|T2{>e^Hh*?%4SDNl5U%RCnjDb|ACaOBS$ zU!)crWO;<9`5@;`&x5qNN7>n6So?@O#z3Ci;HMt>w=ecpa3Nryiy8jz1uhxp=$#ps yCAEpV66}?ZG*MR)UOw6tja}_6;mb@3g>jAzhV<k##yw5+a(!a^pY1YguliqAFHTJW delta 1758 zcmaJ>TTC2P7(Qn%dzoeS#zihG85(LJ<yuHB(x@o4G$6WJD3of;mRX>%g)+MogxSD@ z%I;Gyr<IK{5e-F<M$x`dB@q)JXyU_6vKrj@-t<XKH6i*?|Fa7NB&~mDzVlzsf6jlt z|I9o*@}OM&LKFoAa`C%=dmFzI&zkWv=`$BkUH8ZFEjjLuk9^X0V{oov&OhI%=aei~ zFM99R>N%AwIjhyH-nH8GqV<NKitpF!)u%RcG+&$6ekS4T(7MiP@4TDnI<NcA>!&Yh z{)<|VobU&<{!7}xV4^>$`-9r>6>UUG42N`oNV__wjlY+;I-&a~wCqVeV@geAs8PJ> za7Hc4A*ip1qgC#R4MrB;#{z@UEK<?HZUjX*u<))K;lYAAX^EIrEMuAZfXUl+p@<oL zjLaVJS=4qcvod$UX$_l=EHq%0Bl9w^a((OqY`Sc0ESpq*0?G{2Qg=i(lV2=vVSyaB zmSYp~SzqL>s!6qyYu17Sn`%+n378qlkS*cN-5i7<>j!HAYwcsm6N|(|MDoP?oH;`k zRYA3p=Y^=tu6SU25|1mDsd0?l6OQwC&?WMRaL9ZZv=D<yuI)$ex;Hj<?>Acz3-mB_ zo5yRU$t{tX=$MM&7&~Vi0b+*4I2DI^!$bp={glY~;K3IlvTQ^njLOLS*anN;;~p$- zpA}$ae$VXXe5lmas#L%>%1H_}0FNl2k1_yCIi-qvU#CFRlKezK84i{5$_vz$;)0RK zQ{*Twfh$B0Adw<_>9N<S*$S{djW(TGv%*awUVTHnB}N-IUD>m_H*@1faqk^w-m>WW z%r<Y+U1bSZ85yxx<hMYUVgOV@_f}2=knipJxS9NFKZ;KftD~uqwN`JTXTaYA8Fo}* zp3FJ2%6cJt2F)-t>@12hQ50o+SsA}?iSXfl?NE7{Q91IvBabzyCbI3QH+4edZI-<0 zt|gb9&R1jHLHd1Y3AZjWX^tpcrF;^HlQ@*7h+Z3|9w5z(G)=y8R+iASg^B=xn|R}= zO&>SSc^A2_g)fDb>Lu~6xH6)9>Jpwh!n)o#V&0=Sy(V2Q$;e@)nJR2(I2fWgty}6Q zL#_gedPB5j+uM|SN1b-?A$MFy)1;Kp9sw!r3<spJQ7(#}P6~0l^GbjaxGsEakMXfX zwg_+Pihl&kZQwS>5wANBb7at6=wVQdRgsDpAZ6J|OA|=0xpTVzZvrfs5+739KvCKO z;O3p7dIvy~@9haIK^Vp^4aq5zc1fO|RwO#DlRR`wCNHR=Q$)=4Os$Ttj;?z*@cqfP zNxh~yQPZrKv?NMeHUb*~t*u?_=zK8v^PukON_e`aQR=U#oTV#uQ8-6|{*_A8JxQ9v z7eZJ3LrG@5N|9+WK!G+u=?2(oi`3mMNvVR!hnY_4Z5lZSu+yI|&2iu%-)3HPran1Z zxZ<bKPl~g=<vj1&LI&8g`Quy2fC`aD4Jag^XGQaaH2Dw(3E&^giOa+CXfW`yGC~@& W<yTrT&fG#z$3Ij4zn&3IE&3nW{f&bF diff --git a/drone/drone_env.py b/drone/drone_env.py index 87d0fb9..fc33374 100644 --- a/drone/drone_env.py +++ b/drone/drone_env.py @@ -64,7 +64,7 @@ class DroneEnv(gym.Env): return self.obs, {} def step(self, action): - new_state = self.drone.step(self.state, action, np.zeros(3), self.tau) + new_state = self.drone.step(self.state, action, self.tau) self.state = new_state self.obs = self.observation() terminated = (self.obs@self.obs < 1) diff --git a/drone/drone_model.py b/drone/drone_model.py index 2fd00d6..aeb66a1 100644 --- a/drone/drone_model.py +++ b/drone/drone_model.py @@ -31,10 +31,13 @@ class Drone: # position of rotor wrt center of gravity P_R_CG = self.P_R_CG T, N = self.thrust(n) - u = np.array([T[0] + T[1] + T[2] + T[3], P_R_CG * (T[3] - T[2]), P_R_CG * (T[0] - T[1]), N[2] + N[3] - N[0] - N[1]]) + u = np.array([ T[0] + T[1] + T[2] + T[3], + P_R_CG * (T[3] - T[2]), + P_R_CG * (T[0] - T[1]), + N[2] + N[3] - N[0] - N[1]]) return u - def dyn(self, x, u, w): + def dyn(self, x, u): G = self.G MASS = self.MASS @@ -52,7 +55,7 @@ class Drone: drdt = np.linalg.inv(INERTIA) @ (u[1:4] - np.cross(rot, INERTIA@rot)) # kinematic equations - dpdt = vel + w + dpdt = vel dqdt = 1/2 * quatmul(quat, np.concatenate([[0], rot])) return np.concatenate([dpdt, dqdt, dvdt, drdt]) @@ -64,21 +67,20 @@ class Drone: x[9] = vz def func(n): - u = self.u_int(n) - dx = self.dyn(x, u, np.zeros(3)) + dx = self.dyn(x, self.u_int(n)) return dx[9], dx[10], dx[11], dx[12] y0 = np.array([100, 100, 100, 100]) y = fsolve(func, y0) return y - def step(self, x, n, w, dt): - func = lambda t, s: self.dyn(s, self.u_int(n), w) + def step(self, x, n, dt): + func = lambda t, s: self.dyn(s, self.u_int(n)) sol = solve_ivp(func, (0, dt), x, method='RK45', max_step=0.01) return sol.y.T[-1] - def sim(self, t_span, x0, fctrl, fwind): - func = lambda t, s: self.dyn(s, self.u_int(fctrl(t, s, fwind(t, s))), fwind(t, s)) + def sim(self, t_span, x0, fctrl): + func = lambda t, s: self.dyn(s, self.u_int(fctrl(t, s))) sol = solve_ivp(func, t_span, x0, method='RK45', max_step=0.01) return sol diff --git a/drone/main.py b/drone/main.py index d3e397a..666c370 100644 --- a/drone/main.py +++ b/drone/main.py @@ -24,9 +24,6 @@ if __name__ == "__main__": vh = 0 vz = 0 - # cap = 0 - # omega = 0 - n0 = drone.trim(vh, vz) print(n0) @@ -35,24 +32,17 @@ if __name__ == "__main__": obs0 = drone_env.reset()[0] x0 = drone_env.state print(drone_env.state) - obs1 = drone_env.step(n0)[0] + obs1 = drone_env.step(n0) + print(obs0) print(drone_env.state) - def ctl(t, s, w): - # d = (upulse(t, 5, 6))*dx*0.1 - d = (upulse(t, 1, 1.1)-upulse(t, 1.1, 1.2))*np.linalg.norm(n0)*np.array([0.01, -0.01, 0.0, 0.0]) - n = n0 + d*0.0 - return n - def pid(t, s, w): - n = (10 * s[2])*np.array([1, 1, 1, 1]) + def ctl(t, s): + dn = (upulse(t, 1, 2) - upulse(t, 2, 3))*np.linalg.norm(n0)*np.array([0.01, 0.01, 0.01, 0.01]) + n = n0 + dn return n - def wnd(t, s): - w = np.zeros(3) - return w - - sim = drone.sim((0, 20), x0, pid, wnd) + sim = drone.sim((0, 20), x0, ctl) fig, axs = plt.subplots(2, 2) diff --git a/mavion/mavion_env.py b/mavion/mavion_env.py index 45996ce..9675959 100644 --- a/mavion/mavion_env.py +++ b/mavion/mavion_env.py @@ -67,4 +67,3 @@ class MavionEnv(gym.Env): reward = 1 if terminated else 0 # Binary sparse rewards self.obs = self.state - self.target return self.obs, reward, terminated, False, {} - -- GitLab