From ebcdeae280a2c010a5076d54854cfd4920ffa0eb Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 00:51:13 -0500 Subject: [PATCH 01/23] Add files via upload --- robot arm source code (4).docx | Bin 0 -> 38640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 robot arm source code (4).docx diff --git a/robot arm source code (4).docx b/robot arm source code (4).docx new file mode 100644 index 0000000000000000000000000000000000000000..fff8f42e242f72c42762d4a1a47e417d9f282097 GIT binary patch literal 38640 zcmeEsQJ?f?h?Pz(wHfD8Zuq$Ol$>uh4{tf%Z@Z{nmw=Wb(7PzVA< zkq-d$&;I|f|H3cOoIGVY#DF038uAmg&^j#HNl`L9Q5a`}Z4R|V^~jF60&Vg5@fmwF zoP0Q3BEbsgahmJJ5{?*VAh2l$sea*Ta)$Yt-uw4f14&_B+uV%MNGsf$ zyR#Qdwhhlv&=Q-emH#h%wpa%MvEe1RdL;@SMu0Pn({0EXlGA?M_YZE`ERp)P!GwO% z0WykV1*6CA{2iwR0ItTPI$NqPCi1QoDX3yjo%PRDNt=_ngvRr5$m2sO7KWV*1$7v# zYbP6)j64SkGUB}o#^s?Ex??U^2XnD>oROwuXQ4b2mXE~KfJAtLsjc&-aYNGU;;=QL_M*asQS?Lw;`o( zKUWaSF&8Qm>{;AGK9>-I4Pbd+8Q(aR({v(dRhyg^>DSTbXNy9m*NJUvUS9{&xiAo$T3kw+ z_jJk@b=gnWxyMRXfsO2eTz%Ia()#Rn2S^F&E@5WKA{qRIVpp-AflXGHX>;%%5_j#drkLc%Fke2S+x|`@&d2q5$O%Z?VQE* zg)-%9NMoXnj~m==)EQR3OltoVV@df;gJsP?Pnw-zSPg}B-@S0@S=3iH5)ncJSpXS9 z|LJY2jimW=7I})v$9hMo(X4l1hn=k>@bv%0$6kwcE7ZS}K41U<8~_MFH#=@kn}12|KiTYm0tWD3O8aO1Uwc(2$w&<|AcWop{t`~_l~Ql(?Te>@v)Kf+VhdY`GpH1Gnr_jwhmka2`#qu0ZWZo@Id}3~#1% zKEa{Fh}X~7)v402Tf|B&H}gb@I~3;|+~SvzEak5xzv1a{S9sTF9${E+SUnY3B}Xyq zOfs1A`;MYyDGID7w-H1ZjQ!U8sI-9Pb#G`mdlv{I{Ta(rFus&0re-IRFb?Rhu1{A9 z2!k5~`t+#e&1%}c4)5`avk?m-;V5Y|Y2HYlag@c5?Q;LK5!ZK6JoKFnm*S>BtE0P-A{vE;CVTM+EkJ zSfO^Y8^Ir9$hMw?=tKMCD9A!EVcW)|%I>KPHg215^lQjuPd*%bbITt2KUL>0Nh58L zX&jGnLI*PD1b)w=qrsl91)rk5J0*bl_F3R@k2^O>Z!Cw0D(4(_MQYs=0D*PgDgYwC z5q$?XOm!cVF2aD>3-{@?1_-fyr?)UMXT35%4mf?s2DnJ@$Xvd*m#(pTtzc_-Ig`KB zy6v!UsUM5Os_}JxMrA!Ck^R((cGkdxuCo}4kSDX&hh_<6BHOaR7WC({ef_vS)($_H z5%W1cF@4uIdD)-GI`vI?_qFB;OXctMz^AU#Ivv2|r(1HwV(!lRQsKvmh!QS9*58+k zlGy?Ecn5uS8NDe;Q=J{|E4F%WA7l7&dL#HcO@y#F`VaJa2SqRM4!_sLz0*PX10@C^ zMyHH|2fx6GV8vVHL-ULd)X2B-`qMs#5dje4l-d2rtPe7AT?2YB?tou^@5{Qp)>-8c zeXJ%>Hu|cw4TteD97d8oGA54WNYnSz^cVI%=vYp$I`Ez{Ui)=*68VLd9ZPV6XEqXx zjo=Vw3`_y~5Td}6r8|nBlfjJyA;oVQ(zCemh1Uw#_}bHfnqQ%>M+2OQNRtLd^M4^mVlzeYiGw-7clOf)ar#Wrz6G*bxthu!+I2gEg?M!4Dd;k3X zIlVkx3ftNcV~`A-{N0bW2vZ#H{)n6V-aUKS>k>OsyMw^f21(z*XYvv+Rm^vf2BUFP z-~>LOEEJ+Y9?*emP`St(9302yZra=BnXPsBxZIbFHIFW_J8zsqhNR# z32o}Zj$dP6>MWC9%Gwa}uvkS6XVt@gQW&Pd)ZaX9c2KZ3TbS0|moJpekx*(#Fzr zuV=LDyreewy>2Gr_PNO|1SkEn6GvQNeoSwYtM8zw z?>zD3ZZaWwT1+~>a6CD9p4xh}md_HW|%9k$O%DFtTVQbjmmu{3%wS*G29# z&vYP{<0|EwA?^KK#sdKpC6pZnxh8Ag$0N^WJeh?!P*NM_^P7%0C?iy>1_Shkz{WUjfJphGW~I?V5|fxa@%D* z64JblzsL+v4#Pq9hoI0!WN0Vha0p)T2~XS99{mOY8svf4-Xq33b37x$UB3g_5tvoU zBuQe6CIndh4H!*Y1H^H7=-vS==ujVgF#+IRko|?&T}siPD$+^srp>)#KFXc5%>NqI zat#@92>YyUB=NTBzI3?>OZD6!exvS@Y1_oDZ}D!%EqJpvU9!hmurEnC(dL6{a<7g+ zugkAr?yJlj6Rf9y6Qp3vd@`p0gpkQ#`5~#~!etYruL=LXJCYsq^@=D^kDK=puEj2u z5Nga^Z&oGUeG}koaV3GD4{_#jLCNAq7!6W*c|6>(7gere%}enh2Y3}Jt98Y4AS^rxf)k_h5#ys%*=||yJy|O5?`jYz?sTY^V(hMCh@9Bq5 zI{{ZBYp0%)-BW=|uGrsb5i2L0U($?E-~KmmW@Hv?dmU^rjk=QUD zmueh*`H39_>g_M$bo%Pc02G-^amQ1#NMMz0yagoYOFg%ljXHRGyjJuklED)m%DwRn zcl$mWEGG<6zvm5;3mPk_0Jp{PlvoL)<%wMrwrH8pvKFA7p_n<)r3N+*j@bV6w=F=? zoq=pTk)wcL;6>ub=S|U3ldmkB&Xd-T5UK{{XhUd5^)&D^`;X8FpiJ@~nH-+L^aggn z(S2BG4`Qcb!S&!W48DRq0jv$9x3c8f`QfUtqS$1BcP|atAaMRcKxqF3(tmVVZTD0i zLJ!vuC!{-a4jgLAY@Lr_SBN*YFX~XS!$0LZIMF&LjLfqeS_u#EMWeuC5)Wc4aC zflVaOBIQ>y;Biays;;Ep`c4>;i*8v3@YcaONa3!5Uk>A12%;SizJFM^l~qwz@Dbwz zs3UnkIu96DoP%J1Iy9q7V?_v`ObBPM=%5)zN=HXE@38s%3KEXA6tBV_YaUU1v}$6b-b4`vdt^i1eb&O<-eOie-wFik2z z8&{s8#CEirqG~Cv5-AL|CBy?hR)cZoTVI}m6`@cz>8m5`eZB!39wI#Y-X|G~C?CIW zS(pDE-Jo?@^f#E6SR!7D;v(sOkJwA{>vce1VX)0Ysp8^DvE-1>~);9qAi2zE)iG_T{( zSC#LxB6|`k*}d44mrnPQa(wOgY*CGk1)%{G*4KDxycIqy49qpf0+XkRgDUn*3#Pim z-m;#PBq;g=`y|K^MuGuc1dVWAuhp&Jz29#=dcTM?RFFB4n+&I%_9+I$X>4?H{|Fhzj9@sn6$g{20P>sXZHs%aL=c(5$@2Z}dEiZg_0Mf&5A=!0$f z`vBX#2J6}AnTwG_o*WA6@(Kh&SOhZVpgu-$g&e8dj;|v0c|A@1aX97pp8Y_X5v=hz zSB<>Xash|kZcG9`0;Y;uije!Xn%lLIor;QYffNqf`;|Y*ULv*Mom5JNHUz=6GaFg+ z@1x}V!?=oDX3wxowP}AKCB<%Fhjx%);h@;LJ6wmpp03u-3ChiQ2oDd@c~KGg9+Ejs z4<6aEAB50paOR0fTx-ek*ptyorww+`5sj8p#Pp97%7>;03!h9Y3P-x(QlL2nTdcfje?BR*krh<#kNL;2=Y~fS zBGVc^c_G|vugOb~3L(OQZKE45YqL4iT5Nd7KtLowp0{%K04sVP9|{^`Nn(9vywWZ) z5#6xChul0F*Ps@jg38H_4aP40O{B;umv*9D_3CQbO^R%T4nBO=3KS+wC-U=Q!JcRU ztHllOqAkmYS`3a>JJlaCu2=~ugj7U8vPd0HFb0+_4D!f83Hh9F4h{E9qz|udHfB1X zX1aG*ZnRjrwDwV-XF$*o4TyS8@P5B}`t=?ZOpwDjvuv4E8f5}SgQ2J>&_sq`clZMI z)=w;AKq5#;LcALhSVu|&BtgxOj08lSrk<8)^_b4eQfz@!>4UQ0tisuIv3gN8Tiwg7 zNkdT$fAhIg;}>Lh%5B7sXDYt$h_k>XADp`x6DqnO5X+oZXW2~EnqvtS_qC%lH5;915a*z&e$?R++0hWor>*Nl!ly2uq~%7Hq`6!H z@JsRLc+$EQT@pwElCkHE_+wrC*Nzs9rLF!1bV#Da6hLqVm+!;g7>T|)V-~9kORnj} z&QLk8TaGcEt;BkyL?sbuRKaix@tvfE$WthvFIpREtrYG&JA>dSct@YozUxBn+?~cg zVLKP_Srn!@yksGHZmSZXkne&kr(H?|J*nO`F%8H>px+Z@ril;P|3o96R)j*l8#kWX zxu1D0k8{Uo95hZKjLsOJ6h~RwMwN43m_6AmX(?b&OEU=EoIv89CDGZgF(RoeTyvlz ziz+>%vvwxs8AuA?VY=vRi@qnjIVw4*k|9a{dAsWmu=t2Dl^eE3(eI3;ReL*opp6)9 z>FLD-%7AlEHN;%#M4Rt>C^Ur121Rc`J!bG{>M4-nPv=52BeZ4&j0@8WkQW8j$`X-Z zurI?>meNU<^Ki^C?3!T*!c#=$_KrmWo7he##SEDaI|7Y>HCrU_)A0RJT*|rv{H2Ei zrUpA&P^D|TdW4Y@>c$`Z0ct`u{FM7;OWu=5-9L zQtn&q)bs$i!;C)R0(ls_Ia?vL2`oZL`zoP7N9h@Uz6~HI;OyF1Ij{9KWiXqb{&QyN zy(QXd?iNHZy6e_CUmVJ1lcHe~rpPOBNvOirIfS4HU6yFWqFM%QUM<41(VGGf(v7&e zPY3lQgJ93*0cB5W6Gh@raobP8;StxnjRd;_Rxg=_UIW>UA=2uKk7p;-jiTpp0kK|` zuuZwlykYmcCL;Wp!XOnYfhU`a>ugBCmOl%ov1b75(C%o$IZ%x3Qc*$tA@jD_G*Va! zK2G*zJp2X&?44e?HM%&}{v!sNBb@ol(qCxR7$PtP5!_NDinQJ}`ZX0!$uH>TEV3eg z?$`K)VWsjDo#;60z?pWLTxtwu+nRWpREe9DTjZ}gEE+7hr|3?_iV@W<4)WwXyBb~C zhyc5vC{G6P0)o_ruCFMJ-Sb%*9h(GJJrwj5#}()-Y{sQ`ez(P}cedMo2Q*>abJmC)U4tW_aZqR|Mjs0ize$-NuZI>o@ zzeID%)N@5~{r!8;)M!`&PEujjT#s)6ua2@n-fYFw2GAmx)zqc!UZD@9^~xBbYwQ?-i#6}8yn!1glgC=*F4KB{M{<9 zZ!{TUqmY>cx(KqirNz8?$3IEOyVW7l$4HUSwJEF^V?JUW`0}Z)ml83PzTBI@{Z1jq zvHr4Z5IcH+i`%I(`wcdYz3?1lyDlWsGg2FA_rM{2>2n_qNK~=amDHtV}I=` zyYJ)C*4P-JO)$+pqC{3==NDGk`7GL=!!KE2{*)+=L6)5Amr?g19Y}Uz>TJTnz5x^W z?e(T%?E$kzUD0OaEitxXT6`fWs7eZz&k5sW=bUzROWLPNONhhbs?yZbq;G(LNEVh% z4UCF>xA7|Z`f1uUWZ`wB!St2oE{RmP7;KBaKM&0dfNq21FP70;8V#kIF5?KnGQ|ys z@S|{50mrp(zpJQMKU|b95#{-Qetfd=93R8f)|T2oHwQ|QZ+idO?-1$v{+8|(QudLn zhOC)i(C{7tw)~zx5ESnG``JsPS`kuV6q|sQ1=>(<{VS{|1L^XIp{=-`!o5L4HK_Fp z#s1KQ!?f|7K!PC^4}IPrSM;1uLpy7Ge11RQRy{>$kS_m7bJv{S&+dYgme{;YOK5Ew zi}RSL05}$^Wo<3FjNX=ow{>?X?teHo-22OkQMG^s4L_PdMNUysk(vxF=!f-{Iq^!` zz}gBvpu~4DutGGR;D$njfnz3&-i0Z za4ekvr9kDnAErYF9)HS!4yD^+*%c5MMzPrOs#TjCLRXg|Z#@M+7O8@GgZiLU>=SE7 z{=hzCrq}E-RV0ZT`8nB^L>31BnJtmQky`-9t_ZtOUW|>RdK6KxW#Gp|hf14%$iPFQ z2Qm05(?cKb6moyzEGL?HkL^lUC|(Z3I4PYiDOmafFTB2(iy9# zGe3LQpi{mRP7XDKIzzhUGWfFRM>V(EUtkxsH&8^|c(M~QNJxa);4g|n|LMtE;pq#3 zf<$Xbw2GW4l@#2+LfU&zzRwWdV|2k%d<=3==Z$9u8dE7M$&?|&8|@{Jnk(f_YMqwR zwD7WVFc>-4We5$O#RL9VBv0~Hl}C#6Ve8k>Q+UP8&^62XJ(`?cmv0X4j_V9Sr$(J5 zp*>S$D$6ah*+@c~d6-!g%2YPZyh6;pLWd%n4vFUwm%W^2y)csEKR@N3bF>vd2>d@! zbYFQ_WdptLdIhx_=u`QJd|7wfQKvRpcxEci(19z>(iDtWBW z7E1rwnt+xcvswS?X>n)%$tLe7rpau61b8j|bvlYI{(DVQlH>#~fg)El^f}{Q^wFs! zr91qV2f-EX%{}^En6u5gjcJo9X`}`#oCbdMIN=&!R&rgsuR|T4bCGKOGyFvz_ed>~ zAt5Okq1!8c5&lLU3LeLtgA$n&!X=WU%OlH%y}V;gGJzOd9i?a3`2}<#&SK>V5R;hO zt8(?l+uHZry%)rC?$*MAmP>(b^--QiC}f1fZv0u z<`MeI72L92#ukvBOQz5sgx+m0=Op#w!TK*FX0wt^rE1%u+=t;uD!{m_WL#zrX;fVj zl((<3;cIY0;XYNMaN@i_6uBwtzwR1%`=OQm7UBKauU`0u;rWzea;hSGZ9@s4S1wY#S1|Q3`g$>ex1&hsc zjD#*V^Jj@n zS;uS-H*z!_);zM-w39&Pq7JR$I;g$zx;#hr;Y}@bSmdR{lMNX5%w#(Yk=YjtZX(DP z)c{87n4?ty3$BWNZ+f;;8`yWI5Um*uy>)K zA@B853=x#W)n^pEQB^VdkUp- zE4&Re)9j)wI^47spu5thf0Xs#ZGk70y!#8NA(}-;GJW02(;$gQA_nec$b6|QPx8NX z2)Eg!+mXp>1!-^sln)?-r3Tr2iEfHq%XZSl7z%(Xpw|gaZ^3kPB%7BMkPHn+=e^}y zbx(|rg7|In08#p-Gkq%IazF6&o{So>rtAK8ZJ%kWMiACX$PF&|cAR%}-?l-+xasil zBMK4cdB)kffWY68b6>`RKgw%#=F$eH1dF4KZwoTw^Mz4bVSwg{d)NHQTTxfUf<*9* z!yQa3tR^I`DZl$$JQFIy#XMYtHs@i0xRMmU{HJ1EB#pn-u~TUds)Ja0=n(BaL=Lpv zsUjKt3;G`wwh^x&o3!i5b>DX<9>Y0}!E2BxUqDIO57ROZ;_8kKMMz7_>zX=HXyNELH&}ebi5YkWa0L}7JeR?MfWHh8 z%1B^;qPDV?e_q3IO&JVkIb=wn?46KStUrc6rG@{-h}&G8y$!7u0e*3LuB33)el5Ia zR~`*Hp7f8wINqqF;>OC=W(=c4gIavZj*)`8F}~6(JS;mZX!BGc0s@e=#5WzD{(2g0 zz#mY{s~sf?L2eEVFtVMr#*XXFNj6ywbcL=gE{*P%KFJyX9XENmR00=-`U{f%iQjPs zF0WMPH5GVebH6Til7mix=1|y?d+K)n<_!}3cPxLP(r0@`lmE3j^wu4J{-%7i7fT{! zcqiM-0BH_iLAWnv(ScYH9Lqv-(BLvS2@oYNL97a5hHw@h$lS-moGNZ?Rc%Kj}75|9e-^w4y`*{ zh8AH_^G(3~6DQkJiJWko0nGZa77B*Y?sPm(0QKr+tyQ*!86*_PhC}6F zOQfgv%T6o_m?-Nnpa*51VHb!j=O~NMazf`mkTih2 z!@lrUO1gAw{HWOVnwn>7Wa%^jyHBbPm=0fkOcaOdsn7B!F{%oX6S@dEuQkmOXJh+C z|J`iH;bI|(dlsf1cru0bL~mjIyHXT&TghKwOhLmzn69-osRvys0a*}IrJv>@=DP%b{SO2!!gy2qp8&3hwV=+#L zy@NOnjOav4a+$|Dzfwb^JOJA5Gr5KO6?aQ;4n6v4E6 z*yFI+3Z}@QX}BzuDA$*y@TExZ#<7p>#bc()=&frkvZCfz@iq}pMWLOjz|JM((6Z=v zAwtE~fEm))KaliK4KH)S3f7g_Df*zgXK)~|;@DJ|lGT;4?%vFywj&%XQI&EjAIcSS zsO&17|9bb-*uixuJ>+5i&=Csgu zH+Iu`y*%9BMy2I{Oj2Xs`7@Nc<-Wva8n68|$?u3=17WCc4)t`>J8xGHt#;<~chr52E=U&!9QZe@FIP=f zMyojmnl9t)4@YU?68l^?X`O9GDWj%xvi8@jTLC7}^v}Di+DlU4OgXIQZb}tkFFGxX z-weQWTIm&(1+YON)VS^`vSg0*vhX*?*sn>`IYendU$ln8TOwLRMK0VpEM+LGC{?r) z>G4A!P69me+LQzQi#f*xGfic>M;fY)uOoFqx!AeVW>y1wQ8;?IHhB3Ao`SPYDW%{e z55;7XMjB{N^OxeRAcoUs!|+O4Evg|z{j1*TzRp#$T2ggX*RpIJmOBTbM;Dj8=Ef{# zop7a?D{rVZSyJ)j7A}&5#Z|tYHT`&1a%#{H)31gsF3RD{&|zk#`#!QapVU2NF?Tj& zHF2iqDkt%krbKBI^%zni>v3{?T5whkmL1)%9Oe^rvcyIf^mr?!lO&mj1Glwl^mHu( zEHDBH=z@3h@yH}VA!jO=SNtcGL@dmg7}M~LCfI5f3k%*PzhPxGd%7hMfR)_^2sEK?F#{K(nioXppqGGL!0SmWt4CG1? zkzvZ`R0tU?9$VpCy4PBjJJ{zPbtK>oiU$KynfqZr?B*{JBU{6+2@<%4vlS&=O?G|3 z6Bs$_z;kiS@yeNtW*zz_H{*qW2||uv#=Z}e^oWw~OgGppPx4jaR*5_yTw>sk*~z4W zR+7mdzWC#s8`DtA>)@S{DLm=MA1RiR+^{7tnUXO>R9>-3>&#$35HCYv&y&cyWit{M zTB&?s=Trmb#Oj-YCBfaBSHWLORF-45jo7bJFS*DlT9w1pXXIvSp#|I4S1)<<+F9`( zO-(}Pn6WFDE?oGstJuKO0J!;e(%+b2l-%K-!X)zai|CIAg~xE3r!( z)%&Gg5P9-*$Id>O?oiEQWn#F)&tn2440(w_;fJ{D@9d<$!=yWGj7;t+Kt+5Jq6^~l z@WTUTY-ehF>OuG{NOT&%8}5MyN$ttMed~T@e~`Ty6oE;6)$_0Pp4HpJ1YX>wl^TjLpE-iL~9 z5kx)kSYgxgr;!|uxF!8XX(%`N1nCaKM9% z3-aR;&Zq0PPZtH;d-p%)GNR{ZA^a{dj^*0F`7zFL^$_?f`XS_!uE3OkZ~^m#w&@f9#1%ByauDrYr2JMmJTn{Mc1SN#H}2JlsOWc5BTN!O zzlvdXI0-8+U7$lPnrsMbw@2)i=J&R=v0LtPNCw6CqX0Zy_B@-Zt->pm(4!L6&exL-f-9D9_XMD&MBHba-7Go z9EA2r8joen9kO}Dj zqY~NQ6aNV5j1Etc;p+tCab87?+i}HEB?AF*Cu#lWASU8_KQMa1FW!*p3eOg@xS{B0jymbY=@Z5~1u23{Ua-X$ITCUu=mV10h{Z_QIDJn+=2ia(UxvUD&-3c^Uu-+fT*bEPPcz%OFdud@D<8ZO4YbxflD2B9tGhj6%dKIg@3I;%+ zTO6M_`5^Yc=%)?;5lZX%Hutt{9*J|>@9x8nQ?)pacM`_HQ?3@02fy{L#A%~V$WYuk zQ!ZxZ)pYXk`+x67mU-u~h^oX;>vK-F%iw_+pbiM$&iE$aDJj)sPV)FrjSP!rN0=3; zoM^DXy!7GX$t5ozmP^Q2GnhrpwT%1wUnwbp(N{8-nk;Wn?{(dIKL|R=ZO^aiw=UFc zWu2{D3T+P+Q%Z@e!VL1+;*2`sKkolAp$ULL$_MoLDSGw^X1DhPuiGBqomjWgq(&Ki zad2O|Se6NFRosDG5a@lw6IsIlW-khAt%Nq+n`<4fniL!^7DVDaO!6&#kg66&t=|>) zs^UH-ai38ww%W1};;cgJFox6uchZ==`lzODF^VZn`GPNpo{B(dlu8GGFU)hls5Y+C z5m~M(n;8_**fHo;I)2o17ZhP*;6z=%R}=VZKW(3i9?C%+;F=-c8Wn17*)ELgv``64 zYRRiGQKZmFZInc`m6hQivD5Jym)lqUnghm%HPf5C{@b zln^o}PK-;CVO+g-#C4Nug?WXhFPdy|c}x|zUn zE3M2ho_DSf%SUNtBzR;nUT0m6>GJVaON1~y66Dbw~HSmfzuBGh|JmoJ_U z+g(>wWK2~jRLn4JG2#Q#HyvJj8?z-!fsB5eIZ-y`LmK=dO)#n)hL>l>ak6p}QeH)0 zsLx}neULH@GcT!kEJ4@=gNf zR+cNI6T)kttki(Kc$z1ALR3j}KQ~RSl?yD7B zQz-?>-M>2(*@pnb+>MrIpcM;nT= zkmpGRtg1ynfqXU1$xJP@!qGn&wWT%kMLk+b{>IFT8Uy8F)<0`?5w zZ%eD($Joxf1m&0r zGTL}8`?&R;z7JkL|C5? z90;nHes0Qa{VMd+nJVn=71&)x*j;Cx?!Oek(e$`c-{mktAHM7g7hU5u1X9J>87*!> zZx2)mVaqmExxC48rAR-Is5Kl^h`)vyeEkH@5Ud9MU-_t{Z&EFm66kfF$T;_8S~bBD($E_1oWppHI()UKNFxEC>!Pa9;kb@g!&rV07NJP!e!XO8yc^3lhUWvX zwgni{BbR+NRUeBf@@j!gr{1}qh8nAXdUhsJXsWABmsOakG+2t9bk!DTVjYJglUwdT zJw%43Ql>29snk~e69!x}dpLM*b943d2+t8z1+bprtNO~La(v4uwM%VBXbHQAMFow_ zdNsw$NM|ZzF;3hIMUQuhC+{*CGq82 zoLp_WE3DjG#F69H{d8J-km5MR1~_5urqYqRRo)<|jr5?V;x`l$fQgmI$Td(JxuJ~u zNYbZ9FM*W`VuX&a`c04^TcHSkI2<(M$@f|C9+$38U4lBVx|0*--$vA8I4trC^z)Ve zqp~A|?`B3C_k^pUm1qK&nfsgi8FhS8VlD*8`buKfc&xiF!=@v|tX(esrmo9ni?eDZ zPC*KK`pPnus#ie7USbP=Qrq+RWwy-Pr^;bCSzj&RINvQTRW|^bRCp~)HYedIUAihc zmQy~KW-W5GCrVsVS2k*K6fJf##57Z@R`fO#e=Yac4UTj^N2zYHxoW{CPb}c&J7=r^ z6MbL2{}X*To?IHIpH>uM^~#L|EQa*8aUZQ8gL9P09UEQ@DjGJzR6NL4e|1EVNvf)S z#)@8+%|lJz|K3%D?bfl}52fL$toHBBw=%Lpwp>^9`ih1F%V5=S2%XB^v?<6qd{L2z zD~Fk8Ek8DC($=j!YSPAufojc|jV(@{sD6YRn=oE*<#F`hCz8RvwTX^c<`0xVd*0O3 z6q)9&+{jfH9Cu;!Ah01vl zefdMbxSBF)AJ?+z`}|^d+H#l{ImmZhqqc=g=*k(bp!qC9S@L=3Jt17Wl#li<5uAeD z+LXN9sE42)%6q!1#EK>JRMxwqbWte<&$u83xeT2ft8FpE=fn@bGMzhJ8WpHE%t0&S zoHr$3MJ3EA!noLPh!Mr}t{rFJ4yDg$~Z>eh*li-lx6kBh}*V<#l? zva{opmP}i3260iweu&fx7D&oy|FTob-6PczORL~Q+1az^DwkIo+*m6Yxw6*cIo#Y; zw)#i)#LUHP5}6%qE7o}qR}G1^j5JQ8sjZ$~Dwi&3(uTC+dPNcNj8CSt6g3~lF3O77 z(^dE?-ZpvN{;ieXi`+EPT#>#5__j{CgXOjD{>L;0>wktVWQqy(p@!h$0{)U2FzE|9eD zkKPLp{hoR+YD;;9PZQ*;S`|5e70%Da=N*>?9STcUVxtxVvzd- zCRt{isR;S>w(fO<>S55&1X@pIB3evvGqM{MNhG= zN^!?|h(Y8Wq)tx_%52>xobBBKrMrs&brJXE8eTj2=aT^<_=&pB=5|lOMl`NFRqW6I zs)c}!L`i47Rj}r}>)>h(xmqM`9ASx9WfZBPkqWWYNLyM0j7~>~TI?t|HaH0R79&34 z{NnL#zOG@cBt+z#y=1r-4*u4PKEX&7c-^WB@neYkcw4g-`Y7dS#RK!QN#2@Lzsk77 zdPlfKJf^Brknf++uxjzfi_;;)}VnE{SXP2V$R z+IRn9#{Pg=4#F_}1wGZ}FOJ7WR?IPu5 z$Y*9x{c<=^^WP$H!W8z#khw(IXDkuHhDjt4<7bZCN*}G~ym`&ln% ze7^bdyYabt+8Seg)Awg040$pYbk}%8c0$X++D;oauid)O>@^FTB#gumVgHawGvc+c zZ-)mUoLWL5-xNT4t(I7UgmH;!sqMm7v$Vww!|S>S0GV7*?A~p$8D00sb@2r`!v$Q^ zPh+Td5hR%fUEuQ%o^s=rQ8?OwFjY^cEU8W%I*-WtZ|^QlvZ^JxO&Gf6eCm^j$UR$4x zEG_tR$)bf6(Y!3qCE&I*OF|4p;oUK8}>u^~1*1s@5-A3bJ z9Rr`izy0{T98Pmz<7Rp1e_NmKZy`5ez|Ml2@=|VJKK97;m6Gx7o(-DX#=J;kUnzKZ zgUE31*!_dbJWXayS%5;6yUv4V!&1CijfD0GJ z7JG>uH`0k0x%U?rjUGz{#*Sr9(_!Q}utxQ_Pl^hA9po*c##9BFW&%$M(bDj~^{}1) z`k{*buDzYVUYx_P?ERRuI=HTpm;Q;KV)9`N)*DH&6$9N`0^0x(mjPj*M}?TfB0L9 zWG6kvO5VymHp)Oo=&1n+?X#UbzNC%M88_E4)-dRGqbX~T*OUl5n)axylnN8X3Y1dX z*sg*B$7}c+V-co2!27zb@+W{-_Q5h=`Uwyu(Y}EWvh@MFMg4R2nYEPdDkZnEDKCk* zBakVL0OM!t!Y1ee*732ag-n|Dh|HK=sx9+5(?|4rGF44J zg}Dzdqky&y41`mJ?;y~TJ&({jDU_9RcVBx1c)K54?JFv^EMidPEf-NjxN32fb)P$nw>I1S~pZ=WvXksXl!)(k^|HmBX-n)3tD%8!hmGC+&(iJAJyax zsS9cQb{@eJL9#ZMke=siE3|0&4h7#Y$&c*A>+eC8iTmq zb~VI7XhX;l4X;~vMr6*JYpn3w1#0`2sc+)vB&4Wd##sLd7q)2SY12zjJRm!B_>1J} zJdLMuoCG${mPAtd2NI~@&AFEzK$36IkVX^`$0httysrgCPbVKJ602(8Ge_ zGt}^YJUPugTtTiOAMz=kq@?-zVPh46F4l8*_vf!?`UNmh&|T`C{1cOedv-|rNA3UYuM<<;1Qd@}lbUKbvu_+JcfePWpI3); zVt$CfM0Cqll|%OM!Mb|c*OhOJolKFY{0%TaU}!>9)!)SL;JAWx_2KWk2(xNV1bJ7Wm+GHPtB`|LY{#Ltp+o2-AJ$3G%y!=7N=B-b$z$@emzBgsp&f78xA7* zh!v{5-!p)u{ON4L34L3X2YQ=+V;hfqKQ;PyV^K4^+hEIrhlVJVMun$~xnvpUW{GWy z%QR5ZrV-qnrP+?X>@@<<#3;JVU3l?Qjl##HN27tSRZ-Z5Wi4#WDO(#kOLh7DI zwoW?c0ht>@)f)PZ5WS^bW!eMfPTGM>p1M zSdlxO=@*ZF!3kfpRiA0D`+sBaE0`$6V&LA*vj_g%n&Q2&K1@ zl#g51H_DS`3whTPE4^+G7j+KdRz#ox1?o@P?8!dEunJs z^57U~A-Z+>@(g-?OE^M${JNWZMS);3gKOQo zM)i%@68GSu-Wg^X4)_`4pD>eE_6ZLsgGZCY6>h3^b#v+~>Fj2P%?tD@OI#zS`P-JaIb(X>4e3CVfvt1#c79RMwcL*Vgb81-cILjF2BfX!|Nl$#;Sm7b!PK= z2!HU}VM%>MnM97Q?=4eA#zdGb=vTrruz8)pFo&hTD7i@-MCDABN)SlZ&4{JJJ%D|h z6QXv}6T?A@lTCT)HbT*vp$(smj+V2BeQqPicL3vcs-**QNLAtTJxzV7f9$r$QI*0M zia=tPjz<=cvKGbF4l)6qL24XrvBNy5HL^dnkNc-PX?i_&lqi^rKvD{@#9JkeIAdKx}1v`~*vqmiIo*w*^e4}j) z=mWp91E-N9{n%&=z6w}>Rm^Z~KQ&o|8CMB!&E{|Uq^rXPX?nfsYGD#A;EmT{ed#h~KOYd)q!LRt|bK~Qr$=NIml zCq;d!Io1Ji0F?O2T~*bQgJc;R6#RM!DQOYrF4&qJW`fm)+ZHpf%-PGwDf#^E+GLBa zRtlUY5IoFrCO4??l?R$*QYmcF{#y9G>DQqL`-vzV62mwA#%cYY$B?+nnR%8v{*JSp zNCYD`*1H*-)m2bym#zI^kV8MsSUeW4i0*pdZ(koqIdb_I`hlahGIu+j?LGUXwC^?% zSe0}G@!6*m*b*DY16oT=qYh(Gmf)7xZ{Gtxwyx3&x8A-|br=jV3#u;!HwlYEo8-5~ zG#!=Faj}Wu=Yw{1bu+UYznC=6a+RX98xz)z)g;N*o$D0!zP$6|(yAa@7snLGi{r1{ zTg@_5h_zOcam0_#=Zk%FPw&dl{x)@IUdx`W z30hh?l3EM7iTf49Rm4~+ts=WKS+I;-4k+mavy-3&u|s&I_0QcRvq^3qNP4F=;LDB> z<0U+;-;2c6wxRg6s1ug!hc<#CcoB0sULSNH{9#3xl|DSgFUcyz%$_;Ewp-Z13 zaT3~0pSL{D05-3@aCwhH(bJJ`L>g&W6#6;HpBzJI8_{V&679@B&{obqfOMjl@W5yn z{=n!i!k}sP_g6hTf&7O-cDoMG_g5jg9Y)#Y(G-lJu?O_>J&F;k9#PtC2<~C@NMO_M zhQ7d%=~r-<$EG;kelot|QCiJ_)G3as1~c}^_&an1nvZ3C8+n+$k<^4iBvI+ywF4V4 zxF&p-Gp8^l?|w}mMDIf&(jN*$pd8hr9J++V044@KZ}O~o)iS|QVDXZRw73!w`DJ3X zG*4Ub!!$ztE5U+EoFwS?0sxKz;~C3SF#f^nkZdHg1EfG$wcOS(y>Y(*qsiPE?mo=9 zXoUf=-@wjbL8&<40+bCZUTid%apYaUzBr!wE7ok`*~58@im^)LIwPy`OAU9ljp$}`&Kr=KCHm* zCsv`qRnacX)r$1?7YWJ>^T&783mkOxZ~Ze-(fix`q2S=gWx|aW4O`;PXp+sgwJ5o) z4)#O4M9)~M9D!gOq!X%Z!JV1S_7uq)>)RYeT#MBCqYw@j>wujq881bhPCx>SOo#Iu zjEWkfxRfQ7ht@mLq0Bl(Ly-3->zJ{-s2gO|#)?ff8cmioO;^~|<=kRI&#@~RI;D%3 zG#@aNunSc#D3@c0AKbaA@Guzu{ zU{VdX%>TM5)if!wQOx3Ns_F%IWKZ^hXem-=T~F~kTP7kg0!ZO=d9X-K4X=Sxqr!=D z36110oMQgl10B}LU%2|45tlK;$lqiLsf>?s7%w$}69W&hG`Wn$mSJLwsb^j8_Rr=v z{KcC#yR5$?5nqMM;B~*;l1r|B(e%%I^bw!gg5X&2ILJ~n3&|S%$U+&iA7ia4Y;mR0 zM6gW#lcQy4QDx03THa0szaIjDgD*#>Z1U`6W(J*;T1G8P{Al~Iz1!Wy>TAGot)8W4 zx!UbjRNoivZ7f~`jISfm=PTSf5W@09g^8lB_l9;m%5gT$%h}71%VhZtzFK?v$P-w* zgaj63^S5nED;IS>hu^w^2X*jk{y17Cq-{e{DFqe5-wu{&Apap>5MjjxM%&boGnDHE zZd1zrCtn+!ig@4Or46_3k)CBJh3i~_k+U2|=Y8)Mm8>Bvk;V3xxHOFJXMyY?y-L%T zPK2RL;SGmXvDn7XQ%D|#D)WXl##;rI*spn}h#0{5Qy90McX)k-vJggbm{gHV2@oK? zZ`O+GMUvPJGo2LqyQr7KfB*!*bB%4MfJ=(ahVxDx`7bR^v$;;>t+*NR3T1txp!zzr zKXvyAm57MDASm;9w3po=`hIKOy>%moOS{p(G^T%kA=AYg*6F_tc<^c`Akc3%2$&64 z--uW+8j!`*X7;4vP;p%eZ$lkTp|8>9X7X>8pWO9Fk?N}aE~>zM+D|niuhXkLWYQ$| zgIRQC&5l9gXWJoFWGaPx4VTo|QxN$xyChMJ5&29b9Ai?C9rKIjfdDZS*}HmdlO-H(29>)CTlKeW1bHDH_=yqS!z98;H4 zwykBQf@7%&&qouolIs}Bkn^~$VteQ#_M7|cy#*ssz2M-Q} z1xG()z7}Wx_ruf_(~lN8#DJYPCF+o7O>o$raNLQ+e1RFot&Yu{gjFAU_dMc@+4>(1 z?B2y#ncvoOKD)#mX}b+AlLnUq2n#wYq31w@4hHchwp#=6c}hyl4C8v&!Vt9|?uBP? z;)5L1!;L{{EoU`MKedSy-9c+;tbrg(xvq9k@C;_-_mr5kR7099Hj~zX>Ss2Mu9~J9 z*=Y((^En>zrcucs(R+H>hKJ!IRhEVtlj?1Gn6Z+=2i<$=KXNTU@uzAb~ zhcxm$&b+(XhK7AVQP^dV@JX-8x>dX01O_4781cdPWSZ5-5Ol$Udn14gj+?QZh>sP z__6P?d=CwcGF_|R`N@FnrO`yxyL&wtDRpf2ynZrOwePgZh1$u{EcC$G%FM;WnoH%VIORye*PrHz{j(!}Ss#*2v^aKC^y*;ZY_>XtG|~$+_VCF$}gl&+P^k zyrgv-ICq%c#7%EX^VNpkD5tn_sQms`3`)FWJ1-2yOAwo%`r#RuV?>=QXZJ@Gj<*jC zi{%J!WI}z@N)mJg8bUB+Yzod*X-9aP-jpu}x20c>^aWgO;k@ac7<~+PHfk&hFrFfh zf~sY`6RxSCMKXjEXO>H`Ivi+?p;YVwps6%JCV;uDDiN110U*i*A6?p5hFSq;su;!u z6-)^M{_*N;HnrDQ8ivA}B9xx+u$`%sp~|`0M!NzFQQC#Qh{%Nq zZ;cJp4C5dXPWks4^%BJ zu-|GDTgSvHvWXgA6gitxC$MB(VoY~gB6ppp?`ik%NaaIOR?)R!-osh&LcaqgKuv_Y z9$b2DEb>JFWsiL#u2V|NQ2j`BV^w>8Qe>2UUN1(UcBB^&Qe$=o4jz6$H2_MM=+YC_ z9Xvtql=wTPZAEP8#8!WZtAV_iv>l@rRVJHfLMIf4N)`g(_n5< zMei+{aayV7s=>QH4YuXRRPjrkq_N|cRpCmhJC5SY4x_pE+Ftls0!%#+`S+e0ZdqL) zP2pA{?<%#m2P~F29fMs;kZ9A`o7Mqjo;`7c44UbhbIvWgx;bhwK)z^)>06QH8r${NV{D_j3PreY;op-rSi@a6M2F|IIuoRP-Q;)#-F_}6b@`mC~>0B5I zH`1`2Z?#Jv`K#UF3ioiAfDz0Ld}NI~F*?F7swr}Lyv?U6WvyCeTvgiV>bHa05;MLB z$m`+*=9gK`VzC4$3(spas*Ax7OfE5AgEUkLyZT&Q6f$PG(7U(%@fehhRkk`#mwoiF ztXNp%XGCTiQw^B@VZMp%1Jbk%$eK&2ypKa089HX)ytCprF4-4-&Io@&hJ_%T_qfkt zvO<0Mi}jgRJf7qswIkp+X4h zT+I@2ExUFe-VD6&L&2PhZ6d18KUA8t8WbtnJZjLA5Yw(~mZiyCR5a(SMR7{SQBb6i zY@7R6l~a8ES5wkFr#@jn0_fzb23%K0KwI*ug4!+EIgFQC<8oJFtD&rl=$Y}Gl^0T6 zd9C+E*UIBpBd_&@s&xn0mT#2{F>8$Qv$L1ku*cPS~A_9#&bQfSXiO%*xU9DB+0*3FE*IJTOXV%7z`IoUD9V z3$t9JjS1L@ZyhQ8TrDp;?EKPHG-7U@=1RPBw6P31C$lnLQhwj4GoLT76L=JC-0lW? z=?!6Y*<$pz58MtSLuz|Z*A*KlQt!9Cdq@rtC%SkVSP~hO+=f3CC@aXu4c_Vu0F5Bv z(SF9-K{~r_#;{>+ddl_9Kh}{J(%^O&Qy7^Uvuc_C(d5h6oLq^OEk(}Y%Jcmi}D?r|Jwi;@vQ+LhXXX607#VtY>AKynJ5Mt zsNsWu*3tW?S{bz^uJ-ZM!3?f=Sg6ZrlfB$SE&K8?e-YNxkx0@mg6v6A`Ug=+3)$qK zw(_0_&+HnV@Vd5?n8{Q}zt~aHa0@|?8a1OZH*Gl6(%_5+FCT8 zlEzmShnBJ5z_kT{8*3(=?)b)2_Q&B(wPS_GDf5Lq##Q56J-r?Xor3)m%Y`~1JYC>k z78}1mxgdw>=(x^>h8)cxel2lF<;;Pu8oL&AE?%zU{Ham>B%jaV#1TOGI4|Vu4?PRl zonN5?gJ$2uR$0-yNYkLdrPjliE@7>;FJqk7EHKf0J3 zb@v+bbGlB_=$l2*Oci#s6HHLkVAYp;c!>DK|Ao}i4tsJL zYMRwM!6vB`f5FZCz-9>WB30@L1p|1wRhq;6ovn({yfYSW`z(7w<^YjzEbi2O>AGKc zs7J*}SVt(k7+Qy`N8oGbkZIkOwA6$JP$+r97&@IWx5+$2S_+Gk$MB#p!s*}b7LNj4 ze@r*ezGi9j$1xu-*4QUN!z-^Vq|-R$GRmMM&5+C@)sm#Nzwq&&sbmEW2CKiq974y?Xh#+iPh2upO)b%M+apzsqI=nJ9}i)Un9E z@Mc@m#7-@8s#VIdAL5^EOz#NpZ%fnG?^YIDD|8Nr>7|@ZU3!DC{B_g_r#L+Z5&2pA zk(ch`FRT^Pb4cU->T2x8;%kdIACWA?H+*{WhOX8!XqgWUSiQ%5C$oN@cq@XZr^+An zsQ-mg?*zEs^W(UuFnDgb6-W?jjDEiSS9&)!`>-X zf6lOrN|p4msPc1yuvtdr`(IN{0Dea$Op*ipxa|o!!F%x;80|LAP-K-;X08k3IES1R zc*C|jwG7M1W49UK>l)Th)xFJFcZoMs#>jPukM7t7~`tbN68)+e9MyeyATC*R^) z3|{@loXr{iJY{FS#YuhYR?0Z%97;>;3fb z!KY_-YDb5Lz9S~{(=-!wxBywcGLk{KQKi)CPN<=*Ft8avQ|Zq;|B*q6MwlQSB%cj| zpy0B~s3hB()O+--HF^h}MJjrdovlS5?CX`U*|+Tg!&{rj;n8+^o(({}L_|Yc+Vn3% z{5On`&qk&X2e3J77bZXUFoz|jA;glkH(KiE;`rmc&P7T-g$vGmlAqx1-p%)Y$GNuXrS!o zGS>CyRViub8$w@+`{NGRsQU?JkEH{D%P)-jdu3!{mn=Tz5Rv-s?K*96Mh`y1jctC2 z{75|hcBQyC32MJQ)-ig0ZAHckocmfCes;RAYLp!cV<(|~UuBL2y=(-fG~5N3sbAxb zGUp+63sbTZlclfW#-&)1Gp$!u6|lTNH&Va$zSALS9C3ZL;=&56IapKZXt?rIbqw4X zdtCdKWC!qdk4!RRddGcg?{oWgAdR2oa_JH`cD-$EX99|QkTE5k`^?M?i)$&tVl^Q} zVudGE>_JCHp`kO0H30M5Phc=%Qt3c~g}*fmG9iAZw6C(L=AxdwAoy~Xh(1U^kTxZ7 z$keU6#asDa5R5KH#Hfl~4@plvlR)RxBHx3{Qa^bHuOg$lg}P9fr`L!poL!#ALIO%2 zje$zCd=|1oazEg5&+xROph6Pr@!TIS*l#Ji2jxPD>W_o7bFxY*q2Xx?QqhZ|uufA} zVPdkGIQ9y5CG3tPi+J_9xaF* zjA6x)h_83Ys>RV>@TY0P-0!YMqLaggX8O$X5I`!+TpV~9YaGZ9e%Yy&2`bWBy(qnR z7msuM;XP(c7dkDSB>kI7XY}EE>XV(CGmk$A^YW;Xb1kX=s}-y?gUYBvC48yKlAq0V z)6tUD$SC8V{e3%Wx5KHtXTB%f`9W0c^Ej!-6E<(+;XKJ+X4FLOtCkJYlS2&G`6+Vr z@(sW^&sar7YY*0U*gmqkgr&!79~hNL?-AcN_@^RVHJ8=Gu4lfpB-oVacph;VL;4Rtw!u?MCZM?Ob> zJDq+;3Lv($^3n*fPD)>H%Lg}-KWL@Nlnh^0u3$7^96s6d101*Aiz2I;x^3buAY2Zu& zba3KlYn=!hXKNxZ;ft-m?kcd5<%oQ}nX5b8TPSidp+qK-S}(&VqPW@#9YAk$Cy#)G z5$+n3%%|B$2`wVU9QL#uZ59+pp6CwsCRAw4_GrJ1kH6QNbsK{2Knx~W&D*N>kX0vI z=zb>Wnt``-am!`DLdmE3ysG)#B(o{dTh6n@+*4tt%+K7lp@a(r3rAtMm z`$Xc1L{Os*E^FllW9gU+P;hzE+^wMl*=WBS51O0H_rF)Bwz=__sS?0eoRfC|&gB5Mq6euY6PuwaOcX=;8vAN2_9qC^=p4;NL z@w9q4St5j^9_B+c$q?LUMLVB84G1;W09E2=waiZqR>BqPgy@HgY`|*2a-mr(xdhqS zmW0A9@ELgJtQ1oMw$0hwBlj36($PqM!i({LDOmJ}%wPa%!9o+dVf-mg_r8qGkQ=-x zgbG_OfZr=Vq|Sj|hFV5~=v^_@h)5)&3%Nw=@gG+9R?eW7LG!$7N8xx@Ycg$YcMm)# z&6w}xHs3Q(JA%EkJRLYIK&PN?2(&9oeBcfemg0aekm2tY`ktguX5Iv2}iN{g1pZo0yicW*HQhKn@B z!E25)g}&`TWmRI(Nz;tPtlZshpkUj_uL(4|SG`_E?x+*$u$&_T8WzUtqug19k15ao zh#X_XdFMcxb_fSi3D`S4PmS%z4vgK+`x`;w6x6~ze3-SO$zTDbuq-2;1DgU~3@|{& zj*`z9o0GrC6eB zg?Wm{JI$0=*%;S|akYLr-tD~E*q`;Pb9Z^ml{T&+NNbf-bqXilaji@3$*7}dZJ>Yc zb4|mZnIuxbfZ;{Z_(wC4yFxhrm+)=iFzK$}o}02OUP zJLEE{qG(RDCNwSaHA2XnfgF>)h6qY=84*pkAj+^|yCMk+9x+d6v>X85h4|%JbW)IV zJSDd5mr@9b4X1QMG>mhMYf*hH>tezPcZF$NG1o%^m!e-H+Ni)>o6smiXNl}lED^NW zw$MxKsK1CL5gdL|e{g191vanb@Ywbmn@2o2LZoUWIKp@WID#~vTrh;`^NPbY;b3~i zuXQ<&)^w6zR`=MNgdWw0Eq^?_u~ScWe$^U&2aIYxk{V>T)GWdF=w(UyaLO~x$jrNe z??14Je&oUYlGtNgV7x@n^EGABWCf^p2PuijS(cSU{Ei9BOk`$b>;G7dLQ3>S#RVxZLQcs?$IFN7ttBWJV}d2bagS0eP*ZZIz$S(U(MzMu90!l@W1 z1kk?qtoS{LD>4TjFI(eCu68xU71`#gFAFB_^@JrDsWqLO!EVzoxb!Ey{18WVvl-w( zXMvA>9&jFHW1%V*>uW4Znl~Klom9LLV|enM;TF*YpMFo9Nt zhO&AgHc6-Gt5@JNv&CJKr}){xJM~84Jf&d1#;=<5D3AK6VTjm=RErVCcSor;K$Q8o zkN%fPVB6YKxuPnor*4eiA)FcJ7^ZLtcnn9LTcE5>qL8$UC*Zg;Q@lxzlse-8Byhb_ zQ88RJo6B&CDAw}l4q9are6(g>hFX+?9lGH34FI<(r9&!_EStOdaoMwbTw$+uL&S+E`V)P}V5QMG=FVlb^hAMEe-y=lk8Z*+nB8WQ zZfU;mQSmxEzvA9!p}!*)vs7nOph8eQ0P2G74+N1 zoZED#8AADn6_owDWtT<@Q?s3e5VCN>e*gir(!=-%3zNG+j9fr_ggug9y>g91+9G{~ zv}kIZWN0`_4Jb2ziQdl0RkF(x1#dp-PXu}Utkkr;^}fS!XYV;lwpg4iO52Yn%Mz;i z>({~2QbPmp>^i!g>b~rcBzdv3d6#I4QZN5el_W!0dQp`nk+s%_&5+>wU#-L{9%Cqz z=GP(+6EVgWUrf2-x!LZX#bNIHRM!{ZF$>Pvx8mg>bS1?$*bwZ)qUTlH9`4G^KcEhn z%V)>Vnak@V?i-GQW;K7bEi0M1IxbS1MV}OEd#awv^qn;Q4Czn?qcmVWR@GU4Xs$ zNhA}iEiJ-q63JT0gshE)ce_fGa&rc2^2 ze`MG2UsVq5yBz~%{JLU!W$wJhQ}t+T;@9n%jyhUBr)B<9Ae8~I$XbEH1?*Zzq@Te0 z66uP?t>qoTDsC3pr!T6*MM<@>;N8{P@;xR{#~0s=5Nd^+shYLe50Bx2s`;B{?ipd- zlkgIQn^wy@Y8qAYb9JqyL~!1f=O%3D)rk<|gPYVS7E5)lzY@c`)to@Am)G7B!n);> z!f4d|V_0>|>FpSl(@0yUK+i|G&t&^HidcaE)d-ZjXcuyWOc(NPLqKQ-J7SHhJz56K zMq-$1H;kp^LT6H#s_m5Y_nmPWw6g1x-9@jT*TcP9lg>oFhGQ(Yg4$krP6%txX+qJB z>Xjt6!UH^DSj(DsK^#vlrc@iml6PTMa<6<*5L=-+h&9Jb;zo6TK?r-OPJE6q40}j1 z7?YaE8qTQf5PxpQPcOYr{#b=7f13Scn*@U+g5WQh|AFHjO>rE}Fi-aB(z1(l6>FWgv+^f65T%Lc0ta9+Dt6>TD{gq4be4hVpkEuWsyum=@&hts-&m;){>q~)5 zXi`CfsuBb&nww4J4Epj`=w#t2t-_x!BI!-9CY5PmOF$@KJABPJ|YT$B2x}cx&y*v-) zzfQDR-mNBf2&xPsgMFp_*^EkN;!xb(WCZ#ogu4iRU%tM<_x=|Y8sazhYZ7oEpeSr0 zAhds@(70Hb+L|)_b7lG$p3%9MToeumW)H?I!O%LM|KziA1jn*5k7eWUkaKb}2~Y7H zr7A2esZBkUA7otU(8ZP~`GK2Wl(ryH_lcjGwkoTrw-^<(9yVjCTB|k&R9b`D1k-P) zvv1OItT_`J^2k485%RPJsSiGrzD9SZz)G%O6Z!jSsan0znHwIn;{`i+~Yl#Rh3msx(p+n=ySFB*<|7Y*;o_+(+0&|d%Z`S8Hm;q`dBG~{_m6v(>!rIZeSw$p*dy-Gr(FKGizS8&!F-UPz8~jt7}NT`cQ3gDy!CyZu(2-B zMDmCb95YO9awuF(6F?S2pV`BPu=RGcawPC7=_{HuAV@gJIL?xJU`rxqpjXUPDD2w{ zE55F?IhUR_|x?Uuc+3z+c=+$ z{>k%<`jb2eSu7b)6(^6_kiIdv9Dc?Rk9pui+s6m%g{ULq6fQAhrH!RG81Z*vU0m^S zEqwA*Z>DhQuqQ57wrCwKep#2;DCCAZ3o2a`YcS;a42-@>eCo6Q-bVv1YA1=)k1nb0I& z;({r@K?mE0I}`Jq@8f0t0Gy8gn$6Ipf^RBf!!PK0Nq#Xv#eYZ<*+T~Zbi~ZX45yLV~ zjC$JhZbi*Hsm|4fvFx9~bd;viln!UEZU;&nH8CtY0+f<^TKX^+2c+N%SWL8B10;eW z2kKwt6-dNA4tS1?#kx5N6)UGaXM~L=xnZ8x&Dy+%(jb)T7q>oCs|S{(w~OM=50EV` zwN?pUs`QX1Eni_F?CDYkc0{wZ*wcjhW^VMftLW&}e?QdGPpuQs+P{GQ`T?%jvl4Xe z9jO5s#}W=VJwsnfjp_s~OVteFOb!Rb^+ff+kaiLj-qs-l6x-RQzs#z8%w zMe3ChKCVCf@3Ji=$N^iW7Ldr_VdhLCv(;UFF-N%?be-AfVVh<#qKpv-$AV*{oIy2D zDT&{|j5_#f8hg_JQjRCyFP2`eh->{K&(wjBKL<3Ojdt?vv#HZ;aA+RPb=SCF2%oiN zBis8ES^(68u>i~?=vI~LNvmA?kWD+OGR|vQj+>?ZuNB|>N4xsvRyeif$HzUoFTS37 z*+~6pYA(dNNbkE62f9$I*7@`lKmKA~aw1UcFFjc2{H$o|5*n-SOi`XVTa?k8uGE0g zZ=Snaz#q>G=PdVnSr&QW6*-LJV5sojyO2@VZDasrrBZQ4pr*k?t|In`lJmPdK_wI1K4fb3$uMYl#=TtUm)p^<&$y2jZ_3hnfr^fnF z?*zD5H`lD4w}9I{?GP_I9S*xA=?_~!{qNXj=-Oupq@X}R5imgig>B|+>f&N)XYTy3 z8Kp^m&FMEMX3tiJF9gDp3~YMvB;drrrsZVFwp5-#Fu=w-h*TWeEo-Xh?ehmJ57nee z>pacS*T+%P{pANpwKxPV>5h$EyGAVAK-D&xVQ2fp1$|@bq9pZ@w5ns+(IS-0*~de! ze;3aPG7XrG6DW0hv?WvPqx8a!2W=EziKPAwHVaUzu42))#`y?p#9K)VjJ$P`q&#(j zyz#W7aHYoJkvfUydSx9I6=<4IWs~IJRvqQ-Ph-*{opU#08GTk%mIZBG7~MdGtTDdw z;#u*pT6Ul(@v)s|Lii?TABiPTkv0kXaf*o6wo)*wei&LZ)Nu6?p@FHe4+2!am7X7K zzTwr>i0;{sE+?MXTc{oksDDoB5?p5J#=wyEa_u~`Wywfh4&vE>Lq@lK}X5OK>yJm&p_^C_96Qk zQiIl`AuR6}T^oD_NM=>r%|>vX{#bFj1IETI*xql<`FV$ojVTJ|>5bnkcm@~p8c76y zM=Kd|<>JJCs=5Okv=T3oRd;Jlf(9I8d-N3qQOgyO(ejQp?&)6P7?xl~XxlrcsgqGf z{E!LRKMY5cf8INZxnfrj1OiIc73M}9M6kx|-&YpG_8R3jnq~_o)1G{Io#Je&iD#Yy z)+2DiyKs!3rV9!@(*sS8U~gHt@~gqYz`xsu1u;oLB61(_kbNt+Ev z)PpgZI);esl~le5M>Gr2@j5|de#j!sh9&W9!%WtCj^)6LrpWf1wVG*V&7d9hL;Xou zX>ou+EW>fl;*SVbK#Em$Vs#2uDP${f6>M`zp|3N4qe3yO`BV942-it7V?nlPqy;@B zcJ%`r`yy_8+fPKZYurKok+eT0V{jI0c!X3H6|j$Gz^md#j#4JwLu-$^)d|bl50AJ; z@z6YPdr9=&Q}xd}*Cm%Tg@Udemtn&XANq-mt}!b(m5ql0k=ydz`d`t91X z{Xd})@*XL+Joyfr)0Ye{5U5@1`ZfrrSf^*`pUK16x#oRD?xvgiW`bDgSeq2T4F+n& z#FqKa8Jq$4bhXreLkGWDK0(T5g4PSM89FP`xntc!J}*-WMWP9|HA1kMBA|;m}*?51T zVt~I@4zK6=;+64OoO@HAYjo)mMtpl!c{-|`9!XH#`PNG&vi>3Fkrv*1G*?-YZ=kH# zBT&!Er5&(oc`hZ8y$kF4#Q5J7RTlv+uYqp`mGT=<6aO1})7aJ7#okua*5*I)H!WRE zZU0eL|3CQVcQ5_>h@P&G{6=d9-~QO%?6#z?P7bHJ;G4vfS!9 zETM5Zri}P{Q|jyv71LvCEValhw^GE!gX5P6_j~)W0*M?R>8D4X?Zd-r**KE$9vYU0 zx;aOwED&X9j4HCPUYW$C)ktPcosi_xq%zKNX}GkZ0Q_|AUVP~V-bgBk4-WLf#8&*^ z+u>o4DRgfmafiY@5DRs~K!+}^dpDtusc7{SX4(cD+^Q&#gzB(jZ^y`1(-mTK>sxg{`LM9o$MW){}}{?1*AZfd4&J&hX3bpR{TF`wqaMn-NCaP zu5%$(bdJ)iv@>VRc^XSf$RainYgjnOSNy-SJND#vlj3^_QbrN@65L(%wFZecNCjsk z*Qi(=JiKjB;KLCHT#OpPxiDcyPjB+i-}6y~o(=Hye^?>oP%p|1?$AstXzA@wySz0q zSmb0)H*K1NRnM2$%|A9x&mH1Os{ZyEamEx$M~L?1DnR!$HfMEQ)+rSWKL$5@)0eWT z(q+x;YmriBY!~hBIfbfVo4$I4dHlp*vWQaoYF-D}D!Vxt;R^(+k-Zgazg(g%Abhv^ zfA(MLiF5_!_oNKr00i`}9RGlhI=gt@cV&M=j&dT0UA0Hn57ehe`U zlizSRyFd9!xvN!$oWPeA*R!#8-i;?FHr5a#m2z`8%fcYu+x>MU;OEOtGj2W>B?;27 zOB*vS5!IlZ6EiB-wM|8{Sw=Q}|JymGv4chb?>S`42RRbG?-iV43gU@ zof_(yv2`#xahUSqT-eYMo-?J11mjq%vly>xu{j!5g-G%NZ!YGk1bNuwxnaX{#qbwG zhh(q7h5cuwX!J@LH{Ap-fd1O!ASokj_Y&Kl_izWSO+%aiS?+o8|>lF`*^)C%kT z`W@25QwavS!}__-$I{B)!GuQ34p~&F?XO9hnj~wd2KzkabX|T7~BlfNC?TYR4k9V^?YbBeU2j$O{ zi6Q1w5RIXd&re{}J!rfuHeYumS`rl0=(JFqVZx*A1sG5NuRG9(O7al=|GnJ zdJ%Ga?C<_G%SB2BbbkFA86X8?G9efI(2fSg(B}4Q84FRqt+~Q%F3;LX+#q)>O+>x@ZfJ!@N=F#B9<&0E><@A--%>hHp2I zNR`xJ+);7)0Wn+L;cou8D<5Ce9`D;XP@@e=Dru$!@ew zfNGGEdNIp)OxXqqX7p*~-5nhyDe_QP;j>pyLs??T#P1NxHDT^@ObstPNt9u6DS@JC zDal#k52574wALQB226u8AW>NQSek#Y2l{5Ct-`UfXC>KK3xKUHMEBH>C>Gkj9~}Sn zus9PIx7JNroV~lDHd^%6-bqvbxBR^SBR%q0^a)ts^`M;d6l;eum-n9)C!`FN`3p_= z-1-aMihZt*QqGcUDb+Kt-^3bTwPNaU1T%ElDea5A#NO4OqTo7rVLIoH`sBaCRwXjM z%(N%R)#tU98Rq3Ps!qW!99rw0Ji=^Y9Y}72{(@g<2El$Br8bJoM`qa1Pwe2W)rGB{ z9#o00c7sdJ$dvC&WLiG&-6bA%(0b#_b|@)VP~^-Ym73O^>N?Z;8<3rtzMQ$V8-&(1 z&!HE5<@>oJ@xJ~|4R$}4XHJ+scI!@KCL-xT8ybC^&Mok6W;HFr!o=P#rj|)bWctk# z*z0rD=s)XnEsW8>!ZN$5kC=_$P)8%=5MM4uO+azxmUj2r zlaz>pR7$J27zO{s{>1Y}YFYral4#-$VIq`^LDaOu8#wXV$U>)__P{4y$1atiiC zDdq9KQ15irf_weibO7D%8M(ir907scAIi-QhQr6a)j^fVn@mdy@`?;#fWL5A;{kZ% z>3X*Ikgo92m+Ao41s)T303*c_CaYwnp?q4tg>+xOEqh91G^LH(PR=^`;K6{(z(f}> z4hdBnGcZ)e*2F9a8oZiuG#Ip>|Gr!;lpBi506~bSm>2!>FR0{&kEWic{ck6{fT$1u zQj|f5NOW+~I2VMJd)}CI4!zpctvT_2^FBiKHmIds=fuJ~Z+u?EE4kf|A}$F!D2z3> zSn2&MAMr)D!Gd#)ek>*OVr9{zMRo{WoOa)<)f&b(($Q`Dbt&|_&_t+dzPJ6jg@@ZF zKiWOhCtD7$?8kRfd~{P*y{hTQ&h(^@?1ai7Um6?tU|VCq2CtlAx^or<(Ucl)Xo3<> zu5$t#7B8A-3-@a?vU)Vnbr$3n&juc+M(NE+-U}?KHJ>$>xmOpOh6w}$&Clgb$WpzR z#+n=6G56IJv9s+(vrc47yp`0TQa!CE)0AW4*vW+-W%2^k&wFnf-;m0V3AsV_Nx5@t z8h)Z_{XMq?1GpEh3Zp=UoaXv zjnV$N-U=LkqF0`yamReXFG$^H#P*z4(zhyJ({kU*QsZ%g)9TmZ0l%vac=f6^dH#*t-b9%;+2TNY*oVranOio#GB8CfxkI83kRORIi$n?J1rEl zNr~vkzp`SXg+O4TDbI-iXAo2z0H7^zA^F;N%&mu&yR@+~T5VbC?T{Y{m-+#-ncu_1;w;7wkts=dMFo&EaZ10mi5%E*{W7Zdgu+kn zyPZbQHZ8ntT>|6>;6Tn&;X0M}%@t?ErAw8!rP`;-3D2iTQOdf_GluZMEs_B3kGtKhBm{SUa;;<0H za$s^@t8nO4?1F)!FccDXE6F}-Jbtb>C?RDK*){+o8ZDb>s1zK6sb)D5Fbx~2K{39E z;G@w%aafr_IT5w2Ra@JjG#u1_QbDEQ7{e=pBf%67WI zMk+>m8ETYnAWLu^cm--mZc5%juz6n;LR|))s7^abyP9=WO{T`ePx$A`zBy|E-c#JQdL+ck=U(PSB9_ffn>Vr=0p%XgAq%z#iz(fAGx7g%M+Al@u0Q}`mu4RNz zFNR75$w&0%j{0TT2@kQgIteWl);DvFT<)gYA|#k(q8T}YDM7f8e(TbfbcW}OOg^BqY|A{WWB>2&<1U}EJRx1Ku#7{gN+F*O;bNcYr@x)8oHE)OiL?; z30CNzZ;KGh<1G42@gdslA+^=@(vwE?_1x6WTbxWEi3KcQLCq-9@0oGt9S&uB&e?;+ zs^_P5ZdQ>+HqvnzQ`d{wvwV5WQ8VdVJSlL4w{CS{kx>9!W2h?eiw*LJX zCqtM{stB{Gt5-WTh~~P@K&9J77q79iLPg9`DKeQJEjEq~_Y=DD>y^y1n9{<^e;KNG z#xi(|MxGbZ^RgY+m;By!E8olN>#OnkEXa%D?4VgpNrpJe|C>xr$=MO{;mZ2-<7uA_ zU{cfwJv-d|xOZ$#a1Z`ROAjr1-y~l=nFn2i9>n*1LaUWR^G@8$M@yUzzWwN;Vc{bu zt%NO;Q33eNHn=nVqmurwisG_${Z$ zd=9;W->p-lO2@}WK8*N@56G&lsZt?r#9;Z2jlv*=jGX05DKnAk*4bRKd ziK%18RpA_ymi6((R8QgJ4URs5Sq}N-b)XZ@G0-Mcr{^H=3+0N{lwHriVU^a_nsx5E zwn?6kqpX^Id8l2A^YW ztAMC!Z*DKm4|d~QD2g@_PUttZ*A!5iewfnQP`T3+{|wqL z{g&ad!X;R)0VpkJvU6zFmxg|#_e{NK76pB#XjD2j?| zAko8lfsxXMG0JR8z4r%~=|_Jo1_k!1wFQ0w-H@lJX+U!8NFyTu-AJ?o8gLEl_t6~; zo|f+J|Bs!Z$@aD^-4@qT5t>HYAqA#Cq-u19wTM+-CtA%|nnGT=bZ2PFw%Q;Q`*UXp z6KYtl4EttW2})S)V?g3Y2hDBO+|8LAJFvz{_PODX1q+gYS#SO6lx{EYKJIQSj#_5e z*i1!lUi9lSa=&!DTSxJSRxm}&Bg&LpoEkNmj0UplNpaN0{ih{wn@%b2S0Se51@CSVL?-w2PxeoMF&#W_VU=ON)wM zC7Fr$n;iC0>0rXyPce6Y!j>B8h!WQ$+~24)pRMt{`sgi-Iy5@C&H&j0@l8YDZ9U~S zl8B(GtL43fG*MjQ3#1d)j$q*DMRINNN!0UJmYq0b9m~juXMIY(8c-Xp3fEk}%|B!X zH^Qcns|PczvioN($73CqnFiG8TAsbbN@cCcbqBlCR)=J6wr5YvOj{3AL>L)!u$I~C zlpsEEX<~bg49Z!lM4kz-Hct{wY52XQ+|GObB0MBbP`5TT66a(E_wkjVqJ3X6D>w*W zo0I_`dJ#F6H7(0xy3?mHGBWl$E&%`eOggHymL{_CPi}4J=O+64^$f`5g`{w@NVzx% z?iqx6`$K<{?J`-1E{PEM$5cdIcUsDQJJR5nCfU+sF|+7u3-B-h)w(4j76k7sWB>*D z4HqDP?edHV=qd%^QXYoi^WyJ!QzbBd*}8gL=mogjdR_nNJ31PN3D}dEpW;D)HW>QA zCh&o+6!bm|Pg|6i@UDD92%LDLSw{t)xd}Xs^#BY2-hvTyH+ud;gQ>5N3pj|MXFrk& za_YqiLpuOK(UI>e!~0~6lzU7EIS2`@$4stMtT zb*OzX0I1vm4(JiT>~UC?BIG)(W*p?w2s+4hSlb|EA?)ez^TeQkU(nwjenRl!+GQUK z0FzMw@Q+G{5Pmp|JP1#TA-sa!oRW}$FcaISNRHhb{Gq&z5KkC`_whsVdw7C~OvrFJ i0PW)efGzQW1@^*`js__>;{o6}_`-nRpnCV`r~d%_uQ%ZU literal 0 HcmV?d00001 From 41bdf32e69dec3c0ff8f72b8f091f8220e0825b9 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 00:52:39 -0500 Subject: [PATCH 02/23] Add files via upload --- robot arm source code (4).txt | 2229 +++++++++++++++++++++++++++++++++ 1 file changed, 2229 insertions(+) create mode 100644 robot arm source code (4).txt diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt new file mode 100644 index 0000000..84f5bbf --- /dev/null +++ b/robot arm source code (4).txt @@ -0,0 +1,2229 @@ +//there are about 25 functions in this robot control script +// +//give power to robot platform, then connect the data wire with a computer +//wire mode (could be control through wireless tech., Wi-Fi) +//select and start (single servo control/ group action) +//======================================================================================================================================================================== + +// ----------LIBRARIES-------------- + +#include "VL53L0X2.h"; //the bookshelf we create +#include "Adafruit_VL53L0X2.h" +#include "LobotServoController.h" +#include "Ultrasound.h" +//#include "Screen.h" +#include +#include //default +#include + +//byte 8 bit +//short 16 bit +//int 32 bit +//long 64 bit +//there is no unsigned byte in Arduino //0 - 255 //A byte stores an 8-bit unsigned number, from 0 to 255. +//unsigned short //0 - 65535 +//unsigned int //0 - (2^32 - 1) +//unsigned long + +// --------CONSTANTS (won't change)------------------------------------------------------- +// address we will assign if dual sensor is present +#define LOX1_ADDRESS 0x30//0x27 and 0x28 could be used +#define LOX2_ADDRESS 0x29//default +#define LOX3_ADDRESS 0x31 +#define LOX4_ADDRESS 0x32 + +// set the pins to shutdown +#define SHT_LOX1 6//sensor1//Servo7PositionSensor +#define SHT_LOX2 A0//sensor2//Servo7PositionSensor +#define SHT_LOX3 7//sensor3 +#define SHT_LOX4 A1//sensor4 + +const byte IR1 = 2; //infrared sensor +//const byte IR1 = 3; //infrared sensor +const byte IR2 = 8; //infrared sensor +//const byte IR2 = 9; //infrared sensor +const byte IR3 = 10; //infrared sensor +//const byte IR3 = 11; //infrared sensor +const byte RxPin = 4; //robot arm port +const byte TxPin = 5; //robot arm port +const byte LED = 13; +const byte buttonPin = 12; //Touch sensor + +//from the reference point 265 to the 10,000 ms point +//distance sensor value from 265 to about 350 +// (350 - 265)/ 10,000 = 0.0084/ ms = 8.4/s +float speedTrain = 0.0084; + //assume the sensor1 value will not stuck in a constant value when the robot arm moves + //assumw the pet will not stand between the sensor and the robot arm + //move train only if the sensor value is from sensor1 0 to 710 + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + unsigned int durationMoveTrain_OriginalReferPoint2jointPoint = 15000; + unsigned int durationMoveTrain_referPoint2jointPoint = durationMoveTrain_OriginalReferPoint2jointPoint; + unsigned short jointPoint = 310; //before the point, the sensor value is accurate believe. + //sensor1 sensor1_Min allowed min distance + unsigned short sensor1_Min = 110; + //reference point: 145 (143 - 147 is fine) + unsigned short referencePoint = 145; //default// should > 2 //should > sensor1_Min + //trainDuration = (147 - 143)/ speedTrain = 595.24 ms + unsigned short trainDuration = 595; //19; //952; //1000; //define the smallest motor step distance//resolution; + float safeIndex = 0.8; // 0 < safeIndex < 1 +//The sensor1 wall (mirror) is 6.5 cm far from the edge of platform. +//The barrier, say pet, cannot be under the edge +//80 is the ideal backward sensor1 range (after the 308 point) per 10 seconds +//10.3 is the ideal backward distance (after the 308 point) per 10 seconds +//80/ 10.3 = x/ 6.5 +//x = 80 * 6.5/ 10.3 = 50.4854 +//Therefore, the allowed distance variance is no more than 50.4854 +//max distance Changed per trainDuration// arrange = 50.4854/ (trainDuration * speedTrain) = 10.1011; +//it is better for us to choose the index less than or equal to 10 +byte barrierIndex = 9; + +//could be initialized again________________________ + unsigned int durationMoveTrain_Max = durationMoveTrain_referPoint2jointPoint + 30000; //45000; + //dictionary: + //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement + unsigned int durationMoveTrain_trashBin = durationMoveTrain_Max; + unsigned int durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 10000; + + +//------------ VARIABLES (will change)----------------------------------------------------- +unsigned long currentMillis = 0; //stores the value of total run time +//loopPeriod = duration + interval; +//period = interval + duration +//if switch between two states is needed, then setting clock below: +//if (state1) { +// set clock by using interval +// } else {//state2 +// set clock by using duration +// } +//in this class only duration or interval period is used + +// objects for the vl53l0x +Adafruit_VL53L0X2 lox1; //VL53L0X2 lox1; +//VL53L0X2 lox2; +VL53L0X2 lox3; +VL53L0X2 lox4; +SoftwareSerial mySerial(RxPin, TxPin); //Instantiate soft serial port£¨rx£¬tx£© +LobotServoController robotController(mySerial); //Instantiate servo controller communication library +Ultrasound ultrasound; //Instantiate the ultrasonic class +//Screen screen; + /* + //why it cause dead loop if we call constructors in setup() + lox1 = Adafruit_VL53L0X2(); //lox1 = VL53L0X2(); + //lox2 = VL53L0X2(); + lox3 = VL53L0X2(); + lox4 = VL53L0X2(); + //robotController(mySerial); + ultrasound = Ultrasound(); //Instantiate the ultrasonic class + //screen = Screen(); + */ + +bool isRunTime = false; + +//could be initialized again________________________ +//assume servo7 is controlled by Arduino board, Hiwonder robot arm board support it by providing energy and delivering information. +bool isRunningTrain = false; +//There are two methods to control the position of the train, servo7: + //because the sensor wire is poor, two different methods are used to control the position of the train, servo7: + //when train is too far from the sensor + //keeps or locks the previous time point/value/variable when visited joint point, + //the time point as the reference when robot moves forward and farther away from the sensor. + //1. Time setting (after/on the right side of the joint point) + //////records the previous time point only (once) at the beginning of train movement, like this: + //////////if (allow2updatePreviousMoveServo7_timer == true) {} + //////keeps or locks the previous time point/value/variable during the whole train movement process: + //////////allow2updatePreviousMoveServo7_timer = false; + //////////previousMoveServo7_timer = currentMillis; +unsigned long previousMoveServo7_timer = 0; //it is not enough to use int // stores the value of currentMillis as the previous time point for control the time of servo7 movement + //reset the previousMoveServo7_timer automatically ONLY IF the train will begin to move. + //private // this variable is not allowed to be edited by users + //There are two situations in which the train will begin to move: + // (a) when users ask to move train or + // (b) when the train is not hindered and it continues to finish the previous movement. +bool allow2updatePreviousMoveServo7_timer = false; //could be true, ONLY IF the train will begin to move. + //besides, we can use the same variable, durationMoveTrain, to represent two physical rules: + //1. Represent the total time point when there is no barrier. In other words, planned duration of the train Movement. + //////////durationMoveTrain = targeted duration; //For example, durationMoveTrain = 5000; //meaning set 5s movement + //////////allow2updatePreviousMoveServo7_timer = true; //unlock + //2. Represent the remainning time period when there is a barrier. + //////////durationMoveTrain = abs3(durationMoveTrain_remainingPlanned - trainDuration); //abs3() only applied to the integer + //durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); + //////////allow2updatePreviousMoveServo7_timer = true; //unlock + //2. Distance setting (before/on the left side of the joint point) + //when train is close to the sensor, it is fine, just use the sensor value + // through previousDistanceSensor1, by recording sensor1 value and comparing previous and current value, + //we can detect the movement accuracy or whether the sensor is hindered. +//integer distance; +unsigned short previousDistanceSensor1 = 0; +unsigned short sensor1 = 0; //train +//previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered +unsigned int durationMoveTrain = 0; + //besides, we can use the same variable, durationMoveTrain, to represent two physical rules: + //1. Represent the total time point when there is no barrier. In other words, planned duration of the train Movement. + //////////durationMoveTrain = targeted duration; //For example, durationMoveTrain = 5000; //meaning set 5s movement + //////////allow2updatePreviousMoveServo7_timer = true; //unlock + //2. Represent the remainning time period when there is a barrier. + //////////durationMoveTrain = abs3(durationMoveTrain_remainingPlanned - trainDuration); //abs3() only applied to the integer + //durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); + //////////allow2updatePreviousMoveServo7_timer = true; //unlock +unsigned int durationMoveTrain_remainingPlanned; +bool isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + //durationMoveTrain_remainingPlanned = durationMoveTrain; // the first time + //since the second time, + //durationMoveTrain_remainingPlanned = abs3(durationMoveTrain_remainingPlanned(previousDurationMoveTrain) - trainDuration); //abs3() can only be used for integer + //only (once) at the beginning of train movement (before recover from the hindered state), + //the durationMoveTrain_remainingPlanned will be recorded by durationMoveTrain. + //1.only if the train finish the required movement or + //2.at the begining of train movement (user set rather than recover from the hindered state), + //this variable will be updated/reset. +unsigned long previousMillis; +//unsigned short sensor2 = 0; +unsigned short sensor3 = 0; +unsigned short sensor4 = 0; +unsigned short distance = 0; //ultrasound sensor + +//Record the number of touches +byte NumTouch; +//byte buttonLed_State = LOW; + +byte isHereArray = 0x00; +byte isSafe2grib = 0; + + +//before power off, it is very important +//put the good on the ground + +//before nap or stuck in some dead loop +//pauseTrain(); +//because it is not a right stop +//besides, if isRunning Train = 0, group action will continue to be run wrongly. +//robotController.stopActionGroup(); + + + + + +//======================================================================================================================================================================== + +void setup() { + //no need to be initialized again + //____________________________________________________________________________________________________________________ + //initial master boards' interface + //________________________________ + Serial.begin(9600); + // wait until serial port opens for native USB devices + while (! Serial) { delay(1); } + + + + mySerial.begin(9600); //communication between Uno R3 kit and the robot arm + + //Set the functions of IO port for each infrared sensor + pinMode(IR1, INPUT); + pinMode(IR2, INPUT); + pinMode(IR3, INPUT); + + pinMode(LED, OUTPUT); + pinMode(buttonPin, INPUT); + digitalWrite(LED, LOW); + // set the button pin as input with a pullup resistor to ensure it defaults to HIGH + pinMode(buttonPin, INPUT_PULLUP); + + pinMode(SHT_LOX1, OUTPUT); + pinMode(SHT_LOX2, OUTPUT); + pinMode(SHT_LOX3, OUTPUT); + pinMode(SHT_LOX4, OUTPUT); + //Serial.println(F("Shutdown TOF sensor pins inited...")); + digitalWrite(SHT_LOX1, LOW); + digitalWrite(SHT_LOX2, LOW); + digitalWrite(SHT_LOX3, LOW); + digitalWrite(SHT_LOX4, LOW); + //Serial.println(F("Both TOF sensors in reset mode...(pins are low)")); + + //Serial.println(F("Starting...")); + + //initial sensors + //________________________________ + setID(); + delay(100); // the TOF distance sensors need 90 ms to read + initialization(); //read_multi_tof_sensors(); //previousDistanceSensor1 = sensor1; + //loopInSetup(); + + //Sheridan framework + //____________________________________________________________________________________________________________________ + { + + //deal with the corner case + delay(100); // the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + //because sometimes train stop without recording the correct sensor1 value into previousDistanceSensor1 + previousDistanceSensor1 = sensor1; + try2Recover(); + + delay(100); // the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + previousDistanceSensor1 = sensor1; //assume the sensor1 laser beam is not hindered at the very beginnings + //but it is a corner case + loopInSetup(); + + + //test or some preaction + //delay(100); // the TOF distance sensors need 90 ms to read + //read_multi_tof_sensors(); + //previousDistanceSensor1 = sensor1; //assume the sensor1 laser beam is not hindered at the very beginnings + //but it is a corner case + //isRunTime = false; + //moveForward(durationMoveTrain_table); //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + + //delay(100); // the TOF distance sensors need 90 ms to read + //read_multi_tof_sensors(); + //previousDistanceSensor1 = sensor1; //assume the sensor1 laser beam is not hindered at the very beginnings + //but it is a corner case + //isRunTime = false; + //moveBackward(10000); + + + delay(100); // the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + previousDistanceSensor1 = sensor1; //assume the sensor1 laser beam is not hindered at the very beginnings + //but it is a corner case + + } + + + + //Serial.println(F("Runtime")); + isRunTime = true; +} + +//======================================================================================================================================================================== + +void loop() { + // Notice that none of the action happens in loop() {} apart from reading millis() + // it just calls the functions that have the action code + //do not use while() loop or delay() in the loop() {} + //use synchronized timer/counter or asynchronous timer/counter + //set same clock or different clocks + //initial + //____________________________________________________________________________________________________________________ + //initialization(); + currentMillis = millis(); + // capture the latest value of millis() + // this is equivalent to noting the time from a clock + // use the same time for all operators to keep them synchronized + // in order to synchronize operators in each iteration of loop() {}, such as robot arm (servro1-6), a train (servo7) + isHereArray = 0x00; + + //read + //____________________________________________________________________________________________________________________ + //user IO + readButton(); //asynchronous, fast + //sensors + if (isHere(IR3))//the farthest InfraRedSensor + { + isHereArray = isHereArray | 0x01; // isHereArray = 0x00(0000 0000) | 0x01(0000 0001); + } + if (isHere(IR2))//the middle InfraRedSensor + { + isHereArray = isHereArray | 0x02; // isHereArray = 0x00(0000 0000) | 0x02(0000 0010); + } + if (isHere(IR1))//the closest InfraRedSensor + { + isHereArray = isHereArray | 0x04; // isHereArray = 0x00(0000 0000) | 0x04(0000 0100); + } + if (isHere())//altrasound + { + isHereArray = isHereArray | 0x08; // isHereArray = 0x00(0000 0000) | 0x08(0000 1000); + } + //asynchronous, fast + //Serial.println("isHereInfraRedSensor(IR1)"); + //Serial.println(isHere(IR1)); + //Serial.println(IR2); + //digitalRead() could not be put into the timer/counter {} + //Serial.println(isHere()); + //isHereArray recording the position of object + + + //essential sensors to control operators + read_multi_tof_sensors(); //asynchronous, fast + readRobot(); + //Receive data returned by the robotic arm + //asynchronous, fast + + //analysis + //make decisions + //take actions //synchronize, normal + //____________________________________________________________________________________________________________________ + run(); + //Serial.println(F("isSafe2grib")); + //Serial.println(isSafe2grib); + bool isDoneStep1 = step1(); + if (isDoneStep1) { + step3(); + } + + + //display //report to the PC or monitor + //____________________________________________________________________________________________________________________ + //screen.draw(sensor3); //asynchronous, very slow + + + //delay(100); // do not use delay() in the loop() {}, it will cause the currentMillis delay 100 ms, which could undermine the servo7 movement 100 * 0.0105 = about 1 cm +} + +//==================================================================================================================================================================== + +void initialization() { + //could be initialized again________________________ + durationMoveTrain_Max = durationMoveTrain_referPoint2jointPoint + 30000; //45000; + //dictionary: + //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement + durationMoveTrain_trashBin = durationMoveTrain_Max; + durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 10000; + + //could be initialized again________________________ + //assume servo7 is controlled by arduino board, Hiwonder robot arm board support it by providing energy and delivering information. + isRunningTrain = false; + + previousMoveServo7_timer = 0; //it is not enough to use int // stores the value of currentMillis as the previous time point for control the time of servo7 movement + allow2updatePreviousMoveServo7_timer = false; + + //integer distance; + previousDistanceSensor1 = 0; + sensor1 = 0; //train + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + durationMoveTrain = 0; + durationMoveTrain_remainingPlanned = 0; + isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + previousMillis = 0; + //unsigned short sensor2 = 0; + sensor3 = 0; + sensor4 = 0; + distance = 0; //ultrasound sensor + + //Record the number of touches + NumTouch = 0; + //byte buttonLed_State = LOW; + //the closest InfraRedSensor and altrasound sensor array + //reflect the object position + isHereArray = 0x00; + isSafe2grib = 0; + + //could be initialized again________________________ + read_multi_tof_sensors(); + previousDistanceSensor1 = sensor1; //assume the sensor1 laser beam is not hindered at the very beginnings + //but it is a corner case + + //initial timers/counters + //________________________________ + currentMillis = millis(); + // capture the latest value of millis() + // this is equivalent to noting the time from a clock + // use the same time for all operators to keep them synchronized + // in order to synchronize operators in each iteration of loop() {}, such as robot arm (servro1-6), a train (servo7) + //make sure the currentMillis > MAX(trainDuration, MAX(durationMoveTrain)) + currentMillis = millis(); + if (currentMillis <= durationMoveTrain_Max) { + unsigned int temp = durationMoveTrain_Max - currentMillis + 100; //unsigned int ////0 - (2^32 - 1) + //Serial.print(F("Initializing system for ")); + //Serial.print(temp/1000); + //Serial.println(F(" seconds")); + //delay(temp); + currentMillis = millis(); + } else {//currentMillis > durationMoveTrain_Max + //skip + } +} + +//Run button function +//======================================================================================================================================================================== + +void run() { + //analysis + //make decisions + //take actions //synchronize, normal + //____________________________________________________________________________________________________________________ + //initial + static byte step = 0; + //Serial.println(F("step")); + //Serial.println(step); + static unsigned long previousMillis_timer; //set loop check clock //unsigned long + if(previousMillis_timer <= abs2(currentMillis - (long)trainDuration))//synchronize + { + previousMillis_timer += trainDuration; //set clock + //all senstences below follow the same clock + //because we do not need to set different clocks + { + if ((NumTouch >= 1 && NumTouch <= 6) || NumTouch == 10) {//NumTouch = 1 - 4, 5, 6, or 10 + if (NumTouch == 5) {//initial + //skip + //do nothing + + } else {// (NumTouch != 5) //1s - 3s,15s, or wait + if (NumTouch == 4) {//wait + step = 0; //step = 0; + //wait here until the NumTouch is changed again + //Serial.println(F("wait here until the NumTouch is changed again, button4")); + + } else {//NumTouch == 1, 2, 3, 6 or 10 + if (NumTouch == 10) {//wait, besides, it means the robot is in front of the table right now + step = 0; //step = 0; + //wait here until the NumTouch is changed again + //Serial.println(F("wait here until the NumTouch is changed again, button10")); + } else {//NumTouch == 1, 2, 3, or 6 + //1s - 2s forward, or 1s backward, or 15s forward + if (step == 1) { + if (NumTouch == 3) {//backward + //currentMillis = millis(); + moveBackwardSafe(); + } else {//forward + //currentMillis = millis(); + moveForwardSafe(); + } + + if (!isRunningTrain) { + step = 2; + } + } else { + if (step == 2) { + if (NumTouch == 6) {//jump to the NumTouch 10, meaning the robot is in front of table + isSafe2grib = 1; + NumTouch = 10; + } else { + NumTouch = 4; //jump out to skip + } + } else {//default://step == 0: + + if (NumTouch == 6) { + //Override the value of durationMoveTrain + durationMoveTrain = durationMoveTrain_table; //durationMoveTrain = 15000; //durationMoveTrain = NumTouch * 1000; //durationMoveTrain = durationMoveTrain_Max; + + //Serial.println(F("15 seconds forward")); + } else {//NumTouch == 1 or 2 or 3 + if (NumTouch == 3) { + //Override the value of durationMoveTrain + durationMoveTrain = 1000; //durationMoveTrain = durationMoveTrain_Max; //durationMoveTrain = 40000; + //Serial.println(F("1 second backward")); + } else {//NumTouch == 1 or 2 + if (NumTouch == 1) { + //Override the value of durationMoveTrain + durationMoveTrain = NumTouch * 1000; //durationMoveTrain = durationMoveTrain_Max; //durationMoveTrain = 40000; + //Serial.println(F("1/2 seconds forward")); + } else {//NumTouch == 2 + //Override the value of durationMoveTrain + durationMoveTrain = 5000; //durationMoveTrain = durationMoveTrain_Max; //durationMoveTrain = 40000; + //Serial.println(F("1/2 seconds forward")); + } + } + + } + //Serial.println(durationMoveTrain); + //to put the variable below before the while loop is the same//byte isFirst = 1; + step = 1; + + } + } + } + } + } + } else {// (NumTouch >= 7 or == 0 + if (NumTouch >= 7) { + //Serial.println(F("button7/8/9")); + //switch + //switch between the original reference point and new reference point + if (NumTouch == 7) { + + //set the joint point as the reference point + referencePoint = jointPoint; + //durationMoveTrain_referPoint2jointPoint was the basis, it is 0 now + durationMoveTrain_referPoint2jointPoint = 0; + initialization(); + isRunTime = true; + + NumTouch = 0; + } else { + if (NumTouch == 8) { + //set 145 as the reference point + referencePoint = 145; + durationMoveTrain_referPoint2jointPoint = durationMoveTrain_OriginalReferPoint2jointPoint; + initialization(); + isRunTime = true; + + NumTouch = 0; + } else {//NumTouch >= 9 + //skip + } + } + + + } else {//NumTouch == 0 + //default + //Serial.println(F("button0")); + initTrain(sensor1); + step = 0; + + + } + } + + } + + + } +} + +//======================================================================================================================================================================== + +void loopInSetup() { + //simplified loop() {} + //corner case: cannot detect the barrier + //if there is barrier between sensor1 and train, train will moveforward without stop + isRunTime = true; + //for (unsigned short i = 65535; i > 0; i--) {}//this is not 65536, which causes overflow. + while(1) { + //initial + //____________________________________________________________________________________________________________________ + //initialization(); + currentMillis = millis(); + // capture the latest value of millis() + // this is equivalent to noting the time from a clock + // use the same time for all operators to keep them synchronized + // in order to synchronize operators in each iteration of loop() {}, such as robot arm (servro1-6), a train (servo7) + //read + //____________________________________________________________________________________________________________________ + readRobot(); + //Receive data returned by the robotic arm + //asynchronous, fast + //delay(100); // the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + + //analysis + //make decisions + //take actions + //____________________________________________________________________________________________________________________ + //initalize operators + //Step 0.default position: + //servos 1 - 6 stand still/ expended arm position (group action 0), the arm near the fridge by servos 7 rotation (initTrain()) + robotController.runActionGroup(0, 1); + //initialize train + initTrain(sensor1); + if (!isRunningTrain) {break;} + delay(trainDuration); + } + + + isRunTime = false; +} + + +//Step 1. +//mian function:throw the leftover away: +//======================================================================================================================================================================== + +bool step1() { + static bool isDone = false; + unsigned short robotInterval = trainDuration; + static unsigned long previousButtonMillis_timer; //unsigned long + static byte step; + //Serial.println(F("step1().step")); + //Serial.println(step); + if (previousButtonMillis_timer <= abs2(currentMillis - (long)robotInterval)) { + previousButtonMillis_timer += robotInterval; + + if (step == 0) { + //train move forward (to the right side on the picture), move to the front of the table, + //durationMoveTrain = durationMoveTrain_table; + //NumTouch = 6; + if(NumTouch != 10) + //the check process above is for the setup() or initialization process + return false; + if (isHereArray != 0x00 && isSafe2grib) { + isSafe2grib = 0; + //Serial.println(F("in1")); + //Serial.println(durationMoveTrain); + gribBowl(); + + } else {//isHereArray == 0x00 || !isSafe2grib + if (isHereArray == 0x00 && !isSafe2grib) { + //even if is not running, it could be unsafe //isSafe2grib = 1; + if (!robotController.isRunning()) { + //Serial.println(F("in2")); + //Serial.println(durationMoveTrain); + step = 1; + //move it to the trash bin, moveForward(durationMoveTrain_trashBin++) + durationMoveTrain = abs3(durationMoveTrain_trashBin - durationMoveTrain_table); //abs3() only applied to the integer + //isSafe2grib = 0; + } + //Serial.println(F("in3")); + //Serial.println(durationMoveTrain); + } + //Serial.println(F("in4")); + //Serial.println(durationMoveTrain); + } + //Serial.println(F("in5")); + // Serial.println(durationMoveTrain); + + + } else { + if (step == 1) { + + moveForwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 2; + } + + } else { + if (step == 2) { + if (isSafe2grib) { + isSafe2grib = 0; + throwLeftover(); + + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 3; + //move back(to the left side) to the table, + durationMoveTrain = abs3(durationMoveTrain_trashBin - durationMoveTrain_table) + 2000; //recalculate the variance of change direction + //abs3() only applied to the integer + } + } + } else { + if (step == 3) { + moveBackwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 4; + } + } else { + if (step == 4) { + if (isSafe2grib) { + isSafe2grib = 0; + //put bowl on the table, group action 57 + robotController.runActionGroup(57, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 5; + } + } + } else { + if (step == 5) { + //go back to the default position, initTrain(),(group action 0) + //initTrain(sensor1); //NumTouch = 0; + //robotController.runActionGroup(0, 1); + //only if we make sure there is no barrier, we can use NumTouch = 7; //NumTouch = 8; + //count++; + //if (count >= ) + previousButtonMillis_timer += 1 * 24 * 60 * 60 * 1000; //set clock + //step = 0; + step = 6; + //default go back to step 0 + isSafe2grib = 1; + isDone = true; + return isDone; + } else {//step >= 6 //others + //skip + //previousButtonMillis_timer += 1 * 24 * 60 * 60 * 1000; //set clock + //step = 0; + //default go back to step 0 + } + } + } + } + } + } + return isDone; + } + + +} + + +//Step 3.feed: +//======================================================================================================================================================================== +void step3() { +//do not use switch(){} in the if() {}{} structure. No matter directly or indirectly call in the if() {}, switch() will be not working + unsigned short robotInterval = trainDuration; + static unsigned long previousButtonMillis_timer; //unsigned long + static byte step; + //Serial.println(F("step3().step")); + //Serial.println(step); + //only each action in each step, because multi action cause some strange conflicts( such as only run one of them, or miss to check some of them) + //when moving train, no use arm group action, because in each step, the action is checked several times + if (previousButtonMillis_timer <= abs2(currentMillis - (long)robotInterval)) { + previousButtonMillis_timer += robotInterval; + + if (step == 0) { + + if(NumTouch != 10)//assume the robot is in front of table + //the check process above is for the setup() or initialization process + return; + if (isHereArray == 0x00) + //!!!!! after test, changeto isHereArray != 0x00 + return; + if (!robotController.isRunning()) { + step = 22; + //train move backward 2s //move to the side of the fidge(joint point + 9s , moveForward(durationMoveTrain_fridgeSide), + durationMoveTrain = 2000; + } + } else { + if (step == 22) { + moveBackwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 19; + } + } else { + if (step == 19) { + if (isSafe2grib) { + isSafe2grib = 0; + // (group 51)open the door of the fridge, group action 51, //1s 621 + 1s (642) + 1s (653) + 1s (674)+ fast rotota 1s(skip695, rotate servo 6 to 716 or 737) + //run group action 51 twice + robotController.runActionGroup(51, 1); + //assume the runActionGroup runtime of the robot arm is much longer than that of runTrain + + } else {//isHereArray != 0x00 && !isSafe2grib //isSafe2grib = 0; + if (!robotController.isRunning()) { + //even if is not running, it could be unsafe + step = 20; + isSafe2grib = 1; //isSafe2grib = 1; + } + } + } else { + + if (step == 20) { + if (isSafe2grib) { + isSafe2grib = 0; + //open the door of the fridge, group action 51, //1s 621 + 1s (642) + 1s (653) + 1s (674)+ fast rotota 1s(skip695, rotate servo 6 to 716 or 737) + //update 59 is 51_2 new, sweep a little more then first time + //which arm can avoid to be hindered by the line when run group 55 + robotController.runActionGroup(59, 1); + //if write this sentence in one step, actual run only once, + //besides, there is a problem about isRunning return + + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 1; + //train move backward 1s + durationMoveTrain = 1000; + } + } + } else { + + if (step == 1) { + moveBackwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 2; + } + } else { + if (step == 2) { + if (isSafe2grib) { + isSafe2grib = 0; + //group action 55: push the door open + robotController.runActionGroup(55, 1); + + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 3; + //train move backward 8s + durationMoveTrain = 8 * 1000; + } + } + } else { + if (step == 3) { + moveBackwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 4; + } + } else { + if (step == 4) { + if (isSafe2grib) { + isSafe2grib = 0; + //group action 56: push the door open, back and forth + robotController.runActionGroup(56, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 5; + isSafe2grib = 1; + } + } + } else { + if (step == 5) { + if (isSafe2grib) { + isSafe2grib = 0; + //pull arm back group action 58 never use group action 0:initial arm here + robotController.runActionGroup(58, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 6; + //train move backward,moveBackward(durationMoveTrain_fridge_sensor) or initTrain() + } + } + } else { + if (step == 6) { + //train move backward,moveBackward(durationMoveTrain_fridge_sensor) or initTrain() + initTrain(sensor1); + + if (!isRunningTrain) { + isSafe2grib = 1; + step = 7; + } + } else { + if (step == 7) { + if (isSafe2grib) { + isSafe2grib = 0; + //and then grib the container pillet, (need to make sure where is the bowl (how far = distance between each isHere sensor to the robot arm, + //height and width is almost fixed), GROUP action 18 19 20, keep it close to the base before moving + robotController.runActionGroup(18, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 8; + //move it to the side of table,moveForward(durationMoveTrain_table), + 12s + durationMoveTrain = durationMoveTrain_table + 12 * 1000; + } + } } else { + if (step == 8) { + moveForwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 9; + } + } else { + if (step == 9) { + if (isSafe2grib) { + isSafe2grib = 0; + //rotate the container several times quickly over the bowl,(how far = distance between each isHere sensor to the robot arm, + //height and width is almost fixed, 61 62 63 64 65 66 67), group action_turnOver() 7,keep pillet close to the base and + robotController.runActionGroup(61, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 10; + //moveBackward(durationMoveTrain_fridge_sensor) or initTrain() 8 9 10 + } + } + } else { + if (step == 10) { + //moveBackward(durationMoveTrain_fridge_sensor) or initTrain() 8 9 10 + initTrain(sensor1); + + if (!isRunningTrain) { + isSafe2grib = 1; + step = 11; + } + } else { + if (step == 11) { + if (isSafe2grib) { + isSafe2grib = 0; + //put the pillet and cracker container back, group action 6, + robotController.runActionGroup(6, 1); + + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 12; + isSafe2grib = 1; + } + } + } else { + if (step == 12) { + if (isSafe2grib) { + isSafe2grib = 0; + //close the door, group action 52, + robotController.runActionGroup(52, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 21; + //besides, moveForward(durationMoveTrain_fridge++)12s, + durationMoveTrain = 12 * 1000; + } + } + } else { + if (step == 21) { + moveForwardSafe(); + if (!isRunningTrain) { + isSafe2grib = 1; + step = 13; + } + } else { + if (step == 13) { + if (isSafe2grib) { + isSafe2grib = 0; + //then ,knock the door, group action 53 + robotController.runActionGroup(53, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 14; + isSafe2grib = 1; + //group action 0 + } + } + } else { + if (step ==14) { + if (isSafe2grib) { + isSafe2grib = 0; + robotController.runActionGroup(0, 1); + } else {//!isSafe2grib + if (!robotController.isRunning()) { + step = 15; + //go back to the default position, initTrain() + //go back to the default position, initTrain() + } + } + + } else { + if (step == 15) { + //go back to the default position, initTrain() + //NumTouch = 0; + if (initTrain(sensor1)){ //if (!isRunningTrain) { + //only if we make sure there is no barrier, we can use NumTouch = 7; //NumTouch = 8; + //count++; + //if (count >= ) + previousButtonMillis_timer += 1 * 24 * 60 * 60 * 1000; //set clock + step = 16; + //default go back to step 0 + } + + } else {//step (>= 16 && <= 18) or (>= 23) //others + //skip + //previousButtonMillis_timer += 1 * 24 * 60 * 60 * 1000; //set clock + //step = 0; + //default go back to step 0 + } + } + } + } + + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + } + + } + + } +} + +//======================================================================================================================================================================== + +void readRobot() { + unsigned short robotInterval = 100; + static unsigned long previousButtonMillis_timer; //unsigned long + if (previousButtonMillis_timer <= abs2(millis() - (long)robotInterval)) {// currentMillis = abs2(millis() - (long)robotInterval) + previousButtonMillis_timer += robotInterval; + robotController.receiveHandler(); + } + +} + +//put it into the bin after the cap open, (need to make sure where is the bin (how +//far = distance between bin to the robot arm, it could be fixed as well, height and width +//is almost fixed), shake in front of the bin and pull arm back, turnOver = servo 1 rotate 90 degree +//hold the bowl, (group action 54) +//======================================================================================================================================================================== + +void throwLeftover() { + //unsigned short robotInterval = trainDuration; + //static unsigned long previousButtonMillis_timer; //unsigned long + //if (previousButtonMillis_timer <= abs2(currentMillis - (long)robotInterval)) { + //previousButtonMillis_timer += robotInterval; + robotController.runActionGroup(54, 1); + //} +} + + +//gribbing the used bowl,(need to make sure where is the bowl (how far = distance +//between each isHere sensor to the robot arm, height and width is almost fixed), +//GROUP action 11 12 13 14 15 16 17, holding the bowl, keep it close to the base of arm before moving +//======================================================================================================================================================================== + +void gribBowl() { + unsigned short robotInterval = trainDuration; + static unsigned long previousButtonMillis_timer; //unsigned long + if (previousButtonMillis_timer <= abs2(currentMillis - (long)robotInterval)) { + previousButtonMillis_timer += robotInterval; + //isHereArray recording the position of object + //Serial.println(F("isHereArray")); + //Serial.println(isHereArray); + if(isHereArray == 0x00) { + //case 0x00: //default//0x00(0000 0000) + //no object detected in front of sensors + //skip + } else { + if(isHereArray == 0x01) { + //case 0x01://0x01(0000 0001) + //just in front of the farthest InfraRedSensor + robotController.runActionGroup(11,1); + }else { + if(isHereArray == 0x03) { + //case 0x03://0x03(0000 0011) + //between the middle and the farthest InfraRedSensor + robotController.runActionGroup(12,1); + } else { + if(isHereArray == 0x02) { + //case 0x02://0x02(0000 0010) + robotController.runActionGroup(13,1); + } else { + if(isHereArray == 0x07) { + //case 0x07://0x07(0000 0111) + robotController.runActionGroup(13,1); + //just in front of the middle InfraRedSensor + } else { + if(isHereArray == 0x06) { + //case 0x06://0x06(0000 0110) + //between the closest and the middle InfraRedSensor + robotController.runActionGroup(14,1); + } else { + if(isHereArray == 0x04) { + //case 0x04://0x02(0000 0100) + robotController.runActionGroup(15,1); + } else { + if(isHereArray == 0x0E) { + //case 0x0E://0x02(0000 1110)//14 + robotController.runActionGroup(15,1); + //just in front of the closest InfraRedSensor + } else { + if(isHereArray == 0x0C) { + //case 0x0C://0x0C(0000 1100)//12 + //between the closest InfraRedSensor and the ultrasound sensor + robotController.runActionGroup(16,1); + } else { + if(isHereArray == 0x08) { + //case 0x08://0x08(0000 1000) + + robotController.runActionGroup(17,1); + //just in front of the ultrasound sensor + } else { + //default://otherwise + //others shake the arm let pet leave the place + } + } + + } + } + + } + } + } + } + } + } + + } + +} + +//======================================================================================================================================================================== + +void try2Recover() { +//sensor1 < sensor1_Min || durationMoveTrain > durationMoveTrain_Max + //normally it is not allowed to move over durationMoveTrain_Max or under sensor1_Min + //no sensor signal available + //but let us try to go back to the reference point, sensor1 145 + //move train only if the sensor value is from sensor1 0 to 710 + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + //trainDuration = (147 - 143)/ speedTrain = 595.24 ms + short temp = sensor1 - referencePoint; //unsigned short + //Serial.println(F("sensor1 - referencePoint")); + //Serial.println(temp); + //durationMoveTrain = (targetedPoint - referencePoint) / speedTrain; + durationMoveTrain = (int)(abs2((long)temp)/speedTrain); //abs3() can only be used for integer //unsigned int + //Serial.println(F("durationMoveTrain")); + //Serial.println(durationMoveTrain); + if (durationMoveTrain > durationMoveTrain_Max && sensor1 <= 710) { + durationMoveTrain = durationMoveTrain_referPoint2jointPoint; + allow2updatePreviousMoveServo7_timer = true; //unlock + moveBackward(durationMoveTrain); + //not update// it is not correct //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //difference + } else { + if (sensor1 >= 0 && sensor1 < sensor1_Min) { + durationMoveTrain = (referencePoint - sensor1_Min)/ speedTrain; ////assume referencePoint > sensor1_Min + allow2updatePreviousMoveServo7_timer = true; //unlock + moveForward(durationMoveTrain); + + } else { + // (sensor1 < 0 || sensor > 710) // too close || over far + //genearlly it is impossible to reach that close or far, meaning it could be some bugs or noise + //skip or ignore + } + } + +} +//======================================================================================================================================================================== + +/* + if (previousButtonMillis_timer <= abs2(millis() - (long)buttonInterval)) {// currentMillis = abs2(millis() - (long)buttonInterval) + + //if (digitalRead(buttonPin) != LOW) { + //delay(80); + if (digitalRead(buttonPin) == LOW) { + previousButtonMillis_timer += buttonInterval; + + Serial.println(F("button")); + Serial.println(NumTouchLocal); + NumTouchLocal++; + if (NumTouchLocal > 2) {NumTouchLocal = 1;} + //buttonLed_State = ! buttonLed_State; // this changes it to low if it was high + // and to high if it was low + } + //} + } +*/ +void readButton() { +//do not use while() loop or delay() in the loop() {} +//use synchronized timer/counter or asynchronous timer/counter +//set same clock or different clocks + // ask + // this only reads the button state after the button interval has elapsed + // this avoids multiple flashes if the button is pressed + // Notice that there is no need to synchronize this, using millis() instead of currentMillis + // use of millis() with the flashing Leds + // every time the button is pressed it changes buttonLed_State causing: + static byte step; //0 - 255 + static byte NumTouchLocal = 0; + static unsigned short count; //0 - 65535 + static unsigned long previousButtonMillis_timer; + unsigned short buttonInterval = 200; //200; //300 + + + //if (robotController.isRunning()) + // return; + //if (isRunningTrain) + // return; + + if (previousButtonMillis_timer <= abs2(millis() - (long)buttonInterval)) {// currentMillis = abs2(millis() - (long)buttonInterval) + if (step == 0) //do not use switch(){} in the if() {}{} structure + {//case 0: + if (digitalRead(buttonPin) == LOW) + {//Detection touch sensor + digitalWrite(LED, HIGH); + delay(500); + if (digitalRead(buttonPin) != LOW) + {//If it is short press once + digitalWrite(LED, LOW); + NumTouchLocal ++ ; + count = 0; + step = 1; + previousButtonMillis_timer += buttonInterval; + } + } + } else { + if (step == 1) { + //case 1: + if (digitalRead(buttonPin) == LOW) + {//Detection touch sensor + digitalWrite(LED, HIGH); + delay(500); + if (digitalRead(buttonPin) != LOW) + {//If it is short touch once + NumTouchLocal ++ ; + digitalWrite(LED, LOW); + if (NumTouchLocal > 9) + NumTouchLocal = 9; + count = 0; + previousButtonMillis_timer += buttonInterval; + } + } + else + { + count++; + if (count > 15) + { + step = 2; + count = 0; + } + else + { + previousButtonMillis_timer += buttonInterval; + } + } + + } else { + if (step == 2) { + //case 2: + //output NumTouchLocal + NumTouch = NumTouchLocal; + count++; + if (count > 1) + { + count = 0; + NumTouchLocal = 0; + step = 0; + } + + } else { + //default: + NumTouchLocal = 0; + count = 0; + step = 0; + } + } + } + + Serial.println(F("button")); + Serial.println(NumTouchLocal); + //Serial.println(NumTouch); + + } + +} + +//======================================================================================================================================================================== + +bool isHere() +{ //ultrasound sensor + static unsigned long previousMillis_timer; + unsigned short sensorInterval = 100; + bool isHere = false; + if (previousMillis_timer <= abs2(millis() - (long)sensorInterval))// currentMillis - sensorInterval could be != abs2(millis() - (long)sensorInterval) + { + previousMillis_timer += sensorInterval; //synchronize, besides, set clock + distance=((short)ultrasound.GetDistance())/10; //unsigned short + //Serial.println(distance); //Get and print distance of serial port, unit mm + //if (robotController.isRunning() == false) //Execute when the robotic arm stop running + { + if (distance <= 10) + { + isHere = true; + ultrasound.rainbow_color(); + } else {//>10 + ultrasound.Color(0, 255, 0, 0, 255, 0); //green + } + } + return isHere; + } +} + +//======================================================================================================================================================================== + +bool isHere(byte ID) //InfraRedSensor +{ //infrared sensor + //??digitalRead() is not compitable with timer/counter + //static unsigned long previousMillis_timer; + //unsigned short sensorInterval = 500; + bool isHere = false; + //if (previousMillis_timer <= abs2(millis() - (long)sensorInterval))// currentMillis - sensorInterval could be != abs2(millis() - (long)sensorInterval) + //{ + //previousMillis_timer += sensorInterval; //synchronize, besides, set clock + //a object is detected by the sensor + if (digitalRead(ID) == LOW) + { + isHere = true; + } else { + //skip + } + return isHere; + //} +} + +//======================================================================================================================================================================== + +void setID() { + // all reset + digitalWrite(SHT_LOX1, LOW); + digitalWrite(SHT_LOX2, LOW); + digitalWrite(SHT_LOX3, LOW); + digitalWrite(SHT_LOX4, LOW); + delay(10); + // all unreset + digitalWrite(SHT_LOX1, HIGH); + digitalWrite(SHT_LOX2, HIGH); + digitalWrite(SHT_LOX3, HIGH); + digitalWrite(SHT_LOX4, HIGH); + delay(10); + + // activating LOX1 and reseting LOX2 + digitalWrite(SHT_LOX1, HIGH); + digitalWrite(SHT_LOX2, LOW); + digitalWrite(SHT_LOX3, LOW); + digitalWrite(SHT_LOX4, LOW); + + /* + // initing LOX1 + Wire.begin(); //This function initializes the Wire library + lox1.setAddress(LOX1_ADDRESS); //set address// + if(!lox1.init()) { + Serial.println(F("Failed to boot first VL53L0X")); + //while(1); + } + */ + // initing LOX1 + if(!lox1.begin(LOX1_ADDRESS, false, &Wire, 3)) { + //Serial.println(F("Failed to boot first VL53L0X, LOX1")); + //while(1); + } + delay(10); + + // activating LOX2 + digitalWrite(SHT_LOX2, HIGH); + delay(10); + + //initing LOX2 + //Wire.begin(); //This function initializes the Wire library + //default//lox2.setAddress(LOX2_ADDRESS); //set address// + //if(!lox2.init()) { + // Serial.println(F("Failed to boot second VL53L0X")); + //while(1); + //} + + + // activating LOX3 + digitalWrite(SHT_LOX3, HIGH); + delay(10); + + //initing LOX3 + Wire.begin(); //This function initializes the Wire library + lox3.setAddress(LOX3_ADDRESS); //set address// + if(!lox3.init()) { + //Serial.println(F("Failed to boot third VL53L0X, LOX3")); + //while(1); + } + //lox3.setMeasurementTimingBudget(sensor1_Min); + //a longer timing budget allows for more accurate measurements. + + // activating LOX4 + digitalWrite(SHT_LOX4, HIGH); + delay(10); + + //initing LOX4 + Wire.begin(); //This function initializes the Wire library + lox4.setAddress(LOX4_ADDRESS); //set address// + if(!lox4.init()) { + //Serial.println(F("Failed to boot fourth VL53L0X, LOX4")); + //while(1); + } +} + +//======================================================================================================================================================================== + +void read_multi_tof_sensors() { + // the TOF distance sensors need 90 ms to read + //asynchronous, fast + static unsigned long previousMillis_timer; + unsigned short sensorInterval = 100; //short + if (previousMillis_timer < abs2(millis() - (long)sensorInterval))// currentMillis - sensorInterval could be != abs2(millis() - (long)sensorInterval) + { + previousMillis_timer += sensorInterval; //set clock + //make sure that the sensor value is number instaed of some mysterious string + // this holds the measurement + VL53L0X_RangingMeasurementData_t measure1; + + lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout! + // print sensor1 reading + Serial.print(F("1: ")); + if(measure1.RangeStatus != 4) { // if not out of range + sensor1 = measure1.RangeMilliMeter; + Serial.print(sensor1); + //Serial.print(F("mm")); + } else { + //Serial.print(F("Out of range")); + } + /* + Serial.print(F("1: ")); + Serial.print(lox1.readRangeSingleMillimeters()); + Serial.print(F("mm")); + */ + + //Serial.print(F(" ")); + + // print sensor2 reading + //Serial.print(F("2: ")); + // Serial.print(lox2.readRangeSingleMillimeters()); + // Serial.print(F("mm")); + + Serial.print(F(" ")); + + // print sensor3 reading + Serial.print(F("3: ")); + sensor3 = lox3.readRangeSingleMillimeters(); + Serial.print(sensor3); + //Serial.print(F("mm")); + + Serial.print(F(" ")); + + // print sensor4 reading + Serial.print(F("4: ")); + sensor4 = lox4.readRangeSingleMillimeters(); + Serial.print(sensor4); + //Serial.print(F("mm")); + + Serial.println(); + } + +} + +//======================================================================================================================================================================== + +bool isHinderedSensor1() { + //asynchronous + //static unsigned long previousMillis_timer; + //unsigned short sensorInterval = 100; + bool isHindered = false; //sensor laser beam is not hindered + //unsigned long difference; + // if (previousMillis_timer <= abs2(millis() - (long)sensorInterval))// currentMillis - sensorInterval could be != abs2(millis() - (long)sensorInterval) + //{ + // previousMillis_timer += sensorInterval; //set clock // previousMillis_timer = previousMillis_timer + sensorInterval; + //double check whether we need to update the durationMoveTrain + //sensor1 is not stuck + //assume the sensor1 value will not stuck in a constant value when the robot arm moves + //assumw the pet will not stand between the sensor and the robot arm + //delay(100); + //sensor1 has been updated + //previousDistanceSensor1 is still the same as above in the function + //952 > 100 no need to update previousMillis_timer//1000; //no need 120; + + if (isRunningTrain) { //train is moving + short temp = previousDistanceSensor1 - sensor1; + //Serial.println(F("previousDistanceSensor1")); + //Serial.println(previousDistanceSensor1); + //Serial.println(F("sensor1")); + //Serial.println(sensor1); + //Serial.println(F("difference")); + //Serial.println((short)abs2((long)temp)); //abs3() can only be used for integer + //Serial.println(F("2 * trainDuration * speedTrain")); + //Serial.println(2 * trainDuration * speedTrain); + //if is hindered, the difference > 0 + if ((previousDistanceSensor1 > sensor1) && (short)abs2((long)temp) > barrierIndex * trainDuration * speedTrain) { // (referencePoint + 2 - sensor1_Min) = 47 + //abs3() can only be used for integer + //difference > 2 * trainDuration * speedTrain + //case1: sensor1 is hindered by pet or something else + //because of sensor stuck + //due to the barrier + isHindered = true; + } else {//difference + //skip + } + } else {//!isRunningTrain + //corner case + //skip + // + } + //Serial.println(F("isHindered")); + //Serial.println(isHindered); + return isHindered; + //} +} + +//======================================================================================================================================================================== + +//Moving train to the reference point is its function +//moveBackward(), if the robot is on the right side of the reference point +//moveForward(), if the robot is on the left side of the reference point +bool initTrain(unsigned short sensor1) { + //moving the robot arm platform to the reference point is the function + //normally, it is used in the runtime, loop() {} + //initial + static unsigned long previousMillis_timer; //set loop check clock + static byte isFirstTime = 1; //flag check whether it is the first time to enter the codes about the hindered state + bool isDone = false; + if(previousMillis_timer <= abs2(currentMillis - (long)trainDuration)) + { + previousMillis_timer += trainDuration; + //synchronize, besides, set clock + //1000; //no need 120; + //Serial.println(F("sensor1")); + //Serial.println(sensor1); + //Serial.println(F("previousDistanceSensor1")); + //Serial.println(previousDistanceSensor1); + if (sensor1 >= referencePoint - 2 && sensor1 <= referencePoint + 2) {//about 145 + //stop + isDone = true; + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + return isDone; + } else {// sensor1 < referencePoint - 2 || sensor1 > referencePoint + 2 + //Serial.println(F("sensor1 < referencePoint - 2 || sensor1 > referencePoint + 2")); + //move train only if the sensor value is from sensor1 0 to 710 + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + //trainDuration = (147 - 143)/ speedTrain = 595.24 ms + short temp = sensor1 - referencePoint; //unsigned short + //Serial.println(F("sensor1 - referencePoint")); + //Serial.println(temp); + //durationMoveTrain = (targetedPoint - referencePoint) / speedTrain; + durationMoveTrain = (int)(abs2((long)temp)/speedTrain); //abs3() can only be used for integer //unsigned int + //Serial.println(F("durationMoveTrain")); + //Serial.println(durationMoveTrain); + if (sensor1 >= sensor1_Min && durationMoveTrain <= durationMoveTrain_Max) { + + //Serial.println(F("isHindered: ")); + //Serial.println(isHinderedSensor1()); + if (isHinderedSensor1()) { + //assume the train is moving + //case1: sensor1 is hindered by pet or something else + //the reference point calculated during the runtime is wrong due to barrier + //but it is fine, after the pet move away, the reference pint will be recalculated and corrected. + //Serial.println(F("isB")); + + if (isFirstTime) {//step == 1 + //normally, the durationMoveTrain(remainning duration) is recorded only (once) at the beginning of movement + //during the movement, the previousMoveServo7_timer is not updated + //if eveything is running smoothly, the durationMoveTrain is equal to the difference between the previousMoveServo7_timer recorded and currentTime + //if the train is paused temperarily, besides, the real time(currentTime) is never stopped + // we recorded the remainning duration only (once) at the beginning of the pause (not before the robot moves again, because the currentTime is changed). + //therefore, we can assign the remainning duration to durationMoveTrain only (once) at the beginning of the pause, like this: + ///////////durationMoveTrain = abs3(durationMoveTrain_remainingPlanned - trainDuration); + //durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); + // durationMoveTrain's physical rule is recording the total/remaining time of train movement. + //which we can use the same variable, durationMoveTrain, to represent two physical rules: + //1. Represent the total time point when there is no barrier. In other words, planned duration of the train Movement. + //////////durationMoveTrain = targeted duration; //For example, durationMoveTrain = 5000; //meaning set 5s movement + //////////allow2updatePreviousMoveServo7_timer = true; //unlock + //2. Represent the remainning time period when there is a barrier. + //////////durationMoveTrain = durationMoveTrain_remainingPlanned; + //////////allow2updatePreviousMoveServo7_timer = true; //unlock + durationMoveTrain = abs3(durationMoveTrain_remainingPlanned - abs2(millis() - previousMillis)); //?0.5 delay + //durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); + //the durationMoveTrain_remainingPlanned will be recorded by durationMoveTrain. + //abs3() only applied to the integer + //abs3() can only be used for integer + allow2updatePreviousMoveServo7_timer = true; //unlock + + isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + isFirstTime = 0; // step = 2; + + //pause + pauseTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + /* + if (isRunningTrain) { + + } else {//!isRunningTrain + + } + */ + //there is barrier, the sensor1 value is wrong + //previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + + } else {//!isFirstTime + //skip + //wait here + //pause + pauseTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + + //there is barrier, the sensor1 value is wrong + //previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + } + + + } else {//!isHinderedSensor1() + isFirstTime = 1; // step = 1; + if (isFirstTime2SetDurationMoveTrain_remainingPlanned) { + isFirstTime2SetDurationMoveTrain_remainingPlanned = false; + //1.only (once) at the beginning of train movement (before recover from the hindered state), + //2.only (once) at the beginning of train movement (user set), + //the durationMoveTrain_remainingPlanned will be reset + //only the train is really stopped for a reasonable reason, not pause not skip, just correct to stop + //In other words, the train finished the request movement, then + //isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + durationMoveTrain_remainingPlanned = durationMoveTrain; + + } else { + + durationMoveTrain_remainingPlanned = abs3(durationMoveTrain_remainingPlanned - abs2(millis() - previousMillis)); + //the value above which is calculated since the very second time. In other words, + //this variable will be updated (all the time) during the required movement + //abs3() can only be used for integer + } + previousMillis = millis(); + + //durationMoveTrain can be used to show the big picture, while it could not be accurate when train is far from joint point + if (sensor1 > jointPoint && durationMoveTrain <= durationMoveTrain_Max) { + //synchronize + + //Serial.println(F("currentMillis")); + //Serial.println(currentMillis); + //Serial.println(F("previousMoveServo7_timer")); + //Serial.println(previousMoveServo7_timer); + //Serial.println(F("durationMoveTrain_remainingPlanned")); + //Serial.println(durationMoveTrain_remainingPlanned); + //Serial.println(F("durationMoveTrainBeforeOverride")); + //Serial.println(durationMoveTrain); + //check the difference between scheduled (the previous loop) remaining and actual (the currunt loop) + //if the variance between differenceDuration and trainDuration is too large, meaning the speed is very unstable or the sensor1 is very unaccurate + unsigned int differenceDuration = abs3(durationMoveTrain_remainingPlanned - durationMoveTrain); //abs3() can only be used for integer + //Serial.println(F("differenceDuration")); + //Serial.println(differenceDuration); + //Serial.println("trainDuration"); + //Serial.println(trainDuration); + //Through the test, we found it is because the sensor1 is not accurate in this case + //Therefore, give up to control precisely the position through the sensor1 in the case + //Override the value of durationMoveTrain + durationMoveTrain = durationMoveTrain_OriginalReferPoint2jointPoint; + //Serial.println(durationMoveTrain); + // corner case if the runtime is smaller than the calculated durationMoveTrain at the very beginning, settng clock will be missed + //check the difference between scheduled (the previous loop) remaining and actual (the currunt loop) + if (durationMoveTrain_remainingPlanned < durationMoveTrain) { + // (abs3(durationMoveTrain_remainingPlanned) < durationMoveTrain)//set clock ////abs3() can only be used for integer + //abs3() can only be used for integer + //Serial.println(F("bigger asdfsdsff")); + //skip or continue to move + //small deviation or vibration is acceptable + + //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + if (previousDistanceSensor1 > sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 <= sensor1 + //skip + } + } else {//durationMoveTrain_remainingPlanned >= durationMoveTrain + //Serial.println(F("bigger jointPointfsdfsdfsdfsdf")); + allow2updatePreviousMoveServo7_timer = true; //unlock + moveBackward(durationMoveTrain); + } + + + + + } else { + //sensor1_Min <= sensor1 < referencePoint - 2 || referencePoint + 2 < sensor1 <= jointPoint + //case2: sensor1 is not accurate (the value is too big or too small) during the previous loop period + //accurate control + short temp = previousDistanceSensor1 - sensor1; + unsigned short differenceDistance = (short)abs2((long)temp); + //Serial.println(F("sensor1_Min <= sensor1 < referencePoint - 2 || referencePoint + 2 < sensor1 <= jointPoint")); + //Serial.println(F("previousDistanceSensor1")); + //Serial.println(previousDistanceSensor1); + //Serial.println(F("differenceDistance")); + //Serial.println(differenceDistance); + //Serial.println(F("trainDuration * speedTrain * (1 - safeIndex)")); + //Serial.println(trainDuration * speedTrain * (1 - safeIndex)); + //Serial.println(F("trainDuration * speedTrain * (1 + safeIndex)")); + //Serial.println(trainDuration * speedTrain * (1 + safeIndex)); + //if (differenceDistance >= trainDuration * speedTrain * (1 - safeIndex) && differenceDistance <= trainDuration * speedTrain * (1 + safeIndex) ) { + + //idealy, the speed of train is stable, + //the distance difference per duration = trainDuration * speedTrain // (147 - 143) = 5 //10 //10.5 + //Besides, considering the sensor value deviation.//but moveback value deviation is pretty small + //sensor1 value could be floating between expectedValue - 1 to expectedValue + 1 + // (592 * 0.0084 * 0.7 = 3.4810, center = 592 * 0.0084 = 5, 592 * 0.0084 * 1.3 = 6.4646) + // (592 * 0.0084 * 0.2 = 0.9946, center = 592 * 0.0084 = 5, 592 * 0.0084 * 1.8 = 8.9510) + //nevertheless, the actual speed is a little high, + //592 * 0.0105 = 6.2160, it is very close to the upper boundary, + //therefore, how about 0.7 as upper-band safeindex, 592 * 0.0084 * 1.7 = 8.4538 + //test 3 use safeindex = 0.8 control both boundries + if (differenceDistance >= trainDuration * speedTrain * (1 - safeIndex) && differenceDistance <= trainDuration * speedTrain * (1.7) ) { + //Serial.println(F("less jointPoint durationMoveTrain_Max0skip")); + //continue to move + //small deviation or vibration is acceptable + previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + } else { //it could stop (differenceDistance < trainDuration * speedTrain * (1 - safeIndex)) or not in the range + //reset + //Override the value of durationMoveTrain + if (durationMoveTrain < trainDuration) { + //1000; //define the smallest step distance//resolution + durationMoveTrain = trainDuration; + } else { + //skip + + } + + allow2updatePreviousMoveServo7_timer = true; + if (sensor1 > referencePoint + 2) { + //Serial.println(F("sensor1 > referencePoint + 2 movef")); + //if (sensor1 > referencePoint + 2 && sensor1 <= jointPoint) {}//joint + moveBackward(durationMoveTrain); //set clock + + } else {//< referencePoint - 2 + //Serial.println(F("< referencePoint - 2moveForward")); + //if (sensor1 >= sensor1_Min && sensor1 < referencePoint - 2) {} + moveForward(durationMoveTrain); //set clock ////case1: + + + } + } + + + + } + + + } + + + + } else { + //sensor1 < sensor1_Min || durationMoveTrain > durationMoveTrain_Max + //normally it is not allowed to move over durationMoveTrain_Max or under sensor1_Min + //no sensor signal available + //Serial.println(F("sensor1 < sensor1_Min || durationMoveTrain > durationMoveTrain_Max")); + pauseTrain(); + if (sensor1 >= 0 && sensor1 < sensor1_Min) { + //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + + } + } + + + + + } + + //Serial.println('loop'); + return isDone; //-1//false//while(1); + } +} + +//======================================================================================================================================================================= + +unsigned int abs3(int temp) { + unsigned int result; + //traditional abs3() can only be used for integer + if (temp >= 0) { + result = temp; + } else {//temp <= 0 + result = 0 - temp; + } + + return result; +} + +//======================================================================================================================================================================= + +unsigned long abs2(long temp) { + unsigned long result; + //traditional abs3() can only be used for integer + if (temp >= 0) { + result = temp; + } else {//temp <= 0 + result = 0 - temp; + } + + return result; +} + +//train move backward (to the left side): +//======================================================================================================================================================================== + +void moveBackward(unsigned int durationMoveTrain) { + if (isRunTime) { + static unsigned long previousMillis_timer; //set loop check clock + if(previousMillis_timer <= abs2(currentMillis - (long)trainDuration)) + { + previousMillis_timer += trainDuration; + //synchronize, besides, set clock + //1000; // no need 250; + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (sensor1 >= sensor1_Min) { + //Serial.println(F("allow2updatePreviousMoveServo7_timer")); + //Serial.println(allow2updatePreviousMoveServo7_timer); + if (allow2updatePreviousMoveServo7_timer) { + //start + //////records the previous time point only (once) at the beginning of train movement, like this: + //////////if (allow2updatePreviousMoveServo7_timer == true) {} + //////keeps or locks the previous time point/value/variable during the whole train movement process: + //////////allow2updatePreviousMoveServo7_timer = false; + //////////previousMoveServo7_timer = currentMillis; + //reset the previousMoveServo7_timer automatically only if the train will begin to move. + //There are two situations in which the train will begin to move: + // (a) when users ask to move train or + // (b) when the train is not hindered and it continues to finish the previous movement. + allow2updatePreviousMoveServo7_timer = false; //lock + previousMoveServo7_timer = currentMillis; + //Serial.println(F("previousMoveServo7_timer")); + //Serial.println(previousMoveServo7_timer); + //synchronize + // capture the latest value of currentMillis + // this is equivalent to noting the time from a clock + // use the same time for all servo 7 movements to keep them synchronized + + robotController.moveServo(7, 485, 1000); //set speed + isRunningTrain = true; + } else {//!allow2updatePreviousMoveServo7_timer + //Serial.println(durationMoveTrain_accumulationActual); + //Serial.println(durationMoveTrain); + unsigned long durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); //abs3() can only be used for integer + if (durationMoveTrain_accumulationActual >= durationMoveTrain) {// only no sensor signal case, we guess + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + } else {//durationMoveTrain_accumulationActual < durationMoveTrain + //skip + //do nothing if we have already stopped the train + //continue to move if the train is running + } + } + + //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + if (previousDistanceSensor1 > sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 <= sensor1 + //skip + } + + + } else {//sensor < sensor1_Min + //skip //do nothing + } + + } else { + //skip//do nothing + } + } else {//set up + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (sensor1 >= sensor1_Min) { + robotController.moveServo(7, 485, 1000); //set speed + /* + //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + if (previousDistanceSensor1 > sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 <= sensor1 + //skip + } + */ + isRunningTrain = true; + delay(durationMoveTrain); + stopTrain(); + //assume the sensor1 laser beam is not hindered at the very beginnings + //it could be wrong// previousDistanceSensor1 = sensor1; + + } else {//sensor < sensor1_Min + //skip //do nothing + } + } +} + +//train move forward (to the right side on the picture): +//======================================================================================================================================================================== + +void moveForward(unsigned int durationMoveTrain) { + if (isRunTime) { + static unsigned long previousMillis_timer; //set loop check clock + if(previousMillis_timer <= abs2(currentMillis - (long)trainDuration)) + { + previousMillis_timer += trainDuration; + //synchronize, besides, set clock + //1000; // no need 250; + + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (durationMoveTrain <= durationMoveTrain_Max) { + //Serial.println(allow2updatePreviousMoveServo7_timer); + if (allow2updatePreviousMoveServo7_timer) { + //start + //////records the previous time point only (once) at the beginning of train movement, like this: + //////////if (allow2updatePreviousMoveServo7_timer == true) {} + //////keeps or locks the previous time point/value/variable during the whole train movement process: + //////////allow2updatePreviousMoveServo7_timer = false; + //////////previousMoveServo7_timer = currentMillis; + //reset the previousMoveServo7_timer automatically only if the train will begin to move. + //There are two situations in which the train will begin to move: + // (a) when users ask to move train or + // (b) when the train is not hindered and it continues to finish the previous movement. + allow2updatePreviousMoveServo7_timer = false; //lock + //default//allow2updatePreviousMoveServo7_timer = false; //lock + previousMoveServo7_timer = currentMillis; //update + //Serial.println(F("previousMoveServo7_timer")); + //Serial.println(previousMoveServo7_timer); + //synchronize + // capture the latest value of currentMillis + // this is equivalent to noting the time from a clock + // use the same time for all servo 7 movements to keep them synchronized + + robotController.moveServo(7, 515, 1000); //set speed + isRunningTrain = true; + //Serial.println(F("durationMoveTrain_accumulationActual")); + //Serial.println(currentMillis - previousMoveServo7_timer); + //Serial.println(durationMoveTrain); + } else {//!allow2updatePreviousMoveServo7_timer + unsigned long durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); //abs3() can only be used for integer + if (durationMoveTrain_accumulationActual >= durationMoveTrain) {// only no sensor signal case, we guess + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + } else {//durationMoveTrain_accumulationActual < durationMoveTrain + //skip + //do nothing if we have already stopped the train + //continue to move if the train is running + + } + } + + //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + + + } else {//durationMoveTrain > durationMoveTrain_Max + //skip //do nothing + } + } else { + //skip//do nothing + } + } else {//set up + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (durationMoveTrain <= durationMoveTrain_Max) { + robotController.moveServo(7, 515, 1000); //set speed + /* + //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + */ + isRunningTrain = true; + delay(durationMoveTrain); + stopTrain(); + //assume the sensor1 laser beam is not hindered at the very beginnings + //it could be wrong// previousDistanceSensor1 = sensor1; + } else {//durationMoveTrain > durationMoveTrain_Max + //skip //do nothing + } + } + +} + + +//======================================================================================================================================================================== + +void stopTrain() { + //default//allow2updatePreviousMoveServo7_timer = false; //lock + robotController.moveServo(7, 500, 1); //train stop: + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //no update it because it could be not correct + isRunningTrain = false; + //only the train is really stopped for a reasonable reason, not pause not skip, just correct to stop + //In other words, the train finished the request movement, then + isFirstTime2SetDurationMoveTrain_remainingPlanned = true; +} + +//======================================================================================================================================================================== + +void pauseTrain() { + //default//allow2updatePreviousMoveServo7_timer = false; //lock + robotController.moveServo(7, 500, 1); //train stop: + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not hindered + //no update it because it could be not correct + isRunningTrain = true; + //because it is not a right stop + //besides, if isRunning Train = 0, group action will continue to be run wrongly. + //only the train is really stopped for a reasonable reason, not pause not skip, just correct to stop + //In other words, the train finished the request movement, then + //isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + //otherwise, default is false during the whole runTime +} + +//======================================================================================================================================================================== +void moveForwardSafe() { + + static unsigned long previousButtonMillis_timer; //unsigned long + static byte step; + //Serial.println(F("moveForwardSafe().step")); + //Serial.println(step); + if (previousButtonMillis_timer <= abs2(currentMillis - (long)trainDuration)) { + previousButtonMillis_timer += trainDuration; + + if (step == 0) { + allow2updatePreviousMoveServo7_timer = true; //unlock + isRunningTrain = true; + step = 1; + } else { + if (step == 1) { + if (0) {// (isHinderedSensor1()) { + //2. represent the remainning time period when there is a barrier. + durationMoveTrain = abs3(durationMoveTrain_remainingPlanned - abs2(millis() - previousMillis)); //?0.5 delay + //durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); + //abs3() only applied to the integer + //Serial.println(F("durationMoveTrain In barrierd branch")); + //Serial.println(durationMoveTrain); + allow2updatePreviousMoveServo7_timer = true; //unlock + + step = 2; + isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + + //pause + pauseTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + + //there is barrier, the sensor1 value is wrong + //previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + + } else {//!isHinderedSensor1() + + if (isFirstTime2SetDurationMoveTrain_remainingPlanned) { + isFirstTime2SetDurationMoveTrain_remainingPlanned = false; + //1.only (once) at the beginning of train movement (before recover from the hindered state), + //2.only (once) at the beginning of train movement (user set), + //the durationMoveTrain_remainingPlanned will be reset + //only the train is really stopped for a reasonable reason, not pause not skip, just correct to stop + //In other words, the train finished the request movement, then + //isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + durationMoveTrain_remainingPlanned = durationMoveTrain; + + } else { + + durationMoveTrain_remainingPlanned = abs3(durationMoveTrain_remainingPlanned - abs2(millis() - previousMillis)); + //the value above which is calculated since the very second time. In other words, + //this variable will be updated (all the time) during the required movement + //abs3() can only be used for integer + } + previousMillis = millis(); + //Serial.println(F("durationMoveTrain_remainingPlanned")); + //Serial.println(durationMoveTrain_remainingPlanned); + //Serial.println(F("durationMoveTrain")); + //Serial.println(durationMoveTrain); + moveForward(durationMoveTrain); //initTrain(sensor1); + } + if (!isRunningTrain) { + step = 0; + } + } else { + if (step == 2) { + //skip + //wait here + //pause + pauseTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + + //there is barrier, the sensor1 value is wrong + //previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + if (!isHinderedSensor1()) { + step = 1; + } + } else {//step >= 3 + //skip + //There is a bug if jump into this hole + } + } + } + + + } +} + +//======================================================================================================================================================================== +void moveBackwardSafe() { + + static unsigned long previousButtonMillis_timer; //unsigned long + static byte step; + //Serial.println(F("moveBackwardSafe().step")); + //Serial.println(step); + if (previousButtonMillis_timer <= abs2(currentMillis - (long)trainDuration)) { + previousButtonMillis_timer += trainDuration; + + if (step == 0) { + allow2updatePreviousMoveServo7_timer = true; //unlock + isRunningTrain = true; + step = 1; + } else { + if (step == 1) { + if (0) {// (isHinderedSensor1()) { + //2. represent the remainning time period when there is a barrier. + durationMoveTrain = abs3(durationMoveTrain_remainingPlanned - abs2(millis() - previousMillis)); //?0.5 delay + //durationMoveTrain_accumulationActual = abs2(currentMillis - previousMoveServo7_timer); + //abs3() only applied to the integer + allow2updatePreviousMoveServo7_timer = true; //unlock + + step = 2; + isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + + //pause + pauseTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + + //there is barrier, the sensor1 value is wrong + //previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + + } else {//!isHinderedSensor1() + + if (isFirstTime2SetDurationMoveTrain_remainingPlanned) { + isFirstTime2SetDurationMoveTrain_remainingPlanned = false; + //1.only (once) at the beginning of train movement (before recover from the hindered state), + //2.only (once) at the beginning of train movement (user set), + //the durationMoveTrain_remainingPlanned will reset + //only the train is really stopped for a reasonable reason, not pause not skip, just correct to stop + //In other words, the train finished the request movement, then + //isFirstTime2SetDurationMoveTrain_remainingPlanned = true; + durationMoveTrain_remainingPlanned = durationMoveTrain; + + } else { + + durationMoveTrain_remainingPlanned = abs3(durationMoveTrain_remainingPlanned - abs2(millis() - previousMillis)); + //the value above which is calculated since the very second time. In other words, + //this variable will be updated (all the time) during the required movement + //abs3() can only be used for integer + } + previousMillis = millis(); + moveBackward(durationMoveTrain); //initTrain(sensor1); + } + if (!isRunningTrain) { + step = 0; + } + } else { + if (step == 2) { + //wait here + //pause + pauseTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + + //there is barrier, the sensor1 value is wrong + //previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + if (!isHinderedSensor1()) { + step = 1; + } + } else {//step >= 3 + //skip + //There is a bug if jump into this hole + } + } + } + + + } +} From 277a90c75e1a59d6b0efac06aee76997c9e4026c Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 00:58:51 -0500 Subject: [PATCH 03/23] Update robot arm source code (4).txt --- robot arm source code (4).txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt index 84f5bbf..52d169d 100644 --- a/robot arm source code (4).txt +++ b/robot arm source code (4).txt @@ -1,7 +1,7 @@ //there are about 25 functions in this robot control script // //give power to robot platform, then connect the data wire with a computer -//wire mode (could be control through wireless tech., Wi-Fi) +//wire mode (could be controled through wireless tech., Wi-Fi) //select and start (single servo control/ group action) //======================================================================================================================================================================== @@ -104,7 +104,7 @@ Adafruit_VL53L0X2 lox1; //VL53L0X2 lox1; //VL53L0X2 lox2; VL53L0X2 lox3; VL53L0X2 lox4; -SoftwareSerial mySerial(RxPin, TxPin); //Instantiate soft serial port£¨rx£¬tx£© +SoftwareSerial mySerial(RxPin, TxPin); //Instantiate soft serial port£¨rx£¬tx£© LobotServoController robotController(mySerial); //Instantiate servo controller communication library Ultrasound ultrasound; //Instantiate the ultrasonic class //Screen screen; From 9e2e0afffaff64a0a688892f5400204c01985cc2 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 08:22:25 -0500 Subject: [PATCH 04/23] Update robot arm source code (4).txt --- robot arm source code (4).txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt index 52d169d..b7af11b 100644 --- a/robot arm source code (4).txt +++ b/robot arm source code (4).txt @@ -23,7 +23,7 @@ //there is no unsigned byte in Arduino //0 - 255 //A byte stores an 8-bit unsigned number, from 0 to 255. //unsigned short //0 - 65535 //unsigned int //0 - (2^32 - 1) -//unsigned long +//unsigned long //0 - (2^64 - 1) // --------CONSTANTS (won't change)------------------------------------------------------- // address we will assign if dual sensor is present @@ -620,6 +620,7 @@ void loopInSetup() { //Step 1. //mian function:throw the leftover away: //======================================================================================================================================================================== +//do not use switch(){} in the if(){} structure. No matter directly or indirectly call in the if(), switch() will be not working bool step1() { static bool isDone = false; From 19472ba07de955520757c3835d31d02f32f6afab Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 08:36:47 -0500 Subject: [PATCH 05/23] Update robot arm source code (4).txt --- robot arm source code (4).txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt index b7af11b..ea81a35 100644 --- a/robot arm source code (4).txt +++ b/robot arm source code (4).txt @@ -1,7 +1,8 @@ //there are about 25 functions in this robot control script -// +//porject idea introduction: +//https://docs.google.com/presentation/d/12GfPPMKdLY4WXjXnS6jgWiD87svpd2VR/edit?usp=sharing&ouid=104479909616474097737&rtpof=true&sd=true //give power to robot platform, then connect the data wire with a computer -//wire mode (could be controled through wireless tech., Wi-Fi) +//wire mode (could be controled through wireless, or Wi-Fi tech.) //select and start (single servo control/ group action) //======================================================================================================================================================================== From a26fa4eccdc82491c5518cfe7f8438c820008831 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:54:31 -0500 Subject: [PATCH 06/23] Add files via upload --- Adafruit_VL53L0X2.cpp | 826 +++++++++++++++++++++++++ Adafruit_VL53L0X2.h | 161 +++++ Distance.ino.bak | 1249 ++++++++++++++++++++++++++++++++++++++ LobotServoController.cpp | 369 +++++++++++ LobotServoController.h | 60 ++ Ultrasound.cpp | 131 ++++ Ultrasound.h | 52 ++ VL53L0X2.cpp | 1010 ++++++++++++++++++++++++++++++ VL53L0X2.h | 206 +++++++ 9 files changed, 4064 insertions(+) create mode 100644 Adafruit_VL53L0X2.cpp create mode 100644 Adafruit_VL53L0X2.h create mode 100644 Distance.ino.bak create mode 100644 LobotServoController.cpp create mode 100644 LobotServoController.h create mode 100644 Ultrasound.cpp create mode 100644 Ultrasound.h create mode 100644 VL53L0X2.cpp create mode 100644 VL53L0X2.h diff --git a/Adafruit_VL53L0X2.cpp b/Adafruit_VL53L0X2.cpp new file mode 100644 index 0000000..442fb23 --- /dev/null +++ b/Adafruit_VL53L0X2.cpp @@ -0,0 +1,826 @@ +/*! + * @file Adafruit_VL53L0X2.cpp + * + * @mainpage Adafruit VL53L0X time-of-flight sensor + * + * @section intro_sec Introduction + * + * This is the documentation for Adafruit's VL53L0X driver for the + * Arduino platform. It is designed specifically to work with the + * Adafruit VL53L0X breakout: https://www.adafruit.com/product/3317 + * + * These sensors use I2C to communicate, 2 pins (SCL+SDA) are required + * to interface with the breakout. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * @section dependencies Dependencies + * + * + * @section author Author + * + * Written by Limor Fried/Ladyada for Adafruit Industries. + * + * Updated by Andrew DeVries for Digital Example to include methods needed for + * Interrupt triggering + * + * @section license License + * + * BSD license, all text here must be included in any redistribution. + * + */ + +#include "Adafruit_VL53L0X2.h" +#include "vl53l0x_api_core.h" + +#define VERSION_REQUIRED_MAJOR 1 ///< Required sensor major version +#define VERSION_REQUIRED_MINOR 0 ///< Required sensor minor version +#define VERSION_REQUIRED_BUILD 1 ///< Required sensor build + +#define STR_HELPER(x) #x ///< a string helper +#define STR(x) STR_HELPER(x) ///< string helper wrapper + +/**************************************************************************/ +/*! + @brief Setups the I2C interface and hardware + @param i2c_addr Optional I2C address the sensor can be found on. Default is + 0x29 + @param debug Optional debug flag. If true, debug information will print out + via Serial.print during setup. Defaults to false. + @param i2c Optional I2C bus the sensor is located on. Default is Wire + @param vl_config Sensor configuration + @returns True if device is set up, false on any failure +*/ +/**************************************************************************/ +boolean Adafruit_VL53L0X2::begin(uint8_t i2c_addr, boolean debug, TwoWire *i2c, + VL53L0X_Sense_config_t vl_config) { + uint32_t refSpadCount; + uint8_t isApertureSpads; + uint8_t VhvSettings; + uint8_t PhaseCal; + + // Initialize Comms + pMyDevice->I2cDevAddr = VL53L0X_I2C_ADDR; // default + pMyDevice->comms_type = 1; + pMyDevice->comms_speed_khz = 400; + pMyDevice->i2c = i2c; + + pMyDevice->i2c->begin(); // VL53L0X_i2c_init(); + + // unclear if this is even needed: + if (VL53L0X_IMPLEMENTATION_VER_MAJOR != VERSION_REQUIRED_MAJOR || + VL53L0X_IMPLEMENTATION_VER_MINOR != VERSION_REQUIRED_MINOR || + VL53L0X_IMPLEMENTATION_VER_SUB != VERSION_REQUIRED_BUILD) { + + Status = VL53L0X_ERROR_NOT_SUPPORTED; + + return false; + } + + Status = VL53L0X_DataInit(&MyDevice); // Data initialization + + if (!setAddress(i2c_addr)) { + return false; + } + + Status = VL53L0X_GetDeviceInfo(&MyDevice, &DeviceInfo); + + if (Status == VL53L0X_ERROR_NONE) { + + if ((DeviceInfo.ProductRevisionMajor != 1) || + (DeviceInfo.ProductRevisionMinor != 1)) { + + Status = VL53L0X_ERROR_NOT_SUPPORTED; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_StaticInit(pMyDevice); // Device Initialization + } + + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_PerformRefSpadManagement( + pMyDevice, &refSpadCount, &isApertureSpads); // Device Initialization + } + + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_PerformRefCalibration(pMyDevice, &VhvSettings, + &PhaseCal); // Device Initialization + } + + if (Status == VL53L0X_ERROR_NONE) { + // no need to do this when we use VL53L0X_PerformSingleRangingMeasurement + + Status = VL53L0X_SetDeviceMode( + pMyDevice, + VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode + } + + // Enable/Disable Sigma and Signal check + if( Status == VL53L0X_ERROR_NONE ) { + Status = VL53L0X_SetLimitCheckEnable( pMyDevice, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1 ); + } + + if( Status == VL53L0X_ERROR_NONE ) { + Status = VL53L0X_SetLimitCheckEnable( pMyDevice, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1 ); + } + + if( Status == VL53L0X_ERROR_NONE ) { + Status = VL53L0X_SetLimitCheckEnable( pMyDevice, VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 1 ); + } + + if( Status == VL53L0X_ERROR_NONE ) { + Status = VL53L0X_SetLimitCheckValue( pMyDevice, VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, (FixPoint1616_t)( 1.5 * 0.023 * 65536 ) ); + } + + // call off to the config function to do the last part of configuration. + if (Status == VL53L0X_ERROR_NONE) { + configSensor(vl_config); + } + + + if (Status == VL53L0X_ERROR_NONE) { + return true; + } else { + return false; + } +} + +/**************************************************************************/ +/*! + @brief Change the I2C address of the sensor + @param newAddr the new address to set the sensor to + @returns True if address was set successfully, False otherwise +*/ +/**************************************************************************/ +boolean Adafruit_VL53L0X2::setAddress(uint8_t newAddr) { + newAddr &= 0x7F; + + Status = VL53L0X_SetDeviceAddress(pMyDevice, newAddr * 2); // 7->8 bit + + delay(10); + + if (Status == VL53L0X_ERROR_NONE) { + pMyDevice->I2cDevAddr = newAddr; // 7 bit addr + return true; + } + return false; +} + +/**************************************************************************/ +/*! + @brief Configure the sensor for one of the ways the example ST + sketches configure the sensors for different usages. + @param vl_config Which configureation you are trying to configure for + It should be one of the following + VL53L0X_SENSE_DEFAULT + VL53L0X_SENSE_LONG_RANGE + VL53L0X_SENSE_HIGH_SPEED, + VL53L0X_SENSE_HIGH_ACCURACY + @returns True if address was set successfully, False otherwise +*/ +/**************************************************************************/ +boolean Adafruit_VL53L0X2::configSensor(VL53L0X_Sense_config_t vl_config) { + // All of them appear to configure a few things + + // Serial.print(F("VL53L0X: configSensor ")); + // Serial.println((int)vl_config, DEC); + // Enable/Disable Sigma and Signal check + Status = VL53L0X_SetLimitCheckEnable( + pMyDevice, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckEnable( + pMyDevice, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1); + } + + if (Status != VL53L0X_ERROR_NONE) + return false; + + switch (vl_config) { + case VL53L0X_SENSE_HIGH_ACCURACY: + // increase timing budget to 200 ms + + if (Status == VL53L0X_ERROR_NONE) { + setLimitCheckValue(VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + (FixPoint1616_t)(0.25 * 65536)); + } + if (Status == VL53L0X_ERROR_NONE) { + setLimitCheckValue(VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + (FixPoint1616_t)(18 * 65536)); + } + if (Status == VL53L0X_ERROR_NONE) { + setMeasurementTimingBudgetMicroSeconds(200000); + } + // Not sure about ignore threshold, try turnning it off... + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckEnable( + pMyDevice, VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + } + + break; + } + + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief get a ranging measurement from the device + @param RangingMeasurementData the pointer to the struct the data will be + stored in + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns True if address was set successfully, False otherwise +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::getSingleRangingMeasurement( + VL53L0X_RangingMeasurementData_t *RangingMeasurementData, boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t LimitCheckCurrent; + + /* + * Step 4 : Test ranging mode + */ + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_PerformSingleRangingMeasurement(pMyDevice, + RangingMeasurementData); + + } + + return Status; +} +/**************************************************************************/ +/*! + @brief Start the ranging measurement from the device + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::startMeasurement(boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_StartMeasurement(pMyDevice); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Stop ranging measurement from the device + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::stopMeasurement(boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_StopMeasurement(pMyDevice); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Stop ranging measurement from the device + @param LimitCheckId Limit Check ID (0<= LimitCheckId < + VL53L0X_GetNumberOfLimitCheck() ). + @param pLimitCheckCurrent Pointer to current Value for a given LimitCheckId. + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::getLimitCheckCurrent( + uint8_t LimitCheckId, FixPoint1616_t *pLimitCheckCurrent, boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t intLimitCheckId = LimitCheckId; + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetLimitCheckCurrent(pMyDevice, intLimitCheckId, + pLimitCheckCurrent); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Set a new device mode + @param DeviceMode New device mode to apply + Valid values are: + VL53L0X_DEVICEMODE_SINGLE_RANGING + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING + VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + VL53L0X_HISTOGRAMMODE_RETURN_ONLY + VL53L0X_HISTOGRAMMODE_BOTH + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::setDeviceMode(VL53L0X_DeviceModes DeviceMode, + boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetDeviceMode(pMyDevice, DeviceMode); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Set low and high Interrupt thresholds + @param ThresholdLow Low threshold (mm, lux ..., depending on the mode) + @param ThresholdHigh High threshold (mm, lux ..., depending on the mode) + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::setInterruptThresholds( + FixPoint1616_t ThresholdLow, FixPoint1616_t ThresholdHigh, boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + + // ST API Comments "no dependency on DeviceMode for Ewok " so device mode + // not used but API requires something so pass in + // VL53L0X_DEVICEMODE_CONTINUOUS_RANGING even though not used + Status = VL53L0X_SetInterruptThresholds( + pMyDevice, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, ThresholdLow, + ThresholdHigh); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Get high and low Interrupt thresholds + @param pThresholdLow Low threshold (mm, lux ..., depending on the mode) + @param pThresholdHigh High threshold (mm, lux ..., depending on the mode) + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error +Adafruit_VL53L0X2::getInterruptThresholds(FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh, + boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + + // ST API Comments "no dependency on DeviceMode for Ewok " so device mode + // not used but API requires something so pass in + // VL53L0X_DEVICEMODE_CONTINUOUS_RANGING even though not used + Status = VL53L0X_GetInterruptThresholds( + pMyDevice, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, pThresholdLow, + pThresholdHigh); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Get current new device mode + @param pDeviceMode Pointer to current apply mode value + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::getDeviceMode(VL53L0X_DeviceModes *pDeviceMode, + boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_GetDeviceMode(pMyDevice, pDeviceMode); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Clear system interrupt condition + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::clearInterruptMask(boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_ClearInterruptMask(pMyDevice, 0); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Set the configuration of GPIO pin 0 + @param DeviceMode Device Mode associated to the Gpio. + @param Functionality Select Pin functionality. + @param Polarity Set interrupt polarity. Active high or active low. + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::setGpioConfig( + VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity, boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + + // Pin is always 0, Devicemode is ignored if not + // VL53L0X_DEVICEMODE_GPIO_DRIVE or VL53L0X_DEVICEMODE_GPIO_OSC + Status = VL53L0X_SetGpioConfig(pMyDevice, 0, DeviceMode, Functionality, + Polarity); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief Get current configuration for GPIO pin 0 + @param pDeviceMode Pointer to Device Mode associated to the Gpio. + @param pFunctionality Pointer to Pin functionality. + @param pPolarity Pointer to interrupt polarity. Active high or active low. + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns status code +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::getGpioConfig( + VL53L0X_DeviceModes *pDeviceMode, VL53L0X_GpioFunctionality *pFunctionality, + VL53L0X_InterruptPolarity *pPolarity, boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + if (Status == VL53L0X_ERROR_NONE) { + + // Pin is always 0, Devicemode is ignored if not + // VL53L0X_DEVICEMODE_GPIO_DRIVE or VL53L0X_DEVICEMODE_GPIO_OSC + + Status = VL53L0X_GetGpioConfig(pMyDevice, 0, pDeviceMode, pFunctionality, + pPolarity); + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief get a ranging measurement from the device + @param RangingMeasurementData the pointer to the struct the data will be + stored in + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns VL53L0X_ERROR_NONE or Error if one occured +*/ +/**************************************************************************/ +VL53L0X_Error Adafruit_VL53L0X2::getRangingMeasurement( + VL53L0X_RangingMeasurementData_t *RangingMeasurementData, boolean debug) { + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t LimitCheckCurrent; + + if (Status == VL53L0X_ERROR_NONE) { + Status = + VL53L0X_GetRangingMeasurementData(pMyDevice, RangingMeasurementData); + + } + + return Status; +} + +/**************************************************************************/ +/*! + @brief print a ranging measurement out via Serial.print in a human-readable + format + @param pRangingMeasurementData a pointer to the ranging measurement data +*/ +/**************************************************************************/ +void Adafruit_VL53L0X2::printRangeStatus( + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) { + char buf[VL53L0X_MAX_STRING_LENGTH]; + uint8_t RangeStatus; + + /* + * New Range Status: data is valid when pRangingMeasurementData->RangeStatus = + * 0 + */ + + RangeStatus = pRangingMeasurementData->RangeStatus; + + VL53L0X_GetRangeStatusString(RangeStatus, buf); + + Serial.print(F("Range Status: ")); + Serial.print(RangeStatus); + Serial.print(F(" : ")); + Serial.println(buf); +} + +/**************************************************************************/ +/*! + @brief Single shot ranging. Be sure to check the return of readRangeStatus + to before using the return value! + @return Distance in millimeters if valid +*/ +/**************************************************************************/ + +uint16_t Adafruit_VL53L0X2::readRange(void) { + VL53L0X_RangingMeasurementData_t measure; // keep our own private copy + + Status = getSingleRangingMeasurement(&measure, false); + _rangeStatus = measure.RangeStatus; + + if (Status == VL53L0X_ERROR_NONE) + return measure.RangeMilliMeter; + // Other status return something totally out of bounds... + return 0xffff; +} + +/**************************************************************************/ +/*! + @brief Request ranging success/error message (retrieve after ranging) + @returns One of possible VL6180X_ERROR_* values +*/ +/**************************************************************************/ + +uint8_t Adafruit_VL53L0X2::readRangeStatus(void) { return _rangeStatus; } + +/**************************************************************************/ +/*! + @brief Start a range operation + @return true if range operation successfully started. +*/ +/**************************************************************************/ + +boolean Adafruit_VL53L0X2::startRange(void) { + + /* This function will do a complete single ranging + * Here we fix the mode! */ + // first lets set the device in SINGLE_Ranging mode + Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); + + if (Status == VL53L0X_ERROR_NONE) { + // Lets start up the measurement + Status = VL53L0X_StartMeasurement(pMyDevice); + } + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Checks to see if a range operation has completed + @return true if range operation completed or an error has happened +*/ +/**************************************************************************/ + +boolean Adafruit_VL53L0X2::isRangeComplete(void) { + uint8_t NewDataReady = 0; + Status = VL53L0X_GetMeasurementDataReady(pMyDevice, &NewDataReady); + return ((Status != VL53L0X_ERROR_NONE) || (NewDataReady == 1)); +} + +/**************************************************************************/ +/*! + @brief Wait until Range operation has completed. + @return true if range operation completed, false if error. +*/ +/**************************************************************************/ + +boolean Adafruit_VL53L0X2::waitRangeComplete(void) { + Status = VL53L0X_measurement_poll_for_completion(pMyDevice); + + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Return the range in mm for the last operation. + @return Range in mm. +*/ +/**************************************************************************/ + +uint16_t Adafruit_VL53L0X2::readRangeResult(void) { + VL53L0X_RangingMeasurementData_t measure; // keep our own private copy + + Status = VL53L0X_GetRangingMeasurementData(pMyDevice, &measure); + _rangeStatus = measure.RangeStatus; + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(pMyDevice, 0); + + if ((Status == VL53L0X_ERROR_NONE) && (_rangeStatus != 4)) + return measure.RangeMilliMeter; + + return 0xffff; // some out of range value +} + +/**************************************************************************/ +/*! + @brief Start a continuous range operation + @param period_ms inter measurement period in milliseconds + @return True if successful, false otherwise +*/ +/**************************************************************************/ +boolean Adafruit_VL53L0X2::startRangeContinuous(uint16_t period_ms) { + /* This function will do a complete single ranging + * Here we fix the mode! */ + // first lets set the device in SINGLE_Ranging mode + Status = VL53L0X_SetDeviceMode(pMyDevice, + VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING); + + if (Status == VL53L0X_ERROR_NONE) { + Status = + VL53L0X_SetInterMeasurementPeriodMilliSeconds(pMyDevice, period_ms); + } + + if (Status == VL53L0X_ERROR_NONE) { + // Lets start up the measurement + Status = VL53L0X_StartMeasurement(pMyDevice); + } + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Stop a continuous ranging operation +*/ +/**************************************************************************/ +void Adafruit_VL53L0X2::stopRangeContinuous(void) { + + Status = VL53L0X_StopMeasurement(pMyDevice); + + // lets wait until that completes. + uint32_t StopCompleted = 0; + uint32_t LoopNb; + + // Wait until it finished + // use timeout to avoid deadlock + if (Status == VL53L0X_ERROR_NONE) { + LoopNb = 0; + do { + Status = VL53L0X_GetStopCompletedStatus(pMyDevice, &StopCompleted); + if ((StopCompleted == 0x00) || Status != VL53L0X_ERROR_NONE) { + break; + } + LoopNb = LoopNb + 1; + VL53L0X_PollingDelay(pMyDevice); + } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP); + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) { + Status = VL53L0X_ERROR_TIME_OUT; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_ClearInterruptMask( + pMyDevice, VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY); + } +} + +/**************************************************************************/ +/*! + @brief Wrapper to ST library code to budget how long a measurement + should take + @param budget_us the new budget + @returns True if success +*/ +/**************************************************************************/ +boolean +Adafruit_VL53L0X2::setMeasurementTimingBudgetMicroSeconds(uint32_t budget_us) { + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice, budget_us); + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Wrapper to ST library code to budget how long a measurement + should take + @returns the current budget time in microseconds. +*/ +/**************************************************************************/ +uint32_t Adafruit_VL53L0X2::getMeasurementTimingBudgetMicroSeconds() { + uint32_t budget_us; + Status = + VL53L0X_GetMeasurementTimingBudgetMicroSeconds(pMyDevice, &budget_us); + return (budget_us); +} + +/**************************************************************************/ +/*! + @brief Sets the VCSEL pulse period. + @param VcselPeriodType VCSEL period identifier (pre-range|final). + @param VCSELPulsePeriod VCSEL period value + @returns True if success +*/ +/**************************************************************************/ +boolean +Adafruit_VL53L0X2::setVcselPulsePeriod(VL53L0X_VcselPeriod VcselPeriodType, + uint8_t VCSELPulsePeriod) { + Status = + VL53L0X_SetVcselPulsePeriod(pMyDevice, VcselPeriodType, VCSELPulsePeriod); + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Gets the VCSEL pulse period. + @param VcselPeriodType VCSEL period identifier (pre-range|final). + @returns the current pulse peried for the given type. +*/ +/**************************************************************************/ +uint8_t +Adafruit_VL53L0X2::getVcselPulsePeriod(VL53L0X_VcselPeriod VcselPeriodType) { + uint8_t cur_period; + Status = VL53L0X_GetVcselPulsePeriod(pMyDevice, VcselPeriodType, &cur_period); + return (cur_period); +} + +/**************************************************************************/ +/*! + @brief Enable/Disable a specific limit check + @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + @param LimitCheckEnable if 1 the check limit + corresponding to LimitCheckId is Enabled + if 0 the check limit + corresponding to LimitCheckId is disabled + @return true if succeeded + */ +/**************************************************************************/ +boolean Adafruit_VL53L0X2::setLimitCheckEnable(uint16_t LimitCheckId, + uint8_t LimitCheckEnable) { + Status = + VL53L0X_SetLimitCheckEnable(pMyDevice, LimitCheckId, LimitCheckEnable); + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Get specific limit check enable state + @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + @return current state of limit enabled + */ +/**************************************************************************/ +uint8_t Adafruit_VL53L0X2::getLimitCheckEnable(uint16_t LimitCheckId) { + + uint8_t cur_limit; + Status = VL53L0X_GetLimitCheckEnable(pMyDevice, LimitCheckId, &cur_limit); + return (cur_limit); +} + +/**************************************************************************/ +/*! + @brief Set a specific limit check value + @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + LimitCheckId + @param LimitCheckValue Limit Check Value + @return true if succeeded. + */ +/**************************************************************************/ + +boolean Adafruit_VL53L0X2::setLimitCheckValue(uint16_t LimitCheckId, + FixPoint1616_t LimitCheckValue) { + + Status = VL53L0X_SetLimitCheckValue(pMyDevice, LimitCheckId, LimitCheckValue); + return (Status == VL53L0X_ERROR_NONE); +} + +/**************************************************************************/ +/*! + @brief Get a specific limit check value + @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + @return limit check value in FixPoint1616 + */ +/**************************************************************************/ +FixPoint1616_t Adafruit_VL53L0X2::getLimitCheckValue(uint16_t LimitCheckId) { + + FixPoint1616_t LimitCheckValue; + Status = + VL53L0X_GetLimitCheckValue(pMyDevice, LimitCheckId, &LimitCheckValue); + return (LimitCheckValue); +} + diff --git a/Adafruit_VL53L0X2.h b/Adafruit_VL53L0X2.h new file mode 100644 index 0000000..560ddc1 --- /dev/null +++ b/Adafruit_VL53L0X2.h @@ -0,0 +1,161 @@ +/*! + * @file Adafruit_VL53L0X2.h + This is a library for the Adafruit VL53L0X Sensor Breakout + Designed specifically to work with the VL53L0X sensor from Adafruit + ----> https://www.adafruit.com/products/3317 + These sensors use I2C to communicate, 2 pins are required to + interface + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + Written by Limor Fried/Ladyada for Adafruit Industries. + Updated by Andrew DeVries for Digital Example to include methods needed for + Interrupt triggering. + BSD license, all text above must be included in any + redistribution + ****************************************************/ + +#ifndef Adafruit_VL53L0X2_H +#define Adafruit_VL53L0X2_H + +#if (ARDUINO >= 100) +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#include "Wire.h" +#include "vl53l0x_api.h" + +#define VL53L0X_I2C_ADDR 0x29 ///< Default sensor I2C address + +/**************************************************************************/ +/*! + @brief Class that stores state and functions for interacting with VL53L0X + time-of-flight sensor chips +*/ +/**************************************************************************/ +class Adafruit_VL53L0X2 { +public: + /** Sensor configurations */ + typedef enum { + VL53L0X_SENSE_DEFAULT = 0, + VL53L0X_SENSE_LONG_RANGE, + VL53L0X_SENSE_HIGH_SPEED, + VL53L0X_SENSE_HIGH_ACCURACY + } VL53L0X_Sense_config_t; + + boolean begin(uint8_t i2c_addr = VL53L0X_I2C_ADDR, boolean debug = false, + TwoWire *i2c = &Wire, + VL53L0X_Sense_config_t vl_config = VL53L0X_SENSE_DEFAULT); + boolean setAddress(uint8_t newAddr); + + // uint8_t getAddress(void); // not currently implemented + + /**************************************************************************/ + /*! + @brief get a ranging measurement from the device + @param pRangingMeasurementData the pointer to the struct the data will be + stored in + @param debug Optional debug flag. If true debug information will print via + Serial.print during execution. Defaults to false. + @returns True if address was set successfully, False otherwise + */ + /**************************************************************************/ + VL53L0X_Error + rangingTest(VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + boolean debug = false) { + return getSingleRangingMeasurement(pRangingMeasurementData, debug); + }; + + VL53L0X_Error getSingleRangingMeasurement( + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + boolean debug = false); + void + printRangeStatus(VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); + + VL53L0X_Error getRangingMeasurement( + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + boolean debug = false); + VL53L0X_Error startMeasurement(boolean debug = false); + VL53L0X_Error stopMeasurement(boolean debug = false); + VL53L0X_Error getLimitCheckCurrent(uint8_t LimitCheckId, + FixPoint1616_t *pLimitCheckCurrent, + boolean debug = false); + VL53L0X_Error getDeviceMode(VL53L0X_DeviceModes *pDeviceMode, + boolean debug = false); + VL53L0X_Error setDeviceMode(VL53L0X_DeviceModes DeviceMode, + boolean debug = false); + + VL53L0X_Error setInterruptThresholds(FixPoint1616_t ThresholdLow, + FixPoint1616_t ThresholdHigh, + boolean debug = false); + VL53L0X_Error getInterruptThresholds(FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh, + boolean debug = false); + VL53L0X_Error clearInterruptMask(boolean debug = false); + + VL53L0X_Error getGpioConfig(VL53L0X_DeviceModes *pDeviceMode, + VL53L0X_GpioFunctionality *pFunctionality, + VL53L0X_InterruptPolarity *pPolarity, + boolean debug = false); + VL53L0X_Error setGpioConfig(VL53L0X_DeviceModes DeviceMode, + VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity, + boolean debug = false); + + VL53L0X_Error Status = + VL53L0X_ERROR_NONE; ///< indicates whether or not the sensor has + ///< encountered an error + // Add similar methods as Adafruit_VL6180X class adapted to range of device + uint16_t readRange(void); + // float readLux(uint8_t gain); + uint8_t readRangeStatus(void); + + boolean startRange(void); + boolean isRangeComplete(void); + boolean waitRangeComplete(void); + uint16_t readRangeResult(void); + + boolean startRangeContinuous(uint16_t period_ms = 50); + void stopRangeContinuous(void); + + // void setTimeout(uint16_t timeout) { io_timeout = timeout; } + // uint16_t getTimeout(void) { return io_timeout; } + /**************************************************************************/ + /*! + @brief timeout status + @returns True if timeout has occurred, False otherwise + */ + /**************************************************************************/ + boolean timeoutOccurred(void) { return false; } + + boolean configSensor(VL53L0X_Sense_config_t vl_config); + + // Export some wrappers to internal setting functions + // that are used by the above helper function to allow + // more complete control. + boolean setMeasurementTimingBudgetMicroSeconds(uint32_t budget_us); + uint32_t getMeasurementTimingBudgetMicroSeconds(void); + + boolean setVcselPulsePeriod(VL53L0X_VcselPeriod VcselPeriodType, + uint8_t VCSELPulsePeriod); + + uint8_t getVcselPulsePeriod(VL53L0X_VcselPeriod VcselPeriodType); + + boolean setLimitCheckEnable(uint16_t LimitCheckId, uint8_t LimitCheckEnable); + uint8_t getLimitCheckEnable(uint16_t LimitCheckId); + boolean setLimitCheckValue(uint16_t LimitCheckId, + FixPoint1616_t LimitCheckValue); + FixPoint1616_t getLimitCheckValue(uint16_t LimitCheckId); + +private: + VL53L0X_Dev_t MyDevice; + VL53L0X_Dev_t *pMyDevice = &MyDevice; + VL53L0X_DeviceInfo_t DeviceInfo; + + uint8_t _rangeStatus; +}; + +#endif + diff --git a/Distance.ino.bak b/Distance.ino.bak new file mode 100644 index 0000000..025dbe5 --- /dev/null +++ b/Distance.ino.bak @@ -0,0 +1,1249 @@ +//give power +//set mode (pair, wireless, bluetooth) +//select and start (signle servo control/ group action) +//======================================================================================================================================================================== + +// ----------LIBRARIES-------------- + +#include "VL53L0X2.h"; //the bookshelf we create +#include "Adafruit_VL53L0X2.h" +#include "LobotServoController.h" +#include "Ultrasound.h" +//#include "Screen.h" +#include +#include //default +#include + +//byte 8 bit +//short 16 bit +//int 32 bit +//long 64 bit +//there is no unsigned byte in Arduino //0 - 255 //A byte stores an 8-bit unsigned number, from 0 to 255. +//unsigned short //0 - 65535 +//unsigned int //0 - (2^32 - 1) +//unsigned long + +// --------CONSTANTS (won't change)------------------------------------------------------- +// address we will assign if dual sensor is present +#define LOX1_ADDRESS 0x30//0x27 and 0x28 could be used +#define LOX2_ADDRESS 0x29//default +#define LOX3_ADDRESS 0x31 +#define LOX4_ADDRESS 0x32 + +// set the pins to shutdown +#define SHT_LOX1 6//sensor1//Servo7PositionSensor +#define SHT_LOX2 A0//sensor2//Servo7PositionSensor +#define SHT_LOX3 7//sensor3 +#define SHT_LOX4 A1//sensor4 + +const byte RxPin = 4; +const byte TxPin = 5; +const byte LED = 13; +const byte buttonPin = 12; //Touch sensor + +//from the reference point 265 to the 10,000 ms point +//distance sensor value from 265 to about 350 +//(350 - 265)/ 10,000 = 0.0084/ ms = 8.4/s +float speedTrain = 0.0084; + //assume the sensor1 value will not stuck in a constant value when the robot arm moves + //assumw the pet will not stand between the sensor and the robot arm + //move train only if the sensor value is from sensor1 0 to 710 + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + unsigned int durationMoveTrain_referPoint2jointPoint = 15000; + unsigned short jointPoint = 310; //before the point, the sensor value is accurate believe. + //sensor1 sensor1_Min allowed min distance + unsigned short sensor1_Min = 110; + //reference point: 145 (143 - 147 is fine) + unsigned short referencePoint = 145;//default// should > 2 //should > sensor1_Min + //trainDuration = (147 - 143)/ speedTrain = 595.24 ms + unsigned short trainDuration = 595;//19;//952;//1000;//define the smallest motor step distance//resolution; + float safeIndex = 0.3;// 0 < safeIndex < 1 +//The sensor1 wall (mirror) is 6.5 cm far from the edge of platform. +//The barrier, say pet, can not be under the edge +//80 is the ideal backward sensor1 range (after the 308 point) per 10 seconds +//10.3 is the ideal backward distance (after the 308 point) per 10 seconds +//80/ 10.3 = x/ 6.5 +//x = 80 * 6.5/ 10.3 = 50.4854 +//Therefore, the allowed distance variance is no more than 50.4854 +//max distance Changed per trainDuration// arrange = 50.4854/ (trainDuration * speedTrain) = 10.1011; +//it is better for us to choose the index less than or equal to 10 +byte barrierIndex = 9; + +//could be initialized again________________________ + unsigned int durationMoveTrain_Max = (durationMoveTrain_referPoint2jointPoint + 30000) * 0.0105 / speedTrain;//56250;//45000; + //dictionary: + //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement + unsigned int durationMoveTrain_trashBin = durationMoveTrain_Max; + unsigned int durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 10000; + + +//------------ VARIABLES (will change)----------------------------------------------------- +unsigned long currentMillis = 0; //stores the value of total run time +//loopPeriod = duration + interval; +//period = interval + duration +//if switch between two states is needed, then setting clock below: +//if (state1) { +// set clock by using interval +// } else {//state2 +// set clock by using duration +// } +//in this class only duration or interval period is used + +// objects for the vl53l0x +Adafruit_VL53L0X2 lox1;//VL53L0X2 lox1; +//VL53L0X2 lox2; +VL53L0X2 lox3; +VL53L0X2 lox4; +SoftwareSerial mySerial(RxPin, TxPin); +LobotServoController robotController(mySerial); +Ultrasound ultrasound; //Instantiate the ultrasonic class +//Screen screen; + /* + //why it cause dead loop if we call constructors in setup() + lox1 = Adafruit_VL53L0X2();//lox1 = VL53L0X2(); + //lox2 = VL53L0X2(); + lox3 = VL53L0X2(); + lox4 = VL53L0X2(); + //robotController(mySerial); + ultrasound = Ultrasound(); //Instantiate the ultrasonic class + //screen = Screen(); + */ + +bool isRunTime = false; + +//could be initialized again________________________ +//assume servo7 is controlled by arduino board, Hiwonder robot arm board support it by providing energy and delivering information. +bool isRunningTrain = false; +//There are two methods to control the position of the train, servo7: +//1. time setting +//planned duration of the train Movement +unsigned long previousMoveServo7_timer = 0;//it is not enough to use int // stores the value of currentMillis as the previousTimer for control the time of servo7 movement +bool allow2updatePreviousMoveServo7_timer = false; +//2. distance setting. +// through previousDistanceSensor1, by recording sensor1 value and comparing previous and current value, +//we can detect the movement accuracy or whether the sensor is barried. +//integer distance; +unsigned short previousDistanceSensor1 = 0; +unsigned short sensor1 = 0;//train +//previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried +unsigned int durationMoveTrain = 0; +//unsigned short sensor2 = 0; +unsigned short sensor3 = 0; +unsigned short sensor4 = 0; +unsigned short distance = 0;//ultrasound sensor + +//Record the number of touches +byte NumTouch; +//byte buttonLed_State = LOW; + + + + +//before power off, it is very important +//put the good on the ground + +//before nap or stuck in some dead loop +//stopTrain(); +//robotController.stopActionGroup(); + + + + + +//======================================================================================================================================================================== +void setup() { + //no need to be initalized again + //____________________________________________________________________________________________________________________ + //initial master boards' interface + //________________________________ + Serial.begin(9600); + // wait until serial port opens for native USB devices + while (! Serial) { delay(1); } + + + + mySerial.begin(9600); //communication between uno R3 kit and the robot arm + + pinMode(LED, OUTPUT); + pinMode(buttonPin, INPUT); + digitalWrite(LED, LOW); + // set the button pin as input with a pullup resistor to ensure it defaults to HIGH + pinMode(buttonPin, INPUT_PULLUP); + + pinMode(SHT_LOX1, OUTPUT); + pinMode(SHT_LOX2, OUTPUT); + pinMode(SHT_LOX3, OUTPUT); + pinMode(SHT_LOX4, OUTPUT); + //Serial.println(F("Shutdown TOF sensor pins inited...")); + digitalWrite(SHT_LOX1, LOW); + digitalWrite(SHT_LOX2, LOW); + digitalWrite(SHT_LOX3, LOW); + digitalWrite(SHT_LOX4, LOW); + //Serial.println(F("Both TOF sensors in reset mode...(pins are low)")); + + //Serial.println(F("Starting...")); + + //initial sensors + //________________________________ + setID(); + delay(100);// the TOF distance sensors need 90 ms to read + initialization();//read_multi_tof_sensors(); //previousDistanceSensor1 = sensor1; + loopInSetup(); + + //sherden framework + //____________________________________________________________________________________________________________________ + { + + //deal with the corner case + delay(100);// the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + //because sometimes train stop without recording the correct sensor1 value into previousDistanceSensor1 + previousDistanceSensor1 = sensor1; + try2Recover(); + + delay(100);// the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + loopInSetup(); + + + //test or some preaction + //delay(100);// the TOF distance sensors need 90 ms to read + //read_multi_tof_sensors(); + //previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + //moveForward(durationMoveTrain_table);//moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + + //delay(100);// the TOF distance sensors need 90 ms to read + //read_multi_tof_sensors(); + //previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + //moveBackward(10000); + + + delay(100);// the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + + } + + + + Serial.println(F("Runtime")); + isRunTime = true; +} + +//======================================================================================================================================================================== +void loop() { + // Notice that none of the action happens in loop() apart from reading millis() + // it just calls the functions that have the action code + + //initial + //____________________________________________________________________________________________________________________ + //initialization(); + currentMillis = millis(); + // capture the latest value of millis() + // this is equivalent to noting the time from a clock + // use the same time for all operators to keep them synchronized + // in order to synchronize operators in each iteration of loop(), such as robot arm (servro1-6), a train (servo7) + + //read + //____________________________________________________________________________________________________________________ + //user IO + readButton();//asynchronize, very fast + //sensors + isHere();//asynchronize, very fast + // + // + // + //essential sensors to control operators + read_multi_tof_sensors();//asynchronize, very fast + readRobot(); + //Receive data returned by the robotic arm + //asynchronize, very fast + + //analysis + //make decisions + //take actions //synchronize, normal + //____________________________________________________________________________________________________________________ + run(); + + //display //report to the PC or monitor + //____________________________________________________________________________________________________________________ + //screen.draw(sensor3);//asynchronize, very slow + + + //delay(100);// do not use delay() in the loop(), it will cause the currentMillis delay 100 ms, which could undermine the servo7 movement 100 * 0.0105 = about 1 cm +} + +//==================================================================================================================================================================== +void initialization() { + //could be initialized again________________________ + durationMoveTrain_Max = (durationMoveTrain_referPoint2jointPoint + 30000) * 0.0105 / speedTrain;//56250;//45000; + //dictionary: + //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement + durationMoveTrain_trashBin = durationMoveTrain_Max; + durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 10000; + + //could be initialized again________________________ + //assume servo7 is controlled by arduino board, Hiwonder robot arm board support it by providing energy and delivering information. + isRunningTrain = false; + //There are two methods to control the position of the train, servo7: + //1. time setting + //planned duration of the train Movement + + //reset the previousMoveServo7_timer + previousMoveServo7_timer = 0;//it is not enough to use int // stores the value of currentMillis as the previousTimer for control the time of servo7 movement + allow2updatePreviousMoveServo7_timer = false; + //2. distance setting. + // through previousDistanceSensor1, by recording sensor1 value and comparing previous and current value, + //we can detect the movement accuracy or whether the sensor is barried. + //integer distance; + previousDistanceSensor1 = 0; + sensor1 = 0;//train + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + durationMoveTrain = 0; + //unsigned short sensor2 = 0; + sensor3 = 0; + sensor4 = 0; + distance = 0;//ultrasound sensor + + //Record the number of touches + NumTouch = 0; + //byte buttonLed_State = LOW; + + //could be initialized again________________________ + read_multi_tof_sensors(); + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + + //initial timers/counters + //________________________________ + currentMillis = millis(); + // capture the latest value of millis() + // this is equivalent to noting the time from a clock + // use the same time for all operators to keep them synchronized + // in order to synchronize operators in each iteration of loop(), such as robot arm (servro1-6), a train (servo7) + //make sure the currentMillis > MAX(trainDuration, MAX(durationMoveTrain)) + currentMillis = millis(); + if (currentMillis <= durationMoveTrain_Max) { + unsigned int temp = durationMoveTrain_Max - currentMillis + 100;//unsigned int ////0 - (2^32 - 1) + //Serial.print(F("Initializing system for ")); + //Serial.print(temp/1000); + //Serial.println(F(" seconds")); + //delay(temp); + currentMillis = millis(); + } else {//currentMillis > durationMoveTrain_Max + //skip + } +} +//======================================================================================================================================================================== +void run() { + //analysis + //make decisions + //take actions //synchronize, normal + //____________________________________________________________________________________________________________________ + //initial + static unsigned long previousMillis_timer;//set loop check clock //unsigned long + if(previousMillis_timer <= currentMillis - trainDuration) + { + previousMillis_timer += trainDuration; + { + if (NumTouch >= 1 && NumTouch <=4 ) { + + //Override the value of durationMoveTrain + //if (durationMoveTrain < trainDuration) { + //1000;//define the smallest step distance//resolution + // durationMoveTrain = trainDuration; + //} else { + // //skip + //} + durationMoveTrain = durationMoveTrain_Max;//durationMoveTrain = NumTouch * 1000; + + Serial.println(F("button1/2/3/4")); + Serial.println(durationMoveTrain); + //byte isFirst = 1; + allow2updatePreviousMoveServo7_timer = true;//unlock + while(1) { + currentMillis = millis(); + + + + moveForward(durationMoveTrain);//initTrain(sensor1); + + //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + + + + + + if (!isRunningTrain) {break;} + } + + /* + isRunTime = false; + //delay(100);// the TOF distance sensors need 90 ms to read + moveForward(durationMoveTrain); + read_multi_tof_sensors(); + //delete the sentence below after the test !!!!!!!!! + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + isRunTime = true; + */ + + + NumTouch = 0; + } else { + if (NumTouch >= 5 && NumTouch <= 6) { + + + if (NumTouch == 5) {//5s + isRunTime = false; + //delay(100);// the TOF distance sensors need 90 ms to read + moveForward(5000); //in the setup() which means sensor1 310 joint point//moveForward(durationMoveTrain_table); + read_multi_tof_sensors(); + //delete the sentence below after the test !!!!!!!!! + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + isRunTime = true; + + + } else {//(NumTouch == 6) //15s + isRunTime = false; + //delay(100);// the TOF distance sensors need 90 ms to read + moveForward(15000); //in the setup() which means sensor1 310 joint point//moveForward(durationMoveTrain_table); + read_multi_tof_sensors(); + //delete the sentence below after the test !!!!!!!!! + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //but it is a corner case + isRunTime = true; + } + Serial.println(F("button5/6")); + + NumTouch = 0; + + } else { + if (NumTouch >= 7 && NumTouch <= 8) { + Serial.println(F("button7/8")); + + //switch between the original reference point and new reference point + if (NumTouch == 7) { + + //set the joint point as the reference point + //previous time variable keeps when visited joint point, the time as the reference when robot move forward after the point + referencePoint = jointPoint; + //durationMoveTrain_referPoint2jointPoint was the basis, it is 0 now + durationMoveTrain_referPoint2jointPoint = 0; + initialization(); + } else {//NumTouch == 8 + //set 145 as the reference point + referencePoint = 145; + durationMoveTrain_referPoint2jointPoint = 15000; + initialization(); + + } + + NumTouch = 0; + + + + } else {//NumTouch == 0 or NumTouch > 8 + //default + Serial.println(F("button0")); + initTrain(sensor1); + + + } + } + } + } + + + } +} + +//======================================================================================================================================================================== +void loopInSetup() { + //simplified loop() + //corner case: can not detect the barrier + //if there is barrier between sensor1 and train, train will moveforward without stop + isRunTime = true; + //for (unsigned short i = 65535; i > 0; i--) {}//this is not 65536, which causes overflow. + while(1) { + //initial + //____________________________________________________________________________________________________________________ + //initialization(); + currentMillis = millis(); + // capture the latest value of millis() + // this is equivalent to noting the time from a clock + // use the same time for all operators to keep them synchronized + // in order to synchronize operators in each iteration of loop(), such as robot arm (servro1-6), a train (servo7) + //read + //____________________________________________________________________________________________________________________ + readRobot(); + //Receive data returned by the robotic arm + //asynchronize, very fast + //delay(100);// the TOF distance sensors need 90 ms to read + read_multi_tof_sensors(); + + //analysis + //make decisions + //take actions + //____________________________________________________________________________________________________________________ + //initalize operators + robotController.runActionGroup(0, 1); + //initialize train + initTrain(sensor1); + if (!isRunningTrain) {break;} + //delay(trainDuration); + delay(300); + } + + + isRunTime = false; +} + +//======================================================================================================================================================================== +void readRobot() { + unsigned short robotInterval = 100; + static unsigned long previousButtonMillis_timer;//unsigned long + if (previousButtonMillis_timer <= millis() - robotInterval) {// currentMillis = millis() - robotInterval + previousButtonMillis_timer += robotInterval; + robotController.receiveHandler(); + } + +} + +//======================================================================================================================================================================== +void try2Recover() { +//sensor1 < sensor1_Min || durationMoveTrain > durationMoveTrain_Max + //normally it is not allowed to move over durationMoveTrain_Max or under sensor1_Min + //no sensor signal available + //but let us try to go back to the reference point, sensor1 145 + if (durationMoveTrain > durationMoveTrain_Max && sensor1 <= 710) { + durationMoveTrain = durationMoveTrain_referPoint2jointPoint; + allow2updatePreviousMoveServo7_timer = true;//unlock + moveBackward(durationMoveTrain); + //not update// it is not correct //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //difference + } else { + if (sensor1 >= 0 && sensor1 < sensor1_Min) { + durationMoveTrain = (referencePoint - sensor1_Min)/ speedTrain;////assume + allow2updatePreviousMoveServo7_timer = true;//unlock + moveForward(durationMoveTrain); + //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + //difference + } else { + //(sensor1 < 0 || sensor > 710) // too close || over far + //genearlly it is impossible to reach that close or far, meaning it could be some bugs or noise + //skip or ignore + } + } + +} +//======================================================================================================================================================================== +void readButton() { + + // ask + // this only reads the button state after the button interval has elapsed + // this avoids multiple flashes if the button is pressed + // Notice that there is no need to synchronize this, using millis() instead of currentMillis + // use of millis() with the flashing Leds + // every time the button is pressed it changes buttonLed_State causing: + static byte step;//0 - 255 + static byte NumTouchLocal = 0; + static unsigned short count;//0 - 65535 + static unsigned long previousButtonMillis_timer; + unsigned short buttonInterval = 1;//10;//100;//500 //200;//300 + + + //if (robotController.isRunning()) + // return; + //if (isRunningTrain) + // return; +/* + + if (previousButtonMillis_timer <= millis() - buttonInterval) {// currentMillis = millis() - buttonInterval + + //if (digitalRead(buttonPin) != LOW) { + //delay(80); + if (digitalRead(buttonPin) == LOW) { + previousButtonMillis_timer += buttonInterval; + + Serial.println(F("button")); + Serial.println(NumTouchLocal); + NumTouchLocal++; + if (NumTouchLocal > 2) {NumTouchLocal = 1;} + //buttonLed_State = ! buttonLed_State; // this changes it to low if it was high + // and to high if it was low + } + + //} + + } +*/ + if (previousButtonMillis_timer <= millis() - buttonInterval) {// currentMillis = millis() - buttonInterval + switch(step) + { + case 0: + if (digitalRead(buttonPin) == LOW) + {//Detection touch sensor + digitalWrite(LED, HIGH); + delay(400); + if (digitalRead(buttonPin) != LOW) + {//If it is short press once + digitalWrite(LED, LOW); + NumTouchLocal ++ ; + count = 0; + step = 1; + previousButtonMillis_timer += buttonInterval; + } + } + break; + case 1: + if (digitalRead(buttonPin) == LOW) + {//Detection touch sensor + digitalWrite(LED, HIGH); + delay(400); + if (digitalRead(buttonPin) != LOW) + {//If it is short touch once + NumTouchLocal ++ ; + digitalWrite(LED, LOW); + if (NumTouchLocal > 9) + NumTouchLocal = 9; + count = 0; + previousButtonMillis_timer += buttonInterval; + } + } + else + { + count++; + if (count > 10) + { + step = 2; + count = 0; + } + else + { + previousButtonMillis_timer += buttonInterval; + } + } + break; + case 2: + //output NumTouchLocal + NumTouch = NumTouchLocal; + count++; + if (count > 1) + { + count = 0; + NumTouchLocal = 0; + step = 0; + } + break; + default: + NumTouchLocal = 0; + count = 0; + step = 0; + break; + } + Serial.println(F("button")); + Serial.println(NumTouchLocal); + } + +} + +//======================================================================================================================================================================== +bool isHere() +{ //ultrasound sensor + static unsigned long previousMillis_timer; + unsigned short sensorInterval = 100; + bool isHere = false; + if (previousMillis_timer <= millis() - sensorInterval)// currentMillis - sensorInterval could be != millis() - sensorInterval + { + previousMillis_timer += sensorInterval;//synchronize, besides, set clock + distance=((short)ultrasound.GetDistance())/10; //unsigned short + //Serial.println(distance); //Get and print distance of serial port, unit mm + //if (robotController.isRunning() == false) //Execute when the robotic arm stop running + { + if (distance <= 10) + { + isHere = true; + ultrasound.rainbow_color(); + } else {//>10 + ultrasound.Color(0, 255, 0, 0, 255, 0); //green + } + } + + } +} + +//======================================================================================================================================================================== +void setID() { + // all reset + digitalWrite(SHT_LOX1, LOW); + digitalWrite(SHT_LOX2, LOW); + digitalWrite(SHT_LOX3, LOW); + digitalWrite(SHT_LOX4, LOW); + delay(10); + // all unreset + digitalWrite(SHT_LOX1, HIGH); + digitalWrite(SHT_LOX2, HIGH); + digitalWrite(SHT_LOX3, HIGH); + digitalWrite(SHT_LOX4, HIGH); + delay(10); + + // activating LOX1 and reseting LOX2 + digitalWrite(SHT_LOX1, HIGH); + digitalWrite(SHT_LOX2, LOW); + digitalWrite(SHT_LOX3, LOW); + digitalWrite(SHT_LOX4, LOW); + + /* + // initing LOX1 + Wire.begin();//This function initializes the Wire library + lox1.setAddress(LOX1_ADDRESS);//set address// + if(!lox1.init()) { + Serial.println(F("Failed to boot first VL53L0X")); + //while(1); + } + */ + // initing LOX1 + if(!lox1.begin(LOX1_ADDRESS, false, &Wire, 3)) { + //Serial.println(F("Failed to boot first VL53L0X, LOX1")); + //while(1); + } + delay(10); + + // activating LOX2 + digitalWrite(SHT_LOX2, HIGH); + delay(10); + + //initing LOX2 + //Wire.begin();//This function initializes the Wire library + //default//lox2.setAddress(LOX2_ADDRESS);//set address// + //if(!lox2.init()) { + // Serial.println(F("Failed to boot second VL53L0X")); + //while(1); + //} + + + // activating LOX3 + digitalWrite(SHT_LOX3, HIGH); + delay(10); + + //initing LOX3 + Wire.begin();//This function initializes the Wire library + lox3.setAddress(LOX3_ADDRESS);//set address// + if(!lox3.init()) { + //Serial.println(F("Failed to boot third VL53L0X, LOX3")); + //while(1); + } + //lox3.setMeasurementTimingBudget(sensor1_Min); + //a longer timing budget allows for more accurate measurements. + + // activating LOX4 + digitalWrite(SHT_LOX4, HIGH); + delay(10); + + //initing LOX4 + Wire.begin();//This function initializes the Wire library + lox4.setAddress(LOX4_ADDRESS);//set address// + if(!lox4.init()) { + //Serial.println(F("Failed to boot fourth VL53L0X, LOX4")); + //while(1); + } +} + +//======================================================================================================================================================================== +void read_multi_tof_sensors() { + // the TOF distance sensors need 90 ms to read + //asynchronize, very fast + static unsigned long previousMillis_timer; + unsigned short sensorInterval = 100; //short + if (previousMillis_timer < millis() - sensorInterval)// currentMillis - sensorInterval could be != millis() - sensorInterval + { + previousMillis_timer += sensorInterval;//set clock + //make sure that the sensor value is number instaed of some mysterious string + // this holds the measurement + VL53L0X_RangingMeasurementData_t measure1; + + lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout! + // print sensor1 reading + Serial.print(F("1: ")); + if(measure1.RangeStatus != 4) { // if not out of range + sensor1 = measure1.RangeMilliMeter; + Serial.print(sensor1); + //Serial.print(F("mm")); + } else { + //Serial.print(F("Out of range")); + } + /* + Serial.print(F("1: ")); + Serial.print(lox1.readRangeSingleMillimeters()); + Serial.print(F("mm")); + */ + + //Serial.print(F(" ")); + + // print sensor2 reading + //Serial.print(F("2: ")); + // Serial.print(lox2.readRangeSingleMillimeters()); + // Serial.print(F("mm")); + + Serial.print(F(" ")); + + // print sensor3 reading + Serial.print(F("3: ")); + sensor3 = lox3.readRangeSingleMillimeters(); + Serial.print(sensor3); + //Serial.print(F("mm")); + + Serial.print(F(" ")); + + // print sensor4 reading + Serial.print(F("4: ")); + sensor4 = lox4.readRangeSingleMillimeters(); + Serial.print(sensor4); + //Serial.print(F("mm")); + + Serial.println(); + } + +} + +//======================================================================================================================================================================== +bool isBarriedSensor1() { + //asynchronize + //static unsigned long previousMillis_timer; + //unsigned short sensorInterval = 100; + bool isBarried = false;//sensor laser beam is not barried + //unsigned long difference; + // if (previousMillis_timer <= millis() - sensorInterval)// currentMillis - sensorInterval could be != millis() - sensorInterval + //{ + // previousMillis_timer += sensorInterval;//set clock // previousMillis_timer = previousMillis_timer + sensorInterval; + //double check whether we need to update the durationMoveTrain + //sensor1 is not stuck + //assume the sensor1 value will not stuck in a constant value when the robot arm moves + //assumw the pet will not stand between the sensor and the robot arm + //delay(100); + //sensor1 has been updated + //previousDistanceSensor1 is still the same as above in the function + //952 > 100 no need to update previousMillis_timer//1000;//no need 120; + + if (isRunningTrain) { //train is moving + short temp = previousDistanceSensor1 - sensor1; + Serial.println(F("previousDistanceSensor1")); + Serial.println(previousDistanceSensor1); + Serial.println(F("sensor1")); + Serial.println(sensor1); + Serial.println(F("difference")); + Serial.println((short)abs2((long)temp));//abs() can only be used for integer + Serial.println(F("2 * trainDuration * speedTrain")); + Serial.println(2 * trainDuration * speedTrain); + //if is barried, the difference > 0 + if ((previousDistanceSensor1 > sensor1) && (short)abs2((long)temp) > barrierIndex * trainDuration * speedTrain) { //(referencePoint + 2 - sensor1_Min) = 47 + //abs() can only be used for integer + //difference > 2 * trainDuration * speedTrain + //case1: sensor1 is barried by pet or something else + //because of sensor stuck + //due to the barrier + isBarried = true; + } else {//difference + //skip + } + } else {//!isRunningTrain + //corner case + //skip + // + } + return isBarried; + //} +} + +//train move forward (to the right side on the picture): +//======================================================================================================================================================================== +void moveForward(unsigned int durationMoveTrain) { + if (isRunTime) { + static unsigned long previousMillis_timer;//set loop check clock + if(previousMillis_timer <= currentMillis - trainDuration) + { + previousMillis_timer += trainDuration; + //synchronize, besides, set clock + //1000;// no need 250; + + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (durationMoveTrain <= durationMoveTrain_Max) { + //Serial.println(allow2updatePreviousMoveServo7_timer); + if (allow2updatePreviousMoveServo7_timer) { + //start + allow2updatePreviousMoveServo7_timer = false;//lock + //default//allow2updatePreviousMoveServo7_timer = false;//lock + previousMoveServo7_timer = currentMillis; + //Serial.println(F("previousMoveServo7_timer")); + //Serial.println(previousMoveServo7_timer); + //synchronize + // capture the latest value of currentMillis + // this is equivalent to noting the time from a clock + // use the same time for all servo 7 movements to keep them synchronized + + robotController.moveServo(7, 515, 1000);//set speed + isRunningTrain = true; + //Serial.println(F("currentMillis - previousMoveServo7_timer")); + //Serial.println(currentMillis - previousMoveServo7_timer); + //Serial.println(durationMoveTrain); + } else {//!allow2updatePreviousMoveServo7_timer + if (currentMillis - previousMoveServo7_timer > durationMoveTrain) {// only no sensor signal case, we guess + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + } else {//durationMoveTrain_accumulationActual <= durationMoveTrain + //skip//do nothing + } + } + } else {//durationMoveTrain > durationMoveTrain_Max + //skip //do nothing} + } + } else {// + //skip//do nothing + } + } else {//set up + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (durationMoveTrain <= durationMoveTrain_Max) { + robotController.moveServo(7, 515, 1000);//set speed + isRunningTrain = true; + delay(durationMoveTrain); + stopTrain(); + //!!!!!delete the sentence below when we finish the test + previousDistanceSensor1 = sensor1;//assume the sensor1 laser beam is not barried at the very beginnings + //it could be wrong// previousDistanceSensor1 = sensor1; + } else {//durationMoveTrain > durationMoveTrain_Max + //skip //do nothing + } + } + +} + +//======================================================================================================================================================================== +//Moving train to the reference point is its function +//moveBackward(), if the robot is on the right side of the reference point +//moveForward(), if the robot is on the left side of the reference point +bool initTrain(unsigned short sensor1) { + //moving the robot arm platform to the reference point is the function + //normally, it is used in the runtime, loop() + //initial + static unsigned long previousMillis_timer;//set loop check clock + bool isDone = false; + if(previousMillis_timer <= currentMillis - trainDuration) + { + previousMillis_timer += trainDuration; + //synchronize, besides, set clock + //1000;//no need 120; + //Serial.println(F("sensor1")); + //Serial.println(sensor1); + //Serial.println(F("previousDistanceSensor1")); + //Serial.println(previousDistanceSensor1); + if (sensor1 >= referencePoint - 2 && sensor1 <= referencePoint + 2) {//about 145 + //stop + isDone = true; + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + return isDone; + } else {// sensor1 < referencePoint - 2 || sensor1 > referencePoint + 2 + //Serial.println(F("sensor1 < referencePoint - 2 || sensor1 > referencePoint + 2")); + //move train only if the sensor value is from sensor1 0 to 710 + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + //trainDuration = (147 - 143)/ speedTrain = 595.24 ms + short temp = sensor1 - referencePoint;//unsigned short + //Serial.println(F("sensor1 - referencePoint")); + //Serial.println(temp); + //durationMoveTrain = (targetedPoint - referencePoint) / speedTrain; + durationMoveTrain = (int)(abs2((long)temp)/speedTrain);//abs() can only be used for integer //unsigned int + //Serial.println(F("durationMoveTrain")); + //Serial.println(durationMoveTrain); + if (sensor1 >= sensor1_Min && durationMoveTrain <= durationMoveTrain_Max) { + + //Serial.println(F("isBarried: ")); + //Serial.println(isBarriedSensor1()); + if (isBarriedSensor1()) { + //assume the train is moving + //case1: sensor1 is barried by pet or something else + //the reference point calculated during the runtime is wrong due to barrier + //but it is fine, after the pet move away, the reference pint will be recalculated and corrected. + //Serial.println(F("isB")); + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + //assume the train is moving, just have to wait for pet leaving there. + isRunningTrain = 1; + /* + if (isRunningTrain) { + + } else {//!isRunningTrain + + } + */ + } else {//!isBarriedSensor1() + + //durationMoveTrain can be used to show the big picture, while it could not be accurate when train is far from joint point + if (sensor1 > jointPoint && durationMoveTrain <= durationMoveTrain_Max) { + //synchronize + unsigned int durationMoveTrain_remainingPlanned = (int)abs2(currentMillis - previousMoveServo7_timer);//abs() can only be used for integer + Serial.println(F("currentMillis")); + Serial.println(currentMillis); + Serial.println(F("previousMoveServo7_timer")); + Serial.println(previousMoveServo7_timer); + Serial.println(F("durationMoveTrain_remainingPlanned")); + Serial.println(durationMoveTrain_remainingPlanned); + Serial.println(F("durationMoveTrainBeforeOverride")); + Serial.println(durationMoveTrain); + //check the difference between scheduled(the previous loop) remaining and actual(the currunt loop) + //if the variance between differenceDuration and trainDuration is too large, meaning the speed is very unstable or the sensor1 is very unaccurate + unsigned int differenceDuration = abs(durationMoveTrain_remainingPlanned - durationMoveTrain);//abs() can only be used for integer + Serial.println(F("differenceDuration")); + Serial.println(differenceDuration); + Serial.println("trainDuration"); + Serial.println(trainDuration); + //Through the test, we found it is because the sensor1 is not accurate in this case + //Therefore, give up to control precisely the position through the sensor1 in the case + //Override the value of durationMoveTrain + durationMoveTrain = durationMoveTrain_referPoint2jointPoint; + Serial.println(durationMoveTrain); + // corner case if the runtime is smaller than the calculated durationMoveTrain at the very beginning, settng clock will be missed + //check the difference between scheduled(the previous loop) remaining and actual(the currunt loop) + if (durationMoveTrain_remainingPlanned < durationMoveTrain) { + //(abs(durationMoveTrain_remainingPlanned) < durationMoveTrain)//set clock ////abs() can only be used for integer + //abs() can only be used for integer + //Serial.println(F("bigger asdfsdsff")); + //skip or continue to move + //small deviation or vibration is acceptable + } else {//durationMoveTrain_remainingPlanned >= durationMoveTrain + //Serial.println(F("bigger jointPointfsdfsdfsdfsdf")); + allow2updatePreviousMoveServo7_timer = true;//unlock + moveBackward(durationMoveTrain); + } + //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + if (previousDistanceSensor1 > sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 <= sensor1 + //skip + } + + + + + } else { + //sensor1_Min <= sensor1 < referencePoint - 2 || referencePoint + 2 < sensor1 <= jointPoint + //case2: sensor1 is not accurate(the value is too big or too small) during the previous loop period + //accurate control + short temp = previousDistanceSensor1 - sensor1; + unsigned short differenceDistance = (short)abs2((long)temp); + //Serial.println(F("sensor1_Min <= sensor1 < referencePoint - 2 || referencePoint + 2 < sensor1 <= jointPoint")); + //Serial.println(F("previousDistanceSensor1")); + //Serial.println(previousDistanceSensor1); + //Serial.println(F("differenceDistance")); + //Serial.println(differenceDistance); + //Serial.println(F("trainDuration * speedTrain * (1 - safeIndex)")); + //Serial.println(trainDuration * speedTrain * (1 - safeIndex)); + //Serial.println(F("trainDuration * speedTrain * (1 + safeIndex)")); + //Serial.println(trainDuration * speedTrain * (1 + safeIndex)); + //if (differenceDistance >= trainDuration * speedTrain * (1 - safeIndex) && differenceDistance <= trainDuration * speedTrain * (1 + safeIndex) ) { + + //idealy, the speed of train is stable, + //the distance difference per duration = trainDuration * speedTrain //(147 - 143) = 5 //10 //10.5 + //Besides, considering the sensor value deviation. + //sensor1 value could be floating between expectedValue - 1 to expectedValue + 1 + //(592 * 0.0084 * 0.7 = 3.4810, center = 592 * 0.0084 = 5, 592 * 0.0084 * 1.3 = 6.4646) + //nevertheless, the actual speed is a little high, + //592 * 0.0105 = 6.2160, it is very close to the upper boundary, + //therefore, how about 0.7 as upper-band safeindex, 592 * 0.0084 * 1.7 = 8.4538 + if (differenceDistance >= trainDuration * speedTrain * (1 - safeIndex) && differenceDistance <= trainDuration * speedTrain * (1.7) ) { + //Serial.println(F("less jointPoint durationMoveTrain_Max0skip")); + //continue to move + //small deviation or vibration is acceptable + previousDistanceSensor1 = sensor1; + //update it only if distance is correct which means no barrier + } else { //it could stop (differenceDistance < trainDuration * speedTrain * (1 - safeIndex)) or not in the range + //reset + //Override the value of durationMoveTrain + if (durationMoveTrain < trainDuration) { + //1000;//define the smallest step distance//resolution + durationMoveTrain = trainDuration; + } else { + //skip + + } + + allow2updatePreviousMoveServo7_timer = true; + if (sensor1 > referencePoint + 2) { + //Serial.println(F("sensor1 > referencePoint + 2 movef")); + //if (sensor1 > referencePoint + 2 && sensor1 <= jointPoint) {}//joint + moveBackward(durationMoveTrain);//set clock + //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + if (previousDistanceSensor1 > sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 <= sensor1 + //skip + } + + } else {//< referencePoint - 2 + //Serial.println(F("< referencePoint - 2moveForward")); + //if (sensor1 >= sensor1_Min && sensor1 < referencePoint - 2) {} + moveForward(durationMoveTrain);//set clock ////case1: + //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + + + } + } + + + + } + + + } + + + + } else { + //sensor1 < sensor1_Min || durationMoveTrain > durationMoveTrain_Max + //normally it is not allowed to move over durationMoveTrain_Max or under sensor1_Min + //no sensor signal available + //Serial.println(F("sensor1 < sensor1_Min || durationMoveTrain > durationMoveTrain_Max")); + stopTrain(); + if (sensor1 >= 0 && sensor1 < sensor1_Min) { + //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + if (previousDistanceSensor1 < sensor1) { + previousDistanceSensor1 = sensor1; + } else {//previousDistanceSensor1 >= sensor1 + //skip + } + + } + } + + + + + } + + //Serial.println('loop'); + return isDone;//-1//false//while(1); + } +} + +//======================================================================================================================================================================= +unsigned long abs2(long temp) { + unsigned long result; + //traditional abs() can only be used for integer + if (temp >= 0) { + result = temp; + } else {//temp <= 0 + result = 0 - temp; + } + + return result; +} + +//train move backward (to the left side): +//======================================================================================================================================================================== +void moveBackward(unsigned int durationMoveTrain) { + if (isRunTime) { + static unsigned long previousMillis_timer;//set loop check clock + if(previousMillis_timer <= currentMillis - trainDuration) + { + previousMillis_timer += trainDuration; + //synchronize, besides, set clock + //1000;// no need 250; + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (sensor1 >= sensor1_Min) { + //Serial.println(allow2updatePreviousMoveServo7_timer); + if (allow2updatePreviousMoveServo7_timer) { + //start + allow2updatePreviousMoveServo7_timer = false;//lock + previousMoveServo7_timer = currentMillis; + //Serial.println(F("previousMoveServo7_timer")); + //Serial.println(previousMoveServo7_timer); + //synchronize + // capture the latest value of currentMillis + // this is equivalent to noting the time from a clock + // use the same time for all servo 7 movements to keep them synchronized + + robotController.moveServo(7, 485, 1000);//set speed + isRunningTrain = true; + //Serial.println(currentMillis - previousMoveServo7_timer); + //Serial.println(durationMoveTrain); + } else {//!allow2updatePreviousMoveServo7_timer + + if (currentMillis - previousMoveServo7_timer > durationMoveTrain) { + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + } else { + //skip//do nothing + } + } + } else {//sensor < sensor1_Min + //skip //do nothing + } + + } else { + //skip//do nothing + } + } else {//set up + //protection: + //moveForward(durationMoveTrain_Max); allowed max distance //moveForward(durationMoveTrain_referPoint2jointPoint); in the setup() which means sensor1 310 joint point + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //sensor1 sensor1_Min allowed min distance + //reference point: 145 (143 - 147 is fine) + if (sensor1 >= sensor1_Min) { + robotController.moveServo(7, 485, 1000);//set speed + isRunningTrain = true; + delay(durationMoveTrain); + stopTrain(); + //it could be wrong// previousDistanceSensor1 = sensor1; + + } else {//sensor < sensor1_Min + //skip //do nothing + } + } +} + +//======================================================================================================================================================================== +void stopTrain() { + //default//allow2updatePreviousMoveServo7_timer = false;//lock + robotController.moveServo(7, 500, 1);//train stop: + //previousDistanceSensor1 = sensor1; //update the previousDistanceSensor1 only if the sensor1 is working well and is not barried + //no update it because it could be not correct + isRunningTrain = false; +} diff --git a/LobotServoController.cpp b/LobotServoController.cpp new file mode 100644 index 0000000..67e8703 --- /dev/null +++ b/LobotServoController.cpp @@ -0,0 +1,369 @@ +#include "LobotServoController.h" +#include + +#define GET_LOW_BYTE(A) (uint8_t)((A)) +//Marco function, get lower eight bits of A +#define GET_HIGH_BYTE(A) (uint8_t)((A) >> 8) +//Marco function,get high 8 bits of A +#define BYTE_TO_HW(A, B) ((((uint16_t)(A)) << 8) | (uint8_t)(B)) +//Marco function,A is the high 8bits and B is the low 8bits,which is combined into 16 bits + +LobotServoController::LobotServoController(SoftwareSerial &A) +{ + //Set the running action group number is 0xFF, the number of runs to be 0, the mark to be false in running, and the battery voltage to be 0 + numOfActinGroupRunning = 0xFF; + actionGroupRunTimes = 0; + isGetBatteryVolt = false; + isRunning_ = false; + batteryVoltage = 0; + stateChange = false; + isUseHardwareSerial = false; + stateChangeCallback = NULL; + A.listen(); + SerialX = (Stream*)(&A); +} + +LobotServoController::LobotServoController(HardwareSerial &A) +{ + //Set the running action group number is 0xFF, the number of runs to be 0, the mark to be false is running, and the battery voltage to be 0 + numOfActinGroupRunning = 0xFF; + actionGroupRunTimes = 0; + isGetBatteryVolt = false; + isRunning_ = false; + batteryVoltage = 0; + stateChange = false; + isUseHardwareSerial = true; + stateChangeCallback = NULL; + SerialX = (Stream*)(&A); +} + +/********************************************************************************* + * Function: moveServo + * Description: Control the single servo rotation + * Parameters: sevoID:servoID,Position:target position ,Time: rotation time + Servo ID value:0<= servo ID<=31,Time value: Time > 0 + * Return: no return + * Others: + **********************************************************************************/ +void LobotServoController::moveServo(uint8_t servoID, uint16_t Position, uint16_t Time) +{ + uint8_t buf[11]; + if (servoID > 31 || !(Time > 0)) { //The servo ID should not be greater than 31,which can be modified according to corresponding controller + return; + } + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = 8; //Date length=number of control servos*3+5,here=1*3+5 + buf[3] = CMD_SERVO_MOVE; //Fill servo movement command + buf[4] = 1; //Number of servo to be controlled + buf[5] = GET_LOW_BYTE(Time); //Fill time of low 8 bits + buf[6] = GET_HIGH_BYTE(Time); //Fill time of high 8 bits + buf[7] = servoID; //Servo ID + buf[8] = GET_LOW_BYTE(Position); //Fill target position of low 8 bits + buf[9] = GET_HIGH_BYTE(Position); //Fill target position of high 8 bits + + SerialX->write(buf, 10); +} + +/********************************************************************************* + * Function: moveServos + * Description: Control multiple servos rotation + * Parameters: servos[]:Servo struct array,Num:the munber of servos,Time:rotation time + 0 < Num <= 32,Time > 0 + * Return: no return + * Others: + **********************************************************************************/ +void LobotServoController::moveServos(LobotServo servos[], uint8_t Num, uint16_t Time) +{ + uint8_t buf[103]; //Set the cache + if (Num < 1 || Num > 32 || !(Time > 0)) { + return; //The number of the servos can not be 0 and the maximum is 32, the time can not be 0 + } + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = Num * 3 + 5; //Date length=number of control servo*3+5 + buf[3] = CMD_SERVO_MOVE; //Fill servo movement command + buf[4] = Num; //Number of servo to be controlled + buf[5] = GET_LOW_BYTE(Time); //Get time of low 8 bits + buf[6] = GET_HIGH_BYTE(Time); //Get time of high 8 bits + uint8_t index = 7; + for (uint8_t i = 0; i < Num; i++) { //Circularly fill the servo ID and the corresponding target position + buf[index++] = servos[i].ID; //Fill servo ID + buf[index++] = GET_LOW_BYTE(servos[i].Position); //Fill target position of low 8 bits + buf[index++] = GET_HIGH_BYTE(servos[i].Position);//Fill target position of high 8 bits + } + SerialX->write(buf, buf[2] + 2); //Send the frame,the length of which is the data length + two bytes of the frame header +} + +/********************************************************************************* + * Function: moveServos + * Description: Control multiple servos rotation + * Parameters: Num:the number of servo,Time:rotation time,...:servoID,rotation angle,servoID,rotation angle... + * Return: no return + * Others: + **********************************************************************************/ +void LobotServoController::moveServos(uint8_t Num, uint16_t Time, ...) +{ + uint8_t buf[128]; + va_list arg_ptr = NULL; + va_start(arg_ptr, Time); //Gets the variable parameter address + if (Num < 1 || Num > 32 || (!(Time > 0)) || arg_ptr == NULL) { + return; //The number of the servos can not be 0 and the maximum is 32, the time can not be 0,variable arguments cannot be empty + } + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = Num * 3 + 5; //Date length=number of control servo * 3 + 5 + buf[3] = CMD_SERVO_MOVE; //Servo movement command + buf[4] = Num; //Number of servo to be controlled + buf[5] = GET_LOW_BYTE(Time); //Get time of low 8 bits + buf[6] = GET_HIGH_BYTE(Time); //Get time of high 8 bits + uint8_t index = 7; + for (uint8_t i = 0; i < Num; i++) { //Circularly fill the servo ID and the corresponding target position from variable parameter + uint16_t tmp = va_arg(arg_ptr, uint16_t); //Get the servo ID from variable parameter + buf[index++] = GET_LOW_BYTE(tmp); //avrgcc's variable-parameterare all 16 bits + //Get it's low 8 bits + uint16_t pos = va_arg(arg_ptr, uint16_t); //Getcorresponding target position from variable parameter + buf[index++] = GET_LOW_BYTE(pos); //Fill target position of low 8 bits + buf[index++] = GET_HIGH_BYTE(pos); //Fill target position of high 8 bits + } + va_end(arg_ptr); //Empty arg_ptr + SerialX->write(buf, buf[2] + 2); //Send frame +} + + +/********************************************************************************* + * Function: runActionGroup + * Description: Runs the specified action group + * Parameters: NumOfAction:action group number, Times:perform Times + * Return: No return + * Others: Times = 0 is infinited loop + **********************************************************************************/ +void LobotServoController::runActionGroup(uint8_t numOfAction, uint16_t Times) +{ + uint8_t buf[7]; + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = 5; //Data length, the number of bytes of data frame except the head part of the data frame, this command is fixed to 5 + buf[3] = CMD_ACTION_GROUP_RUN; //Fill runs action group command + buf[4] = numOfAction; //Fill runs action group number + buf[5] = GET_LOW_BYTE(Times); //Gets the low 8 bits to run the number of times + buf[6] = GET_HIGH_BYTE(Times); //Gets the high 8 bits to run the number of times + //isRunning_ = true; + SerialX->write(buf, 7); //Send digital frame +} + +/********************************************************************************* + * Function: stopActiongGroup + * Description: Stop action group running + * Parameters: Speed: target speed + * Return: No return + * Others: + **********************************************************************************/ +void LobotServoController::stopActionGroup(void) +{ + uint8_t buf[4]; + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = 2; //Data length, the number of bytes of data frame except the head part of the data frame, this command is fixed to 2 + buf[3] = CMD_ACTION_GROUP_STOP; //Fill stop running action group command + + SerialX->write(buf, 4); //Send digital frame +} + +/********************************************************************************* + * Function: setActionGroupSpeed + * Description: Sets the speed of the specified action group + * Parameters: NumOfAction: action group number, Speed:target speed + * Return: no Return + * Others: + **********************************************************************************/ +void LobotServoController::setActionGroupSpeed(uint8_t numOfAction, uint16_t Speed) +{ + uint8_t buf[7]; + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = 5; //Data length, the number of bytes of data frame except the head part of the data frame, this command is fixed to 5 + buf[3] = CMD_ACTION_GROUP_SPEED; //Fill the set action group speed command + buf[4] = numOfAction; //Fill the action group number to set + buf[5] = GET_LOW_BYTE(Speed); //Get the lower eight of the target speed + buf[6] = GET_HIGH_BYTE(Speed); //Get the high eight of the target speed + + SerialX->write(buf, 7); //Send digital frame +} + + +/********************************************************************************* + * Function: setAllActionGroupSpeed + * Description: Sets the running speed of all action groups + * Parameters: Speed: target speed + * Return: no Return + * Others: + **********************************************************************************/ +void LobotServoController::setAllActionGroupSpeed(uint16_t Speed) +{ + setActionGroupSpeed(0xFF, Speed); //Call the action group speed set, and set the speed of all groups when the group number is 0xFF +} + +/********************************************************************************* + * Function: sendCMDGetBatteryVolt + * Description: Send get battery voltage command + * Parameters: no input parameter + * Return: no Return + * Others: + **********************************************************************************/ +void LobotServoController::sendCMDGetBatteryVolt() +{ + uint8_t buf[4]; + buf[0] = FRAME_HEADER; //Fill frame header + buf[1] = FRAME_HEADER; + buf[2] = 2; //Data length, the number of bytes of data frame except the head part of the data frame, this command is fixed to 2 + buf[3] = CMD_GET_BATTERY_VOLTAGE; //Battery voltage command after filling + if(!isUseHardwareSerial) + ((SoftwareSerial*)(SerialX))->listen(); + isGetBatteryVolt = false; + SerialX->write(buf, 4); //Send digital frame +} + +uint16_t LobotServoController::getBatteryVolt(void) +{ + if(isGetBatteryVolt) + { + isGetBatteryVolt = false; + return batteryVoltage; + }else{ + return -1; + } +} + +uint16_t LobotServoController::getBatteryVolt(uint32_t timeout) +{ + isGetBatteryVolt = false; + sendCMDGetBatteryVolt(); + timeout += millis(); + while(!isGetBatteryVolt) + { + if(timeout < millis()) + { + return -1; + } + receiveHandle(); + } + return batteryVoltage; +} +bool LobotServoController::isRunning() +{ + return isRunning_; +} + +int LobotServoController::actionGroupRunning() +{ + int ret; + ret = isRunning_ ? numOfActinGroupRunning : (-1); + return ret; +} + +bool LobotServoController::waitForStop(uint32_t timeout) +{ + while(SerialX->available()) + SerialX->read(); + timeout += millis(); + while(isRunning_) + { + if(timeout < millis()) + { + return false; + } + receiveHandle(); + } + return true; +} + +void LobotServoController::setCallback(void *p) +{ + if(p != NULL) + { + stateChangeCallback = (void(*)())p; + } +} +void LobotServoController::receiveHandler() +{ + uint8_t rx; + static uint8_t buf[16]; + static bool isGetFrameHeader = false; + static uint8_t frameHeaderCount = 0; + static uint8_t dataLength = 2; + static uint8_t dataCount = 0; + + while(SerialX->available() > 0) + { + rx = SerialX->read(); + if(!isGetFrameHeader) + { + if(rx == 0x55) + { + frameHeaderCount++; + if(frameHeaderCount == 2) + { + frameHeaderCount = 0; + isGetFrameHeader = true; + dataCount = 1; + } + } else { + isGetFrameHeader = false; + dataCount = 0; + frameHeaderCount = 0; + } + } + if(isGetFrameHeader) + { + buf[dataCount] = rx; + if(dataCount == 2) + { + dataLength = buf[dataCount]; + if(dataLength < 2 || dataLength > 8) + { + dataLength = 2; + isGetFrameHeader = false; + } + } + dataCount++; + if(dataCount == dataLength + 2) + { + isGetFrameHeader = false; + switch(buf[3]) + { + case BATTERY_VOLTAGE: + batteryVoltage = BYTE_TO_HW(buf[5], buf[4]); + isGetBatteryVolt = true; + break; + case ACTION_GROUP_RUNNING: + isRunning_ = true; + stateChange = true; + numOfActinGroupRunning = buf[4]; + actionGroupRunTimes = BYTE_TO_HW(buf[6],buf[5]); + break; + case ACTION_GROUP_COMPLETE: + case ACTION_GROUP_STOPPED: + stateChange = true; + numOfActinGroupRunning = 0xFF; + actionGroupRunTimes = 0; + isRunning_ = false; + break; + default: + break; + } + } + } + } + if(stateChange) + { + stateChange = false; + if(stateChangeCallback != NULL) + (*stateChangeCallback)(); + } +} + +void LobotServoController::receiveHandle() +{ + receiveHandler(); +} diff --git a/LobotServoController.h b/LobotServoController.h new file mode 100644 index 0000000..b6821ed --- /dev/null +++ b/LobotServoController.h @@ -0,0 +1,60 @@ +#ifndef LOBOTSERVOCONTROLLER_H +#define LOBOTSERVOCONTROLLER_H + +#include +#include + +//Send part of the command +#define FRAME_HEADER 0x55 //Frame header +#define CMD_SERVO_MOVE 0x03 //Servo movement command +#define CMD_ACTION_GROUP_RUN 0x06 //Run action group command +#define CMD_ACTION_GROUP_STOP 0x07 //Stop run action group command +#define CMD_ACTION_GROUP_SPEED 0x0B //Set action group runs speed command +#define CMD_GET_BATTERY_VOLTAGE 0x0F //Get battery voltage command + +//Receiver part of the command +#define BATTERY_VOLTAGE 0x0F //Battery voltage +#define ACTION_GROUP_RUNNING 0x06 //Action group running +#define ACTION_GROUP_STOPPED 0x07 //Action group stopped +#define ACTION_GROUP_COMPLETE 0x08 //Action group complete + +struct LobotServo { //ServoID and position struct + uint8_t ID; //ServoID + uint16_t Position; //Servo data +}; + +class LobotServoController { + public: + LobotServoController(SoftwareSerial &A); + LobotServoController(HardwareSerial &A); + void moveServo(uint8_t servoID, uint16_t Position, uint16_t Time); + void moveServos(LobotServo servos[], uint8_t Num, uint16_t Time); + void moveServos(uint8_t Num,uint16_t Time, ...); + void runActionGroup(uint8_t NumOfAction, uint16_t Times); + void stopActionGroup(void); + void setActionGroupSpeed(uint8_t NumOfAction, uint16_t Speed); + void setAllActionGroupSpeed(uint16_t Speed); + + + uint16_t getBatteryVolt(void); + uint16_t getBatteryVolt(uint32_t timeout); + bool waitForStop(uint32_t timeout); + void sendCMDGetBatteryVolt(void); + bool isRunning(void); + int actionGroupRunning(void); + void receiveHandler(void); + void receiveHandle(void); + void setCallback(void *p); + + private: + uint8_t numOfActinGroupRunning; //The sequence number of the running action group + uint16_t actionGroupRunTimes; //Number of running action group runs + bool isUseHardwareSerial; + bool isGetBatteryVolt; + uint16_t batteryVoltage; //Controller battery voltage + bool isRunning_; //Is there an action group running? + bool stateChange; + void (*stateChangeCallback)(void); + Stream *SerialX; +}; +#endif diff --git a/Ultrasound.cpp b/Ultrasound.cpp new file mode 100644 index 0000000..e1b8bb7 --- /dev/null +++ b/Ultrasound.cpp @@ -0,0 +1,131 @@ +#include +#include "Ultrasound.h" + +Ultrasound::Ultrasound() +{ + Wire.begin(); +} + +//Write byte +bool Ultrasound::wireWriteByte(uint8_t addr, uint8_t val) +{ + Wire.beginTransmission(addr); + Wire.write(val); + if( Wire.endTransmission() != 0 ) + { + return false; + } + return true; +} + +//Write multiple bytes +bool Ultrasound::wireWriteDataArray(uint8_t addr, uint8_t reg,uint8_t *val,unsigned int len) +{ + unsigned int i; + + Wire.beginTransmission(addr); + Wire.write(reg); + for(i = 0; i < len; i++) + { + Wire.write(val[i]); + } + if( Wire.endTransmission() != 0 ) + { + return false; + } + return true; +} + +//Read the specified length byte +int Ultrasound::wireReadDataArray(uint8_t addr, uint8_t reg, uint8_t *val, unsigned int len) +{ + unsigned char i = 0; + /* Indicate which register we want to read from */ + if (!wireWriteByte(addr, reg)) + { + return -1; + } + Wire.requestFrom(addr, len); + while (Wire.available()) + { + if (i >= len) + { + return -1; + } + val[i] = Wire.read(); + i++; + } + /* Read block data */ + return i; +} + +//Set ultrasonic rgb to breathing light mode +//r1,g1,b1 represent the breathing cycle of the rgb light on the right, for example,20,20,20,which means a cycle of 2s +//r2,g2,b2 represent the breathing cycle of the rgb light on the left +void Ultrasound::Breathing(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2) +{ + uint8_t breathing[6]; + uint8_t value = RGB_WORK_BREATHING_MODE; + + wireWriteDataArray(ULTRASOUND_I2C_ADDR, RGB_WORK_MODE, &value, 1); + breathing[0] = r1;breathing[1] = g1;breathing[2] = b1;//RGB1 blue + breathing[3] = r2;breathing[4] = g2;breathing[5] = b2;//RGB2 + wireWriteDataArray(ULTRASOUND_I2C_ADDR, RGB1_R_BREATHING_CYCLE,breathing,6); //Send color value +} + +//Set the color of the ultrasonic rgb light +//r1, g1, b1 represent the ratio of the three primary colors of the rgb lamp on the right, the range is 0-255 +//r2, g2, b2 represent the ratio of the three primary colors of the rgb lamp on the left, the range is 0-255 +void Ultrasound::Color(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2) +{ + uint8_t RGB[6]; + uint8_t value = RGB_WORK_SIMPLE_MODE; + + wireWriteDataArray(ULTRASOUND_I2C_ADDR, RGB_WORK_MODE,&value,1); + RGB[0] = r1;RGB[1] = g1;RGB[2] = b1;//RGB1 + RGB[3] = r2;RGB[4] = g2;RGB[5] = b2;//RGB2 + wireWriteDataArray(ULTRASOUND_I2C_ADDR, RGB1_R,RGB,6); +} + +//Get the distance measured by ultrasonic in mm +u16 Ultrasound::GetDistance() +{ + u16 distance; + wireReadDataArray(ULTRASOUND_I2C_ADDR, 0,(uint8_t *)&distance,2); + return distance; +} + +void Ultrasound::rainbow_color() ////Gradient rainbow light +{ + + if(i<33&&i>=0){ + r=255; + g=7.65*i; + b=0; + }else if(i<50&&i>=33){ + r=750-15*i; + g=255; + b=0; + }else if(i<=66&&i>=50){ + r=0; + g=255; + b=15*i-750; + }else if(i<=83&&i>66){ + r=0; + g=1250-15*i; + b=255; + }else if(i<=100&&i>83){ + r=9*i-750; + g=0; + b=255; + }else{ + r=5*i-350; + g=0; + b=1500-12.5*i; + } + i++; + if(i>120) + i=0; + Color(r, g,b, r, g, b); + + } diff --git a/Ultrasound.h b/Ultrasound.h new file mode 100644 index 0000000..1765e1d --- /dev/null +++ b/Ultrasound.h @@ -0,0 +1,52 @@ +#ifndef ULTRASOUND_H +#define ULTRASOUND_H + +#include + +#define ULTRASOUND_I2C_ADDR 0x77 + +//Register +#define DISDENCE_L 0//Lower 8 bits of distance, unit mm +#define DISDENCE_H 1 + +#define RGB_BRIGHTNESS 50//0-255 + +#define RGB_WORK_MODE 2//RGB light mode, 0:user-defined mode 1:breathing light mode default 0 + +#define RGB1_R 3//R value of probe No. 1, 0~255, default 0 +#define RGB1_G 4//default 0 +#define RGB1_B 5//default 255 + +#define RGB2_R 6//R value of probe No. 2, 0~255, default 0 +#define RGB2_G 7//default 0 +#define RGB2_B 8//default 255 + +#define RGB1_R_BREATHING_CYCLE 9 //In the breathing light mode, the breathing cycle of the R of the No. 1 probe, the unit is 100ms and the default is 0. + //If the period is set to 3000ms, the value is 30 +#define RGB1_G_BREATHING_CYCLE 10 +#define RGB1_B_BREATHING_CYCLE 11 + +#define RGB2_R_BREATHING_CYCLE 12//Probe 2 +#define RGB2_G_BREATHING_CYCLE 13 +#define RGB2_B_BREATHING_CYCLE 14 + +#define RGB_WORK_SIMPLE_MODE 0 +#define RGB_WORK_BREATHING_MODE 1 + +class Ultrasound { + public: + Ultrasound(); + bool wireWriteByte(uint8_t addr, uint8_t val); + bool wireWriteDataArray(uint8_t addr, uint8_t reg,uint8_t *val,unsigned int len); + int wireReadDataArray(uint8_t addr, uint8_t reg, uint8_t *val, unsigned int len); + + void Breathing(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2); + void Color(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2); + void rainbow_color(); + u16 GetDistance(); + int i; //Current data location + uint16_t r; + uint16_t g; + uint16_t b; +}; +#endif diff --git a/VL53L0X2.cpp b/VL53L0X2.cpp new file mode 100644 index 0000000..c4b9b2b --- /dev/null +++ b/VL53L0X2.cpp @@ -0,0 +1,1010 @@ +// Most of the functionality of this library is based on the VL53L0X2 API +// provided by ST (STSW-IMG005), and some of the explanatory comments are quoted +// or paraphrased from the API source code, API user manual (UM2039), and the +// VL53L0X2 datasheet. + +#include "VL53L0X2.h" +#include + + + +// Constructors //////////////////////////////////////////////////////////////// + +VL53L0X2::VL53L0X2() + : bus(&Wire)//what does it mean?? + , address(ADDRESS_DEFAULT) + , io_timeout(0) // no timeout + , did_timeout(false) +{ +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void VL53L0X2::setAddress(uint8_t new_addr) +{ + writeReg(I2C_SLAVE_DEVICE_ADDRESS, new_addr & 0x7F); + address = new_addr; +} + +// Initialize sensor using sequence based on VL53L0X2_DataInit(), +// VL53L0X2_StaticInit(), and VL53L0X2_PerformRefCalibration(). +// This function does not perform reference SPAD calibration +// (VL53L0X2_PerformRefSpadManagement()), since the API user manual says that it +// is performed by ST on the bare modules; it seems like that should work well +// enough unless a cover glass is added. +// If io_2v8 (optional) is true or not given, the sensor is configured for 2V8 +// mode. +bool VL53L0X2::init(bool io_2v8) +{ + // check model ID register (value specified in datasheet) + if (readReg(IDENTIFICATION_MODEL_ID) != 0xEE) { return false; } + + // VL53L0X2_DataInit() begin + + // sensor uses 1V8 mode for I/O by default; switch to 2V8 mode if necessary + if (io_2v8) + { + writeReg(VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, + readReg(VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV) | 0x01); // set bit 0 + } + + // "Set I2C standard mode" + writeReg(0x88, 0x00); + + writeReg(0x80, 0x01); + writeReg(0xFF, 0x01); + writeReg(0x00, 0x00); + stop_variable = readReg(0x91); + writeReg(0x00, 0x01); + writeReg(0xFF, 0x00); + writeReg(0x80, 0x00); + + // disable SIGNAL_RATE_MSRC (bit 1) and SIGNAL_RATE_PRE_RANGE (bit 4) limit checks + writeReg(MSRC_CONFIG_CONTROL, readReg(MSRC_CONFIG_CONTROL) | 0x12); + + // set final range signal rate limit to 0.25 MCPS (million counts per second) + setSignalRateLimit(0.25); + + writeReg(SYSTEM_SEQUENCE_CONFIG, 0xFF); + + // VL53L0X2_DataInit() end + + // VL53L0X2_StaticInit() begin + + uint8_t spad_count; + bool spad_type_is_aperture; + if (!getSpadInfo(&spad_count, &spad_type_is_aperture)) { return false; } + + // The SPAD map (RefGoodSpadMap) is read by VL53L0X2_get_info_from_device() in + // the API, but the same data seems to be more easily readable from + // GLOBAL_CONFIG_SPAD_ENABLES_REF_0 through _6, so read it from there + uint8_t ref_spad_map[6]; + readMulti(GLOBAL_CONFIG_SPAD_ENABLES_REF_0, ref_spad_map, 6); + + // -- VL53L0X2_set_reference_spads() begin (assume NVM values are valid) + + writeReg(0xFF, 0x01); + writeReg(DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + writeReg(DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + writeReg(0xFF, 0x00); + writeReg(GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); + + uint8_t first_spad_to_enable = spad_type_is_aperture ? 12 : 0; // 12 is the first aperture spad + uint8_t spads_enabled = 0; + + for (uint8_t i = 0; i < 48; i++) + { + if (i < first_spad_to_enable || spads_enabled == spad_count) + { + // This bit is lower than the first one that should be enabled, or + // (reference_spad_count) bits have already been enabled, so zero this bit + ref_spad_map[i / 8] &= ~(1 << (i % 8)); + } + else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + { + spads_enabled++; + } + } + + writeMulti(GLOBAL_CONFIG_SPAD_ENABLES_REF_0, ref_spad_map, 6); + + // -- VL53L0X2_set_reference_spads() end + + // -- VL53L0X2_load_tuning_settings() begin + // DefaultTuningSettings from VL53L0X2_tuning.h + + writeReg(0xFF, 0x01); + writeReg(0x00, 0x00); + + writeReg(0xFF, 0x00); + writeReg(0x09, 0x00); + writeReg(0x10, 0x00); + writeReg(0x11, 0x00); + + writeReg(0x24, 0x01); + writeReg(0x25, 0xFF); + writeReg(0x75, 0x00); + + writeReg(0xFF, 0x01); + writeReg(0x4E, 0x2C); + writeReg(0x48, 0x00); + writeReg(0x30, 0x20); + + writeReg(0xFF, 0x00); + writeReg(0x30, 0x09); + writeReg(0x54, 0x00); + writeReg(0x31, 0x04); + writeReg(0x32, 0x03); + writeReg(0x40, 0x83); + writeReg(0x46, 0x25); + writeReg(0x60, 0x00); + writeReg(0x27, 0x00); + writeReg(0x50, 0x06); + writeReg(0x51, 0x00); + writeReg(0x52, 0x96); + writeReg(0x56, 0x08); + writeReg(0x57, 0x30); + writeReg(0x61, 0x00); + writeReg(0x62, 0x00); + writeReg(0x64, 0x00); + writeReg(0x65, 0x00); + writeReg(0x66, 0xA0); + + writeReg(0xFF, 0x01); + writeReg(0x22, 0x32); + writeReg(0x47, 0x14); + writeReg(0x49, 0xFF); + writeReg(0x4A, 0x00); + + writeReg(0xFF, 0x00); + writeReg(0x7A, 0x0A); + writeReg(0x7B, 0x00); + writeReg(0x78, 0x21); + + writeReg(0xFF, 0x01); + writeReg(0x23, 0x34); + writeReg(0x42, 0x00); + writeReg(0x44, 0xFF); + writeReg(0x45, 0x26); + writeReg(0x46, 0x05); + writeReg(0x40, 0x40); + writeReg(0x0E, 0x06); + writeReg(0x20, 0x1A); + writeReg(0x43, 0x40); + + writeReg(0xFF, 0x00); + writeReg(0x34, 0x03); + writeReg(0x35, 0x44); + + writeReg(0xFF, 0x01); + writeReg(0x31, 0x04); + writeReg(0x4B, 0x09); + writeReg(0x4C, 0x05); + writeReg(0x4D, 0x04); + + writeReg(0xFF, 0x00); + writeReg(0x44, 0x00); + writeReg(0x45, 0x20); + writeReg(0x47, 0x08); + writeReg(0x48, 0x28); + writeReg(0x67, 0x00); + writeReg(0x70, 0x04); + writeReg(0x71, 0x01); + writeReg(0x72, 0xFE); + writeReg(0x76, 0x00); + writeReg(0x77, 0x00); + + writeReg(0xFF, 0x01); + writeReg(0x0D, 0x01); + + writeReg(0xFF, 0x00); + writeReg(0x80, 0x01); + writeReg(0x01, 0xF8); + + writeReg(0xFF, 0x01); + writeReg(0x8E, 0x01); + writeReg(0x00, 0x01); + writeReg(0xFF, 0x00); + writeReg(0x80, 0x00); + + // -- VL53L0X2_load_tuning_settings() end + + // "Set interrupt config to new sample ready" + // -- VL53L0X2_SetGpioConfig() begin + + writeReg(SYSTEM_INTERRUPT_CONFIG_GPIO, 0x04); + writeReg(GPIO_HV_MUX_ACTIVE_HIGH, readReg(GPIO_HV_MUX_ACTIVE_HIGH) & ~0x10); // active low + writeReg(SYSTEM_INTERRUPT_CLEAR, 0x01); + + // -- VL53L0X2_SetGpioConfig() end + + measurement_timing_budget_us = getMeasurementTimingBudget(); + + // "Disable MSRC and TCC by default" + // MSRC = Minimum Signal Rate Check + // TCC = Target CentreCheck + // -- VL53L0X2_SetSequenceStepEnable() begin + + writeReg(SYSTEM_SEQUENCE_CONFIG, 0xE8); + + // -- VL53L0X2_SetSequenceStepEnable() end + + // "Recalculate timing budget" + setMeasurementTimingBudget(90);//measurement_timing_budget_us);//a longer timing budget allows for more accurate measurements. + + // VL53L0X2_StaticInit() end + + // VL53L0X2_PerformRefCalibration() begin (VL53L0X2_perform_ref_calibration()) + + // -- VL53L0X2_perform_vhv_calibration() begin + + writeReg(SYSTEM_SEQUENCE_CONFIG, 0x01); + if (!performSingleRefCalibration(0x40)) { return false; } + + // -- VL53L0X2_perform_vhv_calibration() end + + // -- VL53L0X2_perform_phase_calibration() begin + + writeReg(SYSTEM_SEQUENCE_CONFIG, 0x02); + if (!performSingleRefCalibration(0x00)) { return false; } + + // -- VL53L0X2_perform_phase_calibration() end + + // "restore the previous Sequence Config" + writeReg(SYSTEM_SEQUENCE_CONFIG, 0xE8); + + // VL53L0X2_PerformRefCalibration() end + + return true; +} + +// Write an 8-bit register +void VL53L0X2::writeReg(uint8_t reg, uint8_t value) +{ + bus->beginTransmission(address); + bus->write(reg); + bus->write(value); + last_status = bus->endTransmission(); +} + +// Write a 16-bit register +void VL53L0X2::writeReg16Bit(uint8_t reg, uint16_t value) +{ + bus->beginTransmission(address); + bus->write(reg); + bus->write((uint8_t)(value >> 8)); // value high byte + bus->write((uint8_t)(value)); // value low byte + last_status = bus->endTransmission(); +} + +// Write a 32-bit register +void VL53L0X2::writeReg32Bit(uint8_t reg, uint32_t value) +{ + bus->beginTransmission(address); + bus->write(reg); + bus->write((uint8_t)(value >> 24)); // value highest byte + bus->write((uint8_t)(value >> 16)); + bus->write((uint8_t)(value >> 8)); + bus->write((uint8_t)(value)); // value lowest byte + last_status = bus->endTransmission(); +} + +// Read an 8-bit register +uint8_t VL53L0X2::readReg(uint8_t reg) +{ + uint8_t value; + + bus->beginTransmission(address); + bus->write(reg); + last_status = bus->endTransmission(); + + bus->requestFrom(address, (uint8_t)1); + value = bus->read(); + + return value; +} + +// Read a 16-bit register +uint16_t VL53L0X2::readReg16Bit(uint8_t reg) +{ + uint16_t value; + + bus->beginTransmission(address); + bus->write(reg); + last_status = bus->endTransmission(); + + bus->requestFrom(address, (uint8_t)2); + value = (uint16_t)bus->read() << 8; // value high byte + value |= bus->read(); // value low byte + + return value; +} + +// Read a 32-bit register +uint32_t VL53L0X2::readReg32Bit(uint8_t reg) +{ + uint32_t value; + + bus->beginTransmission(address); + bus->write(reg); + last_status = bus->endTransmission(); + + bus->requestFrom(address, (uint8_t)4); + value = (uint32_t)bus->read() << 24; // value highest byte + value |= (uint32_t)bus->read() << 16; + value |= (uint16_t)bus->read() << 8; + value |= bus->read(); // value lowest byte + + return value; +} + +// Write an arbitrary number of bytes from the given array to the sensor, +// starting at the given register +void VL53L0X2::writeMulti(uint8_t reg, uint8_t const * src, uint8_t count) +{ + bus->beginTransmission(address); + bus->write(reg); + + while (count-- > 0) + { + bus->write(*(src++)); + } + + last_status = bus->endTransmission(); +} + +// Read an arbitrary number of bytes from the sensor, starting at the given +// register, into the given array +void VL53L0X2::readMulti(uint8_t reg, uint8_t * dst, uint8_t count) +{ + bus->beginTransmission(address); + bus->write(reg); + last_status = bus->endTransmission(); + + bus->requestFrom(address, count); + + while (count-- > 0) + { + *(dst++) = bus->read(); + } +} + +// Set the return signal rate limit check value in units of MCPS (mega counts +// per second). "This represents the amplitude of the signal reflected from the +// target and detected by the device"; setting this limit presumably determines +// the minimum measurement necessary for the sensor to report a valid reading. +// Setting a lower limit increases the potential range of the sensor but also +// seems to increase the likelihood of getting an inaccurate reading because of +// unwanted reflections from objects other than the intended target. +// Defaults to 0.25 MCPS as initialized by the ST API and this library. +bool VL53L0X2::setSignalRateLimit(float limit_Mcps) +{ + if (limit_Mcps < 0 || limit_Mcps > 511.99) { return false; } + + // Q9.7 fixed point format (9 integer bits, 7 fractional bits) + writeReg16Bit(FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, limit_Mcps * (1 << 7)); + return true; +} + +// Get the return signal rate limit check value in MCPS +float VL53L0X2::getSignalRateLimit() +{ + return (float)readReg16Bit(FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT) / (1 << 7); +} + +// Set the measurement timing budget in microseconds, which is the time allowed +// for one measurement; the ST API and this library take care of splitting the +// timing budget among the sub-steps in the ranging sequence. A longer timing +// budget allows for more accurate measurements. Increasing the budget by a +// factor of N decreases the range measurement standard deviation by a factor of +// sqrt(N). Defaults to about 33 milliseconds; the minimum is 20 ms. +// based on VL53L0X2_set_measurement_timing_budget_micro_seconds() +bool VL53L0X2::setMeasurementTimingBudget(uint32_t budget_us) +{ + SequenceStepEnables enables; + SequenceStepTimeouts timeouts; + + uint16_t const StartOverhead = 1910; + uint16_t const EndOverhead = 960; + uint16_t const MsrcOverhead = 660; + uint16_t const TccOverhead = 590; + uint16_t const DssOverhead = 690; + uint16_t const PreRangeOverhead = 660; + uint16_t const FinalRangeOverhead = 550; + + uint32_t used_budget_us = StartOverhead + EndOverhead; + + getSequenceStepEnables(&enables); + getSequenceStepTimeouts(&enables, &timeouts); + + if (enables.tcc) + { + used_budget_us += (timeouts.msrc_dss_tcc_us + TccOverhead); + } + + if (enables.dss) + { + used_budget_us += 2 * (timeouts.msrc_dss_tcc_us + DssOverhead); + } + else if (enables.msrc) + { + used_budget_us += (timeouts.msrc_dss_tcc_us + MsrcOverhead); + } + + if (enables.pre_range) + { + used_budget_us += (timeouts.pre_range_us + PreRangeOverhead); + } + + if (enables.final_range) + { + used_budget_us += FinalRangeOverhead; + + // "Note that the final range timeout is determined by the timing + // budget and the sum of all other timeouts within the sequence. + // If there is no room for the final range timeout, then an error + // will be set. Otherwise the remaining time will be applied to + // the final range." + + if (used_budget_us > budget_us) + { + // "Requested timeout too big." + return false; + } + + uint32_t final_range_timeout_us = budget_us - used_budget_us; + + // set_sequence_step_timeout() begin + // (SequenceStepId == VL53L0X2_SEQUENCESTEP_FINAL_RANGE) + + // "For the final range timeout, the pre-range timeout + // must be added. To do this both final and pre-range + // timeouts must be expressed in macro periods MClks + // because they have different vcsel periods." + + uint32_t final_range_timeout_mclks = + timeoutMicrosecondsToMclks(final_range_timeout_us, + timeouts.final_range_vcsel_period_pclks); + + if (enables.pre_range) + { + final_range_timeout_mclks += timeouts.pre_range_mclks; + } + + writeReg16Bit(FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, + encodeTimeout(final_range_timeout_mclks)); + + // set_sequence_step_timeout() end + + measurement_timing_budget_us = budget_us; // store for internal reuse + } + return true; +} + +// Get the measurement timing budget in microseconds +// based on VL53L0X2_get_measurement_timing_budget_micro_seconds() +// in us +uint32_t VL53L0X2::getMeasurementTimingBudget() +{ + SequenceStepEnables enables; + SequenceStepTimeouts timeouts; + + uint16_t const StartOverhead = 1910; + uint16_t const EndOverhead = 960; + uint16_t const MsrcOverhead = 660; + uint16_t const TccOverhead = 590; + uint16_t const DssOverhead = 690; + uint16_t const PreRangeOverhead = 660; + uint16_t const FinalRangeOverhead = 550; + + // "Start and end overhead times always present" + uint32_t budget_us = StartOverhead + EndOverhead; + + getSequenceStepEnables(&enables); + getSequenceStepTimeouts(&enables, &timeouts); + + if (enables.tcc) + { + budget_us += (timeouts.msrc_dss_tcc_us + TccOverhead); + } + + if (enables.dss) + { + budget_us += 2 * (timeouts.msrc_dss_tcc_us + DssOverhead); + } + else if (enables.msrc) + { + budget_us += (timeouts.msrc_dss_tcc_us + MsrcOverhead); + } + + if (enables.pre_range) + { + budget_us += (timeouts.pre_range_us + PreRangeOverhead); + } + + if (enables.final_range) + { + budget_us += (timeouts.final_range_us + FinalRangeOverhead); + } + + measurement_timing_budget_us = budget_us; // store for internal reuse + return budget_us; +} + +// Set the VCSEL (vertical cavity surface emitting laser) pulse period for the +// given period type (pre-range or final range) to the given value in PCLKs. +// Longer periods seem to increase the potential range of the sensor. +// Valid values are (even numbers only): +// pre: 12 to 18 (initialized default: 14) +// final: 8 to 14 (initialized default: 10) +// based on VL53L0X2_set_vcsel_pulse_period() +bool VL53L0X2::setVcselPulsePeriod(vcselPeriodType type, uint8_t period_pclks) +{ + uint8_t vcsel_period_reg = encodeVcselPeriod(period_pclks); + + SequenceStepEnables enables; + SequenceStepTimeouts timeouts; + + getSequenceStepEnables(&enables); + getSequenceStepTimeouts(&enables, &timeouts); + + // "Apply specific settings for the requested clock period" + // "Re-calculate and apply timeouts, in macro periods" + + // "When the VCSEL period for the pre or final range is changed, + // the corresponding timeout must be read from the device using + // the current VCSEL period, then the new VCSEL period can be + // applied. The timeout then must be written back to the device + // using the new VCSEL period. + // + // For the MSRC timeout, the same applies - this timeout being + // dependant on the pre-range vcsel period." + + + if (type == VcselPeriodPreRange) + { + // "Set phase check limits" + switch (period_pclks) + { + case 12: + writeReg(PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x18); + break; + + case 14: + writeReg(PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x30); + break; + + case 16: + writeReg(PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x40); + break; + + case 18: + writeReg(PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x50); + break; + + default: + // invalid period + return false; + } + writeReg(PRE_RANGE_CONFIG_VALID_PHASE_LOW, 0x08); + + // apply new VCSEL period + writeReg(PRE_RANGE_CONFIG_VCSEL_PERIOD, vcsel_period_reg); + + // update timeouts + + // set_sequence_step_timeout() begin + // (SequenceStepId == VL53L0X2_SEQUENCESTEP_PRE_RANGE) + + uint16_t new_pre_range_timeout_mclks = + timeoutMicrosecondsToMclks(timeouts.pre_range_us, period_pclks); + + writeReg16Bit(PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + encodeTimeout(new_pre_range_timeout_mclks)); + + // set_sequence_step_timeout() end + + // set_sequence_step_timeout() begin + // (SequenceStepId == VL53L0X2_SEQUENCESTEP_MSRC) + + uint16_t new_msrc_timeout_mclks = + timeoutMicrosecondsToMclks(timeouts.msrc_dss_tcc_us, period_pclks); + + writeReg(MSRC_CONFIG_TIMEOUT_MACROP, + (new_msrc_timeout_mclks > 256) ? 255 : (new_msrc_timeout_mclks - 1)); + + // set_sequence_step_timeout() end + } + else if (type == VcselPeriodFinalRange) + { + switch (period_pclks) + { + case 8: + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x10); + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_LOW, 0x08); + writeReg(GLOBAL_CONFIG_VCSEL_WIDTH, 0x02); + writeReg(ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C); + writeReg(0xFF, 0x01); + writeReg(ALGO_PHASECAL_LIM, 0x30); + writeReg(0xFF, 0x00); + break; + + case 10: + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x28); + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_LOW, 0x08); + writeReg(GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + writeReg(ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09); + writeReg(0xFF, 0x01); + writeReg(ALGO_PHASECAL_LIM, 0x20); + writeReg(0xFF, 0x00); + break; + + case 12: + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x38); + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_LOW, 0x08); + writeReg(GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + writeReg(ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08); + writeReg(0xFF, 0x01); + writeReg(ALGO_PHASECAL_LIM, 0x20); + writeReg(0xFF, 0x00); + break; + + case 14: + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x48); + writeReg(FINAL_RANGE_CONFIG_VALID_PHASE_LOW, 0x08); + writeReg(GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + writeReg(ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07); + writeReg(0xFF, 0x01); + writeReg(ALGO_PHASECAL_LIM, 0x20); + writeReg(0xFF, 0x00); + break; + + default: + // invalid period + return false; + } + + // apply new VCSEL period + writeReg(FINAL_RANGE_CONFIG_VCSEL_PERIOD, vcsel_period_reg); + + // update timeouts + + // set_sequence_step_timeout() begin + // (SequenceStepId == VL53L0X2_SEQUENCESTEP_FINAL_RANGE) + + // "For the final range timeout, the pre-range timeout + // must be added. To do this both final and pre-range + // timeouts must be expressed in macro periods MClks + // because they have different vcsel periods." + + uint16_t new_final_range_timeout_mclks = + timeoutMicrosecondsToMclks(timeouts.final_range_us, period_pclks); + + if (enables.pre_range) + { + new_final_range_timeout_mclks += timeouts.pre_range_mclks; + } + + writeReg16Bit(FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, + encodeTimeout(new_final_range_timeout_mclks)); + + // set_sequence_step_timeout end + } + else + { + // invalid type + return false; + } + + // "Finally, the timing budget must be re-applied" + + setMeasurementTimingBudget(measurement_timing_budget_us); + + // "Perform the phase calibration. This is needed after changing on vcsel period." + // VL53L0X2_perform_phase_calibration() begin + + uint8_t sequence_config = readReg(SYSTEM_SEQUENCE_CONFIG); + writeReg(SYSTEM_SEQUENCE_CONFIG, 0x02); + performSingleRefCalibration(0x0); + writeReg(SYSTEM_SEQUENCE_CONFIG, sequence_config); + + // VL53L0X2_perform_phase_calibration() end + + return true; +} + +// Get the VCSEL pulse period in PCLKs for the given period type. +// based on VL53L0X2_get_vcsel_pulse_period() +uint8_t VL53L0X2::getVcselPulsePeriod(vcselPeriodType type) +{ + if (type == VcselPeriodPreRange) + { + return decodeVcselPeriod(readReg(PRE_RANGE_CONFIG_VCSEL_PERIOD)); + } + else if (type == VcselPeriodFinalRange) + { + return decodeVcselPeriod(readReg(FINAL_RANGE_CONFIG_VCSEL_PERIOD)); + } + else { return 255; } +} + +// Start continuous ranging measurements. If period_ms (optional) is 0 or not +// given, continuous back-to-back mode is used (the sensor takes measurements as +// often as possible); otherwise, continuous timed mode is used, with the given +// inter-measurement period in milliseconds determining how often the sensor +// takes a measurement. +// based on VL53L0X2_StartMeasurement() +void VL53L0X2::startContinuous(uint32_t period_ms) +{ + writeReg(0x80, 0x01); + writeReg(0xFF, 0x01); + writeReg(0x00, 0x00); + writeReg(0x91, stop_variable); + writeReg(0x00, 0x01); + writeReg(0xFF, 0x00); + writeReg(0x80, 0x00); + + if (period_ms != 0) + { + // continuous timed mode + + // VL53L0X2_SetInterMeasurementPeriodMilliSeconds() begin + + uint16_t osc_calibrate_val = readReg16Bit(OSC_CALIBRATE_VAL); + + if (osc_calibrate_val != 0) + { + period_ms *= osc_calibrate_val; + } + + writeReg32Bit(SYSTEM_INTERMEASUREMENT_PERIOD, period_ms); + + // VL53L0X2_SetInterMeasurementPeriodMilliSeconds() end + + writeReg(SYSRANGE_START, 0x04); // VL53L0X2_REG_SYSRANGE_MODE_TIMED + } + else + { + // continuous back-to-back mode + writeReg(SYSRANGE_START, 0x02); // VL53L0X2_REG_SYSRANGE_MODE_BACKTOBACK + } +} + +// Stop continuous measurements +// based on VL53L0X2_StopMeasurement() +void VL53L0X2::stopContinuous() +{ + writeReg(SYSRANGE_START, 0x01); // VL53L0X2_REG_SYSRANGE_MODE_SINGLESHOT + + writeReg(0xFF, 0x01); + writeReg(0x00, 0x00); + writeReg(0x91, 0x00); + writeReg(0x00, 0x01); + writeReg(0xFF, 0x00); +} + +// Returns a range reading in millimeters when continuous mode is active +// (readRangeSingleMillimeters() also calls this function after starting a +// single-shot range measurement) +uint16_t VL53L0X2::readRangeContinuousMillimeters() +{ + startTimeout(); + while ((readReg(RESULT_INTERRUPT_STATUS) & 0x07) == 0) + { + if (checkTimeoutExpired()) + { + did_timeout = true; + return 65535; + } + } + + // assumptions: Linearity Corrective Gain is 1000 (default); + // fractional ranging is not enabled + uint16_t range = readReg16Bit(RESULT_RANGE_STATUS + 10); + + writeReg(SYSTEM_INTERRUPT_CLEAR, 0x01); + + return range; +} + +// Performs a single-shot range measurement and returns the reading in +// millimeters +// based on VL53L0X2_PerformSingleRangingMeasurement() +uint16_t VL53L0X2::readRangeSingleMillimeters() +{ + writeReg(0x80, 0x01); + writeReg(0xFF, 0x01); + writeReg(0x00, 0x00); + writeReg(0x91, stop_variable); + writeReg(0x00, 0x01); + writeReg(0xFF, 0x00); + writeReg(0x80, 0x00); + + writeReg(SYSRANGE_START, 0x01); + + // "Wait until start bit has been cleared" + startTimeout(); + while (readReg(SYSRANGE_START) & 0x01) + { + if (checkTimeoutExpired()) + { + did_timeout = true; + return 65535; + } + } + + return readRangeContinuousMillimeters(); +} + +// Did a timeout occur in one of the read functions since the last call to +// timeoutOccurred()? +bool VL53L0X2::timeoutOccurred() +{ + bool tmp = did_timeout; + did_timeout = false; + return tmp; +} + +// Private Methods ///////////////////////////////////////////////////////////// + +// Get reference SPAD (single photon avalanche diode) count and type +// based on VL53L0X2_get_info_from_device(), +// but only gets reference SPAD count and type +bool VL53L0X2::getSpadInfo(uint8_t * count, bool * type_is_aperture) +{ + uint8_t tmp; + + writeReg(0x80, 0x01); + writeReg(0xFF, 0x01); + writeReg(0x00, 0x00); + + writeReg(0xFF, 0x06); + writeReg(0x83, readReg(0x83) | 0x04); + writeReg(0xFF, 0x07); + writeReg(0x81, 0x01); + + writeReg(0x80, 0x01); + + writeReg(0x94, 0x6b); + writeReg(0x83, 0x00); + startTimeout(); + while (readReg(0x83) == 0x00) + { + if (checkTimeoutExpired()) { return false; } + } + writeReg(0x83, 0x01); + tmp = readReg(0x92); + + *count = tmp & 0x7f; + *type_is_aperture = (tmp >> 7) & 0x01; + + writeReg(0x81, 0x00); + writeReg(0xFF, 0x06); + writeReg(0x83, readReg(0x83) & ~0x04); + writeReg(0xFF, 0x01); + writeReg(0x00, 0x01); + + writeReg(0xFF, 0x00); + writeReg(0x80, 0x00); + + return true; +} + +// Get sequence step enables +// based on VL53L0X2_GetSequenceStepEnables() +void VL53L0X2::getSequenceStepEnables(SequenceStepEnables * enables) +{ + uint8_t sequence_config = readReg(SYSTEM_SEQUENCE_CONFIG); + + enables->tcc = (sequence_config >> 4) & 0x1; + enables->dss = (sequence_config >> 3) & 0x1; + enables->msrc = (sequence_config >> 2) & 0x1; + enables->pre_range = (sequence_config >> 6) & 0x1; + enables->final_range = (sequence_config >> 7) & 0x1; +} + +// Get sequence step timeouts +// based on get_sequence_step_timeout(), +// but gets all timeouts instead of just the requested one, and also stores +// intermediate values +void VL53L0X2::getSequenceStepTimeouts(SequenceStepEnables const * enables, SequenceStepTimeouts * timeouts) +{ + timeouts->pre_range_vcsel_period_pclks = getVcselPulsePeriod(VcselPeriodPreRange); + + timeouts->msrc_dss_tcc_mclks = readReg(MSRC_CONFIG_TIMEOUT_MACROP) + 1; + timeouts->msrc_dss_tcc_us = + timeoutMclksToMicroseconds(timeouts->msrc_dss_tcc_mclks, + timeouts->pre_range_vcsel_period_pclks); + + timeouts->pre_range_mclks = + decodeTimeout(readReg16Bit(PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI)); + timeouts->pre_range_us = + timeoutMclksToMicroseconds(timeouts->pre_range_mclks, + timeouts->pre_range_vcsel_period_pclks); + + timeouts->final_range_vcsel_period_pclks = getVcselPulsePeriod(VcselPeriodFinalRange); + + timeouts->final_range_mclks = + decodeTimeout(readReg16Bit(FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI)); + + if (enables->pre_range) + { + timeouts->final_range_mclks -= timeouts->pre_range_mclks; + } + + timeouts->final_range_us = + timeoutMclksToMicroseconds(timeouts->final_range_mclks, + timeouts->final_range_vcsel_period_pclks); +} + +// Decode sequence step timeout in MCLKs from register value +// based on VL53L0X2_decode_timeout() +// Note: the original function returned a uint32_t, but the return value is +// always stored in a uint16_t. +uint16_t VL53L0X2::decodeTimeout(uint16_t reg_val) +{ + // format: "(LSByte * 2^MSByte) + 1" + return (uint16_t)((reg_val & 0x00FF) << + (uint16_t)((reg_val & 0xFF00) >> 8)) + 1; +} + +// Encode sequence step timeout register value from timeout in MCLKs +// based on VL53L0X2_encode_timeout() +uint16_t VL53L0X2::encodeTimeout(uint32_t timeout_mclks) +{ + // format: "(LSByte * 2^MSByte) + 1" + + uint32_t ls_byte = 0; + uint16_t ms_byte = 0; + + if (timeout_mclks > 0) + { + ls_byte = timeout_mclks - 1; + + while ((ls_byte & 0xFFFFFF00) > 0) + { + ls_byte >>= 1; + ms_byte++; + } + + return (ms_byte << 8) | (ls_byte & 0xFF); + } + else { return 0; } +} + +// Convert sequence step timeout from MCLKs to microseconds with given VCSEL period in PCLKs +// based on VL53L0X2_calc_timeout_us() +uint32_t VL53L0X2::timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks) +{ + uint32_t macro_period_ns = calcMacroPeriod(vcsel_period_pclks); + + return ((timeout_period_mclks * macro_period_ns) + 500) / 1000; +} + +// Convert sequence step timeout from microseconds to MCLKs with given VCSEL period in PCLKs +// based on VL53L0X2_calc_timeout_mclks() +uint32_t VL53L0X2::timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks) +{ + uint32_t macro_period_ns = calcMacroPeriod(vcsel_period_pclks); + + return (((timeout_period_us * 1000) + (macro_period_ns / 2)) / macro_period_ns); +} + + +// based on VL53L0X2_perform_single_ref_calibration() +bool VL53L0X2::performSingleRefCalibration(uint8_t vhv_init_byte) +{ + writeReg(SYSRANGE_START, 0x01 | vhv_init_byte); // VL53L0X2_REG_SYSRANGE_MODE_START_STOP + + startTimeout(); + while ((readReg(RESULT_INTERRUPT_STATUS) & 0x07) == 0) + { + if (checkTimeoutExpired()) { return false; } + } + + writeReg(SYSTEM_INTERRUPT_CLEAR, 0x01); + + writeReg(SYSRANGE_START, 0x00); + + return true; +} diff --git a/VL53L0X2.h b/VL53L0X2.h new file mode 100644 index 0000000..ac58190 --- /dev/null +++ b/VL53L0X2.h @@ -0,0 +1,206 @@ +#ifndef VL53L0X2_h +#define VL53L0X2_h + +#include +#include + + +// Defines ///////////////////////////////////////////////////////////////////// + +// The Arduino two-wire interface uses a 7-bit number for the address, +// and sets the last bit correctly based on reads and writes +#define ADDRESS_DEFAULT 0b0101001 + +// Record the current time to check an upcoming timeout against +#define startTimeout() (timeout_start_ms = millis()) + +// Check if timeout is enabled (set to nonzero value) and has expired +#define checkTimeoutExpired() (io_timeout > 0 && ((uint16_t)(millis() - timeout_start_ms) > io_timeout)) + +// Decode VCSEL (vertical cavity surface emitting laser) pulse period in PCLKs +// from register value +// based on VL53L0X2_decode_vcsel_period() +#define decodeVcselPeriod(reg_val) (((reg_val) + 1) << 1) + +// Encode VCSEL pulse period register value from period in PCLKs +// based on VL53L0X2_encode_vcsel_period() +#define encodeVcselPeriod(period_pclks) (((period_pclks) >> 1) - 1) + +// Calculate macro period in *nanoseconds* from VCSEL period in PCLKs +// based on VL53L0X2_calc_macro_period_ps() +// PLL_period_ps = 1655; macro_period_vclks = 2304 +#define calcMacroPeriod(vcsel_period_pclks) ((((uint32_t)2304 * (vcsel_period_pclks) * 1655) + 500) / 1000) + + +class VL53L0X2 +{ + public: + // register addresses from API VL53L0X2_device.h (ordered as listed there) + enum regAddr + { + SYSRANGE_START = 0x00, + + SYSTEM_THRESH_HIGH = 0x0C, + SYSTEM_THRESH_LOW = 0x0E, + + SYSTEM_SEQUENCE_CONFIG = 0x01, + SYSTEM_RANGE_CONFIG = 0x09, + SYSTEM_INTERMEASUREMENT_PERIOD = 0x04, + + SYSTEM_INTERRUPT_CONFIG_GPIO = 0x0A, + + GPIO_HV_MUX_ACTIVE_HIGH = 0x84, + + SYSTEM_INTERRUPT_CLEAR = 0x0B, + + RESULT_INTERRUPT_STATUS = 0x13, + RESULT_RANGE_STATUS = 0x14, + + RESULT_CORE_AMBIENT_WINDOW_EVENTS_RTN = 0xBC, + RESULT_CORE_RANGING_TOTAL_EVENTS_RTN = 0xC0, + RESULT_CORE_AMBIENT_WINDOW_EVENTS_REF = 0xD0, + RESULT_CORE_RANGING_TOTAL_EVENTS_REF = 0xD4, + RESULT_PEAK_SIGNAL_RATE_REF = 0xB6, + + ALGO_PART_TO_PART_RANGE_OFFSET_MM = 0x28, + + I2C_SLAVE_DEVICE_ADDRESS = 0x8A, + + MSRC_CONFIG_CONTROL = 0x60, + + PRE_RANGE_CONFIG_MIN_SNR = 0x27, + PRE_RANGE_CONFIG_VALID_PHASE_LOW = 0x56, + PRE_RANGE_CONFIG_VALID_PHASE_HIGH = 0x57, + PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT = 0x64, + + FINAL_RANGE_CONFIG_MIN_SNR = 0x67, + FINAL_RANGE_CONFIG_VALID_PHASE_LOW = 0x47, + FINAL_RANGE_CONFIG_VALID_PHASE_HIGH = 0x48, + FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT = 0x44, + + PRE_RANGE_CONFIG_SIGMA_THRESH_HI = 0x61, + PRE_RANGE_CONFIG_SIGMA_THRESH_LO = 0x62, + + PRE_RANGE_CONFIG_VCSEL_PERIOD = 0x50, + PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI = 0x51, + PRE_RANGE_CONFIG_TIMEOUT_MACROP_LO = 0x52, + + SYSTEM_HISTOGRAM_BIN = 0x81, + HISTOGRAM_CONFIG_INITIAL_PHASE_SELECT = 0x33, + HISTOGRAM_CONFIG_READOUT_CTRL = 0x55, + + FINAL_RANGE_CONFIG_VCSEL_PERIOD = 0x70, + FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI = 0x71, + FINAL_RANGE_CONFIG_TIMEOUT_MACROP_LO = 0x72, + CROSSTALK_COMPENSATION_PEAK_RATE_MCPS = 0x20, + + MSRC_CONFIG_TIMEOUT_MACROP = 0x46, + + SOFT_RESET_GO2_SOFT_RESET_N = 0xBF, + IDENTIFICATION_MODEL_ID = 0xC0, + IDENTIFICATION_REVISION_ID = 0xC2, + + OSC_CALIBRATE_VAL = 0xF8, + + GLOBAL_CONFIG_VCSEL_WIDTH = 0x32, + GLOBAL_CONFIG_SPAD_ENABLES_REF_0 = 0xB0, + GLOBAL_CONFIG_SPAD_ENABLES_REF_1 = 0xB1, + GLOBAL_CONFIG_SPAD_ENABLES_REF_2 = 0xB2, + GLOBAL_CONFIG_SPAD_ENABLES_REF_3 = 0xB3, + GLOBAL_CONFIG_SPAD_ENABLES_REF_4 = 0xB4, + GLOBAL_CONFIG_SPAD_ENABLES_REF_5 = 0xB5, + + GLOBAL_CONFIG_REF_EN_START_SELECT = 0xB6, + DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD = 0x4E, + DYNAMIC_SPAD_REF_EN_START_OFFSET = 0x4F, + POWER_MANAGEMENT_GO1_POWER_FORCE = 0x80, + + VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV = 0x89, + + ALGO_PHASECAL_LIM = 0x30, + ALGO_PHASECAL_CONFIG_TIMEOUT = 0x30, + }; + + enum vcselPeriodType { VcselPeriodPreRange, VcselPeriodFinalRange }; + + uint8_t last_status; // status of last I2C transmission + + VL53L0X2(); + + void setBus(TwoWire * bus) { this->bus = bus; } + TwoWire * getBus() { return bus; } + + void setAddress(uint8_t new_addr); + inline uint8_t getAddress() { return address; } + + bool init(bool io_2v8 = true); + + void writeReg(uint8_t reg, uint8_t value); + void writeReg16Bit(uint8_t reg, uint16_t value); + void writeReg32Bit(uint8_t reg, uint32_t value); + uint8_t readReg(uint8_t reg); + uint16_t readReg16Bit(uint8_t reg); + uint32_t readReg32Bit(uint8_t reg); + + void writeMulti(uint8_t reg, uint8_t const * src, uint8_t count); + void readMulti(uint8_t reg, uint8_t * dst, uint8_t count); + + bool setSignalRateLimit(float limit_Mcps); + float getSignalRateLimit(); + + bool setMeasurementTimingBudget(uint32_t budget_us); + uint32_t getMeasurementTimingBudget(); + + bool setVcselPulsePeriod(vcselPeriodType type, uint8_t period_pclks); + uint8_t getVcselPulsePeriod(vcselPeriodType type); + + void startContinuous(uint32_t period_ms = 0); + void stopContinuous(); + uint16_t readRangeContinuousMillimeters(); + uint16_t readRangeSingleMillimeters(); + + inline void setTimeout(uint16_t timeout) { io_timeout = timeout; } + inline uint16_t getTimeout() { return io_timeout; } + bool timeoutOccurred(); + + private: + // TCC: Target CentreCheck + // MSRC: Minimum Signal Rate Check + // DSS: Dynamic Spad Selection + + struct SequenceStepEnables + { + boolean tcc, msrc, dss, pre_range, final_range; + }; + + struct SequenceStepTimeouts + { + uint16_t pre_range_vcsel_period_pclks, final_range_vcsel_period_pclks; + + uint16_t msrc_dss_tcc_mclks, pre_range_mclks, final_range_mclks; + uint32_t msrc_dss_tcc_us, pre_range_us, final_range_us; + }; + + TwoWire * bus; + uint8_t address; + uint16_t io_timeout; + bool did_timeout; + uint16_t timeout_start_ms; + + uint8_t stop_variable; // read by init and used when starting measurement; is StopVariable field of VL53L0X2_DevData_t structure in API + uint32_t measurement_timing_budget_us; + + bool getSpadInfo(uint8_t * count, bool * type_is_aperture); + + void getSequenceStepEnables(SequenceStepEnables * enables); + void getSequenceStepTimeouts(SequenceStepEnables const * enables, SequenceStepTimeouts * timeouts); + + bool performSingleRefCalibration(uint8_t vhv_init_byte); + + static uint16_t decodeTimeout(uint16_t value); + static uint16_t encodeTimeout(uint32_t timeout_mclks); + static uint32_t timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks); + static uint32_t timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks); +}; + +#endif From 14fd7bbd48de4b439545801f6b2a7bb9f345a68c Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:57:02 -0500 Subject: [PATCH 07/23] Update robot arm source code (4).txt --- robot arm source code (4).txt | 1 + 1 file changed, 1 insertion(+) diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt index ea81a35..a2197fb 100644 --- a/robot arm source code (4).txt +++ b/robot arm source code (4).txt @@ -1,3 +1,4 @@ +//This is a .ino file, //there are about 25 functions in this robot control script //porject idea introduction: //https://docs.google.com/presentation/d/12GfPPMKdLY4WXjXnS6jgWiD87svpd2VR/edit?usp=sharing&ouid=104479909616474097737&rtpof=true&sd=true From 4d9880ad0538f5d30bf395a9ab229dcaeae0991f Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Fri, 1 Jul 2022 11:13:23 -0500 Subject: [PATCH 08/23] Update robot arm source code (4).txt --- robot arm source code (4).txt | 143 +++++++++++++++++++++++++--------- 1 file changed, 105 insertions(+), 38 deletions(-) diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt index a2197fb..422a11e 100644 --- a/robot arm source code (4).txt +++ b/robot arm source code (4).txt @@ -13,7 +13,7 @@ #include "Adafruit_VL53L0X2.h" #include "LobotServoController.h" #include "Ultrasound.h" -//#include "Screen.h" +#include "U8g2lib.h" #include #include //default #include @@ -30,7 +30,7 @@ // --------CONSTANTS (won't change)------------------------------------------------------- // address we will assign if dual sensor is present #define LOX1_ADDRESS 0x30//0x27 and 0x28 could be used -#define LOX2_ADDRESS 0x29//default +//#define LOX2_ADDRESS 0x29//default #define LOX3_ADDRESS 0x31 #define LOX4_ADDRESS 0x32 @@ -86,7 +86,7 @@ byte barrierIndex = 9; //dictionary: //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement unsigned int durationMoveTrain_trashBin = durationMoveTrain_Max; - unsigned int durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 10000; + unsigned int durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 13000; //------------ VARIABLES (will change)----------------------------------------------------- @@ -102,14 +102,15 @@ unsigned long currentMillis = 0; //stores the value of total run time //in this class only duration or interval period is used // objects for the vl53l0x -Adafruit_VL53L0X2 lox1; //VL53L0X2 lox1; +VL53L0X2 lox1;//Adafruit_VL53L0X2 lox1; // //VL53L0X2 lox2; VL53L0X2 lox3; VL53L0X2 lox4; SoftwareSerial mySerial(RxPin, TxPin); //Instantiate soft serial port£¨rx£¬tx£© LobotServoController robotController(mySerial); //Instantiate servo controller communication library Ultrasound ultrasound; //Instantiate the ultrasonic class -//Screen screen; +U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//screen = Screen(); + /* //why it cause dead loop if we call constructors in setup() lox1 = Adafruit_VL53L0X2(); //lox1 = VL53L0X2(); @@ -118,7 +119,6 @@ Ultrasound ultrasound; //Instantiate the ultrasonic class lox4 = VL53L0X2(); //robotController(mySerial); ultrasound = Ultrasound(); //Instantiate the ultrasonic class - //screen = Screen(); */ bool isRunTime = false; @@ -247,6 +247,19 @@ void setup() { //initial sensors //________________________________ + { + u8g2.begin();//Wire.begin(); + u8g2.setFontPosTop(); + + u8g2.setDisplayRotation(U8G2_R2); + u8g2.setFont(u8g2_font_fub20_tr); + u8g2.firstPage(); + do { + u8g2.setCursor(0, 38); + u8g2.println("0.0"); + } while ( u8g2.nextPage() ); + + } setID(); delay(100); // the TOF distance sensors need 90 ms to read initialization(); //read_multi_tof_sensors(); //previousDistanceSensor1 = sensor1; @@ -320,6 +333,7 @@ void loop() { //read //____________________________________________________________________________________________________________________ //user IO + readSerial(); //asynchronous, fast readButton(); //asynchronous, fast //sensors if (isHere(IR3))//the farthest InfraRedSensor @@ -360,29 +374,44 @@ void loop() { run(); //Serial.println(F("isSafe2grib")); //Serial.println(isSafe2grib); - bool isDoneStep1 = step1(); - if (isDoneStep1) { + //bool isDoneStep1 = step1(); + //if (isDoneStep1) { step3(); - } + //} //display //report to the PC or monitor //____________________________________________________________________________________________________________________ - //screen.draw(sensor3); //asynchronous, very slow + //draw(sensor3); //asynchronous, very slow //delay(100); // do not use delay() in the loop() {}, it will cause the currentMillis delay 100 ms, which could undermine the servo7 movement 100 * 0.0105 = about 1 cm } //==================================================================================================================================================================== +void readSerial() { + static unsigned long previousButtonMillis_timer; + unsigned short buttonInterval = 200; + char NumTouchLocal; + if (previousButtonMillis_timer <= abs2(millis() - (long)buttonInterval)) {// currentMillis = abs2(millis() - (long)buttonInterval) + previousButtonMillis_timer += buttonInterval; + if (Serial.available() > 0) { + NumTouchLocal = char(Serial.read()); + NumTouch = (byte)NumTouchLocal - (byte)('0'); + Serial.println(NumTouch); + } + } +} + +//==================================================================================================================================================================== void initialization() { //could be initialized again________________________ durationMoveTrain_Max = durationMoveTrain_referPoint2jointPoint + 30000; //45000; //dictionary: //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement durationMoveTrain_trashBin = durationMoveTrain_Max; - durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 10000; + durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 13000; //could be initialized again________________________ //assume servo7 is controlled by arduino board, Hiwonder robot arm board support it by providing energy and delivering information. @@ -399,7 +428,7 @@ void initialization() { durationMoveTrain_remainingPlanned = 0; isFirstTime2SetDurationMoveTrain_remainingPlanned = true; previousMillis = 0; - //unsigned short sensor2 = 0; + //sensor2 = 0; sensor3 = 0; sensor4 = 0; distance = 0; //ultrasound sensor @@ -438,6 +467,40 @@ void initialization() { } } +//======================================================================================================================================================================== +void draw(unsigned int sensor3) { + // answer + // no need to synchronize, keep currentMillis local + // can report slowly + static uint32_t previousMillis_timer = 0; + unsigned int screenInterval = 500; + if (previousMillis_timer < millis() - screenInterval)//currentMillis = millis() - screenInterval + { + previousMillis_timer = previousMillis_timer + screenInterval;//set clock + u8g2.clearBuffer(); + u8g2.firstPage(); + do { + if(sensor3 < 350)// + { + u8g2.setFont(u8g2_font_fub35_tn);//u8g2.setFont(u8g2_font_fub35_tn); // 791 bytes + u8g2.setCursor(0, 38); + //Serial.println(sensor3); + //u8g2.print(" "); + u8g2.print(sensor3, 1); + //u8g2.setCursor(90, 38); + //u8g2.setFont(u8g2_font_fub20_tr); // 2520 bytes + //u8g2.println("mm"); + } + else//>= 350 + { + //u8g2.setFont(u8g2_font_fub20_tr); + //u8g2.setCursor(5, 38); + //u8g2.println("over range"); + } + } while ( u8g2.nextPage()); + } +} + //Run button function //======================================================================================================================================================================== @@ -1022,7 +1085,7 @@ void step3() { //======================================================================================================================================================================== void readRobot() { - unsigned short robotInterval = 100; + unsigned short robotInterval = 500; static unsigned long previousButtonMillis_timer; //unsigned long if (previousButtonMillis_timer <= abs2(millis() - (long)robotInterval)) {// currentMillis = abs2(millis() - (long)robotInterval) previousButtonMillis_timer += robotInterval; @@ -1247,7 +1310,7 @@ void readButton() { else { count++; - if (count > 15) + if (count >50) { step = 2; count = 0; @@ -1264,7 +1327,7 @@ void readButton() { //output NumTouchLocal NumTouch = NumTouchLocal; count++; - if (count > 1) + if (count > 5) { count = 0; NumTouchLocal = 0; @@ -1280,8 +1343,9 @@ void readButton() { } } - Serial.println(F("button")); - Serial.println(NumTouchLocal); + //Serial.println(F("button")); + //Serial.println(NumTouchLocal); + draw(NumTouchLocal); //asynchronous, very slow //Serial.println(NumTouch); } @@ -1358,7 +1422,7 @@ void setID() { digitalWrite(SHT_LOX3, LOW); digitalWrite(SHT_LOX4, LOW); - /* + // initing LOX1 Wire.begin(); //This function initializes the Wire library lox1.setAddress(LOX1_ADDRESS); //set address// @@ -1366,23 +1430,23 @@ void setID() { Serial.println(F("Failed to boot first VL53L0X")); //while(1); } - */ + /* // initing LOX1 if(!lox1.begin(LOX1_ADDRESS, false, &Wire, 3)) { //Serial.println(F("Failed to boot first VL53L0X, LOX1")); //while(1); } - delay(10); + */ // activating LOX2 - digitalWrite(SHT_LOX2, HIGH); + //digitalWrite(SHT_LOX2, HIGH); delay(10); //initing LOX2 //Wire.begin(); //This function initializes the Wire library //default//lox2.setAddress(LOX2_ADDRESS); //set address// //if(!lox2.init()) { - // Serial.println(F("Failed to boot second VL53L0X")); + //Serial.println(F("Failed to boot second VL53L0X")); //while(1); //} @@ -1420,52 +1484,55 @@ void read_multi_tof_sensors() { // the TOF distance sensors need 90 ms to read //asynchronous, fast static unsigned long previousMillis_timer; - unsigned short sensorInterval = 100; //short + unsigned short sensorInterval = 500; //short if (previousMillis_timer < abs2(millis() - (long)sensorInterval))// currentMillis - sensorInterval could be != abs2(millis() - (long)sensorInterval) { previousMillis_timer += sensorInterval; //set clock //make sure that the sensor value is number instaed of some mysterious string + /* // this holds the measurement VL53L0X_RangingMeasurementData_t measure1; lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout! // print sensor1 reading - Serial.print(F("1: ")); + //Serial.print(F("1: ")); if(measure1.RangeStatus != 4) { // if not out of range sensor1 = measure1.RangeMilliMeter; - Serial.print(sensor1); + Serial.println(sensor1); //Serial.print(F("mm")); } else { //Serial.print(F("Out of range")); } - /* - Serial.print(F("1: ")); - Serial.print(lox1.readRangeSingleMillimeters()); - Serial.print(F("mm")); */ + sensor1 = lox1.readRangeSingleMillimeters(); + + Serial.print(F(" 1: ")); + Serial.print(sensor1); + //Serial.print(F("mm")); + //Serial.print(F(" ")); - + //sensor2 = lox2.readRangeSingleMillimeters(); // print sensor2 reading - //Serial.print(F("2: ")); - // Serial.print(lox2.readRangeSingleMillimeters()); + //Serial.print(F(" 2: ")); + //Serial.print(sensor2); // Serial.print(F("mm")); - Serial.print(F(" ")); + //Serial.print(F(" ")); // print sensor3 reading - Serial.print(F("3: ")); + Serial.print(F(" 3: ")); sensor3 = lox3.readRangeSingleMillimeters(); Serial.print(sensor3); //Serial.print(F("mm")); - Serial.print(F(" ")); + //Serial.print(F(" ")); // print sensor4 reading - Serial.print(F("4: ")); + Serial.print(F(" 4: ")); sensor4 = lox4.readRangeSingleMillimeters(); - Serial.print(sensor4); - //Serial.print(F("mm")); + Serial.print(sensor4); + Serial.print(F(" mm")); Serial.println(); } From f2891fe7a7f3db123b73ffa71fc30c8a77065774 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 4 Jul 2022 10:26:00 -0500 Subject: [PATCH 09/23] Delete robot arm source code (4).docx --- robot arm source code (4).docx | Bin 38640 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 robot arm source code (4).docx diff --git a/robot arm source code (4).docx b/robot arm source code (4).docx deleted file mode 100644 index fff8f42e242f72c42762d4a1a47e417d9f282097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38640 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 From 4457eeca1fb339a2e2a52350e1318da4714c7e07 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 4 Jul 2022 10:35:30 -0500 Subject: [PATCH 10/23] Update and rename robot arm source code (4).txt to robot_arm_source_code.md --- robot arm source code (4).txt => robot_arm_source_code.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename robot arm source code (4).txt => robot_arm_source_code.md (98%) diff --git a/robot arm source code (4).txt b/robot_arm_source_code.md similarity index 98% rename from robot arm source code (4).txt rename to robot_arm_source_code.md index 422a11e..a8d4d1a 100644 --- a/robot arm source code (4).txt +++ b/robot_arm_source_code.md @@ -102,7 +102,9 @@ unsigned long currentMillis = 0; //stores the value of total run time //in this class only duration or interval period is used // objects for the vl53l0x -VL53L0X2 lox1;//Adafruit_VL53L0X2 lox1; // +VL53L0X2 lox1;//Adafruit_VL53L0X2 lox1; +//Adafruit TOF sensor library is good, just the sketch and global variables are occupying too much memory space +//(almost 50% memory of the flash disk of arduino uno R3) //VL53L0X2 lox2; VL53L0X2 lox3; VL53L0X2 lox4; From a74665c305d54d81457f08dd6b429522f4ce78fc Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 4 Jul 2022 10:36:44 -0500 Subject: [PATCH 11/23] Rename robot_arm_source_code.md to robot_arm_source_code.txt --- robot_arm_source_code.md => robot_arm_source_code.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename robot_arm_source_code.md => robot_arm_source_code.txt (100%) diff --git a/robot_arm_source_code.md b/robot_arm_source_code.txt similarity index 100% rename from robot_arm_source_code.md rename to robot_arm_source_code.txt From 3c194d5e5ca8cff317fa2b537bc00e9dc7f809ad Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 4 Jul 2022 10:42:27 -0500 Subject: [PATCH 12/23] Rename robot_arm_source_code.txt to robot arm source code (4).txt --- robot_arm_source_code.txt => robot arm source code (4).txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename robot_arm_source_code.txt => robot arm source code (4).txt (100%) diff --git a/robot_arm_source_code.txt b/robot arm source code (4).txt similarity index 100% rename from robot_arm_source_code.txt rename to robot arm source code (4).txt From f7eae670554d42e87758ccfc5f3fc979a1bbc5a2 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 4 Jul 2022 10:53:46 -0500 Subject: [PATCH 13/23] Create ReadMe_RemoteRobotArm --- ReadMe_RemoteRobotArm | 1 + 1 file changed, 1 insertion(+) create mode 100644 ReadMe_RemoteRobotArm diff --git a/ReadMe_RemoteRobotArm b/ReadMe_RemoteRobotArm new file mode 100644 index 0000000..d6b6ef1 --- /dev/null +++ b/ReadMe_RemoteRobotArm @@ -0,0 +1 @@ +https://www.remoteutilities.com/download/ From dc5e9dac14160662ecc2a9a1faeb9b58e1e95771 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Fri, 8 Jul 2022 20:48:17 -0500 Subject: [PATCH 14/23] Update robot arm source code (4).txt --- robot arm source code (4).txt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/robot arm source code (4).txt b/robot arm source code (4).txt index a8d4d1a..479c2f3 100644 --- a/robot arm source code (4).txt +++ b/robot arm source code (4).txt @@ -86,8 +86,7 @@ byte barrierIndex = 9; //dictionary: //the trashbin durationMoveTrain_Max, table 25000, the duration of train movement unsigned int durationMoveTrain_trashBin = durationMoveTrain_Max; - unsigned int durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 13000; - + unsigned int durationMoveTrain_table = durationMoveTrain_referPoint2jointPoint + 15000; //------------ VARIABLES (will change)----------------------------------------------------- unsigned long currentMillis = 0; //stores the value of total run time @@ -102,9 +101,7 @@ unsigned long currentMillis = 0; //stores the value of total run time //in this class only duration or interval period is used // objects for the vl53l0x -VL53L0X2 lox1;//Adafruit_VL53L0X2 lox1; -//Adafruit TOF sensor library is good, just the sketch and global variables are occupying too much memory space -//(almost 50% memory of the flash disk of arduino uno R3) +VL53L0X2 lox1;//Adafruit_VL53L0X2 lox1; // //VL53L0X2 lox2; VL53L0X2 lox3; VL53L0X2 lox4; @@ -376,10 +373,10 @@ void loop() { run(); //Serial.println(F("isSafe2grib")); //Serial.println(isSafe2grib); - //bool isDoneStep1 = step1(); - //if (isDoneStep1) { + bool isDoneStep1 = step1(); + if (isDoneStep1) { step3(); - //} + } //display //report to the PC or monitor @@ -832,7 +829,7 @@ void step3() { if (!robotController.isRunning()) { step = 22; //train move backward 2s //move to the side of the fidge(joint point + 9s , moveForward(durationMoveTrain_fridgeSide), - durationMoveTrain = 2000; + durationMoveTrain = 4000; } } else { if (step == 22) { @@ -948,8 +945,8 @@ void step3() { } else {//!isSafe2grib if (!robotController.isRunning()) { step = 8; - //move it to the side of table,moveForward(durationMoveTrain_table), + 12s - durationMoveTrain = durationMoveTrain_table + 12 * 1000; + //move it to the side of table,moveForward(durationMoveTrain_table), + 10s + durationMoveTrain = durationMoveTrain_table + 10 * 1000; } } } else { if (step == 8) { From ab578ccf3c379aa9a1b4346929649727f5c82d90 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 17 Oct 2022 17:52:58 -0500 Subject: [PATCH 15/23] Add files via upload --- RTP.cpp | 316 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RTP.h | 130 +++++++++++++++++++++++ 2 files changed, 446 insertions(+) create mode 100644 RTP.cpp create mode 100644 RTP.h diff --git a/RTP.cpp b/RTP.cpp new file mode 100644 index 0000000..529bf73 --- /dev/null +++ b/RTP.cpp @@ -0,0 +1,316 @@ +/////////////////////////////////////// +// COMP/ELEC/MECH 450/550 +// Project 3 +// Authors: Connor Kelly, Simon (Guoliang Du) +////////////////////////////////////// + +#include "RTP.h" +#include +#include "ompl/base/goals/GoalSampleableRegion.h" +// often useful headers: +#include +//#include "ompl/base/spaces/RealVectorStateSpace.h" +//RealVectorStateSpace +#include "ompl/tools/config/SelfConfig.h" + + + + +ompl::geometric::RTP::RTP(const base::SpaceInformationPtr &si) : base::Planner(si, "RTP") +{ +// the specifications of this planner (ompl::base::PlannerSpecs) + specs_.approximateSolutions = true; + specs_.directed = true; + + Planner::declareParam("range", this, &RTP::setRange, &RTP::getRange, "0.:1.:10000."); + Planner::declareParam("goal_bias", this, &RTP::setGoalBias, &RTP::getGoalBias, "0.:.05:1."); + // Planner::declareParam("intermediate_states", this, &RRT::setIntermediateStates, &RRT::getIntermediateStates, "0,1"); + + // addIntermediateStates_ = addIntermediateStates; +} + + + + +ompl::geometric::RTP::~RTP() +{ + // free any allocated memory + freeMemory(); +} + + +void ompl::geometric::RTP::clear() +{ + + + Planner::clear(); + sampler_.reset(); + freeMemory(); + // clear the data structures here + // if (nn_) + // nn_->clear(); + if (tree) { + tree->clear(); + } + lastGoalMotion_ = nullptr; +} + +// optional, if additional setup/configuration is needed, the setup() method can be implemented +void ompl::geometric::RTP::setup() +{ + Planner::setup(); + + // perhaps attempt some auto-configuration + tools::SelfConfig sc(si_, getName()); + // This RTP inherits from ompl::base::planner class + // the planner class has a built-in function called "getName()" + + sc.configurePlannerRange(maxDistance_); + + // if (!nn_) + // nn_.reset(tools::SelfConfig::getDefaultNearestNeighbors(this)); + //if (!tree) + // tree_reset(); + + // nn_->setDistanceFunction + // ( + // [this](const Motion *a, const Motion *b) + // { + // return distanceFunction(a, b); + // } + // ); +} +/*void tree_reset() +{ +as(0)->values[0]; +} +*/ +void ompl::geometric::RTP::freeMemory() +{ + if (tree) + { + //the tree information has already been stored in an arraylist(the root pointer) called tree, we do not need to creat a new list + for (auto &motion : *tree) + //meaning: for ( auto i = begin(*tree); i != end(*tree); ++i) + { + //besides: + // auto &motion = *i; // motion is a node on the tree, besides the node has some property (state) + if (motion->state != nullptr) + si_->freeState(motion->state); + delete motion; + } + } +} + + + + +ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTerminationCondition &ptc) +{ + //Todo: + // init tree vector + // make sure the planner is configured correctly; ompl::base::Planner::checkValidity + // ensures that there is at least one input state and a ompl::base::Goal object specified + checkValidity(); + base::Goal *goal = pdef_->getGoal().get(); + // pdef_ is a field or memeber variable of planner class + // it is about the problem defined by an user + // get a handle to the Goal from the ompl::base::ProblemDefinition member, pdef_ + auto *goal_s = dynamic_cast(goal); + + // get input states with PlannerInputStates helper, pis_ + // initialize tree to start states + while (const base::State *st = pis_.nextStart()) + //pis_ means PlannerInputStates, Utility class to extract valid input states + + { + // st will contain a start state. Typically this state will + // be cloned here and inserted into the Planner's data structure. + auto *motion = new Motion(si_); + si_->copyState(motion->state, st); + // nn_->add(motion); + tree->push_back(motion); + } + + + // if needed, sample states from the goal region (and wait until a state is sampled) + //const base::State *st = pis_.nextGoal(ptc); + // or sample a new goal state only if available: + //const base::State *st = pis_.nextGoal(); + + + // if init tree is empty, exit + if (tree->size() == 0) + { + OMPL_ERROR("%s: There are no valid initial states!", getName().c_str()); + return base::PlannerStatus::INVALID_START; + } + + if (!sampler_) + sampler_ = si_->allocStateSampler(); + + OMPL_INFORM("%s: Starting planning with %u states already in datastructure", getName().c_str(), tree->size()); + + + // ------------------------------------------------------------------------------------------ + + Motion *solution = nullptr; + Motion *approxsol = nullptr; + double approxdif = std::numeric_limits::infinity(); + auto *rmotion = new Motion(si_); //random node, could be the state of a node in the space, + base::State *rstate = rmotion->state;// + //base::State *xstate = si_->allocState();// state of the intermediate node + //nmotion is a tree node + //dstate is originially for the state of the intermediate tree node, but + //we do not need intermediate nodes, therefore dstate = rstate all the time in the algorithm + //which means dstate is just the state of the random node above + + // periodically check if ptc() returns true. + // if it does, terminate planning. + while (!ptc) + { +// TODO: Implement RTP as described +// 1. Select a random configuration qa from the existing Random tree. +// 2. Sample a random configuration qb from the configuration space. With a small probability, select the +// goal configuration as qb instead of a random one. +// 3. Check whether the straight-line path between qa and qb in the C-space is valid (i.e., collision free). If +// the path is valid, add the path from qa to qb to the tree. +// 4. Repeat steps 1 - 3 until the goal state is added to the tree. Extract the final motion plan from the tree + + // Start planning here. + + // call routines from SpaceInformation (si_) as needed. i.e., + // si_->allocStateSampler() for sampling, + // si_->checkMotion(state1, state2) for state validity, etc... + + // use the Goal pointer to evaluate whether a sampled state satisfies the goal requirements + + // use log macros for informative messaging, i.e., logInfo("Planner found a solution!"); + + // 1. Select a random configuration qa from the existing Random tree. + + /* find a random state in the tree */ + // pick an existing node from the tree + Motion *nmotion = tree->at(rng_.uniformInt(0, tree->size() - 1)); + //base::State *stateNodePicked = nmotion->state;// the state of the existing tree node picked above + base::State *dstate = rstate;// state of the random node + + + // 2. Sample a random configuration qb from the configuration space. With a small probability, select the + // goal configuration as qb instead of a random one. + + /* sample random state (with goal biasing) */ + if ((goal_s != nullptr) && rng_.uniform01() < goalBias_ && goal_s->canSample()) + goal_s->sampleGoal(rstate); + else + sampler_->sampleUniform(rstate); + + + // 3. Check whether the straight-line path between qa and qb in the C-space is valid (i.e., collision free). If + // the path is valid, add the path from qa to qb to the tree. + + /* find state to add */ + // double d = si_->distance(nmotion->state, rstate); + // if (d > maxDistance_) + // { + // si_->getStateSpace()->interpolate(nmotion->state, rstate, maxDistance_ / d, xstate); + // dstate = xstate; + // } + + if (si_->checkMotion(nmotion->state, dstate)) + { + + auto *motion = new Motion(si_); + si_->copyState(motion->state, dstate);// the random node becomes a new tree node + motion->parent = nmotion; + tree->push_back(motion); + + nmotion = motion; + + + // 4. Repeat steps 1 - 3 until the goal state is added to the tree. Extract the final motion plan from the tree + double dist = 0.0; + bool sat = goal->isSatisfied(nmotion->state, &dist); + if (sat) + { + approxdif = dist; + solution = nmotion; + break; + } + if (dist < approxdif) + { + approxdif = dist; + approxsol = nmotion; + } + } + } + + + // ------------------------------------------------------------------------------------------ + + + bool solved = false; + bool approximate = false; + if (solution == nullptr) + { + solution = approxsol; + approximate = true; + } + + if (solution != nullptr) + { + lastGoalMotion_ = solution; + + /* construct the solution path */ + std::vector mpath; + while (solution != nullptr) + { + mpath.push_back(solution); + solution = solution->parent; + } + + /* set the solution path */ + auto path(std::make_shared(si_)); + for (int i = mpath.size() - 1; i >= 0; --i) + path->append(mpath[i]->state); + + // When a solution path is computed, save it here + pdef_->addSolutionPath(path, approximate, approxdif, getName()); + solved = true; + } + + //si_->freeState(xstate);// state of the intermediate node + if (rmotion->state != nullptr) + si_->freeState(rmotion->state); + delete rmotion; + + + OMPL_INFORM("%s: Created %u states", getName().c_str(), tree->size()); + + return {solved, approximate}; + + // Return a value from the PlannerStatus enumeration. + // See ompl::base::PlannerStatus for the possible return values + //return base::PlannerStatus::EXACT_SOLUTION; + +} + + +void ompl::geometric::RTP::getPlannerData(base::PlannerData &data) const +{ + // fill data with the states and edges that were created + // in the exploration data structure + // perhaps also fill control::PlannerData + Planner::getPlannerData(data); + + if (lastGoalMotion_ != nullptr) + data.addGoalVertex(base::PlannerDataVertex(lastGoalMotion_->state)); + + for (auto &motion : *tree) + { + if (motion->parent == nullptr) + data.addStartVertex(base::PlannerDataVertex(motion->state)); + else + data.addEdge(base::PlannerDataVertex(motion->parent->state), base::PlannerDataVertex(motion->state)); + } +} diff --git a/RTP.h b/RTP.h new file mode 100644 index 0000000..c9ec189 --- /dev/null +++ b/RTP.h @@ -0,0 +1,130 @@ +/////////////////////////////////////// +// COMP/ELEC/MECH 450/550 +// Project 3 +// Authors: Connor Kelly, Simon (Guoliang Du) +////////////////////////////////////// + +#ifndef RANDOM_TREE_H +#define RANDOM_TREE_H + +//#include "ompl/datastructures/NearestNeighbors.h" +#include +#include "ompl/geometric/planners/PlannerIncludes.h" + +namespace ompl +{ + namespace geometric + { + // TODO: Implement RTP as described + + class RTP : public base::Planner //inheritance from the grandparent + { + + + public: + + /** \brief Constructor */ + RTP(const base::SpaceInformationPtr &si); + + ~RTP() override; //destructor ?? but why override + + void getPlannerData(base::PlannerData &data) const override; + + base::PlannerStatus solve(const base::PlannerTerminationCondition &ptc) override; + + void clear() override; + + + + /** \brief Set the goal bias + + In the process of randomly selecting states in + the state space to attempt to go towards, the + algorithm may in fact choose the actual goal state, if + it knows it, with some probability. This probability + is a real number between 0.0 and 1.0; its value should + usually be around 0.05 and should not be too large. It + is probably a good idea to use the default value. */ + void setGoalBias(double goalBias) + { + goalBias_ = goalBias; + } + + /** \brief Get the goal bias the planner is using */ + double getGoalBias() const + { + return goalBias_; + } + + /** \brief Set the range the planner is supposed to use. + + This parameter greatly influences the runtime of the + algorithm. It represents the maximum length of a + motion to be added in the tree of motions. */ + void setRange(double distance) + { + maxDistance_ = distance; + } + + /** \brief Get the range the planner is using */ + double getRange() const + { + return maxDistance_; + } + + + + void setup() override; + + protected: + /** \brief Representation of a motion + + This only contains pointers to parent motions as we + only need to go backwards in the tree. */ + class Motion + { + public: + Motion() = default; + + /** \brief Constructor that allocates memory for the state */ + Motion(const base::SpaceInformationPtr &si) : state(si->allocState()) + { + } + + ~Motion() = default; + + /** \brief The state contained by the motion */ + base::State * state{nullptr}; + + /** \brief The parent motion in the exploration tree */ + Motion * parent{nullptr}; + }; + + /** \brief Free the memory allocated by this planner */ + void freeMemory(); + + /** \brief A tree datastructure containing the tree of motions */ + std::shared_ptr> tree; + + /** \brief State sampler */ + base::StateSamplerPtr sampler_; + + /** \brief The fraction of time the goal is picked as the state to expand towards (if such a state is + * available) */ + double goalBias_{.05}; + + /** \brief The maximum length of a motion to be added to a tree */ + double maxDistance_{0.}; + + /** \brief The random number generator */ + RNG rng_; + + /** \brief The most recent goal motion. Used for PlannerData computation */ + Motion * lastGoalMotion_{nullptr}; + + }; + + } // namespace geometric +} // namespace ompl + +#endif From f150eb2d38bf172833005e63681f210e86f47281 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Mon, 17 Oct 2022 18:24:09 -0500 Subject: [PATCH 16/23] Update RTP.cpp --- RTP.cpp | 138 ++++++++++++++++++++++++++------------------------------ 1 file changed, 63 insertions(+), 75 deletions(-) diff --git a/RTP.cpp b/RTP.cpp index 529bf73..a0d6ded 100644 --- a/RTP.cpp +++ b/RTP.cpp @@ -9,24 +9,22 @@ #include "ompl/base/goals/GoalSampleableRegion.h" // often useful headers: #include -//#include "ompl/base/spaces/RealVectorStateSpace.h" -//RealVectorStateSpace #include "ompl/tools/config/SelfConfig.h" +//constructor +// This RTP implement inherits from ompl::base::planner class ompl::geometric::RTP::RTP(const base::SpaceInformationPtr &si) : base::Planner(si, "RTP") { -// the specifications of this planner (ompl::base::PlannerSpecs) + // the specifications of this planner (ompl::base::PlannerSpecs) specs_.approximateSolutions = true; specs_.directed = true; Planner::declareParam("range", this, &RTP::setRange, &RTP::getRange, "0.:1.:10000."); Planner::declareParam("goal_bias", this, &RTP::setGoalBias, &RTP::getGoalBias, "0.:.05:1."); - // Planner::declareParam("intermediate_states", this, &RRT::setIntermediateStates, &RRT::getIntermediateStates, "0,1"); - // addIntermediateStates_ = addIntermediateStates; } @@ -34,11 +32,12 @@ ompl::geometric::RTP::RTP(const base::SpaceInformationPtr &si) : base::Planner(s ompl::geometric::RTP::~RTP() { - // free any allocated memory + // free any allocated memory freeMemory(); } + void ompl::geometric::RTP::clear() { @@ -46,12 +45,12 @@ void ompl::geometric::RTP::clear() Planner::clear(); sampler_.reset(); freeMemory(); - // clear the data structures here - // if (nn_) - // nn_->clear(); + + // clear the data structures here if (tree) { tree->clear(); } + lastGoalMotion_ = nullptr; } @@ -60,41 +59,26 @@ void ompl::geometric::RTP::setup() { Planner::setup(); - // perhaps attempt some auto-configuration + // perhaps attempt some auto-configuration tools::SelfConfig sc(si_, getName()); - // This RTP inherits from ompl::base::planner class // the planner class has a built-in function called "getName()" sc.configurePlannerRange(maxDistance_); - - // if (!nn_) - // nn_.reset(tools::SelfConfig::getDefaultNearestNeighbors(this)); - //if (!tree) - // tree_reset(); - - // nn_->setDistanceFunction - // ( - // [this](const Motion *a, const Motion *b) - // { - // return distanceFunction(a, b); - // } - // ); -} -/*void tree_reset() -{ -as(0)->values[0]; } -*/ + + + + void ompl::geometric::RTP::freeMemory() { if (tree) { //the tree information has already been stored in an arraylist(the root pointer) called tree, we do not need to creat a new list for (auto &motion : *tree) - //meaning: for ( auto i = begin(*tree); i != end(*tree); ++i) { + //meaning: for ( auto i = begin(*tree); i != end(*tree); ++i) //besides: - // auto &motion = *i; // motion is a node on the tree, besides the node has some property (state) + // auto &motion = *i; // motion is a node on the tree, besides the node has some property (state) if (motion->state != nullptr) si_->freeState(motion->state); delete motion; @@ -109,34 +93,37 @@ ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTermina { //Todo: // init tree vector - // make sure the planner is configured correctly; ompl::base::Planner::checkValidity - // ensures that there is at least one input state and a ompl::base::Goal object specified + // make sure the planner is configured correctly; ompl::base::Planner::checkValidity + // ensures that there is at least one input state and a ompl::base::Goal object specified checkValidity(); + + // get a handle to the Goal from the ompl::base::ProblemDefinition member, pdef_ base::Goal *goal = pdef_->getGoal().get(); // pdef_ is a field or memeber variable of planner class // it is about the problem defined by an user - // get a handle to the Goal from the ompl::base::ProblemDefinition member, pdef_ + + auto *goal_s = dynamic_cast(goal); - // get input states with PlannerInputStates helper, pis_ - // initialize tree to start states + + // get input states with PlannerInputStates helper, pis_ + // initialize tree to start states while (const base::State *st = pis_.nextStart()) //pis_ means PlannerInputStates, Utility class to extract valid input states { - // st will contain a start state. Typically this state will - // be cloned here and inserted into the Planner's data structure. + // st will contain a start state. Typically this state will + // be cloned here and inserted into the Planner's data structure. auto *motion = new Motion(si_); si_->copyState(motion->state, st); - // nn_->add(motion); tree->push_back(motion); } - // if needed, sample states from the goal region (and wait until a state is sampled) - //const base::State *st = pis_.nextGoal(ptc); - // or sample a new goal state only if available: - //const base::State *st = pis_.nextGoal(); + // if needed, sample states from the goal region (and wait until a state is sampled) + //const base::State *st = pis_.nextGoal(ptc); + // or sample a new goal state only if available: + //const base::State *st = pis_.nextGoal(); // if init tree is empty, exit @@ -165,40 +152,40 @@ ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTermina //we do not need intermediate nodes, therefore dstate = rstate all the time in the algorithm //which means dstate is just the state of the random node above - // periodically check if ptc() returns true. - // if it does, terminate planning. + + + // periodically check if ptc() returns true. + // if it does, terminate planning. while (!ptc) { -// TODO: Implement RTP as described -// 1. Select a random configuration qa from the existing Random tree. -// 2. Sample a random configuration qb from the configuration space. With a small probability, select the -// goal configuration as qb instead of a random one. -// 3. Check whether the straight-line path between qa and qb in the C-space is valid (i.e., collision free). If -// the path is valid, add the path from qa to qb to the tree. -// 4. Repeat steps 1 - 3 until the goal state is added to the tree. Extract the final motion plan from the tree - - // Start planning here. - - // call routines from SpaceInformation (si_) as needed. i.e., - // si_->allocStateSampler() for sampling, - // si_->checkMotion(state1, state2) for state validity, etc... - - // use the Goal pointer to evaluate whether a sampled state satisfies the goal requirements - - // use log macros for informative messaging, i.e., logInfo("Planner found a solution!"); - + // TODO: Implement RTP as described + // 1. Select a random configuration qa from the existing Random tree. + // 2. Sample a random configuration qb from the configuration space. With a small probability, select the + // goal configuration as qb instead of a random one. + // 3. Check whether the straight-line path between qa and qb in the C-space is valid (i.e., collision free). If + // the path is valid, add the path from qa to qb to the tree. + // 4. Repeat steps 1 - 3 until the goal state is added to the tree. Extract the final motion plan from the tree + + // Start planning here. + + // call routines from SpaceInformation (si_) as needed. i.e., + // si_->allocStateSampler() for sampling, + // si_->checkMotion(state1, state2) for state validity, etc... + + // use the Goal pointer to evaluate whether a sampled state satisfies the goal requirements + + // use log macros for informative messaging, i.e., logInfo("Planner found a solution!"); + + // 1. Select a random configuration qa from the existing Random tree. - /* find a random state in the tree */ // pick an existing node from the tree Motion *nmotion = tree->at(rng_.uniformInt(0, tree->size() - 1)); - //base::State *stateNodePicked = nmotion->state;// the state of the existing tree node picked above base::State *dstate = rstate;// state of the random node // 2. Sample a random configuration qb from the configuration space. With a small probability, select the // goal configuration as qb instead of a random one. - /* sample random state (with goal biasing) */ if ((goal_s != nullptr) && rng_.uniform01() < goalBias_ && goal_s->canSample()) goal_s->sampleGoal(rstate); @@ -208,7 +195,6 @@ ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTermina // 3. Check whether the straight-line path between qa and qb in the C-space is valid (i.e., collision free). If // the path is valid, add the path from qa to qb to the tree. - /* find state to add */ // double d = si_->distance(nmotion->state, rstate); // if (d > maxDistance_) @@ -218,6 +204,7 @@ ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTermina // } if (si_->checkMotion(nmotion->state, dstate)) + //nmotion->state, meaning the state of the existing tree node picked above { auto *motion = new Motion(si_); @@ -274,12 +261,13 @@ ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTermina for (int i = mpath.size() - 1; i >= 0; --i) path->append(mpath[i]->state); - // When a solution path is computed, save it here + // When a solution path is computed, save it here pdef_->addSolutionPath(path, approximate, approxdif, getName()); solved = true; } - //si_->freeState(xstate);// state of the intermediate node + //si_->freeState(xstate);//x is the state of the intermediate node + if (rmotion->state != nullptr) si_->freeState(rmotion->state); delete rmotion; @@ -289,18 +277,18 @@ ompl::base::PlannerStatus ompl::geometric::RTP::solve(const base::PlannerTermina return {solved, approximate}; - // Return a value from the PlannerStatus enumeration. - // See ompl::base::PlannerStatus for the possible return values - //return base::PlannerStatus::EXACT_SOLUTION; + // Return a value from the PlannerStatus enumeration. + // See ompl::base::PlannerStatus for the possible return values + //return base::PlannerStatus::EXACT_SOLUTION; } void ompl::geometric::RTP::getPlannerData(base::PlannerData &data) const { - // fill data with the states and edges that were created - // in the exploration data structure - // perhaps also fill control::PlannerData + // fill data with the states and edges that were created + // in the exploration data structure + // perhaps also fill control::PlannerData Planner::getPlannerData(data); if (lastGoalMotion_ != nullptr) From 4c3c3805fae4b68b0510219e49edcf0f294dbd0e Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 22 Nov 2022 22:19:31 -0600 Subject: [PATCH 17/23] Add files via upload --- RGrrt_tree.csv | 1333 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1333 insertions(+) create mode 100644 RGrrt_tree.csv diff --git a/RGrrt_tree.csv b/RGrrt_tree.csv new file mode 100644 index 0000000..a2c5cf8 --- /dev/null +++ b/RGrrt_tree.csv @@ -0,0 +1,1333 @@ +,x,y,Column3,Column4 +0,0.0,0.0,0.0,0.1 +1,0.009895,-0.00125,-0.251327,0.1 +2,0.0,0.0,0.0,0.1 +3,0.009974,0.000627,0.125664,0.1 +4,0.009895,-0.00125,-0.251327,0.1 +5,0.019035,-0.005205,-0.565486,0.1 +6,0.019035,-0.005205,-0.565486,0.1 +7,0.027932,-0.009738,-0.376991,0.1 +8,0.009974,0.000627,0.125664,0.1 +9,0.028882,0.006771,0.502654,0.1 +10,0.019035,-0.005205,-0.565486,0.1 +11,0.037084,-0.013698,-0.314159,0.1 +12,0.028882,0.006771,0.502654,0.1 +13,0.046967,0.015281,0.376991,0.1 +14,0.019035,-0.005205,-0.565486,0.1 +15,0.02712,-0.011079,-0.69115,0.1 +16,0.028882,0.006771,0.502654,0.1 +17,0.038046,0.010737,0.314159,0.1 +18,0.028882,0.006771,0.502654,0.1 +19,0.047791,0.012915,0.125664,0.1 +20,0.028882,0.006771,0.502654,0.1 +21,0.04502,0.018496,0.753982,0.1 +22,0.02712,-0.011079,-0.69115,0.1 +23,0.035378,-0.016692,-0.502654,0.1 +24,0.04502,0.018496,0.753982,0.1 +25,0.05231,0.025342,0.753982,0.1 +26,0.02712,-0.011079,-0.69115,0.1 +27,0.035541,-0.016423,-0.439823,0.1 +28,0.02712,-0.011079,-0.69115,0.1 +29,0.043289,-0.022827,-0.565486,0.1 +30,0.05231,0.025342,0.753982,0.1 +31,0.058667,0.033026,1.005309,0.1 +32,0.05231,0.025342,0.753982,0.1 +33,0.069097,0.035995,0.376991,0.1 +34,0.028882,0.006771,0.502654,0.1 +35,0.038156,0.010443,0.251327,0.1 +36,0.058667,0.033026,1.005309,0.1 +37,0.063482,0.041784,1.130972,0.1 +38,0.069097,0.035995,0.376991,0.1 +39,0.087692,0.043357,0.376991,0.1 +40,0.063482,0.041784,1.130972,0.1 +41,0.066564,0.051269,1.3823,0.1 +42,0.02712,-0.011079,-0.69115,0.1 +43,0.04169,-0.024761,-0.816813,0.1 +44,0.04169,-0.024761,-0.816813,0.1 +45,0.058399,-0.035365,-0.314159,0.1 +46,0.04169,-0.024761,-0.816813,0.1 +47,0.057774,-0.036447,-0.439823,0.1 +48,0.02712,-0.011079,-0.69115,0.1 +49,0.03502,-0.017207,-0.628318,0.1 +50,0.087692,0.043357,0.376991,0.1 +51,0.09699,0.047038,0.376991,0.1 +52,0.066564,0.051269,1.3823,0.1 +53,0.069049,0.060949,1.256636,0.1 +54,0.066564,0.051269,1.3823,0.1 +55,0.068128,0.061145,1.445131,0.1 +56,0.04169,-0.024761,-0.816813,0.1 +57,0.048974,-0.031602,-0.69115,0.1 +58,0.058667,0.033026,1.005309,0.1 +59,0.073825,0.045566,0.376991,0.1 +60,0.04169,-0.024761,-0.816813,0.1 +61,0.05443,-0.040161,-0.942477,0.1 +62,0.05443,-0.040161,-0.942477,0.1 +63,0.068085,-0.054702,-0.69115,0.1 +64,0.05443,-0.040161,-0.942477,0.1 +65,0.058951,-0.049035,-1.256636,0.1 +66,0.09699,0.047038,0.376991,0.1 +67,0.116624,0.048274,-0.251327,0.1 +68,0.0,0.0,0.0,0.1 +69,0.019947,0.001255,0.125664,0.1 +70,0.0,0.0,0.0,0.1 +71,0.009895,-0.00125,-0.251327,0.1 +72,0.019035,-0.005205,-0.565486,0.1 +73,0.033528,-0.018815,-0.942477,0.1 +74,0.068128,0.061145,1.445131,0.1 +75,0.070608,0.070805,1.193804,0.1 +76,0.068128,0.061145,1.445131,0.1 +77,0.071873,0.080777,1.319468,0.1 +78,0.068128,0.061145,1.445131,0.1 +79,0.064442,0.080469,2.073449,0.1 +80,0.064442,0.080469,2.073449,0.1 +81,0.060476,0.089633,1.884954,0.1 +82,0.060476,0.089633,1.884954,0.1 +83,0.048913,0.105548,2.513272,0.1 +84,0.048913,0.105548,2.513272,0.1 +85,0.040039,0.110069,2.827431,0.1 +86,0.060476,0.089633,1.884954,0.1 +87,0.059233,0.109384,1.3823,0.1 +88,0.028882,0.006771,0.502654,0.1 +89,0.047429,0.014114,0.251327,0.1 +90,0.116624,0.048274,-0.251327,0.1 +91,0.125897,0.044602,-0.502654,0.1 +92,0.125897,0.044602,-0.502654,0.1 +93,0.134335,0.039247,-0.628318,0.1 +94,0.058951,-0.049035,-1.256636,0.1 +95,0.06174,-0.058636,-1.319468,0.1 +96,0.05231,0.025342,0.753982,0.1 +97,0.0596,0.032187,0.753982,0.1 +98,0.019035,-0.005205,-0.565486,0.1 +99,0.038089,-0.010098,0.062832,0.1 +100,0.019035,-0.005205,-0.565486,0.1 +101,0.028059,-0.009452,-0.314159,0.1 +102,0.06174,-0.058636,-1.319468,0.1 +103,0.060505,-0.07827,-1.947786,0.1 +104,0.116624,0.048274,-0.251327,0.1 +105,0.126225,0.045484,-0.314159,0.1 +106,0.028882,0.006771,0.502654,0.1 +107,0.036951,0.012634,0.753982,0.1 +108,0.019035,-0.005205,-0.565486,0.1 +109,0.027304,-0.010825,-0.628318,0.1 +110,0.06174,-0.058636,-1.319468,0.1 +111,0.070206,-0.076626,-0.942477,0.1 +112,0.060505,-0.07827,-1.947786,0.1 +113,0.055972,-0.087167,-2.136281,0.1 +114,0.055972,-0.087167,-2.136281,0.1 +115,0.041546,-0.100714,-2.638936,0.1 +116,0.048913,0.105548,2.513272,0.1 +117,0.040643,0.111168,2.576104,0.1 +118,0.040039,0.110069,2.827431,0.1 +119,0.030748,0.113748,2.701767,0.1 +120,0.036951,0.012634,0.753982,0.1 +121,0.054294,0.022168,0.251327,0.1 +122,0.070206,-0.076626,-0.942477,0.1 +123,0.076576,-0.084326,-0.816813,0.1 +124,0.048913,0.105548,2.513272,0.1 +125,0.031433,0.115158,2.764599,0.1 +126,0.041546,-0.100714,-2.638936,0.1 +127,0.033108,-0.106069,-2.513272,0.1 +128,0.048913,0.105548,2.513272,0.1 +129,0.036298,0.120797,2.010618,0.1 +130,0.0,0.0,0.0,0.1 +131,0.009895,0.00125,0.251327,0.1 +132,0.066564,0.051269,1.3823,0.1 +133,0.067816,0.071177,1.633627,0.1 +134,0.059233,0.109384,1.3823,0.1 +135,0.062981,0.129029,1.3823,0.1 +136,0.070206,-0.076626,-0.942477,0.1 +137,0.075826,-0.084895,-1.005309,0.1 +138,0.134335,0.039247,-0.628318,0.1 +139,0.152324,0.030782,-0.251327,0.1 +140,0.033108,-0.106069,-2.513272,0.1 +141,0.025208,-0.112197,-2.45044,0.1 +142,0.040643,0.111168,2.576104,0.1 +143,0.031504,0.115123,2.890263,0.1 +144,0.030748,0.113748,2.701767,0.1 +145,0.011308,0.117457,3.204422,0.1 +146,0.025208,-0.112197,-2.45044,0.1 +147,0.016787,-0.117541,-2.701767,0.1 +148,0.152324,0.030782,-0.251327,0.1 +149,0.161598,0.027111,-0.502654,0.1 +150,0.0,0.0,0.0,0.1 +151,0.009993,-0.000314,-0.062832,0.1 +152,0.064442,0.080469,2.073449,0.1 +153,0.055932,0.098553,1.947786,0.1 +154,0.062981,0.129029,1.3823,0.1 +155,0.064545,0.138905,1.445131,0.1 +156,0.064442,0.080469,2.073449,0.1 +157,0.060187,0.089511,1.947786,0.1 +158,0.009895,0.00125,0.251327,0.1 +159,0.029685,0.00125,-0.251327,0.1 +160,0.033528,-0.018815,-0.942477,0.1 +161,0.039607,-0.037525,-1.570795,0.1 +162,0.152324,0.030782,-0.251327,0.1 +163,0.162141,0.02891,-0.125664,0.1 +164,0.064545,0.138905,1.445131,0.1 +165,0.064859,0.148885,1.633627,0.1 +166,0.162141,0.02891,-0.125664,0.1 +167,0.172095,0.029222,0.188495,0.1 +168,0.025208,-0.112197,-2.45044,0.1 +169,0.007301,-0.120623,-2.953095,0.1 +170,0.033108,-0.106069,-2.513272,0.1 +171,0.02467,-0.111424,-2.638936,0.1 +172,0.041546,-0.100714,-2.638936,0.1 +173,0.02402,-0.110349,-2.638936,0.1 +174,0.172095,0.029222,0.188495,0.1 +175,0.181684,0.032008,0.376991,0.1 +176,0.039607,-0.037525,-1.570795,0.1 +177,0.043333,-0.057055,-1.193804,0.1 +178,0.011308,0.117457,3.204422,0.1 +179,0.001394,0.116204,3.330085,0.1 +180,0.181684,0.032008,0.376991,0.1 +181,0.191403,0.034181,0.062832,0.1 +182,0.076576,-0.084326,-0.816813,0.1 +183,0.083646,-0.091396,-0.753982,0.1 +184,0.016787,-0.117541,-2.701767,0.1 +185,0.007301,-0.120623,-2.953095,0.1 +186,0.0,0.0,0.0,0.1 +187,0.019168,-0.004922,-0.502654,0.1 +188,0.025208,-0.112197,-2.45044,0.1 +189,0.011553,-0.126738,-2.199113,0.1 +190,0.064859,0.148885,1.633627,0.1 +191,0.064859,0.168872,1.507963,0.1 +192,0.181684,0.032008,0.376991,0.1 +193,0.197694,0.043641,0.879645,0.1 +194,0.191403,0.034181,0.062832,0.1 +195,0.201396,0.034181,-0.062832,0.1 +196,0.060505,-0.07827,-1.947786,0.1 +197,0.050895,-0.09575,-2.199113,0.1 +198,0.031504,0.115123,2.890263,0.1 +199,0.021687,0.116996,3.015926,0.1 +200,0.066564,0.051269,1.3823,0.1 +201,0.06935,0.060858,1.193804,0.1 +202,0.007301,-0.120623,-2.953095,0.1 +203,-0.010606,-0.129049,-2.45044,0.1 +204,0.030748,0.113748,2.701767,0.1 +205,0.022327,0.119093,2.45044,0.1 +206,0.033528,-0.018815,-0.942477,0.1 +207,0.044238,-0.035691,-1.068141,0.1 +208,0.022327,0.119093,2.45044,0.1 +209,0.007757,0.132774,2.324777,0.1 +210,0.007301,-0.120623,-2.953095,0.1 +211,-0.002653,-0.121249,-3.204422,0.1 +212,0.059233,0.109384,1.3823,0.1 +213,0.062315,0.118869,1.130972,0.1 +214,0.083646,-0.091396,-0.753982,0.1 +215,0.08975,-0.099265,-1.068141,0.1 +216,0.064859,0.168872,1.507963,0.1 +217,0.063922,0.178787,1.822122,0.1 +218,0.009895,0.00125,0.251327,0.1 +219,0.01929,0.004632,0.439823,0.1 +220,-0.010606,-0.129049,-2.45044,0.1 +221,-0.028512,-0.137476,-2.953095,0.1 +222,0.201396,0.034181,-0.062832,0.1 +223,0.219687,0.026939,-0.69115,0.1 +224,0.007757,0.132774,2.324777,0.1 +225,0.001894,0.140843,2.073449,0.1 +226,0.066564,0.051269,1.3823,0.1 +227,0.066564,0.071151,1.75929,0.1 +228,0.197694,0.043641,0.879645,0.1 +229,0.212235,0.057295,0.628318,0.1 +230,0.011553,-0.126738,-2.199113,0.1 +231,-0.002102,-0.141279,-2.45044,0.1 +232,0.009895,-0.00125,-0.251327,0.1 +233,0.019035,-0.005205,-0.565486,0.1 +234,0.01929,0.004632,0.439823,0.1 +235,0.036805,0.014261,0.565486,0.1 +236,0.212235,0.057295,0.628318,0.1 +237,0.219506,0.064123,0.879645,0.1 +238,0.219687,0.026939,-0.69115,0.1 +239,0.237594,0.018512,-0.188495,0.1 +240,0.219506,0.064123,0.879645,0.1 +241,0.226748,0.082414,1.507963,0.1 +242,-0.028512,-0.137476,-2.953095,0.1 +243,-0.047871,-0.142446,-2.827431,0.1 +244,0.0,0.0,0.0,0.1 +245,0.019168,-0.004922,-0.502654,0.1 +246,0.237594,0.018512,-0.188495,0.1 +247,0.246964,0.015139,-0.502654,0.1 +248,0.116624,0.048274,-0.251327,0.1 +249,0.136414,0.045774,-0.0,0.1 +250,0.063922,0.178787,1.822122,0.1 +251,0.060177,0.198419,1.696459,0.1 +252,0.001894,0.140843,2.073449,0.1 +253,-0.012446,0.15431,2.701767,0.1 +254,-0.047871,-0.142446,-2.827431,0.1 +255,-0.06592,-0.150939,-2.576104,0.1 +256,0.001894,0.140843,2.073449,0.1 +257,-0.005449,0.15939,1.822122,0.1 +258,0.219506,0.064123,0.879645,0.1 +259,0.226748,0.082414,1.507963,0.1 +260,0.033528,-0.018815,-0.942477,0.1 +261,0.040356,-0.026086,-0.69115,0.1 +262,0.001394,0.116204,3.330085,0.1 +263,-0.015846,0.106727,3.958403,0.1 +264,0.01929,0.004632,0.439823,0.1 +265,0.028047,0.009447,0.565486,0.1 +266,0.019035,-0.005205,-0.565486,0.1 +267,0.037856,-0.011321,-0.062832,0.1 +268,0.0,0.0,0.0,0.1 +269,0.019168,0.004922,0.502654,0.1 +270,-0.06592,-0.150939,-2.576104,0.1 +271,-0.080413,-0.16455,-2.199113,0.1 +272,-0.080413,-0.16455,-2.199113,0.1 +273,-0.085496,-0.173144,-2.010618,0.1 +274,0.048913,0.105548,2.513272,0.1 +275,0.036298,0.120797,2.010618,0.1 +276,0.08975,-0.099265,-1.068141,0.1 +277,0.094839,-0.107871,-1.005309,0.1 +278,0.226748,0.082414,1.507963,0.1 +279,0.229253,0.102243,1.3823,0.1 +280,0.237594,0.018512,-0.188495,0.1 +281,0.257345,0.019755,0.314159,0.1 +282,0.019035,-0.005205,-0.565486,0.1 +283,0.027304,-0.010825,-0.628318,0.1 +284,0.219687,0.026939,-0.69115,0.1 +285,0.227946,0.021326,-0.502654,0.1 +286,-0.012446,0.15431,2.701767,0.1 +287,-0.020867,0.159654,2.45044,0.1 +288,-0.06592,-0.150939,-2.576104,0.1 +289,-0.074526,-0.156029,-2.638936,0.1 +290,0.257345,0.019755,0.314159,0.1 +291,0.266637,0.023434,0.439823,0.1 +292,0.021687,0.116996,3.015926,0.1 +293,0.002366,0.121957,2.764599,0.1 +294,-0.085496,-0.173144,-2.010618,0.1 +295,-0.09084,-0.181565,-2.261945,0.1 +296,0.0,0.0,0.0,0.1 +297,0.009993,-0.000314,-0.062832,0.1 +298,0.036951,0.012634,0.753982,0.1 +299,0.044451,0.019246,0.69115,0.1 +300,-0.09084,-0.181565,-2.261945,0.1 +301,-0.105381,-0.19522,-2.513272,0.1 +302,0.266637,0.023434,0.439823,0.1 +303,0.275545,0.027973,0.502654,0.1 +304,0.094839,-0.107871,-1.005309,0.1 +305,0.107554,-0.12324,-0.753982,0.1 +306,0.055972,-0.087167,-2.136281,0.1 +307,0.045255,-0.104053,-2.136281,0.1 +308,0.036951,0.012634,0.753982,0.1 +309,0.044841,0.018754,0.565486,0.1 +310,0.257345,0.019755,0.314159,0.1 +311,0.267024,0.02224,0.188495,0.1 +312,0.107554,-0.12324,-0.753982,0.1 +313,0.114395,-0.130525,-0.879645,0.1 +314,0.219687,0.026939,-0.69115,0.1 +315,0.226748,0.019878,-0.879645,0.1 +316,0.246964,0.015139,-0.502654,0.1 +317,0.263839,0.00443,-0.628318,0.1 +318,0.267024,0.02224,0.188495,0.1 +319,0.284264,0.031718,0.816813,0.1 +320,0.263839,0.00443,-0.628318,0.1 +321,0.28224,-0.002856,-0.125664,0.1 +322,0.275545,0.027973,0.502654,0.1 +323,0.283804,0.033586,0.69115,0.1 +324,0.226748,0.019878,-0.879645,0.1 +325,0.242067,0.007205,-0.502654,0.1 +326,-0.005449,0.15939,1.822122,0.1 +327,-0.011625,0.178399,1.947786,0.1 +328,0.226748,0.019878,-0.879645,0.1 +329,0.232876,0.011978,-0.942477,0.1 +330,-0.085496,-0.173144,-2.010618,0.1 +331,-0.088878,-0.182539,-1.822122,0.1 +332,0.036951,0.012634,0.753982,0.1 +333,0.048638,0.028718,1.130972,0.1 +334,0.039607,-0.037525,-1.570795,0.1 +335,0.040547,-0.047466,-1.3823,0.1 +336,0.041546,-0.100714,-2.638936,0.1 +337,0.028079,-0.115055,-2.010618,0.1 +338,-0.012446,0.15431,2.701767,0.1 +339,-0.028531,0.165996,2.324777,0.1 +340,0.263839,0.00443,-0.628318,0.1 +341,0.271539,-0.001941,-0.753982,0.1 +342,-0.011625,0.178399,1.947786,0.1 +343,-0.015596,0.187575,2.010618,0.1 +344,-0.005449,0.15939,1.822122,0.1 +345,-0.005449,0.17918,1.319468,0.1 +346,-0.028531,0.165996,2.324777,0.1 +347,-0.035816,0.172837,2.45044,0.1 +348,0.007301,-0.120623,-2.953095,0.1 +349,-0.012528,-0.123128,-3.078758,0.1 +350,0.271539,-0.001941,-0.753982,0.1 +351,0.279776,-0.007538,-0.439823,0.1 +352,-0.015596,0.187575,2.010618,0.1 +353,-0.019274,0.196866,1.884954,0.1 +354,-0.035816,0.172837,2.45044,0.1 +355,-0.054107,0.180079,3.078758,0.1 +356,0.033528,-0.018815,-0.942477,0.1 +357,0.046268,-0.034215,-0.816813,0.1 +358,0.226748,0.082414,1.507963,0.1 +359,0.226748,0.092407,1.633627,0.1 +360,0.283804,0.033586,0.69115,0.1 +361,0.30171,0.042012,0.188495,0.1 +362,0.125897,0.044602,-0.502654,0.1 +363,0.134156,0.03899,-0.69115,0.1 +364,0.125897,0.044602,-0.502654,0.1 +365,0.141216,0.031929,-0.879645,0.1 +366,0.284264,0.031718,0.816813,0.1 +367,0.300973,0.042322,0.314159,0.1 +368,0.033528,-0.018815,-0.942477,0.1 +369,0.045284,-0.034996,-0.942477,0.1 +370,-0.088878,-0.182539,-1.822122,0.1 +371,-0.093852,-0.201911,-1.822122,0.1 +372,-0.093852,-0.201911,-1.822122,0.1 +373,-0.101195,-0.220457,-2.073449,0.1 +374,-0.019274,0.196866,1.884954,0.1 +375,-0.028853,0.214289,2.261945,0.1 +376,0.226748,0.092407,1.633627,0.1 +377,0.226748,0.102401,1.507963,0.1 +378,0.271539,-0.001941,-0.753982,0.1 +379,0.281017,-0.01918,-1.3823,0.1 +380,-0.101195,-0.220457,-2.073449,0.1 +381,-0.106013,-0.22922,-2.073449,0.1 +382,-0.054107,0.180079,3.078758,0.1 +383,-0.063969,0.181642,2.890263,0.1 +384,0.226748,0.092407,1.633627,0.1 +385,0.220632,0.111229,2.136281,0.1 +386,0.30171,0.042012,0.188495,0.1 +387,0.311299,0.044798,0.376991,0.1 +388,0.281017,-0.01918,-1.3823,0.1 +389,0.288336,-0.037665,-1.005309,0.1 +390,0.009895,-0.00125,-0.251327,0.1 +391,0.01979,-0.0025,0.0,0.1 +392,0.041546,-0.100714,-2.638936,0.1 +393,0.03294,-0.105804,-2.576104,0.1 +394,0.288336,-0.037665,-1.005309,0.1 +395,0.293425,-0.046271,-1.068141,0.1 +396,0.220632,0.111229,2.136281,0.1 +397,0.214758,0.119314,2.261945,0.1 +398,-0.080413,-0.16455,-2.199113,0.1 +399,-0.087241,-0.17182,-2.45044,0.1 +400,-0.028853,0.214289,2.261945,0.1 +401,-0.039541,0.231131,2.010618,0.1 +402,0.007301,-0.120623,-2.953095,0.1 +403,-0.01167,-0.126787,-2.701767,0.1 +404,0.009895,-0.00125,-0.251327,0.1 +405,0.01979,-0.0025,0.0,0.1 +406,0.311299,0.044798,0.376991,0.1 +407,0.320039,0.049602,0.628318,0.1 +408,0.0,0.0,0.0,0.1 +409,0.009974,0.000627,0.125664,0.1 +410,-0.106013,-0.22922,-2.073449,0.1 +411,-0.111625,-0.237479,-2.261945,0.1 +412,-0.005449,0.17918,1.319468,0.1 +413,-0.0042,0.199023,1.696459,0.1 +414,-0.005449,0.17918,1.319468,0.1 +415,-0.003267,0.188938,1.3823,0.1 +416,-0.111625,-0.237479,-2.261945,0.1 +417,-0.122314,-0.254321,-2.010618,0.1 +418,0.066564,0.071151,1.75929,0.1 +419,0.067806,0.090902,1.256636,0.1 +420,-0.122314,-0.254321,-2.010618,0.1 +421,-0.126022,-0.273761,-1.507963,0.1 +422,-0.126022,-0.273761,-1.507963,0.1 +423,-0.127274,-0.293669,-1.75929,0.1 +424,0.041546,-0.100714,-2.638936,0.1 +425,0.033477,-0.106576,-2.387608,0.1 +426,-0.028531,0.165996,2.324777,0.1 +427,-0.040256,0.182134,2.073449,0.1 +428,0.214758,0.119314,2.261945,0.1 +429,0.209689,0.127886,1.947786,0.1 +430,-0.003267,0.188938,1.3823,0.1 +431,-0.000185,0.198423,1.130972,0.1 +432,0.220632,0.111229,2.136281,0.1 +433,0.205474,0.123769,2.764599,0.1 +434,0.214758,0.119314,2.261945,0.1 +435,0.206332,0.13722,1.75929,0.1 +436,-0.039541,0.231131,2.010618,0.1 +437,-0.043249,0.250571,1.507963,0.1 +438,0.281017,-0.01918,-1.3823,0.1 +439,0.281957,-0.029121,-1.570795,0.1 +440,-0.126022,-0.273761,-1.507963,0.1 +441,-0.124769,-0.283675,-1.3823,0.1 +442,0.281017,-0.01918,-1.3823,0.1 +443,0.282269,-0.039088,-1.633627,0.1 +444,-0.043249,0.250571,1.507963,0.1 +445,-0.04138,0.260368,1.256636,0.1 +446,0.311299,0.044798,0.376991,0.1 +447,0.330829,0.048523,-0.0,0.1 +448,0.064442,0.080469,2.073449,0.1 +449,0.058829,0.088727,2.261945,0.1 +450,0.019168,0.004922,0.502654,0.1 +451,0.033595,0.018469,1.005309,0.1 +452,0.114395,-0.130525,-0.879645,0.1 +453,0.119739,-0.138946,-1.130972,0.1 +454,-0.127274,-0.293669,-1.75929,0.1 +455,-0.12976,-0.303348,-1.884954,0.1 +456,0.330829,0.048523,-0.0,0.1 +457,0.340822,0.048209,-0.062832,0.1 +458,-0.04138,0.260368,1.256636,0.1 +459,-0.032887,0.278417,1.005309,0.1 +460,0.320039,0.049602,0.628318,0.1 +461,0.33458,0.063257,0.879645,0.1 +462,-0.032887,0.278417,1.005309,0.1 +463,-0.028073,0.287174,1.130972,0.1 +464,-0.032887,0.278417,1.005309,0.1 +465,-0.027797,0.287023,1.068141,0.1 +466,0.040039,0.110069,2.827431,0.1 +467,0.030875,0.114035,2.638936,0.1 +468,0.141216,0.031929,-0.879645,0.1 +469,0.146286,0.023357,-1.193804,0.1 +470,-0.032887,0.278417,1.005309,0.1 +471,-0.024394,0.296466,1.256636,0.1 +472,0.33458,0.063257,0.879645,0.1 +473,0.346328,0.079427,1.005309,0.1 +474,0.346328,0.079427,1.005309,0.1 +475,0.357045,0.096314,1.005309,0.1 +476,-0.032887,0.278417,1.005309,0.1 +477,-0.027267,0.286686,0.942477,0.1 +478,0.033595,0.018469,1.005309,0.1 +479,0.042088,0.036518,1.256636,0.1 +480,0.357045,0.096314,1.005309,0.1 +481,0.362665,0.104583,0.942477,0.1 +482,-0.124769,-0.283675,-1.3823,0.1 +483,-0.123517,-0.303583,-1.633627,0.1 +484,0.214758,0.119314,2.261945,0.1 +485,0.201076,0.133884,2.387608,0.1 +486,-0.027267,0.286686,0.942477,0.1 +487,-0.020664,0.294176,0.753982,0.1 +488,0.346328,0.079427,1.005309,0.1 +489,0.351418,0.088033,1.068141,0.1 +490,0.205474,0.123769,2.764599,0.1 +491,0.186466,0.129945,2.890263,0.1 +492,-0.124769,-0.283675,-1.3823,0.1 +493,-0.121984,-0.293264,-1.193804,0.1 +494,0.040039,0.110069,2.827431,0.1 +495,0.030242,0.111938,3.078758,0.1 +496,0.293425,-0.046271,-1.068141,0.1 +497,0.300769,-0.064818,-1.319468,0.1 +498,-0.020664,0.294176,0.753982,0.1 +499,-0.002863,0.302552,0.125664,0.1 +500,0.282269,-0.039088,-1.633627,0.1 +501,0.282896,-0.049042,-1.3823,0.1 +502,-0.063969,0.181642,2.890263,0.1 +503,-0.083759,0.181642,3.392917,0.1 +504,0.220632,0.111229,2.136281,0.1 +505,0.212139,0.129278,1.884954,0.1 +506,0.351418,0.088033,1.068141,0.1 +507,0.355957,0.096942,1.130972,0.1 +508,-0.083759,0.181642,3.392917,0.1 +509,-0.103602,0.180393,3.015926,0.1 +510,-0.002863,0.302552,0.125664,0.1 +511,0.016045,0.308696,0.502654,0.1 +512,-0.12976,-0.303348,-1.884954,0.1 +513,-0.140364,-0.320058,-2.387608,0.1 +514,-0.121984,-0.293264,-1.193804,0.1 +515,-0.119198,-0.302853,-1.3823,0.1 +516,-0.140364,-0.320058,-2.387608,0.1 +517,-0.155764,-0.332798,-2.513272,0.1 +518,-0.028853,0.214289,2.261945,0.1 +519,-0.035465,0.221789,2.324777,0.1 +520,-0.103602,0.180393,3.015926,0.1 +521,-0.113576,0.180393,3.267254,0.1 +522,0.340822,0.048209,-0.062832,0.1 +523,0.350776,0.047268,-0.125664,0.1 +524,0.220632,0.111229,2.136281,0.1 +525,0.213313,0.129715,1.75929,0.1 +526,-0.121984,-0.293264,-1.193804,0.1 +527,-0.118013,-0.30244,-1.130972,0.1 +528,0.346328,0.079427,1.005309,0.1 +529,0.350861,0.088324,1.193804,0.1 +530,-0.002863,0.302552,0.125664,0.1 +531,0.006881,0.30473,0.314159,0.1 +532,0.201076,0.133884,2.387608,0.1 +533,0.194473,0.141374,2.199113,0.1 +534,-0.103602,0.180393,3.015926,0.1 +535,-0.123236,0.177913,3.518581,0.1 +536,0.300769,-0.064818,-1.319468,0.1 +537,0.310303,-0.08216,-0.816813,0.1 +538,-0.12976,-0.303348,-1.884954,0.1 +539,-0.13285,-0.312859,-1.884954,0.1 +540,-0.002863,0.302552,0.125664,0.1 +541,0.016771,0.300072,-0.376991,0.1 +542,-0.118013,-0.30244,-1.130972,0.1 +543,-0.112669,-0.310861,-0.879645,0.1 +544,-0.112669,-0.310861,-0.879645,0.1 +545,-0.107324,-0.319282,-1.130972,0.1 +546,0.281957,-0.029121,-1.570795,0.1 +547,0.282896,-0.039062,-1.3823,0.1 +548,-0.103602,0.180393,3.015926,0.1 +549,-0.113477,0.181957,2.953095,0.1 +550,-0.074526,-0.156029,-2.638936,0.1 +551,-0.082395,-0.162133,-2.324777,0.1 +552,0.016771,0.300072,-0.376991,0.1 +553,0.025343,0.295002,-0.69115,0.1 +554,-0.002863,0.302552,0.125664,0.1 +555,0.016457,0.307513,0.376991,0.1 +556,-0.112669,-0.310861,-0.879645,0.1 +557,-0.106795,-0.318946,-1.005309,0.1 +558,-0.13285,-0.312859,-1.884954,0.1 +559,-0.13782,-0.332218,-1.75929,0.1 +560,-0.155764,-0.332798,-2.513272,0.1 +561,-0.164637,-0.337319,-2.827431,0.1 +562,-0.043249,0.250571,1.507963,0.1 +563,-0.043563,0.260551,1.696459,0.1 +564,0.362665,0.104583,0.942477,0.1 +565,0.368019,0.113021,1.068141,0.1 +566,-0.164637,-0.337319,-2.827431,0.1 +567,-0.184362,-0.339811,-3.204422,0.1 +568,-0.112669,-0.310861,-0.879645,0.1 +569,-0.106795,-0.318946,-1.005309,0.1 +570,-0.043563,0.260551,1.696459,0.1 +571,-0.048523,0.279872,1.947786,0.1 +572,0.362665,0.104583,0.942477,0.1 +573,0.37858,0.116146,0.314159,0.1 +574,-0.184362,-0.339811,-3.204422,0.1 +575,-0.194356,-0.339811,-3.078758,0.1 +576,-0.113477,0.181957,2.953095,0.1 +577,-0.122847,0.185331,2.638936,0.1 +578,-0.155764,-0.332798,-2.513272,0.1 +579,-0.163034,-0.339625,-2.261945,0.1 +580,-0.112669,-0.310861,-0.879645,0.1 +581,-0.104242,-0.328768,-1.3823,0.1 +582,0.025343,0.295002,-0.69115,0.1 +583,0.032843,0.28839,-0.753982,0.1 +584,0.282269,-0.039088,-1.633627,0.1 +585,0.285978,-0.058527,-1.130972,0.1 +586,0.016045,0.308696,0.502654,0.1 +587,0.025209,0.312662,0.314159,0.1 +588,-0.002863,0.302552,0.125664,0.1 +589,0.00711,0.30318,-0.0,0.1 +590,0.300769,-0.064818,-1.319468,0.1 +591,0.30295,-0.074576,-1.3823,0.1 +592,0.282269,-0.039088,-1.633627,0.1 +593,0.280401,-0.048885,-1.884954,0.1 +594,0.350776,0.047268,-0.125664,0.1 +595,0.370723,0.046013,-0.0,0.1 +596,0.368019,0.113021,1.068141,0.1 +597,0.377654,0.130547,1.068141,0.1 +598,-0.048523,0.279872,1.947786,0.1 +599,-0.057033,0.297956,2.073449,0.1 +600,0.280401,-0.048885,-1.884954,0.1 +601,0.276435,-0.058049,-2.073449,0.1 +602,0.377654,0.130547,1.068141,0.1 +603,0.391995,0.144014,0.439823,0.1 +604,0.391995,0.144014,0.439823,0.1 +605,0.411513,0.146479,-0.188495,0.1 +606,-0.112669,-0.310861,-0.879645,0.1 +607,-0.096058,-0.321402,-0.251327,0.1 +608,-0.155764,-0.332798,-2.513272,0.1 +609,-0.171164,-0.345538,-2.387608,0.1 +610,-0.194356,-0.339811,-3.078758,0.1 +611,-0.214185,-0.342316,-2.953095,0.1 +612,-0.096058,-0.321402,-0.251327,0.1 +613,-0.086196,-0.322964,-0.062832,0.1 +614,-0.171164,-0.345538,-2.387608,0.1 +615,-0.178864,-0.351908,-2.513272,0.1 +616,0.391995,0.144014,0.439823,0.1 +617,0.410092,0.152529,0.439823,0.1 +618,0.30295,-0.074576,-1.3823,0.1 +619,0.311376,-0.092482,-0.879645,0.1 +620,0.411513,0.146479,-0.188495,0.1 +621,0.421192,0.143994,-0.314159,0.1 +622,0.30295,-0.074576,-1.3823,0.1 +623,0.306697,-0.094221,-1.3823,0.1 +624,-0.104242,-0.328768,-1.3823,0.1 +625,-0.105485,-0.348519,-1.884954,0.1 +626,-0.086196,-0.322964,-0.062832,0.1 +627,-0.076281,-0.322027,0.251327,0.1 +628,0.421192,0.143994,-0.314159,0.1 +629,0.430217,0.139748,-0.565486,0.1 +630,0.370723,0.046013,-0.0,0.1 +631,0.380697,0.046641,0.125664,0.1 +632,-0.106795,-0.318946,-1.005309,0.1 +633,-0.097166,-0.336461,-1.130972,0.1 +634,0.430217,0.139748,-0.565486,0.1 +635,0.438301,0.133874,-0.69115,0.1 +636,0.438301,0.133874,-0.69115,0.1 +637,0.446723,0.128529,-0.439823,0.1 +638,-0.076281,-0.322027,0.251327,0.1 +639,-0.067008,-0.318356,0.502654,0.1 +640,0.410092,0.152529,0.439823,0.1 +641,0.418849,0.157344,0.565486,0.1 +642,0.276435,-0.058049,-2.073449,0.1 +643,0.27218,-0.067091,-1.947786,0.1 +644,0.438301,0.133874,-0.69115,0.1 +645,0.446386,0.128,-0.565486,0.1 +646,-0.020664,0.294176,0.753982,0.1 +647,-0.003877,0.304829,0.376991,0.1 +648,-0.067008,-0.318356,0.502654,0.1 +649,-0.058402,-0.313266,0.565486,0.1 +650,0.446723,0.128529,-0.439823,0.1 +651,0.465694,0.122365,-0.188495,0.1 +652,-0.178864,-0.351908,-2.513272,0.1 +653,-0.197264,-0.359193,-3.015926,0.1 +654,0.418849,0.157344,0.565486,0.1 +655,0.427746,0.161877,0.376991,0.1 +656,0.465694,0.122365,-0.188495,0.1 +657,0.484179,0.115046,-0.565486,0.1 +658,0.438301,0.133874,-0.69115,0.1 +659,0.446723,0.128529,-0.439823,0.1 +660,0.484179,0.115046,-0.565486,0.1 +661,0.491864,0.108689,-0.816813,0.1 +662,-0.067008,-0.318356,0.502654,0.1 +663,-0.053541,-0.304015,1.130972,0.1 +664,0.276435,-0.058049,-2.073449,0.1 +665,0.270291,-0.076958,-1.696459,0.1 +666,-0.122847,0.185331,2.638936,0.1 +667,-0.141394,0.192674,2.890263,0.1 +668,-0.13782,-0.332218,-1.75929,0.1 +669,-0.142791,-0.351577,-1.884954,0.1 +670,0.377654,0.130547,1.068141,0.1 +671,0.390328,0.145866,0.69115,0.1 +672,-0.086196,-0.322964,-0.062832,0.1 +673,-0.076242,-0.323905,-0.125664,0.1 +674,-0.032887,0.278417,1.005309,0.1 +675,-0.026772,0.297238,1.507963,0.1 +676,0.465694,0.122365,-0.188495,0.1 +677,0.475635,0.121426,-0.0,0.1 +678,-0.057033,0.297956,2.073449,0.1 +679,-0.062896,0.306025,2.324777,0.1 +680,0.475635,0.121426,-0.0,0.1 +681,0.485628,0.121112,-0.062832,0.1 +682,-0.053541,-0.304015,1.130972,0.1 +683,-0.049833,-0.284575,1.633627,0.1 +684,-0.214185,-0.342316,-2.953095,0.1 +685,-0.223864,-0.344801,-2.827431,0.1 +686,0.025209,0.312662,0.314159,0.1 +687,0.035006,0.314531,0.062832,0.1 +688,-0.178864,-0.351908,-2.513272,0.1 +689,-0.194264,-0.364648,-2.387608,0.1 +690,0.025343,0.295002,-0.69115,0.1 +691,0.036975,0.278992,-1.193804,0.1 +692,-0.223864,-0.344801,-2.827431,0.1 +693,-0.233544,-0.347287,-2.953095,0.1 +694,0.205474,0.123769,2.764599,0.1 +695,0.196902,0.128838,2.45044,0.1 +696,-0.067008,-0.318356,0.502654,0.1 +697,-0.05857,-0.313001,0.628318,0.1 +698,0.491864,0.108689,-0.816813,0.1 +699,0.497726,0.10062,-1.068141,0.1 +700,-0.020664,0.294176,0.753982,0.1 +701,-0.012964,0.300546,0.628318,0.1 +702,0.036975,0.278992,-1.193804,0.1 +703,0.039761,0.269403,-1.3823,0.1 +704,-0.197264,-0.359193,-3.015926,0.1 +705,-0.216897,-0.362938,-2.890263,0.1 +706,-0.216897,-0.362938,-2.890263,0.1 +707,-0.22617,-0.36661,-2.638936,0.1 +708,0.036975,0.278992,-1.193804,0.1 +709,0.046585,0.261512,-0.942477,0.1 +710,-0.142791,-0.351577,-1.884954,0.1 +711,-0.152369,-0.368999,-2.261945,0.1 +712,-0.026772,0.297238,1.507963,0.1 +713,-0.027085,0.307218,1.696459,0.1 +714,0.418849,0.157344,0.565486,0.1 +715,0.432396,0.17177,1.068141,0.1 +716,0.497726,0.10062,-1.068141,0.1 +717,0.503589,0.092551,-0.816813,0.1 +718,-0.096058,-0.321402,-0.251327,0.1 +719,-0.076268,-0.323902,0.0,0.1 +720,0.276435,-0.058049,-2.073449,0.1 +721,0.272749,-0.077373,-1.445131,0.1 +722,0.497726,0.10062,-1.068141,0.1 +723,0.502816,0.092014,-1.005309,0.1 +724,0.025343,0.295002,-0.69115,0.1 +725,0.032843,0.28839,-0.753982,0.1 +726,0.497726,0.10062,-1.068141,0.1 +727,0.501398,0.091347,-1.319468,0.1 +728,0.484179,0.115046,-0.565486,0.1 +729,0.501066,0.10433,-0.565486,0.1 +730,-0.027085,0.307218,1.696459,0.1 +731,-0.027085,0.317192,1.445131,0.1 +732,-0.027085,0.317192,1.445131,0.1 +733,-0.02583,0.33714,1.570795,0.1 +734,-0.002863,0.302552,0.125664,0.1 +735,0.016045,0.308696,0.502654,0.1 +736,0.497726,0.10062,-1.068141,0.1 +737,0.502816,0.092014,-1.005309,0.1 +738,0.432396,0.17177,1.068141,0.1 +739,0.436935,0.180679,1.130972,0.1 +740,0.485628,0.121112,-0.062832,0.1 +741,0.495621,0.121112,0.062832,0.1 +742,0.495621,0.121112,0.062832,0.1 +743,0.515061,0.117403,-0.439823,0.1 +744,-0.121984,-0.293264,-1.193804,0.1 +745,-0.117179,-0.302004,-0.942477,0.1 +746,0.495621,0.121112,0.062832,0.1 +747,0.505615,0.121426,-0.0,0.1 +748,-0.053541,-0.304015,1.130972,0.1 +749,-0.048458,-0.29542,0.942477,0.1 +750,0.515061,0.117403,-0.439823,0.1 +751,0.524237,0.113432,-0.376991,0.1 +752,-0.067008,-0.318356,0.502654,0.1 +753,-0.048099,-0.312212,0.125664,0.1 +754,-0.062896,0.306025,2.324777,0.1 +755,-0.080135,0.315503,2.953095,0.1 +756,0.501398,0.091347,-1.319468,0.1 +757,0.508741,0.0728,-1.068141,0.1 +758,0.436935,0.180679,1.130972,0.1 +759,0.4431,0.19965,1.3823,0.1 +760,0.039761,0.269403,-1.3823,0.1 +761,0.04708,0.250918,-1.005309,0.1 +762,-0.080135,0.315503,2.953095,0.1 +763,-0.100043,0.316755,3.204422,0.1 +764,-0.122847,0.185331,2.638936,0.1 +765,-0.131453,0.19042,2.576104,0.1 +766,-0.053541,-0.304015,1.130972,0.1 +767,-0.048727,-0.295258,1.005309,0.1 +768,0.501398,0.091347,-1.319468,0.1 +769,0.503898,0.071557,-1.570795,0.1 +770,-0.112669,-0.310861,-0.879645,0.1 +771,-0.106795,-0.318946,-1.005309,0.1 +772,-0.097166,-0.336461,-1.130972,0.1 +773,-0.092627,-0.345369,-1.068141,0.1 +774,0.524237,0.113432,-0.376991,0.1 +775,0.533741,0.110344,-0.251327,0.1 +776,0.533741,0.110344,-0.251327,0.1 +777,0.543604,0.108782,-0.062832,0.1 +778,-0.100043,0.316755,3.204422,0.1 +779,-0.119483,0.320464,2.701767,0.1 +780,0.533741,0.110344,-0.251327,0.1 +781,0.553375,0.11158,0.376991,0.1 +782,0.503898,0.071557,-1.570795,0.1 +783,0.505456,0.06172,-1.256636,0.1 +784,-0.22617,-0.36661,-2.638936,0.1 +785,-0.245339,-0.371532,-3.14159,0.1 +786,-0.086196,-0.322964,-0.062832,0.1 +787,-0.066288,-0.321712,0.188495,0.1 +788,-0.119483,0.320464,2.701767,0.1 +789,-0.135567,0.33215,2.324777,0.1 +790,-0.049833,-0.284575,1.633627,0.1 +791,-0.051085,-0.274661,1.75929,0.1 +792,-0.076281,-0.322027,0.251327,0.1 +793,-0.066386,-0.320777,0.0,0.1 +794,0.503898,0.071557,-1.570795,0.1 +795,0.505153,0.051609,-1.445131,0.1 +796,-0.002863,0.302552,0.125664,0.1 +797,0.007012,0.304116,0.188495,0.1 +798,0.553375,0.11158,0.376991,0.1 +799,0.561947,0.116649,0.69115,0.1 +800,0.503898,0.071557,-1.570795,0.1 +801,0.505148,0.061661,-1.319468,0.1 +802,0.039761,0.269403,-1.3823,0.1 +803,0.040701,0.259462,-1.570795,0.1 +804,0.561947,0.116649,0.69115,0.1 +805,0.576517,0.130331,0.816813,0.1 +806,-0.122314,-0.254321,-2.010618,0.1 +807,-0.126284,-0.263497,-1.947786,0.1 +808,-0.092627,-0.345369,-1.068141,0.1 +809,-0.078286,-0.358836,-0.439823,0.1 +810,0.576517,0.130331,0.816813,0.1 +811,0.582887,0.138031,0.942477,0.1 +812,-0.078286,-0.358836,-0.439823,0.1 +813,-0.070049,-0.364434,-0.753982,0.1 +814,0.505153,0.051609,-1.445131,0.1 +815,0.503905,0.031767,-1.822122,0.1 +816,-0.053541,-0.304015,1.130972,0.1 +817,-0.048197,-0.295594,0.879645,0.1 +818,-0.049833,-0.284575,1.633627,0.1 +819,-0.04858,-0.264667,1.3823,0.1 +820,0.508741,0.0728,-1.068141,0.1 +821,0.51328,0.063891,-1.130972,0.1 +822,-0.003877,0.304829,0.376991,0.1 +823,0.00502,0.309362,0.565486,0.1 +824,-0.049833,-0.284575,1.633627,0.1 +825,-0.049519,-0.274595,1.445131,0.1 +826,-0.096058,-0.321402,-0.251327,0.1 +827,-0.077512,-0.328745,-0.502654,0.1 +828,0.501398,0.091347,-1.319468,0.1 +829,0.501398,0.071557,-1.822122,0.1 +830,0.533741,0.110344,-0.251327,0.1 +831,0.553531,0.110344,0.251327,0.1 +832,0.501398,0.071557,-1.822122,0.1 +833,0.497727,0.062283,-2.073449,0.1 +834,-0.135567,0.33215,2.324777,0.1 +835,-0.151652,0.343836,2.701767,0.1 +836,0.582887,0.138031,0.942477,0.1 +837,0.588507,0.1463,1.005309,0.1 +838,0.025343,0.295002,-0.69115,0.1 +839,0.031929,0.287532,-1.005309,0.1 +840,-0.112669,-0.310861,-0.879645,0.1 +841,-0.096658,-0.322494,-0.376991,0.1 +842,-0.051085,-0.274661,1.75929,0.1 +843,-0.052649,-0.264785,1.696459,0.1 +844,-0.070049,-0.364434,-0.753982,0.1 +845,-0.062159,-0.370554,-0.565486,0.1 +846,-0.151652,0.343836,2.701767,0.1 +847,-0.170235,0.351194,2.827431,0.1 +848,-0.22617,-0.36661,-2.638936,0.1 +849,-0.235444,-0.370282,-2.890263,0.1 +850,-0.078286,-0.358836,-0.439823,0.1 +851,-0.068994,-0.362515,-0.314159,0.1 +852,-0.053541,-0.304015,1.130972,0.1 +853,-0.049862,-0.294723,1.256636,0.1 +854,-0.170235,0.351194,2.827431,0.1 +855,-0.17926,0.35544,2.576104,0.1 +856,-0.05857,-0.313001,0.628318,0.1 +857,-0.040581,-0.304536,0.251327,0.1 +858,-0.068994,-0.362515,-0.314159,0.1 +859,-0.059484,-0.365605,-0.314159,0.1 +860,-0.059484,-0.365605,-0.314159,0.1 +861,-0.050076,-0.368992,-0.376991,0.1 +862,0.588507,0.1463,1.005309,0.1 +863,0.59304,0.155197,1.193804,0.1 +864,-0.17926,0.35544,2.576104,0.1 +865,-0.198081,0.361556,3.078758,0.1 +866,0.533741,0.110344,-0.251327,0.1 +867,0.543636,0.109094,-0.0,0.1 +868,-0.053541,-0.304015,1.130972,0.1 +869,-0.051076,-0.284497,1.75929,0.1 +870,-0.22617,-0.36661,-2.638936,0.1 +871,-0.244717,-0.373953,-2.890263,0.1 +872,0.59304,0.155197,1.193804,0.1 +873,0.595826,0.164786,1.3823,0.1 +874,-0.051076,-0.284497,1.75929,0.1 +875,-0.04861,-0.26498,1.130972,0.1 +876,0.497727,0.062283,-2.073449,0.1 +877,0.492114,0.054025,-2.261945,0.1 +878,-0.012964,0.300546,0.628318,0.1 +879,0.003217,0.312302,0.628318,0.1 +880,-0.053541,-0.304015,1.130972,0.1 +881,-0.051076,-0.284497,1.75929,0.1 +882,0.492114,0.054025,-2.261945,0.1 +883,0.476104,0.042392,-2.764599,0.1 +884,0.588507,0.1463,1.005309,0.1 +885,0.595826,0.164786,1.3823,0.1 +886,-0.051076,-0.284497,1.75929,0.1 +887,-0.059502,-0.266591,2.261945,0.1 +888,0.588507,0.1463,1.005309,0.1 +889,0.600255,0.16247,0.879645,0.1 +890,-0.096658,-0.322494,-0.376991,0.1 +891,-0.087761,-0.327027,-0.565486,0.1 +892,0.600255,0.16247,0.879645,0.1 +893,0.616265,0.174102,0.376991,0.1 +894,-0.053541,-0.304015,1.130972,0.1 +895,-0.045026,-0.285918,1.130972,0.1 +896,0.616265,0.174102,0.376991,0.1 +897,0.633745,0.183712,0.628318,0.1 +898,-0.051076,-0.284497,1.75929,0.1 +899,-0.056046,-0.265138,1.884954,0.1 +900,0.616265,0.174102,0.376991,0.1 +901,0.631423,0.186642,1.005309,0.1 +902,-0.197264,-0.359193,-3.015926,0.1 +903,-0.216897,-0.362938,-2.890263,0.1 +904,0.616265,0.174102,0.376991,0.1 +905,0.625162,0.178636,0.565486,0.1 +906,0.040701,0.259462,-1.570795,0.1 +907,0.0382,0.239672,-1.822122,0.1 +908,0.040701,0.259462,-1.570795,0.1 +909,0.04164,0.249521,-1.3823,0.1 +910,-0.078286,-0.358836,-0.439823,0.1 +911,-0.06911,-0.362807,-0.376991,0.1 +912,0.503905,0.031767,-1.822122,0.1 +913,0.497729,0.012758,-1.947786,0.1 +914,0.031929,0.287532,-1.005309,0.1 +915,0.037287,0.279089,-1.005309,0.1 +916,-0.032887,0.278417,1.005309,0.1 +917,-0.021139,0.294586,0.879645,0.1 +918,-0.050076,-0.368992,-0.376991,0.1 +919,-0.041179,-0.373525,-0.565486,0.1 +920,0.616265,0.174102,0.376991,0.1 +921,0.625162,0.178636,0.565486,0.1 +922,-0.059502,-0.266591,2.261945,0.1 +923,-0.073184,-0.252021,2.387608,0.1 +924,-0.17926,0.35544,2.576104,0.1 +925,-0.187529,0.36106,2.513272,0.1 +926,-0.051076,-0.284497,1.75929,0.1 +927,-0.051702,-0.274543,1.507963,0.1 +928,0.497729,0.012758,-1.947786,0.1 +929,0.493758,0.003582,-2.010618,0.1 +930,-0.187529,0.36106,2.513272,0.1 +931,-0.195019,0.367664,2.324777,0.1 +932,-0.195019,0.367664,2.324777,0.1 +933,-0.202509,0.374267,2.513272,0.1 +934,0.616265,0.174102,0.376991,0.1 +935,0.625985,0.176275,0.062832,0.1 +936,0.306697,-0.094221,-1.3823,0.1 +937,0.30795,-0.104136,-1.507963,0.1 +938,-0.202509,0.374267,2.513272,0.1 +939,-0.219989,0.383877,2.764599,0.1 +940,-0.067008,-0.318356,0.502654,0.1 +941,-0.057735,-0.314684,0.251327,0.1 +942,0.633745,0.183712,0.628318,0.1 +943,0.640788,0.190754,0.942477,0.1 +944,0.025343,0.295002,-0.69115,0.1 +945,0.033048,0.288628,-0.69115,0.1 +946,0.640788,0.190754,0.942477,0.1 +947,0.646665,0.198844,0.942477,0.1 +948,-0.051076,-0.284497,1.75929,0.1 +949,-0.052015,-0.274557,1.570795,0.1 +950,-0.041179,-0.373525,-0.565486,0.1 +951,-0.032422,-0.378339,-0.439823,0.1 +952,-0.219989,0.383877,2.764599,0.1 +953,-0.229031,0.388132,2.638936,0.1 +954,-0.244717,-0.373953,-2.890263,0.1 +955,-0.263264,-0.381296,-2.638936,0.1 +956,-0.263264,-0.381296,-2.638936,0.1 +957,-0.272634,-0.38467,-2.953095,0.1 +958,-0.027267,0.286686,0.942477,0.1 +959,-0.021389,0.294776,0.942477,0.1 +960,-0.272634,-0.38467,-2.953095,0.1 +961,-0.292385,-0.383427,-3.455749,0.1 +962,-0.292385,-0.383427,-3.455749,0.1 +963,-0.302064,-0.380942,-3.330085,0.1 +964,-0.229031,0.388132,2.638936,0.1 +965,-0.244351,0.400805,2.261945,0.1 +966,-0.302064,-0.380942,-3.330085,0.1 +967,-0.321893,-0.378437,-3.204422,0.1 +968,-0.067008,-0.318356,0.502654,0.1 +969,-0.05857,-0.313001,0.628318,0.1 +970,0.016771,0.300072,-0.376991,0.1 +971,0.026178,0.296685,-0.314159,0.1 +972,0.646665,0.198844,0.942477,0.1 +973,0.659405,0.214244,0.816813,0.1 +974,-0.041179,-0.373525,-0.565486,0.1 +975,-0.027632,-0.387951,-1.068141,0.1 +976,0.493758,0.003582,-2.010618,0.1 +977,0.490375,-0.005813,-1.822122,0.1 +978,0.659405,0.214244,0.816813,0.1 +979,0.674775,0.226959,0.565486,0.1 +980,-0.04138,0.260368,1.256636,0.1 +981,-0.04138,0.28004,1.884954,0.1 +982,0.674775,0.226959,0.565486,0.1 +983,0.691662,0.237676,0.565486,0.1 +984,-0.027632,-0.387951,-1.068141,0.1 +985,-0.02177,-0.39602,-0.816813,0.1 +986,-0.059502,-0.266591,2.261945,0.1 +987,-0.06908,-0.249168,1.884954,0.1 +988,-0.263264,-0.381296,-2.638936,0.1 +989,-0.280139,-0.392006,-2.513272,0.1 +990,-0.244351,0.400805,2.261945,0.1 +991,-0.250963,0.408305,2.324777,0.1 +992,0.501398,0.071557,-1.822122,0.1 +993,0.498898,0.051766,-1.570795,0.1 +994,0.490375,-0.005813,-1.822122,0.1 +995,0.485402,-0.025185,-1.822122,0.1 +996,-0.321893,-0.378437,-3.204422,0.1 +997,-0.341723,-0.375932,-3.330085,0.1 +998,-0.051076,-0.284497,1.75929,0.1 +999,-0.052015,-0.274557,1.570795,0.1 +1000,-0.250963,0.408305,2.324777,0.1 +1001,-0.266332,0.42102,2.576104,0.1 +1002,-0.266332,0.42102,2.576104,0.1 +1003,-0.284381,0.429513,2.827431,0.1 +1004,0.691662,0.237676,0.565486,0.1 +1005,0.699747,0.24355,0.69115,0.1 +1006,-0.02177,-0.39602,-0.816813,0.1 +1007,-0.014485,-0.402861,-0.69115,0.1 +1008,-0.096058,-0.321402,-0.251327,0.1 +1009,-0.086663,-0.324785,-0.439823,0.1 +1010,-0.341723,-0.375932,-3.330085,0.1 +1011,-0.351677,-0.375306,-3.078758,0.1 +1012,-0.059502,-0.266591,2.261945,0.1 +1013,-0.066772,-0.259763,2.513272,0.1 +1014,0.501398,0.071557,-1.822122,0.1 +1015,0.501398,0.051766,-1.319468,0.1 +1016,0.699747,0.24355,0.69115,0.1 +1017,0.716589,0.254238,0.439823,0.1 +1018,-0.066772,-0.259763,2.513272,0.1 +1019,-0.084252,-0.250153,2.764599,0.1 +1020,0.595826,0.164786,1.3823,0.1 +1021,0.598311,0.174466,1.256636,0.1 +1022,0.501398,0.071557,-1.822122,0.1 +1023,0.497727,0.062283,-2.073449,0.1 +1024,-0.280139,-0.392006,-2.513272,0.1 +1025,-0.298539,-0.399291,-3.015926,0.1 +1026,-0.066772,-0.259763,2.513272,0.1 +1027,-0.074043,-0.252936,2.261945,0.1 +1028,-0.250963,0.408305,2.324777,0.1 +1029,-0.261616,0.425092,1.947786,0.1 +1030,-0.351677,-0.375306,-3.078758,0.1 +1031,-0.36167,-0.375306,-3.204422,0.1 +1032,-0.078286,-0.358836,-0.439823,0.1 +1033,-0.069238,-0.363094,-0.439823,0.1 +1034,0.59304,0.155197,1.193804,0.1 +1035,0.597295,0.16424,1.068141,0.1 +1036,0.485402,-0.025185,-1.822122,0.1 +1037,0.482314,-0.034689,-1.947786,0.1 +1038,-0.284381,0.429513,2.827431,0.1 +1039,-0.293406,0.43376,2.576104,0.1 +1040,-0.261616,0.425092,1.947786,0.1 +1041,-0.273248,0.441102,2.45044,0.1 +1042,-0.088878,-0.182539,-1.822122,0.1 +1043,-0.099419,-0.199149,-2.45044,0.1 +1044,-0.051076,-0.284497,1.75929,0.1 +1045,-0.05724,-0.265526,2.010618,0.1 +1046,-0.117179,-0.302004,-0.942477,0.1 +1047,-0.110575,-0.309494,-0.753982,0.1 +1048,-0.053541,-0.304015,1.130972,0.1 +1049,-0.042853,-0.287173,0.879645,0.1 +1050,0.476104,0.042392,-2.764599,0.1 +1051,0.456574,0.038667,-3.14159,0.1 +1052,-0.068994,-0.362515,-0.314159,0.1 +1053,-0.052285,-0.373119,-0.816813,0.1 +1054,0.0382,0.239672,-1.822122,0.1 +1055,0.035714,0.229986,-1.822122,0.1 +1056,-0.261616,0.425092,1.947786,0.1 +1057,-0.274156,0.44025,2.576104,0.1 +1058,-0.032422,-0.378339,-0.439823,0.1 +1059,-0.023828,-0.383422,-0.628318,0.1 +1060,0.482314,-0.034689,-1.947786,0.1 +1061,0.478059,-0.043731,-2.073449,0.1 +1062,0.492114,0.054025,-2.261945,0.1 +1063,0.476104,0.042392,-2.764599,0.1 +1064,0.716589,0.254238,0.439823,0.1 +1065,0.731837,0.266853,0.942477,0.1 +1066,-0.351677,-0.375306,-3.078758,0.1 +1067,-0.361631,-0.37468,-3.330085,0.1 +1068,-0.053541,-0.304015,1.130972,0.1 +1069,-0.046184,-0.285432,1.256636,0.1 +1070,-0.078286,-0.358836,-0.439823,0.1 +1071,-0.068722,-0.361615,-0.125664,0.1 +1072,0.716589,0.254238,0.439823,0.1 +1073,0.725984,0.257621,0.251327,0.1 +1074,-0.293406,0.43376,2.576104,0.1 +1075,-0.311891,0.441079,2.953095,0.1 +1076,0.016771,0.300072,-0.376991,0.1 +1077,0.036405,0.297592,0.125664,0.1 +1078,-0.051076,-0.284497,1.75929,0.1 +1079,-0.053257,-0.27474,1.822122,0.1 +1080,-0.197264,-0.359193,-3.015926,0.1 +1081,-0.215665,-0.366479,-2.513272,0.1 +1082,0.036975,0.278992,-1.193804,0.1 +1083,0.039455,0.259358,-1.696459,0.1 +1084,0.731837,0.266853,0.942477,0.1 +1085,0.747086,0.279468,0.439823,0.1 +1086,-0.051076,-0.284497,1.75929,0.1 +1087,-0.052015,-0.274557,1.570795,0.1 +1088,-0.261616,0.425092,1.947786,0.1 +1089,-0.271226,0.442572,2.199113,0.1 +1090,-0.280139,-0.392006,-2.513272,0.1 +1091,-0.297619,-0.401616,-2.764599,0.1 +1092,0.731837,0.266853,0.942477,0.1 +1093,0.747086,0.279468,0.439823,0.1 +1094,0.725984,0.257621,0.251327,0.1 +1095,0.735846,0.259183,0.062832,0.1 +1096,0.731837,0.266853,0.942477,0.1 +1097,0.744577,0.282253,0.816813,0.1 +1098,0.735846,0.259183,0.062832,0.1 +1099,0.755286,0.255474,-0.439823,0.1 +1100,0.747086,0.279468,0.439823,0.1 +1101,0.766343,0.284412,0.062832,0.1 +1102,-0.273248,0.441102,2.45044,0.1 +1103,-0.280533,0.447943,2.324777,0.1 +1104,-0.067008,-0.318356,0.502654,0.1 +1105,-0.04784,-0.313434,0.0,0.1 +1106,-0.067008,-0.318356,0.502654,0.1 +1107,-0.04784,-0.313434,0.0,0.1 +1108,0.731837,0.266853,0.942477,0.1 +1109,0.738207,0.274553,0.816813,0.1 +1110,0.738207,0.274553,0.816813,0.1 +1111,0.748861,0.29134,1.193804,0.1 +1112,0.0382,0.239672,-1.822122,0.1 +1113,0.036328,0.229856,-1.696459,0.1 +1114,-0.002863,0.302552,0.125664,0.1 +1115,0.006797,0.305033,0.376991,0.1 +1116,0.478059,-0.043731,-2.073449,0.1 +1117,0.464511,-0.058158,-2.576104,0.1 +1118,-0.076281,-0.322027,0.251327,0.1 +1119,-0.06668,-0.319238,0.314159,0.1 +1120,-0.261616,0.425092,1.947786,0.1 +1121,-0.272269,0.441878,2.324777,0.1 +1122,-0.014485,-0.402861,-0.69115,0.1 +1123,-0.0064,-0.408735,-0.565486,0.1 +1124,-0.084252,-0.250153,2.764599,0.1 +1125,-0.101732,-0.240544,2.513272,0.1 +1126,-0.053541,-0.304015,1.130972,0.1 +1127,-0.047377,-0.285044,1.3823,0.1 +1128,0.748861,0.29134,1.193804,0.1 +1129,0.760493,0.30735,0.69115,0.1 +1130,0.016771,0.300072,-0.376991,0.1 +1131,0.034251,0.290462,-0.628318,0.1 +1132,0.501398,0.071557,-1.822122,0.1 +1133,0.499526,0.06174,-1.696459,0.1 +1134,0.748861,0.29134,1.193804,0.1 +1135,0.755037,0.310348,1.319468,0.1 +1136,-0.051076,-0.284497,1.75929,0.1 +1137,-0.04861,-0.26498,1.130972,0.1 +1138,0.464511,-0.058158,-2.576104,0.1 +1139,0.456826,-0.064515,-2.324777,0.1 +1140,0.031929,0.287532,-1.005309,0.1 +1141,0.038286,0.279847,-0.753982,0.1 +1142,0.748861,0.29134,1.193804,0.1 +1143,0.7614,0.306498,0.565486,0.1 +1144,-0.311891,0.441079,2.953095,0.1 +1145,-0.321845,0.441705,3.204422,0.1 +1146,-0.076281,-0.322027,0.251327,0.1 +1147,-0.066596,-0.31954,0.251327,0.1 +1148,0.755286,0.255474,-0.439823,0.1 +1149,0.764462,0.251504,-0.376991,0.1 +1150,-0.351677,-0.375306,-3.078758,0.1 +1151,-0.361474,-0.377175,-2.827431,0.1 +1152,-0.361474,-0.377175,-2.827431,0.1 +1153,-0.371153,-0.37966,-2.953095,0.1 +1154,-0.261616,0.425092,1.947786,0.1 +1155,-0.270126,0.443176,2.073449,0.1 +1156,-0.068722,-0.361615,-0.125664,0.1 +1157,-0.058906,-0.363487,-0.251327,0.1 +1158,-0.261616,0.425092,1.947786,0.1 +1159,-0.264704,0.434596,1.822122,0.1 +1160,-0.051076,-0.284497,1.75929,0.1 +1161,-0.053581,-0.264668,1.633627,0.1 +1162,-0.068722,-0.361615,-0.125664,0.1 +1163,-0.059062,-0.364095,-0.376991,0.1 +1164,0.755037,0.310348,1.319468,0.1 +1165,0.755974,0.320263,1.633627,0.1 +1166,0.035006,0.314531,0.062832,0.1 +1167,0.054446,0.310822,-0.439823,0.1 +1168,0.755974,0.320263,1.633627,0.1 +1169,0.75566,0.330257,1.570795,0.1 +1170,0.755974,0.320263,1.633627,0.1 +1171,0.752236,0.339857,1.884954,0.1 +1172,0.7614,0.306498,0.565486,0.1 +1173,0.76967,0.312118,0.628318,0.1 +1174,0.755286,0.255474,-0.439823,0.1 +1175,0.76468,0.252092,-0.251327,0.1 +1176,0.752236,0.339857,1.884954,0.1 +1177,0.747266,0.359216,1.75929,0.1 +1178,-0.053541,-0.304015,1.130972,0.1 +1179,-0.048197,-0.295594,0.879645,0.1 +1180,-0.264704,0.434596,1.822122,0.1 +1181,-0.265954,0.444491,1.570795,0.1 +1182,0.0382,0.239672,-1.822122,0.1 +1183,0.0357,0.219882,-1.570795,0.1 +1184,0.755286,0.255474,-0.439823,0.1 +1185,0.764194,0.250935,-0.502654,0.1 +1186,0.75566,0.330257,1.570795,0.1 +1187,0.759386,0.349786,1.193804,0.1 +1188,0.764194,0.250935,-0.502654,0.1 +1189,0.782741,0.243592,-0.251327,0.1 +1190,-0.280533,0.447943,2.324777,0.1 +1191,-0.295903,0.460658,2.576104,0.1 +1192,0.464511,-0.058158,-2.576104,0.1 +1193,0.456242,-0.063778,-2.513272,0.1 +1194,0.464511,-0.058158,-2.576104,0.1 +1195,0.456621,-0.064278,-2.387608,0.1 +1196,-0.265954,0.444491,1.570795,0.1 +1197,-0.269679,0.464021,1.947786,0.1 +1198,0.755974,0.320263,1.633627,0.1 +1199,0.7566,0.330217,1.3823,0.1 +1200,0.764194,0.250935,-0.502654,0.1 +1201,0.783362,0.246014,-0.0,0.1 +1202,0.764194,0.250935,-0.502654,0.1 +1203,0.773236,0.24668,-0.376991,0.1 +1204,0.035006,0.314531,0.062832,0.1 +1205,0.04496,0.313904,-0.188495,0.1 +1206,0.503898,0.071557,-1.570795,0.1 +1207,0.500173,0.052027,-1.947786,0.1 +1208,0.764194,0.250935,-0.502654,0.1 +1209,0.773564,0.247562,-0.188495,0.1 +1210,0.025343,0.295002,-0.69115,0.1 +1211,0.032843,0.28839,-0.753982,0.1 +1212,-0.295903,0.460658,2.576104,0.1 +1213,-0.303988,0.466532,2.45044,0.1 +1214,-0.269679,0.464021,1.947786,0.1 +1215,-0.274213,0.472917,2.136281,0.1 +1216,-0.361474,-0.377175,-2.827431,0.1 +1217,-0.380495,-0.383355,-2.827431,0.1 +1218,-0.067008,-0.318356,0.502654,0.1 +1219,-0.048461,-0.311012,0.251327,0.1 +1220,0.76967,0.312118,0.628318,0.1 +1221,0.776712,0.31916,0.942477,0.1 +1222,-0.380495,-0.383355,-2.827431,0.1 +1223,-0.389659,-0.387321,-2.638936,0.1 +1224,0.00711,0.30318,-0.0,0.1 +1225,0.0269,0.30068,-0.251327,0.1 +1226,0.783362,0.246014,-0.0,0.1 +1227,0.793362,0.246014,-0.0,0.1 +1228,0.759386,0.349786,1.193804,0.1 +1229,0.771925,0.364944,0.565486,0.1 +1230,0.0382,0.239672,-1.822122,0.1 +1231,0.027659,0.223062,-2.45044,0.1 +1232,0.025343,0.295002,-0.69115,0.1 +1233,0.033243,0.288874,-0.628318,0.1 +1234,0.764194,0.250935,-0.502654,0.1 +1235,0.773564,0.247562,-0.188495,0.1 +1236,-0.053541,-0.304015,1.130972,0.1 +1237,-0.042853,-0.287173,0.879645,0.1 +1238,0.027659,0.223062,-2.45044,0.1 +1239,0.020832,0.215791,-2.199113,0.1 +1240,0.764194,0.250935,-0.502654,0.1 +1241,0.773103,0.246396,-0.439823,0.1 +1242,-0.068722,-0.361615,-0.125664,0.1 +1243,-0.050322,-0.3689,-0.628318,0.1 +1244,0.793362,0.246014,-0.0,0.1 +1245,0.812531,0.250935,0.502654,0.1 +1246,-0.389659,-0.387321,-2.638936,0.1 +1247,-0.404085,-0.400868,-2.136281,0.1 +1248,-0.303988,0.466532,2.45044,0.1 +1249,-0.318557,0.480214,2.324777,0.1 +1250,-0.404085,-0.400868,-2.136281,0.1 +1251,-0.408978,-0.419923,-1.507963,0.1 +1252,-0.408978,-0.419923,-1.507963,0.1 +1253,-0.41023,-0.439831,-1.75929,0.1 +1254,-0.408978,-0.419923,-1.507963,0.1 +1255,-0.411469,-0.439648,-1.884954,0.1 +1256,0.764194,0.250935,-0.502654,0.1 +1257,0.783518,0.247249,0.125664,0.1 +1258,-0.051076,-0.284497,1.75929,0.1 +1259,-0.053561,-0.274818,1.884954,0.1 +1260,0.782741,0.243592,-0.251327,0.1 +1261,0.792655,0.242655,0.062832,0.1 +1262,0.771925,0.364944,0.565486,0.1 +1263,0.785473,0.379371,1.068141,0.1 +1264,-0.318557,0.480214,2.324777,0.1 +1265,-0.331297,0.495614,2.199113,0.1 +1266,0.764194,0.250935,-0.502654,0.1 +1267,0.773236,0.24668,-0.376991,0.1 +1268,-0.265954,0.444491,1.570795,0.1 +1269,-0.266894,0.454432,1.75929,0.1 +1270,0.785473,0.379371,1.068141,0.1 +1271,0.798146,0.39469,0.69115,0.1 +1272,0.755974,0.320263,1.633627,0.1 +1273,0.759682,0.339703,1.130972,0.1 +1274,-0.0064,-0.408735,-0.565486,0.1 +1275,0.00977,-0.420483,-0.69115,0.1 +1276,-0.331297,0.495614,2.199113,0.1 +1277,-0.336652,0.504052,2.073449,0.1 +1278,0.798146,0.39469,0.69115,0.1 +1279,0.805206,0.40175,0.879645,0.1 +1280,-0.059502,-0.266591,2.261945,0.1 +1281,-0.073184,-0.252021,2.387608,0.1 +1282,-0.411469,-0.439648,-1.884954,0.1 +1283,-0.414259,-0.449249,-1.822122,0.1 +1284,0.805206,0.40175,0.879645,0.1 +1285,0.811818,0.40925,0.816813,0.1 +1286,0.752236,0.339857,1.884954,0.1 +1287,0.74885,0.349264,1.947786,0.1 +1288,0.811818,0.40925,0.816813,0.1 +1289,0.828528,0.419854,0.314159,0.1 +1290,0.00977,-0.420483,-0.69115,0.1 +1291,0.018191,-0.425827,-0.439823,0.1 +1292,-0.265954,0.444491,1.570795,0.1 +1293,-0.269679,0.464021,1.947786,0.1 +1294,0.792655,0.242655,0.062832,0.1 +1295,0.812642,0.242655,-0.062832,0.1 +1296,0.018191,-0.425827,-0.439823,0.1 +1297,0.026785,-0.43091,-0.628318,0.1 +1298,0.456621,-0.064278,-2.387608,0.1 +1299,0.449781,-0.071563,-2.261945,0.1 +1300,-0.408978,-0.419923,-1.507963,0.1 +1301,-0.40524,-0.439517,-1.256636,0.1 +1302,0.811818,0.40925,0.816813,0.1 +1303,0.827903,0.420936,0.439823,0.1 +1304,0.773103,0.246396,-0.439823,0.1 +1305,0.782151,0.242138,-0.439823,0.1 +1306,0.020832,0.215791,-2.199113,0.1 +1307,0.007177,0.20125,-2.45044,0.1 +1308,0.782151,0.242138,-0.439823,0.1 +1309,0.790388,0.236541,-0.753982,0.1 +1310,0.501398,0.071557,-1.822122,0.1 +1311,0.495222,0.052548,-1.947786,0.1 +1312,0.828528,0.419854,0.314159,0.1 +1313,0.845237,0.430458,0.816813,0.1 +1314,0.74885,0.349264,1.947786,0.1 +1315,0.745124,0.368794,1.570795,0.1 +1316,0.812531,0.250935,0.502654,0.1 +1317,0.821695,0.254901,0.314159,0.1 +1318,0.790388,0.236541,-0.753982,0.1 +1319,0.802074,0.220456,-1.130972,0.1 +1320,-0.336652,0.504052,2.073449,0.1 +1321,-0.341574,0.52322,1.570795,0.1 +1322,-0.414259,-0.449249,-1.822122,0.1 +1323,-0.41644,-0.459007,-1.75929,0.1 +1324,0.031929,0.287532,-1.005309,0.1 +1325,0.038515,0.280062,-0.69115,0.1 +1326,0.595826,0.164786,1.3823,0.1 +1327,0.59336,0.184304,2.010618,0.1 +1328,0.845237,0.430458,0.816813,0.1 +1329,0.861947,0.441062,0.314159,0.1 +1330,0.845237,0.430458,0.816813,0.1 +1331,0.856962,0.446596,1.068141,0.1 From edd1e035bafe106fd0b88fc2d5c933a981477b79 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 22 Nov 2022 22:24:42 -0600 Subject: [PATCH 18/23] Delete RGrrt_tree.csv --- RGrrt_tree.csv | 1333 ------------------------------------------------ 1 file changed, 1333 deletions(-) delete mode 100644 RGrrt_tree.csv diff --git a/RGrrt_tree.csv b/RGrrt_tree.csv deleted file mode 100644 index a2c5cf8..0000000 --- a/RGrrt_tree.csv +++ /dev/null @@ -1,1333 +0,0 @@ -,x,y,Column3,Column4 -0,0.0,0.0,0.0,0.1 -1,0.009895,-0.00125,-0.251327,0.1 -2,0.0,0.0,0.0,0.1 -3,0.009974,0.000627,0.125664,0.1 -4,0.009895,-0.00125,-0.251327,0.1 -5,0.019035,-0.005205,-0.565486,0.1 -6,0.019035,-0.005205,-0.565486,0.1 -7,0.027932,-0.009738,-0.376991,0.1 -8,0.009974,0.000627,0.125664,0.1 -9,0.028882,0.006771,0.502654,0.1 -10,0.019035,-0.005205,-0.565486,0.1 -11,0.037084,-0.013698,-0.314159,0.1 -12,0.028882,0.006771,0.502654,0.1 -13,0.046967,0.015281,0.376991,0.1 -14,0.019035,-0.005205,-0.565486,0.1 -15,0.02712,-0.011079,-0.69115,0.1 -16,0.028882,0.006771,0.502654,0.1 -17,0.038046,0.010737,0.314159,0.1 -18,0.028882,0.006771,0.502654,0.1 -19,0.047791,0.012915,0.125664,0.1 -20,0.028882,0.006771,0.502654,0.1 -21,0.04502,0.018496,0.753982,0.1 -22,0.02712,-0.011079,-0.69115,0.1 -23,0.035378,-0.016692,-0.502654,0.1 -24,0.04502,0.018496,0.753982,0.1 -25,0.05231,0.025342,0.753982,0.1 -26,0.02712,-0.011079,-0.69115,0.1 -27,0.035541,-0.016423,-0.439823,0.1 -28,0.02712,-0.011079,-0.69115,0.1 -29,0.043289,-0.022827,-0.565486,0.1 -30,0.05231,0.025342,0.753982,0.1 -31,0.058667,0.033026,1.005309,0.1 -32,0.05231,0.025342,0.753982,0.1 -33,0.069097,0.035995,0.376991,0.1 -34,0.028882,0.006771,0.502654,0.1 -35,0.038156,0.010443,0.251327,0.1 -36,0.058667,0.033026,1.005309,0.1 -37,0.063482,0.041784,1.130972,0.1 -38,0.069097,0.035995,0.376991,0.1 -39,0.087692,0.043357,0.376991,0.1 -40,0.063482,0.041784,1.130972,0.1 -41,0.066564,0.051269,1.3823,0.1 -42,0.02712,-0.011079,-0.69115,0.1 -43,0.04169,-0.024761,-0.816813,0.1 -44,0.04169,-0.024761,-0.816813,0.1 -45,0.058399,-0.035365,-0.314159,0.1 -46,0.04169,-0.024761,-0.816813,0.1 -47,0.057774,-0.036447,-0.439823,0.1 -48,0.02712,-0.011079,-0.69115,0.1 -49,0.03502,-0.017207,-0.628318,0.1 -50,0.087692,0.043357,0.376991,0.1 -51,0.09699,0.047038,0.376991,0.1 -52,0.066564,0.051269,1.3823,0.1 -53,0.069049,0.060949,1.256636,0.1 -54,0.066564,0.051269,1.3823,0.1 -55,0.068128,0.061145,1.445131,0.1 -56,0.04169,-0.024761,-0.816813,0.1 -57,0.048974,-0.031602,-0.69115,0.1 -58,0.058667,0.033026,1.005309,0.1 -59,0.073825,0.045566,0.376991,0.1 -60,0.04169,-0.024761,-0.816813,0.1 -61,0.05443,-0.040161,-0.942477,0.1 -62,0.05443,-0.040161,-0.942477,0.1 -63,0.068085,-0.054702,-0.69115,0.1 -64,0.05443,-0.040161,-0.942477,0.1 -65,0.058951,-0.049035,-1.256636,0.1 -66,0.09699,0.047038,0.376991,0.1 -67,0.116624,0.048274,-0.251327,0.1 -68,0.0,0.0,0.0,0.1 -69,0.019947,0.001255,0.125664,0.1 -70,0.0,0.0,0.0,0.1 -71,0.009895,-0.00125,-0.251327,0.1 -72,0.019035,-0.005205,-0.565486,0.1 -73,0.033528,-0.018815,-0.942477,0.1 -74,0.068128,0.061145,1.445131,0.1 -75,0.070608,0.070805,1.193804,0.1 -76,0.068128,0.061145,1.445131,0.1 -77,0.071873,0.080777,1.319468,0.1 -78,0.068128,0.061145,1.445131,0.1 -79,0.064442,0.080469,2.073449,0.1 -80,0.064442,0.080469,2.073449,0.1 -81,0.060476,0.089633,1.884954,0.1 -82,0.060476,0.089633,1.884954,0.1 -83,0.048913,0.105548,2.513272,0.1 -84,0.048913,0.105548,2.513272,0.1 -85,0.040039,0.110069,2.827431,0.1 -86,0.060476,0.089633,1.884954,0.1 -87,0.059233,0.109384,1.3823,0.1 -88,0.028882,0.006771,0.502654,0.1 -89,0.047429,0.014114,0.251327,0.1 -90,0.116624,0.048274,-0.251327,0.1 -91,0.125897,0.044602,-0.502654,0.1 -92,0.125897,0.044602,-0.502654,0.1 -93,0.134335,0.039247,-0.628318,0.1 -94,0.058951,-0.049035,-1.256636,0.1 -95,0.06174,-0.058636,-1.319468,0.1 -96,0.05231,0.025342,0.753982,0.1 -97,0.0596,0.032187,0.753982,0.1 -98,0.019035,-0.005205,-0.565486,0.1 -99,0.038089,-0.010098,0.062832,0.1 -100,0.019035,-0.005205,-0.565486,0.1 -101,0.028059,-0.009452,-0.314159,0.1 -102,0.06174,-0.058636,-1.319468,0.1 -103,0.060505,-0.07827,-1.947786,0.1 -104,0.116624,0.048274,-0.251327,0.1 -105,0.126225,0.045484,-0.314159,0.1 -106,0.028882,0.006771,0.502654,0.1 -107,0.036951,0.012634,0.753982,0.1 -108,0.019035,-0.005205,-0.565486,0.1 -109,0.027304,-0.010825,-0.628318,0.1 -110,0.06174,-0.058636,-1.319468,0.1 -111,0.070206,-0.076626,-0.942477,0.1 -112,0.060505,-0.07827,-1.947786,0.1 -113,0.055972,-0.087167,-2.136281,0.1 -114,0.055972,-0.087167,-2.136281,0.1 -115,0.041546,-0.100714,-2.638936,0.1 -116,0.048913,0.105548,2.513272,0.1 -117,0.040643,0.111168,2.576104,0.1 -118,0.040039,0.110069,2.827431,0.1 -119,0.030748,0.113748,2.701767,0.1 -120,0.036951,0.012634,0.753982,0.1 -121,0.054294,0.022168,0.251327,0.1 -122,0.070206,-0.076626,-0.942477,0.1 -123,0.076576,-0.084326,-0.816813,0.1 -124,0.048913,0.105548,2.513272,0.1 -125,0.031433,0.115158,2.764599,0.1 -126,0.041546,-0.100714,-2.638936,0.1 -127,0.033108,-0.106069,-2.513272,0.1 -128,0.048913,0.105548,2.513272,0.1 -129,0.036298,0.120797,2.010618,0.1 -130,0.0,0.0,0.0,0.1 -131,0.009895,0.00125,0.251327,0.1 -132,0.066564,0.051269,1.3823,0.1 -133,0.067816,0.071177,1.633627,0.1 -134,0.059233,0.109384,1.3823,0.1 -135,0.062981,0.129029,1.3823,0.1 -136,0.070206,-0.076626,-0.942477,0.1 -137,0.075826,-0.084895,-1.005309,0.1 -138,0.134335,0.039247,-0.628318,0.1 -139,0.152324,0.030782,-0.251327,0.1 -140,0.033108,-0.106069,-2.513272,0.1 -141,0.025208,-0.112197,-2.45044,0.1 -142,0.040643,0.111168,2.576104,0.1 -143,0.031504,0.115123,2.890263,0.1 -144,0.030748,0.113748,2.701767,0.1 -145,0.011308,0.117457,3.204422,0.1 -146,0.025208,-0.112197,-2.45044,0.1 -147,0.016787,-0.117541,-2.701767,0.1 -148,0.152324,0.030782,-0.251327,0.1 -149,0.161598,0.027111,-0.502654,0.1 -150,0.0,0.0,0.0,0.1 -151,0.009993,-0.000314,-0.062832,0.1 -152,0.064442,0.080469,2.073449,0.1 -153,0.055932,0.098553,1.947786,0.1 -154,0.062981,0.129029,1.3823,0.1 -155,0.064545,0.138905,1.445131,0.1 -156,0.064442,0.080469,2.073449,0.1 -157,0.060187,0.089511,1.947786,0.1 -158,0.009895,0.00125,0.251327,0.1 -159,0.029685,0.00125,-0.251327,0.1 -160,0.033528,-0.018815,-0.942477,0.1 -161,0.039607,-0.037525,-1.570795,0.1 -162,0.152324,0.030782,-0.251327,0.1 -163,0.162141,0.02891,-0.125664,0.1 -164,0.064545,0.138905,1.445131,0.1 -165,0.064859,0.148885,1.633627,0.1 -166,0.162141,0.02891,-0.125664,0.1 -167,0.172095,0.029222,0.188495,0.1 -168,0.025208,-0.112197,-2.45044,0.1 -169,0.007301,-0.120623,-2.953095,0.1 -170,0.033108,-0.106069,-2.513272,0.1 -171,0.02467,-0.111424,-2.638936,0.1 -172,0.041546,-0.100714,-2.638936,0.1 -173,0.02402,-0.110349,-2.638936,0.1 -174,0.172095,0.029222,0.188495,0.1 -175,0.181684,0.032008,0.376991,0.1 -176,0.039607,-0.037525,-1.570795,0.1 -177,0.043333,-0.057055,-1.193804,0.1 -178,0.011308,0.117457,3.204422,0.1 -179,0.001394,0.116204,3.330085,0.1 -180,0.181684,0.032008,0.376991,0.1 -181,0.191403,0.034181,0.062832,0.1 -182,0.076576,-0.084326,-0.816813,0.1 -183,0.083646,-0.091396,-0.753982,0.1 -184,0.016787,-0.117541,-2.701767,0.1 -185,0.007301,-0.120623,-2.953095,0.1 -186,0.0,0.0,0.0,0.1 -187,0.019168,-0.004922,-0.502654,0.1 -188,0.025208,-0.112197,-2.45044,0.1 -189,0.011553,-0.126738,-2.199113,0.1 -190,0.064859,0.148885,1.633627,0.1 -191,0.064859,0.168872,1.507963,0.1 -192,0.181684,0.032008,0.376991,0.1 -193,0.197694,0.043641,0.879645,0.1 -194,0.191403,0.034181,0.062832,0.1 -195,0.201396,0.034181,-0.062832,0.1 -196,0.060505,-0.07827,-1.947786,0.1 -197,0.050895,-0.09575,-2.199113,0.1 -198,0.031504,0.115123,2.890263,0.1 -199,0.021687,0.116996,3.015926,0.1 -200,0.066564,0.051269,1.3823,0.1 -201,0.06935,0.060858,1.193804,0.1 -202,0.007301,-0.120623,-2.953095,0.1 -203,-0.010606,-0.129049,-2.45044,0.1 -204,0.030748,0.113748,2.701767,0.1 -205,0.022327,0.119093,2.45044,0.1 -206,0.033528,-0.018815,-0.942477,0.1 -207,0.044238,-0.035691,-1.068141,0.1 -208,0.022327,0.119093,2.45044,0.1 -209,0.007757,0.132774,2.324777,0.1 -210,0.007301,-0.120623,-2.953095,0.1 -211,-0.002653,-0.121249,-3.204422,0.1 -212,0.059233,0.109384,1.3823,0.1 -213,0.062315,0.118869,1.130972,0.1 -214,0.083646,-0.091396,-0.753982,0.1 -215,0.08975,-0.099265,-1.068141,0.1 -216,0.064859,0.168872,1.507963,0.1 -217,0.063922,0.178787,1.822122,0.1 -218,0.009895,0.00125,0.251327,0.1 -219,0.01929,0.004632,0.439823,0.1 -220,-0.010606,-0.129049,-2.45044,0.1 -221,-0.028512,-0.137476,-2.953095,0.1 -222,0.201396,0.034181,-0.062832,0.1 -223,0.219687,0.026939,-0.69115,0.1 -224,0.007757,0.132774,2.324777,0.1 -225,0.001894,0.140843,2.073449,0.1 -226,0.066564,0.051269,1.3823,0.1 -227,0.066564,0.071151,1.75929,0.1 -228,0.197694,0.043641,0.879645,0.1 -229,0.212235,0.057295,0.628318,0.1 -230,0.011553,-0.126738,-2.199113,0.1 -231,-0.002102,-0.141279,-2.45044,0.1 -232,0.009895,-0.00125,-0.251327,0.1 -233,0.019035,-0.005205,-0.565486,0.1 -234,0.01929,0.004632,0.439823,0.1 -235,0.036805,0.014261,0.565486,0.1 -236,0.212235,0.057295,0.628318,0.1 -237,0.219506,0.064123,0.879645,0.1 -238,0.219687,0.026939,-0.69115,0.1 -239,0.237594,0.018512,-0.188495,0.1 -240,0.219506,0.064123,0.879645,0.1 -241,0.226748,0.082414,1.507963,0.1 -242,-0.028512,-0.137476,-2.953095,0.1 -243,-0.047871,-0.142446,-2.827431,0.1 -244,0.0,0.0,0.0,0.1 -245,0.019168,-0.004922,-0.502654,0.1 -246,0.237594,0.018512,-0.188495,0.1 -247,0.246964,0.015139,-0.502654,0.1 -248,0.116624,0.048274,-0.251327,0.1 -249,0.136414,0.045774,-0.0,0.1 -250,0.063922,0.178787,1.822122,0.1 -251,0.060177,0.198419,1.696459,0.1 -252,0.001894,0.140843,2.073449,0.1 -253,-0.012446,0.15431,2.701767,0.1 -254,-0.047871,-0.142446,-2.827431,0.1 -255,-0.06592,-0.150939,-2.576104,0.1 -256,0.001894,0.140843,2.073449,0.1 -257,-0.005449,0.15939,1.822122,0.1 -258,0.219506,0.064123,0.879645,0.1 -259,0.226748,0.082414,1.507963,0.1 -260,0.033528,-0.018815,-0.942477,0.1 -261,0.040356,-0.026086,-0.69115,0.1 -262,0.001394,0.116204,3.330085,0.1 -263,-0.015846,0.106727,3.958403,0.1 -264,0.01929,0.004632,0.439823,0.1 -265,0.028047,0.009447,0.565486,0.1 -266,0.019035,-0.005205,-0.565486,0.1 -267,0.037856,-0.011321,-0.062832,0.1 -268,0.0,0.0,0.0,0.1 -269,0.019168,0.004922,0.502654,0.1 -270,-0.06592,-0.150939,-2.576104,0.1 -271,-0.080413,-0.16455,-2.199113,0.1 -272,-0.080413,-0.16455,-2.199113,0.1 -273,-0.085496,-0.173144,-2.010618,0.1 -274,0.048913,0.105548,2.513272,0.1 -275,0.036298,0.120797,2.010618,0.1 -276,0.08975,-0.099265,-1.068141,0.1 -277,0.094839,-0.107871,-1.005309,0.1 -278,0.226748,0.082414,1.507963,0.1 -279,0.229253,0.102243,1.3823,0.1 -280,0.237594,0.018512,-0.188495,0.1 -281,0.257345,0.019755,0.314159,0.1 -282,0.019035,-0.005205,-0.565486,0.1 -283,0.027304,-0.010825,-0.628318,0.1 -284,0.219687,0.026939,-0.69115,0.1 -285,0.227946,0.021326,-0.502654,0.1 -286,-0.012446,0.15431,2.701767,0.1 -287,-0.020867,0.159654,2.45044,0.1 -288,-0.06592,-0.150939,-2.576104,0.1 -289,-0.074526,-0.156029,-2.638936,0.1 -290,0.257345,0.019755,0.314159,0.1 -291,0.266637,0.023434,0.439823,0.1 -292,0.021687,0.116996,3.015926,0.1 -293,0.002366,0.121957,2.764599,0.1 -294,-0.085496,-0.173144,-2.010618,0.1 -295,-0.09084,-0.181565,-2.261945,0.1 -296,0.0,0.0,0.0,0.1 -297,0.009993,-0.000314,-0.062832,0.1 -298,0.036951,0.012634,0.753982,0.1 -299,0.044451,0.019246,0.69115,0.1 -300,-0.09084,-0.181565,-2.261945,0.1 -301,-0.105381,-0.19522,-2.513272,0.1 -302,0.266637,0.023434,0.439823,0.1 -303,0.275545,0.027973,0.502654,0.1 -304,0.094839,-0.107871,-1.005309,0.1 -305,0.107554,-0.12324,-0.753982,0.1 -306,0.055972,-0.087167,-2.136281,0.1 -307,0.045255,-0.104053,-2.136281,0.1 -308,0.036951,0.012634,0.753982,0.1 -309,0.044841,0.018754,0.565486,0.1 -310,0.257345,0.019755,0.314159,0.1 -311,0.267024,0.02224,0.188495,0.1 -312,0.107554,-0.12324,-0.753982,0.1 -313,0.114395,-0.130525,-0.879645,0.1 -314,0.219687,0.026939,-0.69115,0.1 -315,0.226748,0.019878,-0.879645,0.1 -316,0.246964,0.015139,-0.502654,0.1 -317,0.263839,0.00443,-0.628318,0.1 -318,0.267024,0.02224,0.188495,0.1 -319,0.284264,0.031718,0.816813,0.1 -320,0.263839,0.00443,-0.628318,0.1 -321,0.28224,-0.002856,-0.125664,0.1 -322,0.275545,0.027973,0.502654,0.1 -323,0.283804,0.033586,0.69115,0.1 -324,0.226748,0.019878,-0.879645,0.1 -325,0.242067,0.007205,-0.502654,0.1 -326,-0.005449,0.15939,1.822122,0.1 -327,-0.011625,0.178399,1.947786,0.1 -328,0.226748,0.019878,-0.879645,0.1 -329,0.232876,0.011978,-0.942477,0.1 -330,-0.085496,-0.173144,-2.010618,0.1 -331,-0.088878,-0.182539,-1.822122,0.1 -332,0.036951,0.012634,0.753982,0.1 -333,0.048638,0.028718,1.130972,0.1 -334,0.039607,-0.037525,-1.570795,0.1 -335,0.040547,-0.047466,-1.3823,0.1 -336,0.041546,-0.100714,-2.638936,0.1 -337,0.028079,-0.115055,-2.010618,0.1 -338,-0.012446,0.15431,2.701767,0.1 -339,-0.028531,0.165996,2.324777,0.1 -340,0.263839,0.00443,-0.628318,0.1 -341,0.271539,-0.001941,-0.753982,0.1 -342,-0.011625,0.178399,1.947786,0.1 -343,-0.015596,0.187575,2.010618,0.1 -344,-0.005449,0.15939,1.822122,0.1 -345,-0.005449,0.17918,1.319468,0.1 -346,-0.028531,0.165996,2.324777,0.1 -347,-0.035816,0.172837,2.45044,0.1 -348,0.007301,-0.120623,-2.953095,0.1 -349,-0.012528,-0.123128,-3.078758,0.1 -350,0.271539,-0.001941,-0.753982,0.1 -351,0.279776,-0.007538,-0.439823,0.1 -352,-0.015596,0.187575,2.010618,0.1 -353,-0.019274,0.196866,1.884954,0.1 -354,-0.035816,0.172837,2.45044,0.1 -355,-0.054107,0.180079,3.078758,0.1 -356,0.033528,-0.018815,-0.942477,0.1 -357,0.046268,-0.034215,-0.816813,0.1 -358,0.226748,0.082414,1.507963,0.1 -359,0.226748,0.092407,1.633627,0.1 -360,0.283804,0.033586,0.69115,0.1 -361,0.30171,0.042012,0.188495,0.1 -362,0.125897,0.044602,-0.502654,0.1 -363,0.134156,0.03899,-0.69115,0.1 -364,0.125897,0.044602,-0.502654,0.1 -365,0.141216,0.031929,-0.879645,0.1 -366,0.284264,0.031718,0.816813,0.1 -367,0.300973,0.042322,0.314159,0.1 -368,0.033528,-0.018815,-0.942477,0.1 -369,0.045284,-0.034996,-0.942477,0.1 -370,-0.088878,-0.182539,-1.822122,0.1 -371,-0.093852,-0.201911,-1.822122,0.1 -372,-0.093852,-0.201911,-1.822122,0.1 -373,-0.101195,-0.220457,-2.073449,0.1 -374,-0.019274,0.196866,1.884954,0.1 -375,-0.028853,0.214289,2.261945,0.1 -376,0.226748,0.092407,1.633627,0.1 -377,0.226748,0.102401,1.507963,0.1 -378,0.271539,-0.001941,-0.753982,0.1 -379,0.281017,-0.01918,-1.3823,0.1 -380,-0.101195,-0.220457,-2.073449,0.1 -381,-0.106013,-0.22922,-2.073449,0.1 -382,-0.054107,0.180079,3.078758,0.1 -383,-0.063969,0.181642,2.890263,0.1 -384,0.226748,0.092407,1.633627,0.1 -385,0.220632,0.111229,2.136281,0.1 -386,0.30171,0.042012,0.188495,0.1 -387,0.311299,0.044798,0.376991,0.1 -388,0.281017,-0.01918,-1.3823,0.1 -389,0.288336,-0.037665,-1.005309,0.1 -390,0.009895,-0.00125,-0.251327,0.1 -391,0.01979,-0.0025,0.0,0.1 -392,0.041546,-0.100714,-2.638936,0.1 -393,0.03294,-0.105804,-2.576104,0.1 -394,0.288336,-0.037665,-1.005309,0.1 -395,0.293425,-0.046271,-1.068141,0.1 -396,0.220632,0.111229,2.136281,0.1 -397,0.214758,0.119314,2.261945,0.1 -398,-0.080413,-0.16455,-2.199113,0.1 -399,-0.087241,-0.17182,-2.45044,0.1 -400,-0.028853,0.214289,2.261945,0.1 -401,-0.039541,0.231131,2.010618,0.1 -402,0.007301,-0.120623,-2.953095,0.1 -403,-0.01167,-0.126787,-2.701767,0.1 -404,0.009895,-0.00125,-0.251327,0.1 -405,0.01979,-0.0025,0.0,0.1 -406,0.311299,0.044798,0.376991,0.1 -407,0.320039,0.049602,0.628318,0.1 -408,0.0,0.0,0.0,0.1 -409,0.009974,0.000627,0.125664,0.1 -410,-0.106013,-0.22922,-2.073449,0.1 -411,-0.111625,-0.237479,-2.261945,0.1 -412,-0.005449,0.17918,1.319468,0.1 -413,-0.0042,0.199023,1.696459,0.1 -414,-0.005449,0.17918,1.319468,0.1 -415,-0.003267,0.188938,1.3823,0.1 -416,-0.111625,-0.237479,-2.261945,0.1 -417,-0.122314,-0.254321,-2.010618,0.1 -418,0.066564,0.071151,1.75929,0.1 -419,0.067806,0.090902,1.256636,0.1 -420,-0.122314,-0.254321,-2.010618,0.1 -421,-0.126022,-0.273761,-1.507963,0.1 -422,-0.126022,-0.273761,-1.507963,0.1 -423,-0.127274,-0.293669,-1.75929,0.1 -424,0.041546,-0.100714,-2.638936,0.1 -425,0.033477,-0.106576,-2.387608,0.1 -426,-0.028531,0.165996,2.324777,0.1 -427,-0.040256,0.182134,2.073449,0.1 -428,0.214758,0.119314,2.261945,0.1 -429,0.209689,0.127886,1.947786,0.1 -430,-0.003267,0.188938,1.3823,0.1 -431,-0.000185,0.198423,1.130972,0.1 -432,0.220632,0.111229,2.136281,0.1 -433,0.205474,0.123769,2.764599,0.1 -434,0.214758,0.119314,2.261945,0.1 -435,0.206332,0.13722,1.75929,0.1 -436,-0.039541,0.231131,2.010618,0.1 -437,-0.043249,0.250571,1.507963,0.1 -438,0.281017,-0.01918,-1.3823,0.1 -439,0.281957,-0.029121,-1.570795,0.1 -440,-0.126022,-0.273761,-1.507963,0.1 -441,-0.124769,-0.283675,-1.3823,0.1 -442,0.281017,-0.01918,-1.3823,0.1 -443,0.282269,-0.039088,-1.633627,0.1 -444,-0.043249,0.250571,1.507963,0.1 -445,-0.04138,0.260368,1.256636,0.1 -446,0.311299,0.044798,0.376991,0.1 -447,0.330829,0.048523,-0.0,0.1 -448,0.064442,0.080469,2.073449,0.1 -449,0.058829,0.088727,2.261945,0.1 -450,0.019168,0.004922,0.502654,0.1 -451,0.033595,0.018469,1.005309,0.1 -452,0.114395,-0.130525,-0.879645,0.1 -453,0.119739,-0.138946,-1.130972,0.1 -454,-0.127274,-0.293669,-1.75929,0.1 -455,-0.12976,-0.303348,-1.884954,0.1 -456,0.330829,0.048523,-0.0,0.1 -457,0.340822,0.048209,-0.062832,0.1 -458,-0.04138,0.260368,1.256636,0.1 -459,-0.032887,0.278417,1.005309,0.1 -460,0.320039,0.049602,0.628318,0.1 -461,0.33458,0.063257,0.879645,0.1 -462,-0.032887,0.278417,1.005309,0.1 -463,-0.028073,0.287174,1.130972,0.1 -464,-0.032887,0.278417,1.005309,0.1 -465,-0.027797,0.287023,1.068141,0.1 -466,0.040039,0.110069,2.827431,0.1 -467,0.030875,0.114035,2.638936,0.1 -468,0.141216,0.031929,-0.879645,0.1 -469,0.146286,0.023357,-1.193804,0.1 -470,-0.032887,0.278417,1.005309,0.1 -471,-0.024394,0.296466,1.256636,0.1 -472,0.33458,0.063257,0.879645,0.1 -473,0.346328,0.079427,1.005309,0.1 -474,0.346328,0.079427,1.005309,0.1 -475,0.357045,0.096314,1.005309,0.1 -476,-0.032887,0.278417,1.005309,0.1 -477,-0.027267,0.286686,0.942477,0.1 -478,0.033595,0.018469,1.005309,0.1 -479,0.042088,0.036518,1.256636,0.1 -480,0.357045,0.096314,1.005309,0.1 -481,0.362665,0.104583,0.942477,0.1 -482,-0.124769,-0.283675,-1.3823,0.1 -483,-0.123517,-0.303583,-1.633627,0.1 -484,0.214758,0.119314,2.261945,0.1 -485,0.201076,0.133884,2.387608,0.1 -486,-0.027267,0.286686,0.942477,0.1 -487,-0.020664,0.294176,0.753982,0.1 -488,0.346328,0.079427,1.005309,0.1 -489,0.351418,0.088033,1.068141,0.1 -490,0.205474,0.123769,2.764599,0.1 -491,0.186466,0.129945,2.890263,0.1 -492,-0.124769,-0.283675,-1.3823,0.1 -493,-0.121984,-0.293264,-1.193804,0.1 -494,0.040039,0.110069,2.827431,0.1 -495,0.030242,0.111938,3.078758,0.1 -496,0.293425,-0.046271,-1.068141,0.1 -497,0.300769,-0.064818,-1.319468,0.1 -498,-0.020664,0.294176,0.753982,0.1 -499,-0.002863,0.302552,0.125664,0.1 -500,0.282269,-0.039088,-1.633627,0.1 -501,0.282896,-0.049042,-1.3823,0.1 -502,-0.063969,0.181642,2.890263,0.1 -503,-0.083759,0.181642,3.392917,0.1 -504,0.220632,0.111229,2.136281,0.1 -505,0.212139,0.129278,1.884954,0.1 -506,0.351418,0.088033,1.068141,0.1 -507,0.355957,0.096942,1.130972,0.1 -508,-0.083759,0.181642,3.392917,0.1 -509,-0.103602,0.180393,3.015926,0.1 -510,-0.002863,0.302552,0.125664,0.1 -511,0.016045,0.308696,0.502654,0.1 -512,-0.12976,-0.303348,-1.884954,0.1 -513,-0.140364,-0.320058,-2.387608,0.1 -514,-0.121984,-0.293264,-1.193804,0.1 -515,-0.119198,-0.302853,-1.3823,0.1 -516,-0.140364,-0.320058,-2.387608,0.1 -517,-0.155764,-0.332798,-2.513272,0.1 -518,-0.028853,0.214289,2.261945,0.1 -519,-0.035465,0.221789,2.324777,0.1 -520,-0.103602,0.180393,3.015926,0.1 -521,-0.113576,0.180393,3.267254,0.1 -522,0.340822,0.048209,-0.062832,0.1 -523,0.350776,0.047268,-0.125664,0.1 -524,0.220632,0.111229,2.136281,0.1 -525,0.213313,0.129715,1.75929,0.1 -526,-0.121984,-0.293264,-1.193804,0.1 -527,-0.118013,-0.30244,-1.130972,0.1 -528,0.346328,0.079427,1.005309,0.1 -529,0.350861,0.088324,1.193804,0.1 -530,-0.002863,0.302552,0.125664,0.1 -531,0.006881,0.30473,0.314159,0.1 -532,0.201076,0.133884,2.387608,0.1 -533,0.194473,0.141374,2.199113,0.1 -534,-0.103602,0.180393,3.015926,0.1 -535,-0.123236,0.177913,3.518581,0.1 -536,0.300769,-0.064818,-1.319468,0.1 -537,0.310303,-0.08216,-0.816813,0.1 -538,-0.12976,-0.303348,-1.884954,0.1 -539,-0.13285,-0.312859,-1.884954,0.1 -540,-0.002863,0.302552,0.125664,0.1 -541,0.016771,0.300072,-0.376991,0.1 -542,-0.118013,-0.30244,-1.130972,0.1 -543,-0.112669,-0.310861,-0.879645,0.1 -544,-0.112669,-0.310861,-0.879645,0.1 -545,-0.107324,-0.319282,-1.130972,0.1 -546,0.281957,-0.029121,-1.570795,0.1 -547,0.282896,-0.039062,-1.3823,0.1 -548,-0.103602,0.180393,3.015926,0.1 -549,-0.113477,0.181957,2.953095,0.1 -550,-0.074526,-0.156029,-2.638936,0.1 -551,-0.082395,-0.162133,-2.324777,0.1 -552,0.016771,0.300072,-0.376991,0.1 -553,0.025343,0.295002,-0.69115,0.1 -554,-0.002863,0.302552,0.125664,0.1 -555,0.016457,0.307513,0.376991,0.1 -556,-0.112669,-0.310861,-0.879645,0.1 -557,-0.106795,-0.318946,-1.005309,0.1 -558,-0.13285,-0.312859,-1.884954,0.1 -559,-0.13782,-0.332218,-1.75929,0.1 -560,-0.155764,-0.332798,-2.513272,0.1 -561,-0.164637,-0.337319,-2.827431,0.1 -562,-0.043249,0.250571,1.507963,0.1 -563,-0.043563,0.260551,1.696459,0.1 -564,0.362665,0.104583,0.942477,0.1 -565,0.368019,0.113021,1.068141,0.1 -566,-0.164637,-0.337319,-2.827431,0.1 -567,-0.184362,-0.339811,-3.204422,0.1 -568,-0.112669,-0.310861,-0.879645,0.1 -569,-0.106795,-0.318946,-1.005309,0.1 -570,-0.043563,0.260551,1.696459,0.1 -571,-0.048523,0.279872,1.947786,0.1 -572,0.362665,0.104583,0.942477,0.1 -573,0.37858,0.116146,0.314159,0.1 -574,-0.184362,-0.339811,-3.204422,0.1 -575,-0.194356,-0.339811,-3.078758,0.1 -576,-0.113477,0.181957,2.953095,0.1 -577,-0.122847,0.185331,2.638936,0.1 -578,-0.155764,-0.332798,-2.513272,0.1 -579,-0.163034,-0.339625,-2.261945,0.1 -580,-0.112669,-0.310861,-0.879645,0.1 -581,-0.104242,-0.328768,-1.3823,0.1 -582,0.025343,0.295002,-0.69115,0.1 -583,0.032843,0.28839,-0.753982,0.1 -584,0.282269,-0.039088,-1.633627,0.1 -585,0.285978,-0.058527,-1.130972,0.1 -586,0.016045,0.308696,0.502654,0.1 -587,0.025209,0.312662,0.314159,0.1 -588,-0.002863,0.302552,0.125664,0.1 -589,0.00711,0.30318,-0.0,0.1 -590,0.300769,-0.064818,-1.319468,0.1 -591,0.30295,-0.074576,-1.3823,0.1 -592,0.282269,-0.039088,-1.633627,0.1 -593,0.280401,-0.048885,-1.884954,0.1 -594,0.350776,0.047268,-0.125664,0.1 -595,0.370723,0.046013,-0.0,0.1 -596,0.368019,0.113021,1.068141,0.1 -597,0.377654,0.130547,1.068141,0.1 -598,-0.048523,0.279872,1.947786,0.1 -599,-0.057033,0.297956,2.073449,0.1 -600,0.280401,-0.048885,-1.884954,0.1 -601,0.276435,-0.058049,-2.073449,0.1 -602,0.377654,0.130547,1.068141,0.1 -603,0.391995,0.144014,0.439823,0.1 -604,0.391995,0.144014,0.439823,0.1 -605,0.411513,0.146479,-0.188495,0.1 -606,-0.112669,-0.310861,-0.879645,0.1 -607,-0.096058,-0.321402,-0.251327,0.1 -608,-0.155764,-0.332798,-2.513272,0.1 -609,-0.171164,-0.345538,-2.387608,0.1 -610,-0.194356,-0.339811,-3.078758,0.1 -611,-0.214185,-0.342316,-2.953095,0.1 -612,-0.096058,-0.321402,-0.251327,0.1 -613,-0.086196,-0.322964,-0.062832,0.1 -614,-0.171164,-0.345538,-2.387608,0.1 -615,-0.178864,-0.351908,-2.513272,0.1 -616,0.391995,0.144014,0.439823,0.1 -617,0.410092,0.152529,0.439823,0.1 -618,0.30295,-0.074576,-1.3823,0.1 -619,0.311376,-0.092482,-0.879645,0.1 -620,0.411513,0.146479,-0.188495,0.1 -621,0.421192,0.143994,-0.314159,0.1 -622,0.30295,-0.074576,-1.3823,0.1 -623,0.306697,-0.094221,-1.3823,0.1 -624,-0.104242,-0.328768,-1.3823,0.1 -625,-0.105485,-0.348519,-1.884954,0.1 -626,-0.086196,-0.322964,-0.062832,0.1 -627,-0.076281,-0.322027,0.251327,0.1 -628,0.421192,0.143994,-0.314159,0.1 -629,0.430217,0.139748,-0.565486,0.1 -630,0.370723,0.046013,-0.0,0.1 -631,0.380697,0.046641,0.125664,0.1 -632,-0.106795,-0.318946,-1.005309,0.1 -633,-0.097166,-0.336461,-1.130972,0.1 -634,0.430217,0.139748,-0.565486,0.1 -635,0.438301,0.133874,-0.69115,0.1 -636,0.438301,0.133874,-0.69115,0.1 -637,0.446723,0.128529,-0.439823,0.1 -638,-0.076281,-0.322027,0.251327,0.1 -639,-0.067008,-0.318356,0.502654,0.1 -640,0.410092,0.152529,0.439823,0.1 -641,0.418849,0.157344,0.565486,0.1 -642,0.276435,-0.058049,-2.073449,0.1 -643,0.27218,-0.067091,-1.947786,0.1 -644,0.438301,0.133874,-0.69115,0.1 -645,0.446386,0.128,-0.565486,0.1 -646,-0.020664,0.294176,0.753982,0.1 -647,-0.003877,0.304829,0.376991,0.1 -648,-0.067008,-0.318356,0.502654,0.1 -649,-0.058402,-0.313266,0.565486,0.1 -650,0.446723,0.128529,-0.439823,0.1 -651,0.465694,0.122365,-0.188495,0.1 -652,-0.178864,-0.351908,-2.513272,0.1 -653,-0.197264,-0.359193,-3.015926,0.1 -654,0.418849,0.157344,0.565486,0.1 -655,0.427746,0.161877,0.376991,0.1 -656,0.465694,0.122365,-0.188495,0.1 -657,0.484179,0.115046,-0.565486,0.1 -658,0.438301,0.133874,-0.69115,0.1 -659,0.446723,0.128529,-0.439823,0.1 -660,0.484179,0.115046,-0.565486,0.1 -661,0.491864,0.108689,-0.816813,0.1 -662,-0.067008,-0.318356,0.502654,0.1 -663,-0.053541,-0.304015,1.130972,0.1 -664,0.276435,-0.058049,-2.073449,0.1 -665,0.270291,-0.076958,-1.696459,0.1 -666,-0.122847,0.185331,2.638936,0.1 -667,-0.141394,0.192674,2.890263,0.1 -668,-0.13782,-0.332218,-1.75929,0.1 -669,-0.142791,-0.351577,-1.884954,0.1 -670,0.377654,0.130547,1.068141,0.1 -671,0.390328,0.145866,0.69115,0.1 -672,-0.086196,-0.322964,-0.062832,0.1 -673,-0.076242,-0.323905,-0.125664,0.1 -674,-0.032887,0.278417,1.005309,0.1 -675,-0.026772,0.297238,1.507963,0.1 -676,0.465694,0.122365,-0.188495,0.1 -677,0.475635,0.121426,-0.0,0.1 -678,-0.057033,0.297956,2.073449,0.1 -679,-0.062896,0.306025,2.324777,0.1 -680,0.475635,0.121426,-0.0,0.1 -681,0.485628,0.121112,-0.062832,0.1 -682,-0.053541,-0.304015,1.130972,0.1 -683,-0.049833,-0.284575,1.633627,0.1 -684,-0.214185,-0.342316,-2.953095,0.1 -685,-0.223864,-0.344801,-2.827431,0.1 -686,0.025209,0.312662,0.314159,0.1 -687,0.035006,0.314531,0.062832,0.1 -688,-0.178864,-0.351908,-2.513272,0.1 -689,-0.194264,-0.364648,-2.387608,0.1 -690,0.025343,0.295002,-0.69115,0.1 -691,0.036975,0.278992,-1.193804,0.1 -692,-0.223864,-0.344801,-2.827431,0.1 -693,-0.233544,-0.347287,-2.953095,0.1 -694,0.205474,0.123769,2.764599,0.1 -695,0.196902,0.128838,2.45044,0.1 -696,-0.067008,-0.318356,0.502654,0.1 -697,-0.05857,-0.313001,0.628318,0.1 -698,0.491864,0.108689,-0.816813,0.1 -699,0.497726,0.10062,-1.068141,0.1 -700,-0.020664,0.294176,0.753982,0.1 -701,-0.012964,0.300546,0.628318,0.1 -702,0.036975,0.278992,-1.193804,0.1 -703,0.039761,0.269403,-1.3823,0.1 -704,-0.197264,-0.359193,-3.015926,0.1 -705,-0.216897,-0.362938,-2.890263,0.1 -706,-0.216897,-0.362938,-2.890263,0.1 -707,-0.22617,-0.36661,-2.638936,0.1 -708,0.036975,0.278992,-1.193804,0.1 -709,0.046585,0.261512,-0.942477,0.1 -710,-0.142791,-0.351577,-1.884954,0.1 -711,-0.152369,-0.368999,-2.261945,0.1 -712,-0.026772,0.297238,1.507963,0.1 -713,-0.027085,0.307218,1.696459,0.1 -714,0.418849,0.157344,0.565486,0.1 -715,0.432396,0.17177,1.068141,0.1 -716,0.497726,0.10062,-1.068141,0.1 -717,0.503589,0.092551,-0.816813,0.1 -718,-0.096058,-0.321402,-0.251327,0.1 -719,-0.076268,-0.323902,0.0,0.1 -720,0.276435,-0.058049,-2.073449,0.1 -721,0.272749,-0.077373,-1.445131,0.1 -722,0.497726,0.10062,-1.068141,0.1 -723,0.502816,0.092014,-1.005309,0.1 -724,0.025343,0.295002,-0.69115,0.1 -725,0.032843,0.28839,-0.753982,0.1 -726,0.497726,0.10062,-1.068141,0.1 -727,0.501398,0.091347,-1.319468,0.1 -728,0.484179,0.115046,-0.565486,0.1 -729,0.501066,0.10433,-0.565486,0.1 -730,-0.027085,0.307218,1.696459,0.1 -731,-0.027085,0.317192,1.445131,0.1 -732,-0.027085,0.317192,1.445131,0.1 -733,-0.02583,0.33714,1.570795,0.1 -734,-0.002863,0.302552,0.125664,0.1 -735,0.016045,0.308696,0.502654,0.1 -736,0.497726,0.10062,-1.068141,0.1 -737,0.502816,0.092014,-1.005309,0.1 -738,0.432396,0.17177,1.068141,0.1 -739,0.436935,0.180679,1.130972,0.1 -740,0.485628,0.121112,-0.062832,0.1 -741,0.495621,0.121112,0.062832,0.1 -742,0.495621,0.121112,0.062832,0.1 -743,0.515061,0.117403,-0.439823,0.1 -744,-0.121984,-0.293264,-1.193804,0.1 -745,-0.117179,-0.302004,-0.942477,0.1 -746,0.495621,0.121112,0.062832,0.1 -747,0.505615,0.121426,-0.0,0.1 -748,-0.053541,-0.304015,1.130972,0.1 -749,-0.048458,-0.29542,0.942477,0.1 -750,0.515061,0.117403,-0.439823,0.1 -751,0.524237,0.113432,-0.376991,0.1 -752,-0.067008,-0.318356,0.502654,0.1 -753,-0.048099,-0.312212,0.125664,0.1 -754,-0.062896,0.306025,2.324777,0.1 -755,-0.080135,0.315503,2.953095,0.1 -756,0.501398,0.091347,-1.319468,0.1 -757,0.508741,0.0728,-1.068141,0.1 -758,0.436935,0.180679,1.130972,0.1 -759,0.4431,0.19965,1.3823,0.1 -760,0.039761,0.269403,-1.3823,0.1 -761,0.04708,0.250918,-1.005309,0.1 -762,-0.080135,0.315503,2.953095,0.1 -763,-0.100043,0.316755,3.204422,0.1 -764,-0.122847,0.185331,2.638936,0.1 -765,-0.131453,0.19042,2.576104,0.1 -766,-0.053541,-0.304015,1.130972,0.1 -767,-0.048727,-0.295258,1.005309,0.1 -768,0.501398,0.091347,-1.319468,0.1 -769,0.503898,0.071557,-1.570795,0.1 -770,-0.112669,-0.310861,-0.879645,0.1 -771,-0.106795,-0.318946,-1.005309,0.1 -772,-0.097166,-0.336461,-1.130972,0.1 -773,-0.092627,-0.345369,-1.068141,0.1 -774,0.524237,0.113432,-0.376991,0.1 -775,0.533741,0.110344,-0.251327,0.1 -776,0.533741,0.110344,-0.251327,0.1 -777,0.543604,0.108782,-0.062832,0.1 -778,-0.100043,0.316755,3.204422,0.1 -779,-0.119483,0.320464,2.701767,0.1 -780,0.533741,0.110344,-0.251327,0.1 -781,0.553375,0.11158,0.376991,0.1 -782,0.503898,0.071557,-1.570795,0.1 -783,0.505456,0.06172,-1.256636,0.1 -784,-0.22617,-0.36661,-2.638936,0.1 -785,-0.245339,-0.371532,-3.14159,0.1 -786,-0.086196,-0.322964,-0.062832,0.1 -787,-0.066288,-0.321712,0.188495,0.1 -788,-0.119483,0.320464,2.701767,0.1 -789,-0.135567,0.33215,2.324777,0.1 -790,-0.049833,-0.284575,1.633627,0.1 -791,-0.051085,-0.274661,1.75929,0.1 -792,-0.076281,-0.322027,0.251327,0.1 -793,-0.066386,-0.320777,0.0,0.1 -794,0.503898,0.071557,-1.570795,0.1 -795,0.505153,0.051609,-1.445131,0.1 -796,-0.002863,0.302552,0.125664,0.1 -797,0.007012,0.304116,0.188495,0.1 -798,0.553375,0.11158,0.376991,0.1 -799,0.561947,0.116649,0.69115,0.1 -800,0.503898,0.071557,-1.570795,0.1 -801,0.505148,0.061661,-1.319468,0.1 -802,0.039761,0.269403,-1.3823,0.1 -803,0.040701,0.259462,-1.570795,0.1 -804,0.561947,0.116649,0.69115,0.1 -805,0.576517,0.130331,0.816813,0.1 -806,-0.122314,-0.254321,-2.010618,0.1 -807,-0.126284,-0.263497,-1.947786,0.1 -808,-0.092627,-0.345369,-1.068141,0.1 -809,-0.078286,-0.358836,-0.439823,0.1 -810,0.576517,0.130331,0.816813,0.1 -811,0.582887,0.138031,0.942477,0.1 -812,-0.078286,-0.358836,-0.439823,0.1 -813,-0.070049,-0.364434,-0.753982,0.1 -814,0.505153,0.051609,-1.445131,0.1 -815,0.503905,0.031767,-1.822122,0.1 -816,-0.053541,-0.304015,1.130972,0.1 -817,-0.048197,-0.295594,0.879645,0.1 -818,-0.049833,-0.284575,1.633627,0.1 -819,-0.04858,-0.264667,1.3823,0.1 -820,0.508741,0.0728,-1.068141,0.1 -821,0.51328,0.063891,-1.130972,0.1 -822,-0.003877,0.304829,0.376991,0.1 -823,0.00502,0.309362,0.565486,0.1 -824,-0.049833,-0.284575,1.633627,0.1 -825,-0.049519,-0.274595,1.445131,0.1 -826,-0.096058,-0.321402,-0.251327,0.1 -827,-0.077512,-0.328745,-0.502654,0.1 -828,0.501398,0.091347,-1.319468,0.1 -829,0.501398,0.071557,-1.822122,0.1 -830,0.533741,0.110344,-0.251327,0.1 -831,0.553531,0.110344,0.251327,0.1 -832,0.501398,0.071557,-1.822122,0.1 -833,0.497727,0.062283,-2.073449,0.1 -834,-0.135567,0.33215,2.324777,0.1 -835,-0.151652,0.343836,2.701767,0.1 -836,0.582887,0.138031,0.942477,0.1 -837,0.588507,0.1463,1.005309,0.1 -838,0.025343,0.295002,-0.69115,0.1 -839,0.031929,0.287532,-1.005309,0.1 -840,-0.112669,-0.310861,-0.879645,0.1 -841,-0.096658,-0.322494,-0.376991,0.1 -842,-0.051085,-0.274661,1.75929,0.1 -843,-0.052649,-0.264785,1.696459,0.1 -844,-0.070049,-0.364434,-0.753982,0.1 -845,-0.062159,-0.370554,-0.565486,0.1 -846,-0.151652,0.343836,2.701767,0.1 -847,-0.170235,0.351194,2.827431,0.1 -848,-0.22617,-0.36661,-2.638936,0.1 -849,-0.235444,-0.370282,-2.890263,0.1 -850,-0.078286,-0.358836,-0.439823,0.1 -851,-0.068994,-0.362515,-0.314159,0.1 -852,-0.053541,-0.304015,1.130972,0.1 -853,-0.049862,-0.294723,1.256636,0.1 -854,-0.170235,0.351194,2.827431,0.1 -855,-0.17926,0.35544,2.576104,0.1 -856,-0.05857,-0.313001,0.628318,0.1 -857,-0.040581,-0.304536,0.251327,0.1 -858,-0.068994,-0.362515,-0.314159,0.1 -859,-0.059484,-0.365605,-0.314159,0.1 -860,-0.059484,-0.365605,-0.314159,0.1 -861,-0.050076,-0.368992,-0.376991,0.1 -862,0.588507,0.1463,1.005309,0.1 -863,0.59304,0.155197,1.193804,0.1 -864,-0.17926,0.35544,2.576104,0.1 -865,-0.198081,0.361556,3.078758,0.1 -866,0.533741,0.110344,-0.251327,0.1 -867,0.543636,0.109094,-0.0,0.1 -868,-0.053541,-0.304015,1.130972,0.1 -869,-0.051076,-0.284497,1.75929,0.1 -870,-0.22617,-0.36661,-2.638936,0.1 -871,-0.244717,-0.373953,-2.890263,0.1 -872,0.59304,0.155197,1.193804,0.1 -873,0.595826,0.164786,1.3823,0.1 -874,-0.051076,-0.284497,1.75929,0.1 -875,-0.04861,-0.26498,1.130972,0.1 -876,0.497727,0.062283,-2.073449,0.1 -877,0.492114,0.054025,-2.261945,0.1 -878,-0.012964,0.300546,0.628318,0.1 -879,0.003217,0.312302,0.628318,0.1 -880,-0.053541,-0.304015,1.130972,0.1 -881,-0.051076,-0.284497,1.75929,0.1 -882,0.492114,0.054025,-2.261945,0.1 -883,0.476104,0.042392,-2.764599,0.1 -884,0.588507,0.1463,1.005309,0.1 -885,0.595826,0.164786,1.3823,0.1 -886,-0.051076,-0.284497,1.75929,0.1 -887,-0.059502,-0.266591,2.261945,0.1 -888,0.588507,0.1463,1.005309,0.1 -889,0.600255,0.16247,0.879645,0.1 -890,-0.096658,-0.322494,-0.376991,0.1 -891,-0.087761,-0.327027,-0.565486,0.1 -892,0.600255,0.16247,0.879645,0.1 -893,0.616265,0.174102,0.376991,0.1 -894,-0.053541,-0.304015,1.130972,0.1 -895,-0.045026,-0.285918,1.130972,0.1 -896,0.616265,0.174102,0.376991,0.1 -897,0.633745,0.183712,0.628318,0.1 -898,-0.051076,-0.284497,1.75929,0.1 -899,-0.056046,-0.265138,1.884954,0.1 -900,0.616265,0.174102,0.376991,0.1 -901,0.631423,0.186642,1.005309,0.1 -902,-0.197264,-0.359193,-3.015926,0.1 -903,-0.216897,-0.362938,-2.890263,0.1 -904,0.616265,0.174102,0.376991,0.1 -905,0.625162,0.178636,0.565486,0.1 -906,0.040701,0.259462,-1.570795,0.1 -907,0.0382,0.239672,-1.822122,0.1 -908,0.040701,0.259462,-1.570795,0.1 -909,0.04164,0.249521,-1.3823,0.1 -910,-0.078286,-0.358836,-0.439823,0.1 -911,-0.06911,-0.362807,-0.376991,0.1 -912,0.503905,0.031767,-1.822122,0.1 -913,0.497729,0.012758,-1.947786,0.1 -914,0.031929,0.287532,-1.005309,0.1 -915,0.037287,0.279089,-1.005309,0.1 -916,-0.032887,0.278417,1.005309,0.1 -917,-0.021139,0.294586,0.879645,0.1 -918,-0.050076,-0.368992,-0.376991,0.1 -919,-0.041179,-0.373525,-0.565486,0.1 -920,0.616265,0.174102,0.376991,0.1 -921,0.625162,0.178636,0.565486,0.1 -922,-0.059502,-0.266591,2.261945,0.1 -923,-0.073184,-0.252021,2.387608,0.1 -924,-0.17926,0.35544,2.576104,0.1 -925,-0.187529,0.36106,2.513272,0.1 -926,-0.051076,-0.284497,1.75929,0.1 -927,-0.051702,-0.274543,1.507963,0.1 -928,0.497729,0.012758,-1.947786,0.1 -929,0.493758,0.003582,-2.010618,0.1 -930,-0.187529,0.36106,2.513272,0.1 -931,-0.195019,0.367664,2.324777,0.1 -932,-0.195019,0.367664,2.324777,0.1 -933,-0.202509,0.374267,2.513272,0.1 -934,0.616265,0.174102,0.376991,0.1 -935,0.625985,0.176275,0.062832,0.1 -936,0.306697,-0.094221,-1.3823,0.1 -937,0.30795,-0.104136,-1.507963,0.1 -938,-0.202509,0.374267,2.513272,0.1 -939,-0.219989,0.383877,2.764599,0.1 -940,-0.067008,-0.318356,0.502654,0.1 -941,-0.057735,-0.314684,0.251327,0.1 -942,0.633745,0.183712,0.628318,0.1 -943,0.640788,0.190754,0.942477,0.1 -944,0.025343,0.295002,-0.69115,0.1 -945,0.033048,0.288628,-0.69115,0.1 -946,0.640788,0.190754,0.942477,0.1 -947,0.646665,0.198844,0.942477,0.1 -948,-0.051076,-0.284497,1.75929,0.1 -949,-0.052015,-0.274557,1.570795,0.1 -950,-0.041179,-0.373525,-0.565486,0.1 -951,-0.032422,-0.378339,-0.439823,0.1 -952,-0.219989,0.383877,2.764599,0.1 -953,-0.229031,0.388132,2.638936,0.1 -954,-0.244717,-0.373953,-2.890263,0.1 -955,-0.263264,-0.381296,-2.638936,0.1 -956,-0.263264,-0.381296,-2.638936,0.1 -957,-0.272634,-0.38467,-2.953095,0.1 -958,-0.027267,0.286686,0.942477,0.1 -959,-0.021389,0.294776,0.942477,0.1 -960,-0.272634,-0.38467,-2.953095,0.1 -961,-0.292385,-0.383427,-3.455749,0.1 -962,-0.292385,-0.383427,-3.455749,0.1 -963,-0.302064,-0.380942,-3.330085,0.1 -964,-0.229031,0.388132,2.638936,0.1 -965,-0.244351,0.400805,2.261945,0.1 -966,-0.302064,-0.380942,-3.330085,0.1 -967,-0.321893,-0.378437,-3.204422,0.1 -968,-0.067008,-0.318356,0.502654,0.1 -969,-0.05857,-0.313001,0.628318,0.1 -970,0.016771,0.300072,-0.376991,0.1 -971,0.026178,0.296685,-0.314159,0.1 -972,0.646665,0.198844,0.942477,0.1 -973,0.659405,0.214244,0.816813,0.1 -974,-0.041179,-0.373525,-0.565486,0.1 -975,-0.027632,-0.387951,-1.068141,0.1 -976,0.493758,0.003582,-2.010618,0.1 -977,0.490375,-0.005813,-1.822122,0.1 -978,0.659405,0.214244,0.816813,0.1 -979,0.674775,0.226959,0.565486,0.1 -980,-0.04138,0.260368,1.256636,0.1 -981,-0.04138,0.28004,1.884954,0.1 -982,0.674775,0.226959,0.565486,0.1 -983,0.691662,0.237676,0.565486,0.1 -984,-0.027632,-0.387951,-1.068141,0.1 -985,-0.02177,-0.39602,-0.816813,0.1 -986,-0.059502,-0.266591,2.261945,0.1 -987,-0.06908,-0.249168,1.884954,0.1 -988,-0.263264,-0.381296,-2.638936,0.1 -989,-0.280139,-0.392006,-2.513272,0.1 -990,-0.244351,0.400805,2.261945,0.1 -991,-0.250963,0.408305,2.324777,0.1 -992,0.501398,0.071557,-1.822122,0.1 -993,0.498898,0.051766,-1.570795,0.1 -994,0.490375,-0.005813,-1.822122,0.1 -995,0.485402,-0.025185,-1.822122,0.1 -996,-0.321893,-0.378437,-3.204422,0.1 -997,-0.341723,-0.375932,-3.330085,0.1 -998,-0.051076,-0.284497,1.75929,0.1 -999,-0.052015,-0.274557,1.570795,0.1 -1000,-0.250963,0.408305,2.324777,0.1 -1001,-0.266332,0.42102,2.576104,0.1 -1002,-0.266332,0.42102,2.576104,0.1 -1003,-0.284381,0.429513,2.827431,0.1 -1004,0.691662,0.237676,0.565486,0.1 -1005,0.699747,0.24355,0.69115,0.1 -1006,-0.02177,-0.39602,-0.816813,0.1 -1007,-0.014485,-0.402861,-0.69115,0.1 -1008,-0.096058,-0.321402,-0.251327,0.1 -1009,-0.086663,-0.324785,-0.439823,0.1 -1010,-0.341723,-0.375932,-3.330085,0.1 -1011,-0.351677,-0.375306,-3.078758,0.1 -1012,-0.059502,-0.266591,2.261945,0.1 -1013,-0.066772,-0.259763,2.513272,0.1 -1014,0.501398,0.071557,-1.822122,0.1 -1015,0.501398,0.051766,-1.319468,0.1 -1016,0.699747,0.24355,0.69115,0.1 -1017,0.716589,0.254238,0.439823,0.1 -1018,-0.066772,-0.259763,2.513272,0.1 -1019,-0.084252,-0.250153,2.764599,0.1 -1020,0.595826,0.164786,1.3823,0.1 -1021,0.598311,0.174466,1.256636,0.1 -1022,0.501398,0.071557,-1.822122,0.1 -1023,0.497727,0.062283,-2.073449,0.1 -1024,-0.280139,-0.392006,-2.513272,0.1 -1025,-0.298539,-0.399291,-3.015926,0.1 -1026,-0.066772,-0.259763,2.513272,0.1 -1027,-0.074043,-0.252936,2.261945,0.1 -1028,-0.250963,0.408305,2.324777,0.1 -1029,-0.261616,0.425092,1.947786,0.1 -1030,-0.351677,-0.375306,-3.078758,0.1 -1031,-0.36167,-0.375306,-3.204422,0.1 -1032,-0.078286,-0.358836,-0.439823,0.1 -1033,-0.069238,-0.363094,-0.439823,0.1 -1034,0.59304,0.155197,1.193804,0.1 -1035,0.597295,0.16424,1.068141,0.1 -1036,0.485402,-0.025185,-1.822122,0.1 -1037,0.482314,-0.034689,-1.947786,0.1 -1038,-0.284381,0.429513,2.827431,0.1 -1039,-0.293406,0.43376,2.576104,0.1 -1040,-0.261616,0.425092,1.947786,0.1 -1041,-0.273248,0.441102,2.45044,0.1 -1042,-0.088878,-0.182539,-1.822122,0.1 -1043,-0.099419,-0.199149,-2.45044,0.1 -1044,-0.051076,-0.284497,1.75929,0.1 -1045,-0.05724,-0.265526,2.010618,0.1 -1046,-0.117179,-0.302004,-0.942477,0.1 -1047,-0.110575,-0.309494,-0.753982,0.1 -1048,-0.053541,-0.304015,1.130972,0.1 -1049,-0.042853,-0.287173,0.879645,0.1 -1050,0.476104,0.042392,-2.764599,0.1 -1051,0.456574,0.038667,-3.14159,0.1 -1052,-0.068994,-0.362515,-0.314159,0.1 -1053,-0.052285,-0.373119,-0.816813,0.1 -1054,0.0382,0.239672,-1.822122,0.1 -1055,0.035714,0.229986,-1.822122,0.1 -1056,-0.261616,0.425092,1.947786,0.1 -1057,-0.274156,0.44025,2.576104,0.1 -1058,-0.032422,-0.378339,-0.439823,0.1 -1059,-0.023828,-0.383422,-0.628318,0.1 -1060,0.482314,-0.034689,-1.947786,0.1 -1061,0.478059,-0.043731,-2.073449,0.1 -1062,0.492114,0.054025,-2.261945,0.1 -1063,0.476104,0.042392,-2.764599,0.1 -1064,0.716589,0.254238,0.439823,0.1 -1065,0.731837,0.266853,0.942477,0.1 -1066,-0.351677,-0.375306,-3.078758,0.1 -1067,-0.361631,-0.37468,-3.330085,0.1 -1068,-0.053541,-0.304015,1.130972,0.1 -1069,-0.046184,-0.285432,1.256636,0.1 -1070,-0.078286,-0.358836,-0.439823,0.1 -1071,-0.068722,-0.361615,-0.125664,0.1 -1072,0.716589,0.254238,0.439823,0.1 -1073,0.725984,0.257621,0.251327,0.1 -1074,-0.293406,0.43376,2.576104,0.1 -1075,-0.311891,0.441079,2.953095,0.1 -1076,0.016771,0.300072,-0.376991,0.1 -1077,0.036405,0.297592,0.125664,0.1 -1078,-0.051076,-0.284497,1.75929,0.1 -1079,-0.053257,-0.27474,1.822122,0.1 -1080,-0.197264,-0.359193,-3.015926,0.1 -1081,-0.215665,-0.366479,-2.513272,0.1 -1082,0.036975,0.278992,-1.193804,0.1 -1083,0.039455,0.259358,-1.696459,0.1 -1084,0.731837,0.266853,0.942477,0.1 -1085,0.747086,0.279468,0.439823,0.1 -1086,-0.051076,-0.284497,1.75929,0.1 -1087,-0.052015,-0.274557,1.570795,0.1 -1088,-0.261616,0.425092,1.947786,0.1 -1089,-0.271226,0.442572,2.199113,0.1 -1090,-0.280139,-0.392006,-2.513272,0.1 -1091,-0.297619,-0.401616,-2.764599,0.1 -1092,0.731837,0.266853,0.942477,0.1 -1093,0.747086,0.279468,0.439823,0.1 -1094,0.725984,0.257621,0.251327,0.1 -1095,0.735846,0.259183,0.062832,0.1 -1096,0.731837,0.266853,0.942477,0.1 -1097,0.744577,0.282253,0.816813,0.1 -1098,0.735846,0.259183,0.062832,0.1 -1099,0.755286,0.255474,-0.439823,0.1 -1100,0.747086,0.279468,0.439823,0.1 -1101,0.766343,0.284412,0.062832,0.1 -1102,-0.273248,0.441102,2.45044,0.1 -1103,-0.280533,0.447943,2.324777,0.1 -1104,-0.067008,-0.318356,0.502654,0.1 -1105,-0.04784,-0.313434,0.0,0.1 -1106,-0.067008,-0.318356,0.502654,0.1 -1107,-0.04784,-0.313434,0.0,0.1 -1108,0.731837,0.266853,0.942477,0.1 -1109,0.738207,0.274553,0.816813,0.1 -1110,0.738207,0.274553,0.816813,0.1 -1111,0.748861,0.29134,1.193804,0.1 -1112,0.0382,0.239672,-1.822122,0.1 -1113,0.036328,0.229856,-1.696459,0.1 -1114,-0.002863,0.302552,0.125664,0.1 -1115,0.006797,0.305033,0.376991,0.1 -1116,0.478059,-0.043731,-2.073449,0.1 -1117,0.464511,-0.058158,-2.576104,0.1 -1118,-0.076281,-0.322027,0.251327,0.1 -1119,-0.06668,-0.319238,0.314159,0.1 -1120,-0.261616,0.425092,1.947786,0.1 -1121,-0.272269,0.441878,2.324777,0.1 -1122,-0.014485,-0.402861,-0.69115,0.1 -1123,-0.0064,-0.408735,-0.565486,0.1 -1124,-0.084252,-0.250153,2.764599,0.1 -1125,-0.101732,-0.240544,2.513272,0.1 -1126,-0.053541,-0.304015,1.130972,0.1 -1127,-0.047377,-0.285044,1.3823,0.1 -1128,0.748861,0.29134,1.193804,0.1 -1129,0.760493,0.30735,0.69115,0.1 -1130,0.016771,0.300072,-0.376991,0.1 -1131,0.034251,0.290462,-0.628318,0.1 -1132,0.501398,0.071557,-1.822122,0.1 -1133,0.499526,0.06174,-1.696459,0.1 -1134,0.748861,0.29134,1.193804,0.1 -1135,0.755037,0.310348,1.319468,0.1 -1136,-0.051076,-0.284497,1.75929,0.1 -1137,-0.04861,-0.26498,1.130972,0.1 -1138,0.464511,-0.058158,-2.576104,0.1 -1139,0.456826,-0.064515,-2.324777,0.1 -1140,0.031929,0.287532,-1.005309,0.1 -1141,0.038286,0.279847,-0.753982,0.1 -1142,0.748861,0.29134,1.193804,0.1 -1143,0.7614,0.306498,0.565486,0.1 -1144,-0.311891,0.441079,2.953095,0.1 -1145,-0.321845,0.441705,3.204422,0.1 -1146,-0.076281,-0.322027,0.251327,0.1 -1147,-0.066596,-0.31954,0.251327,0.1 -1148,0.755286,0.255474,-0.439823,0.1 -1149,0.764462,0.251504,-0.376991,0.1 -1150,-0.351677,-0.375306,-3.078758,0.1 -1151,-0.361474,-0.377175,-2.827431,0.1 -1152,-0.361474,-0.377175,-2.827431,0.1 -1153,-0.371153,-0.37966,-2.953095,0.1 -1154,-0.261616,0.425092,1.947786,0.1 -1155,-0.270126,0.443176,2.073449,0.1 -1156,-0.068722,-0.361615,-0.125664,0.1 -1157,-0.058906,-0.363487,-0.251327,0.1 -1158,-0.261616,0.425092,1.947786,0.1 -1159,-0.264704,0.434596,1.822122,0.1 -1160,-0.051076,-0.284497,1.75929,0.1 -1161,-0.053581,-0.264668,1.633627,0.1 -1162,-0.068722,-0.361615,-0.125664,0.1 -1163,-0.059062,-0.364095,-0.376991,0.1 -1164,0.755037,0.310348,1.319468,0.1 -1165,0.755974,0.320263,1.633627,0.1 -1166,0.035006,0.314531,0.062832,0.1 -1167,0.054446,0.310822,-0.439823,0.1 -1168,0.755974,0.320263,1.633627,0.1 -1169,0.75566,0.330257,1.570795,0.1 -1170,0.755974,0.320263,1.633627,0.1 -1171,0.752236,0.339857,1.884954,0.1 -1172,0.7614,0.306498,0.565486,0.1 -1173,0.76967,0.312118,0.628318,0.1 -1174,0.755286,0.255474,-0.439823,0.1 -1175,0.76468,0.252092,-0.251327,0.1 -1176,0.752236,0.339857,1.884954,0.1 -1177,0.747266,0.359216,1.75929,0.1 -1178,-0.053541,-0.304015,1.130972,0.1 -1179,-0.048197,-0.295594,0.879645,0.1 -1180,-0.264704,0.434596,1.822122,0.1 -1181,-0.265954,0.444491,1.570795,0.1 -1182,0.0382,0.239672,-1.822122,0.1 -1183,0.0357,0.219882,-1.570795,0.1 -1184,0.755286,0.255474,-0.439823,0.1 -1185,0.764194,0.250935,-0.502654,0.1 -1186,0.75566,0.330257,1.570795,0.1 -1187,0.759386,0.349786,1.193804,0.1 -1188,0.764194,0.250935,-0.502654,0.1 -1189,0.782741,0.243592,-0.251327,0.1 -1190,-0.280533,0.447943,2.324777,0.1 -1191,-0.295903,0.460658,2.576104,0.1 -1192,0.464511,-0.058158,-2.576104,0.1 -1193,0.456242,-0.063778,-2.513272,0.1 -1194,0.464511,-0.058158,-2.576104,0.1 -1195,0.456621,-0.064278,-2.387608,0.1 -1196,-0.265954,0.444491,1.570795,0.1 -1197,-0.269679,0.464021,1.947786,0.1 -1198,0.755974,0.320263,1.633627,0.1 -1199,0.7566,0.330217,1.3823,0.1 -1200,0.764194,0.250935,-0.502654,0.1 -1201,0.783362,0.246014,-0.0,0.1 -1202,0.764194,0.250935,-0.502654,0.1 -1203,0.773236,0.24668,-0.376991,0.1 -1204,0.035006,0.314531,0.062832,0.1 -1205,0.04496,0.313904,-0.188495,0.1 -1206,0.503898,0.071557,-1.570795,0.1 -1207,0.500173,0.052027,-1.947786,0.1 -1208,0.764194,0.250935,-0.502654,0.1 -1209,0.773564,0.247562,-0.188495,0.1 -1210,0.025343,0.295002,-0.69115,0.1 -1211,0.032843,0.28839,-0.753982,0.1 -1212,-0.295903,0.460658,2.576104,0.1 -1213,-0.303988,0.466532,2.45044,0.1 -1214,-0.269679,0.464021,1.947786,0.1 -1215,-0.274213,0.472917,2.136281,0.1 -1216,-0.361474,-0.377175,-2.827431,0.1 -1217,-0.380495,-0.383355,-2.827431,0.1 -1218,-0.067008,-0.318356,0.502654,0.1 -1219,-0.048461,-0.311012,0.251327,0.1 -1220,0.76967,0.312118,0.628318,0.1 -1221,0.776712,0.31916,0.942477,0.1 -1222,-0.380495,-0.383355,-2.827431,0.1 -1223,-0.389659,-0.387321,-2.638936,0.1 -1224,0.00711,0.30318,-0.0,0.1 -1225,0.0269,0.30068,-0.251327,0.1 -1226,0.783362,0.246014,-0.0,0.1 -1227,0.793362,0.246014,-0.0,0.1 -1228,0.759386,0.349786,1.193804,0.1 -1229,0.771925,0.364944,0.565486,0.1 -1230,0.0382,0.239672,-1.822122,0.1 -1231,0.027659,0.223062,-2.45044,0.1 -1232,0.025343,0.295002,-0.69115,0.1 -1233,0.033243,0.288874,-0.628318,0.1 -1234,0.764194,0.250935,-0.502654,0.1 -1235,0.773564,0.247562,-0.188495,0.1 -1236,-0.053541,-0.304015,1.130972,0.1 -1237,-0.042853,-0.287173,0.879645,0.1 -1238,0.027659,0.223062,-2.45044,0.1 -1239,0.020832,0.215791,-2.199113,0.1 -1240,0.764194,0.250935,-0.502654,0.1 -1241,0.773103,0.246396,-0.439823,0.1 -1242,-0.068722,-0.361615,-0.125664,0.1 -1243,-0.050322,-0.3689,-0.628318,0.1 -1244,0.793362,0.246014,-0.0,0.1 -1245,0.812531,0.250935,0.502654,0.1 -1246,-0.389659,-0.387321,-2.638936,0.1 -1247,-0.404085,-0.400868,-2.136281,0.1 -1248,-0.303988,0.466532,2.45044,0.1 -1249,-0.318557,0.480214,2.324777,0.1 -1250,-0.404085,-0.400868,-2.136281,0.1 -1251,-0.408978,-0.419923,-1.507963,0.1 -1252,-0.408978,-0.419923,-1.507963,0.1 -1253,-0.41023,-0.439831,-1.75929,0.1 -1254,-0.408978,-0.419923,-1.507963,0.1 -1255,-0.411469,-0.439648,-1.884954,0.1 -1256,0.764194,0.250935,-0.502654,0.1 -1257,0.783518,0.247249,0.125664,0.1 -1258,-0.051076,-0.284497,1.75929,0.1 -1259,-0.053561,-0.274818,1.884954,0.1 -1260,0.782741,0.243592,-0.251327,0.1 -1261,0.792655,0.242655,0.062832,0.1 -1262,0.771925,0.364944,0.565486,0.1 -1263,0.785473,0.379371,1.068141,0.1 -1264,-0.318557,0.480214,2.324777,0.1 -1265,-0.331297,0.495614,2.199113,0.1 -1266,0.764194,0.250935,-0.502654,0.1 -1267,0.773236,0.24668,-0.376991,0.1 -1268,-0.265954,0.444491,1.570795,0.1 -1269,-0.266894,0.454432,1.75929,0.1 -1270,0.785473,0.379371,1.068141,0.1 -1271,0.798146,0.39469,0.69115,0.1 -1272,0.755974,0.320263,1.633627,0.1 -1273,0.759682,0.339703,1.130972,0.1 -1274,-0.0064,-0.408735,-0.565486,0.1 -1275,0.00977,-0.420483,-0.69115,0.1 -1276,-0.331297,0.495614,2.199113,0.1 -1277,-0.336652,0.504052,2.073449,0.1 -1278,0.798146,0.39469,0.69115,0.1 -1279,0.805206,0.40175,0.879645,0.1 -1280,-0.059502,-0.266591,2.261945,0.1 -1281,-0.073184,-0.252021,2.387608,0.1 -1282,-0.411469,-0.439648,-1.884954,0.1 -1283,-0.414259,-0.449249,-1.822122,0.1 -1284,0.805206,0.40175,0.879645,0.1 -1285,0.811818,0.40925,0.816813,0.1 -1286,0.752236,0.339857,1.884954,0.1 -1287,0.74885,0.349264,1.947786,0.1 -1288,0.811818,0.40925,0.816813,0.1 -1289,0.828528,0.419854,0.314159,0.1 -1290,0.00977,-0.420483,-0.69115,0.1 -1291,0.018191,-0.425827,-0.439823,0.1 -1292,-0.265954,0.444491,1.570795,0.1 -1293,-0.269679,0.464021,1.947786,0.1 -1294,0.792655,0.242655,0.062832,0.1 -1295,0.812642,0.242655,-0.062832,0.1 -1296,0.018191,-0.425827,-0.439823,0.1 -1297,0.026785,-0.43091,-0.628318,0.1 -1298,0.456621,-0.064278,-2.387608,0.1 -1299,0.449781,-0.071563,-2.261945,0.1 -1300,-0.408978,-0.419923,-1.507963,0.1 -1301,-0.40524,-0.439517,-1.256636,0.1 -1302,0.811818,0.40925,0.816813,0.1 -1303,0.827903,0.420936,0.439823,0.1 -1304,0.773103,0.246396,-0.439823,0.1 -1305,0.782151,0.242138,-0.439823,0.1 -1306,0.020832,0.215791,-2.199113,0.1 -1307,0.007177,0.20125,-2.45044,0.1 -1308,0.782151,0.242138,-0.439823,0.1 -1309,0.790388,0.236541,-0.753982,0.1 -1310,0.501398,0.071557,-1.822122,0.1 -1311,0.495222,0.052548,-1.947786,0.1 -1312,0.828528,0.419854,0.314159,0.1 -1313,0.845237,0.430458,0.816813,0.1 -1314,0.74885,0.349264,1.947786,0.1 -1315,0.745124,0.368794,1.570795,0.1 -1316,0.812531,0.250935,0.502654,0.1 -1317,0.821695,0.254901,0.314159,0.1 -1318,0.790388,0.236541,-0.753982,0.1 -1319,0.802074,0.220456,-1.130972,0.1 -1320,-0.336652,0.504052,2.073449,0.1 -1321,-0.341574,0.52322,1.570795,0.1 -1322,-0.414259,-0.449249,-1.822122,0.1 -1323,-0.41644,-0.459007,-1.75929,0.1 -1324,0.031929,0.287532,-1.005309,0.1 -1325,0.038515,0.280062,-0.69115,0.1 -1326,0.595826,0.164786,1.3823,0.1 -1327,0.59336,0.184304,2.010618,0.1 -1328,0.845237,0.430458,0.816813,0.1 -1329,0.861947,0.441062,0.314159,0.1 -1330,0.845237,0.430458,0.816813,0.1 -1331,0.856962,0.446596,1.068141,0.1 From ae656a8cb047594abf4b9c3ab486e4c2c65cbe70 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 22 Nov 2022 22:24:54 -0600 Subject: [PATCH 19/23] Add files via upload --- RGrrt_tree.csv | 1333 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1333 insertions(+) create mode 100644 RGrrt_tree.csv diff --git a/RGrrt_tree.csv b/RGrrt_tree.csv new file mode 100644 index 0000000..b7d8473 --- /dev/null +++ b/RGrrt_tree.csv @@ -0,0 +1,1333 @@ +,x,y,theta,v +0,0.0,0.0,0.0,0.1 +1,0.009895,-0.00125,-0.251327,0.1 +2,0.0,0.0,0.0,0.1 +3,0.009974,0.000627,0.125664,0.1 +4,0.009895,-0.00125,-0.251327,0.1 +5,0.019035,-0.005205,-0.565486,0.1 +6,0.019035,-0.005205,-0.565486,0.1 +7,0.027932,-0.009738,-0.376991,0.1 +8,0.009974,0.000627,0.125664,0.1 +9,0.028882,0.006771,0.502654,0.1 +10,0.019035,-0.005205,-0.565486,0.1 +11,0.037084,-0.013698,-0.314159,0.1 +12,0.028882,0.006771,0.502654,0.1 +13,0.046967,0.015281,0.376991,0.1 +14,0.019035,-0.005205,-0.565486,0.1 +15,0.02712,-0.011079,-0.69115,0.1 +16,0.028882,0.006771,0.502654,0.1 +17,0.038046,0.010737,0.314159,0.1 +18,0.028882,0.006771,0.502654,0.1 +19,0.047791,0.012915,0.125664,0.1 +20,0.028882,0.006771,0.502654,0.1 +21,0.04502,0.018496,0.753982,0.1 +22,0.02712,-0.011079,-0.69115,0.1 +23,0.035378,-0.016692,-0.502654,0.1 +24,0.04502,0.018496,0.753982,0.1 +25,0.05231,0.025342,0.753982,0.1 +26,0.02712,-0.011079,-0.69115,0.1 +27,0.035541,-0.016423,-0.439823,0.1 +28,0.02712,-0.011079,-0.69115,0.1 +29,0.043289,-0.022827,-0.565486,0.1 +30,0.05231,0.025342,0.753982,0.1 +31,0.058667,0.033026,1.005309,0.1 +32,0.05231,0.025342,0.753982,0.1 +33,0.069097,0.035995,0.376991,0.1 +34,0.028882,0.006771,0.502654,0.1 +35,0.038156,0.010443,0.251327,0.1 +36,0.058667,0.033026,1.005309,0.1 +37,0.063482,0.041784,1.130972,0.1 +38,0.069097,0.035995,0.376991,0.1 +39,0.087692,0.043357,0.376991,0.1 +40,0.063482,0.041784,1.130972,0.1 +41,0.066564,0.051269,1.3823,0.1 +42,0.02712,-0.011079,-0.69115,0.1 +43,0.04169,-0.024761,-0.816813,0.1 +44,0.04169,-0.024761,-0.816813,0.1 +45,0.058399,-0.035365,-0.314159,0.1 +46,0.04169,-0.024761,-0.816813,0.1 +47,0.057774,-0.036447,-0.439823,0.1 +48,0.02712,-0.011079,-0.69115,0.1 +49,0.03502,-0.017207,-0.628318,0.1 +50,0.087692,0.043357,0.376991,0.1 +51,0.09699,0.047038,0.376991,0.1 +52,0.066564,0.051269,1.3823,0.1 +53,0.069049,0.060949,1.256636,0.1 +54,0.066564,0.051269,1.3823,0.1 +55,0.068128,0.061145,1.445131,0.1 +56,0.04169,-0.024761,-0.816813,0.1 +57,0.048974,-0.031602,-0.69115,0.1 +58,0.058667,0.033026,1.005309,0.1 +59,0.073825,0.045566,0.376991,0.1 +60,0.04169,-0.024761,-0.816813,0.1 +61,0.05443,-0.040161,-0.942477,0.1 +62,0.05443,-0.040161,-0.942477,0.1 +63,0.068085,-0.054702,-0.69115,0.1 +64,0.05443,-0.040161,-0.942477,0.1 +65,0.058951,-0.049035,-1.256636,0.1 +66,0.09699,0.047038,0.376991,0.1 +67,0.116624,0.048274,-0.251327,0.1 +68,0.0,0.0,0.0,0.1 +69,0.019947,0.001255,0.125664,0.1 +70,0.0,0.0,0.0,0.1 +71,0.009895,-0.00125,-0.251327,0.1 +72,0.019035,-0.005205,-0.565486,0.1 +73,0.033528,-0.018815,-0.942477,0.1 +74,0.068128,0.061145,1.445131,0.1 +75,0.070608,0.070805,1.193804,0.1 +76,0.068128,0.061145,1.445131,0.1 +77,0.071873,0.080777,1.319468,0.1 +78,0.068128,0.061145,1.445131,0.1 +79,0.064442,0.080469,2.073449,0.1 +80,0.064442,0.080469,2.073449,0.1 +81,0.060476,0.089633,1.884954,0.1 +82,0.060476,0.089633,1.884954,0.1 +83,0.048913,0.105548,2.513272,0.1 +84,0.048913,0.105548,2.513272,0.1 +85,0.040039,0.110069,2.827431,0.1 +86,0.060476,0.089633,1.884954,0.1 +87,0.059233,0.109384,1.3823,0.1 +88,0.028882,0.006771,0.502654,0.1 +89,0.047429,0.014114,0.251327,0.1 +90,0.116624,0.048274,-0.251327,0.1 +91,0.125897,0.044602,-0.502654,0.1 +92,0.125897,0.044602,-0.502654,0.1 +93,0.134335,0.039247,-0.628318,0.1 +94,0.058951,-0.049035,-1.256636,0.1 +95,0.06174,-0.058636,-1.319468,0.1 +96,0.05231,0.025342,0.753982,0.1 +97,0.0596,0.032187,0.753982,0.1 +98,0.019035,-0.005205,-0.565486,0.1 +99,0.038089,-0.010098,0.062832,0.1 +100,0.019035,-0.005205,-0.565486,0.1 +101,0.028059,-0.009452,-0.314159,0.1 +102,0.06174,-0.058636,-1.319468,0.1 +103,0.060505,-0.07827,-1.947786,0.1 +104,0.116624,0.048274,-0.251327,0.1 +105,0.126225,0.045484,-0.314159,0.1 +106,0.028882,0.006771,0.502654,0.1 +107,0.036951,0.012634,0.753982,0.1 +108,0.019035,-0.005205,-0.565486,0.1 +109,0.027304,-0.010825,-0.628318,0.1 +110,0.06174,-0.058636,-1.319468,0.1 +111,0.070206,-0.076626,-0.942477,0.1 +112,0.060505,-0.07827,-1.947786,0.1 +113,0.055972,-0.087167,-2.136281,0.1 +114,0.055972,-0.087167,-2.136281,0.1 +115,0.041546,-0.100714,-2.638936,0.1 +116,0.048913,0.105548,2.513272,0.1 +117,0.040643,0.111168,2.576104,0.1 +118,0.040039,0.110069,2.827431,0.1 +119,0.030748,0.113748,2.701767,0.1 +120,0.036951,0.012634,0.753982,0.1 +121,0.054294,0.022168,0.251327,0.1 +122,0.070206,-0.076626,-0.942477,0.1 +123,0.076576,-0.084326,-0.816813,0.1 +124,0.048913,0.105548,2.513272,0.1 +125,0.031433,0.115158,2.764599,0.1 +126,0.041546,-0.100714,-2.638936,0.1 +127,0.033108,-0.106069,-2.513272,0.1 +128,0.048913,0.105548,2.513272,0.1 +129,0.036298,0.120797,2.010618,0.1 +130,0.0,0.0,0.0,0.1 +131,0.009895,0.00125,0.251327,0.1 +132,0.066564,0.051269,1.3823,0.1 +133,0.067816,0.071177,1.633627,0.1 +134,0.059233,0.109384,1.3823,0.1 +135,0.062981,0.129029,1.3823,0.1 +136,0.070206,-0.076626,-0.942477,0.1 +137,0.075826,-0.084895,-1.005309,0.1 +138,0.134335,0.039247,-0.628318,0.1 +139,0.152324,0.030782,-0.251327,0.1 +140,0.033108,-0.106069,-2.513272,0.1 +141,0.025208,-0.112197,-2.45044,0.1 +142,0.040643,0.111168,2.576104,0.1 +143,0.031504,0.115123,2.890263,0.1 +144,0.030748,0.113748,2.701767,0.1 +145,0.011308,0.117457,3.204422,0.1 +146,0.025208,-0.112197,-2.45044,0.1 +147,0.016787,-0.117541,-2.701767,0.1 +148,0.152324,0.030782,-0.251327,0.1 +149,0.161598,0.027111,-0.502654,0.1 +150,0.0,0.0,0.0,0.1 +151,0.009993,-0.000314,-0.062832,0.1 +152,0.064442,0.080469,2.073449,0.1 +153,0.055932,0.098553,1.947786,0.1 +154,0.062981,0.129029,1.3823,0.1 +155,0.064545,0.138905,1.445131,0.1 +156,0.064442,0.080469,2.073449,0.1 +157,0.060187,0.089511,1.947786,0.1 +158,0.009895,0.00125,0.251327,0.1 +159,0.029685,0.00125,-0.251327,0.1 +160,0.033528,-0.018815,-0.942477,0.1 +161,0.039607,-0.037525,-1.570795,0.1 +162,0.152324,0.030782,-0.251327,0.1 +163,0.162141,0.02891,-0.125664,0.1 +164,0.064545,0.138905,1.445131,0.1 +165,0.064859,0.148885,1.633627,0.1 +166,0.162141,0.02891,-0.125664,0.1 +167,0.172095,0.029222,0.188495,0.1 +168,0.025208,-0.112197,-2.45044,0.1 +169,0.007301,-0.120623,-2.953095,0.1 +170,0.033108,-0.106069,-2.513272,0.1 +171,0.02467,-0.111424,-2.638936,0.1 +172,0.041546,-0.100714,-2.638936,0.1 +173,0.02402,-0.110349,-2.638936,0.1 +174,0.172095,0.029222,0.188495,0.1 +175,0.181684,0.032008,0.376991,0.1 +176,0.039607,-0.037525,-1.570795,0.1 +177,0.043333,-0.057055,-1.193804,0.1 +178,0.011308,0.117457,3.204422,0.1 +179,0.001394,0.116204,3.330085,0.1 +180,0.181684,0.032008,0.376991,0.1 +181,0.191403,0.034181,0.062832,0.1 +182,0.076576,-0.084326,-0.816813,0.1 +183,0.083646,-0.091396,-0.753982,0.1 +184,0.016787,-0.117541,-2.701767,0.1 +185,0.007301,-0.120623,-2.953095,0.1 +186,0.0,0.0,0.0,0.1 +187,0.019168,-0.004922,-0.502654,0.1 +188,0.025208,-0.112197,-2.45044,0.1 +189,0.011553,-0.126738,-2.199113,0.1 +190,0.064859,0.148885,1.633627,0.1 +191,0.064859,0.168872,1.507963,0.1 +192,0.181684,0.032008,0.376991,0.1 +193,0.197694,0.043641,0.879645,0.1 +194,0.191403,0.034181,0.062832,0.1 +195,0.201396,0.034181,-0.062832,0.1 +196,0.060505,-0.07827,-1.947786,0.1 +197,0.050895,-0.09575,-2.199113,0.1 +198,0.031504,0.115123,2.890263,0.1 +199,0.021687,0.116996,3.015926,0.1 +200,0.066564,0.051269,1.3823,0.1 +201,0.06935,0.060858,1.193804,0.1 +202,0.007301,-0.120623,-2.953095,0.1 +203,-0.010606,-0.129049,-2.45044,0.1 +204,0.030748,0.113748,2.701767,0.1 +205,0.022327,0.119093,2.45044,0.1 +206,0.033528,-0.018815,-0.942477,0.1 +207,0.044238,-0.035691,-1.068141,0.1 +208,0.022327,0.119093,2.45044,0.1 +209,0.007757,0.132774,2.324777,0.1 +210,0.007301,-0.120623,-2.953095,0.1 +211,-0.002653,-0.121249,-3.204422,0.1 +212,0.059233,0.109384,1.3823,0.1 +213,0.062315,0.118869,1.130972,0.1 +214,0.083646,-0.091396,-0.753982,0.1 +215,0.08975,-0.099265,-1.068141,0.1 +216,0.064859,0.168872,1.507963,0.1 +217,0.063922,0.178787,1.822122,0.1 +218,0.009895,0.00125,0.251327,0.1 +219,0.01929,0.004632,0.439823,0.1 +220,-0.010606,-0.129049,-2.45044,0.1 +221,-0.028512,-0.137476,-2.953095,0.1 +222,0.201396,0.034181,-0.062832,0.1 +223,0.219687,0.026939,-0.69115,0.1 +224,0.007757,0.132774,2.324777,0.1 +225,0.001894,0.140843,2.073449,0.1 +226,0.066564,0.051269,1.3823,0.1 +227,0.066564,0.071151,1.75929,0.1 +228,0.197694,0.043641,0.879645,0.1 +229,0.212235,0.057295,0.628318,0.1 +230,0.011553,-0.126738,-2.199113,0.1 +231,-0.002102,-0.141279,-2.45044,0.1 +232,0.009895,-0.00125,-0.251327,0.1 +233,0.019035,-0.005205,-0.565486,0.1 +234,0.01929,0.004632,0.439823,0.1 +235,0.036805,0.014261,0.565486,0.1 +236,0.212235,0.057295,0.628318,0.1 +237,0.219506,0.064123,0.879645,0.1 +238,0.219687,0.026939,-0.69115,0.1 +239,0.237594,0.018512,-0.188495,0.1 +240,0.219506,0.064123,0.879645,0.1 +241,0.226748,0.082414,1.507963,0.1 +242,-0.028512,-0.137476,-2.953095,0.1 +243,-0.047871,-0.142446,-2.827431,0.1 +244,0.0,0.0,0.0,0.1 +245,0.019168,-0.004922,-0.502654,0.1 +246,0.237594,0.018512,-0.188495,0.1 +247,0.246964,0.015139,-0.502654,0.1 +248,0.116624,0.048274,-0.251327,0.1 +249,0.136414,0.045774,-0.0,0.1 +250,0.063922,0.178787,1.822122,0.1 +251,0.060177,0.198419,1.696459,0.1 +252,0.001894,0.140843,2.073449,0.1 +253,-0.012446,0.15431,2.701767,0.1 +254,-0.047871,-0.142446,-2.827431,0.1 +255,-0.06592,-0.150939,-2.576104,0.1 +256,0.001894,0.140843,2.073449,0.1 +257,-0.005449,0.15939,1.822122,0.1 +258,0.219506,0.064123,0.879645,0.1 +259,0.226748,0.082414,1.507963,0.1 +260,0.033528,-0.018815,-0.942477,0.1 +261,0.040356,-0.026086,-0.69115,0.1 +262,0.001394,0.116204,3.330085,0.1 +263,-0.015846,0.106727,3.958403,0.1 +264,0.01929,0.004632,0.439823,0.1 +265,0.028047,0.009447,0.565486,0.1 +266,0.019035,-0.005205,-0.565486,0.1 +267,0.037856,-0.011321,-0.062832,0.1 +268,0.0,0.0,0.0,0.1 +269,0.019168,0.004922,0.502654,0.1 +270,-0.06592,-0.150939,-2.576104,0.1 +271,-0.080413,-0.16455,-2.199113,0.1 +272,-0.080413,-0.16455,-2.199113,0.1 +273,-0.085496,-0.173144,-2.010618,0.1 +274,0.048913,0.105548,2.513272,0.1 +275,0.036298,0.120797,2.010618,0.1 +276,0.08975,-0.099265,-1.068141,0.1 +277,0.094839,-0.107871,-1.005309,0.1 +278,0.226748,0.082414,1.507963,0.1 +279,0.229253,0.102243,1.3823,0.1 +280,0.237594,0.018512,-0.188495,0.1 +281,0.257345,0.019755,0.314159,0.1 +282,0.019035,-0.005205,-0.565486,0.1 +283,0.027304,-0.010825,-0.628318,0.1 +284,0.219687,0.026939,-0.69115,0.1 +285,0.227946,0.021326,-0.502654,0.1 +286,-0.012446,0.15431,2.701767,0.1 +287,-0.020867,0.159654,2.45044,0.1 +288,-0.06592,-0.150939,-2.576104,0.1 +289,-0.074526,-0.156029,-2.638936,0.1 +290,0.257345,0.019755,0.314159,0.1 +291,0.266637,0.023434,0.439823,0.1 +292,0.021687,0.116996,3.015926,0.1 +293,0.002366,0.121957,2.764599,0.1 +294,-0.085496,-0.173144,-2.010618,0.1 +295,-0.09084,-0.181565,-2.261945,0.1 +296,0.0,0.0,0.0,0.1 +297,0.009993,-0.000314,-0.062832,0.1 +298,0.036951,0.012634,0.753982,0.1 +299,0.044451,0.019246,0.69115,0.1 +300,-0.09084,-0.181565,-2.261945,0.1 +301,-0.105381,-0.19522,-2.513272,0.1 +302,0.266637,0.023434,0.439823,0.1 +303,0.275545,0.027973,0.502654,0.1 +304,0.094839,-0.107871,-1.005309,0.1 +305,0.107554,-0.12324,-0.753982,0.1 +306,0.055972,-0.087167,-2.136281,0.1 +307,0.045255,-0.104053,-2.136281,0.1 +308,0.036951,0.012634,0.753982,0.1 +309,0.044841,0.018754,0.565486,0.1 +310,0.257345,0.019755,0.314159,0.1 +311,0.267024,0.02224,0.188495,0.1 +312,0.107554,-0.12324,-0.753982,0.1 +313,0.114395,-0.130525,-0.879645,0.1 +314,0.219687,0.026939,-0.69115,0.1 +315,0.226748,0.019878,-0.879645,0.1 +316,0.246964,0.015139,-0.502654,0.1 +317,0.263839,0.00443,-0.628318,0.1 +318,0.267024,0.02224,0.188495,0.1 +319,0.284264,0.031718,0.816813,0.1 +320,0.263839,0.00443,-0.628318,0.1 +321,0.28224,-0.002856,-0.125664,0.1 +322,0.275545,0.027973,0.502654,0.1 +323,0.283804,0.033586,0.69115,0.1 +324,0.226748,0.019878,-0.879645,0.1 +325,0.242067,0.007205,-0.502654,0.1 +326,-0.005449,0.15939,1.822122,0.1 +327,-0.011625,0.178399,1.947786,0.1 +328,0.226748,0.019878,-0.879645,0.1 +329,0.232876,0.011978,-0.942477,0.1 +330,-0.085496,-0.173144,-2.010618,0.1 +331,-0.088878,-0.182539,-1.822122,0.1 +332,0.036951,0.012634,0.753982,0.1 +333,0.048638,0.028718,1.130972,0.1 +334,0.039607,-0.037525,-1.570795,0.1 +335,0.040547,-0.047466,-1.3823,0.1 +336,0.041546,-0.100714,-2.638936,0.1 +337,0.028079,-0.115055,-2.010618,0.1 +338,-0.012446,0.15431,2.701767,0.1 +339,-0.028531,0.165996,2.324777,0.1 +340,0.263839,0.00443,-0.628318,0.1 +341,0.271539,-0.001941,-0.753982,0.1 +342,-0.011625,0.178399,1.947786,0.1 +343,-0.015596,0.187575,2.010618,0.1 +344,-0.005449,0.15939,1.822122,0.1 +345,-0.005449,0.17918,1.319468,0.1 +346,-0.028531,0.165996,2.324777,0.1 +347,-0.035816,0.172837,2.45044,0.1 +348,0.007301,-0.120623,-2.953095,0.1 +349,-0.012528,-0.123128,-3.078758,0.1 +350,0.271539,-0.001941,-0.753982,0.1 +351,0.279776,-0.007538,-0.439823,0.1 +352,-0.015596,0.187575,2.010618,0.1 +353,-0.019274,0.196866,1.884954,0.1 +354,-0.035816,0.172837,2.45044,0.1 +355,-0.054107,0.180079,3.078758,0.1 +356,0.033528,-0.018815,-0.942477,0.1 +357,0.046268,-0.034215,-0.816813,0.1 +358,0.226748,0.082414,1.507963,0.1 +359,0.226748,0.092407,1.633627,0.1 +360,0.283804,0.033586,0.69115,0.1 +361,0.30171,0.042012,0.188495,0.1 +362,0.125897,0.044602,-0.502654,0.1 +363,0.134156,0.03899,-0.69115,0.1 +364,0.125897,0.044602,-0.502654,0.1 +365,0.141216,0.031929,-0.879645,0.1 +366,0.284264,0.031718,0.816813,0.1 +367,0.300973,0.042322,0.314159,0.1 +368,0.033528,-0.018815,-0.942477,0.1 +369,0.045284,-0.034996,-0.942477,0.1 +370,-0.088878,-0.182539,-1.822122,0.1 +371,-0.093852,-0.201911,-1.822122,0.1 +372,-0.093852,-0.201911,-1.822122,0.1 +373,-0.101195,-0.220457,-2.073449,0.1 +374,-0.019274,0.196866,1.884954,0.1 +375,-0.028853,0.214289,2.261945,0.1 +376,0.226748,0.092407,1.633627,0.1 +377,0.226748,0.102401,1.507963,0.1 +378,0.271539,-0.001941,-0.753982,0.1 +379,0.281017,-0.01918,-1.3823,0.1 +380,-0.101195,-0.220457,-2.073449,0.1 +381,-0.106013,-0.22922,-2.073449,0.1 +382,-0.054107,0.180079,3.078758,0.1 +383,-0.063969,0.181642,2.890263,0.1 +384,0.226748,0.092407,1.633627,0.1 +385,0.220632,0.111229,2.136281,0.1 +386,0.30171,0.042012,0.188495,0.1 +387,0.311299,0.044798,0.376991,0.1 +388,0.281017,-0.01918,-1.3823,0.1 +389,0.288336,-0.037665,-1.005309,0.1 +390,0.009895,-0.00125,-0.251327,0.1 +391,0.01979,-0.0025,0.0,0.1 +392,0.041546,-0.100714,-2.638936,0.1 +393,0.03294,-0.105804,-2.576104,0.1 +394,0.288336,-0.037665,-1.005309,0.1 +395,0.293425,-0.046271,-1.068141,0.1 +396,0.220632,0.111229,2.136281,0.1 +397,0.214758,0.119314,2.261945,0.1 +398,-0.080413,-0.16455,-2.199113,0.1 +399,-0.087241,-0.17182,-2.45044,0.1 +400,-0.028853,0.214289,2.261945,0.1 +401,-0.039541,0.231131,2.010618,0.1 +402,0.007301,-0.120623,-2.953095,0.1 +403,-0.01167,-0.126787,-2.701767,0.1 +404,0.009895,-0.00125,-0.251327,0.1 +405,0.01979,-0.0025,0.0,0.1 +406,0.311299,0.044798,0.376991,0.1 +407,0.320039,0.049602,0.628318,0.1 +408,0.0,0.0,0.0,0.1 +409,0.009974,0.000627,0.125664,0.1 +410,-0.106013,-0.22922,-2.073449,0.1 +411,-0.111625,-0.237479,-2.261945,0.1 +412,-0.005449,0.17918,1.319468,0.1 +413,-0.0042,0.199023,1.696459,0.1 +414,-0.005449,0.17918,1.319468,0.1 +415,-0.003267,0.188938,1.3823,0.1 +416,-0.111625,-0.237479,-2.261945,0.1 +417,-0.122314,-0.254321,-2.010618,0.1 +418,0.066564,0.071151,1.75929,0.1 +419,0.067806,0.090902,1.256636,0.1 +420,-0.122314,-0.254321,-2.010618,0.1 +421,-0.126022,-0.273761,-1.507963,0.1 +422,-0.126022,-0.273761,-1.507963,0.1 +423,-0.127274,-0.293669,-1.75929,0.1 +424,0.041546,-0.100714,-2.638936,0.1 +425,0.033477,-0.106576,-2.387608,0.1 +426,-0.028531,0.165996,2.324777,0.1 +427,-0.040256,0.182134,2.073449,0.1 +428,0.214758,0.119314,2.261945,0.1 +429,0.209689,0.127886,1.947786,0.1 +430,-0.003267,0.188938,1.3823,0.1 +431,-0.000185,0.198423,1.130972,0.1 +432,0.220632,0.111229,2.136281,0.1 +433,0.205474,0.123769,2.764599,0.1 +434,0.214758,0.119314,2.261945,0.1 +435,0.206332,0.13722,1.75929,0.1 +436,-0.039541,0.231131,2.010618,0.1 +437,-0.043249,0.250571,1.507963,0.1 +438,0.281017,-0.01918,-1.3823,0.1 +439,0.281957,-0.029121,-1.570795,0.1 +440,-0.126022,-0.273761,-1.507963,0.1 +441,-0.124769,-0.283675,-1.3823,0.1 +442,0.281017,-0.01918,-1.3823,0.1 +443,0.282269,-0.039088,-1.633627,0.1 +444,-0.043249,0.250571,1.507963,0.1 +445,-0.04138,0.260368,1.256636,0.1 +446,0.311299,0.044798,0.376991,0.1 +447,0.330829,0.048523,-0.0,0.1 +448,0.064442,0.080469,2.073449,0.1 +449,0.058829,0.088727,2.261945,0.1 +450,0.019168,0.004922,0.502654,0.1 +451,0.033595,0.018469,1.005309,0.1 +452,0.114395,-0.130525,-0.879645,0.1 +453,0.119739,-0.138946,-1.130972,0.1 +454,-0.127274,-0.293669,-1.75929,0.1 +455,-0.12976,-0.303348,-1.884954,0.1 +456,0.330829,0.048523,-0.0,0.1 +457,0.340822,0.048209,-0.062832,0.1 +458,-0.04138,0.260368,1.256636,0.1 +459,-0.032887,0.278417,1.005309,0.1 +460,0.320039,0.049602,0.628318,0.1 +461,0.33458,0.063257,0.879645,0.1 +462,-0.032887,0.278417,1.005309,0.1 +463,-0.028073,0.287174,1.130972,0.1 +464,-0.032887,0.278417,1.005309,0.1 +465,-0.027797,0.287023,1.068141,0.1 +466,0.040039,0.110069,2.827431,0.1 +467,0.030875,0.114035,2.638936,0.1 +468,0.141216,0.031929,-0.879645,0.1 +469,0.146286,0.023357,-1.193804,0.1 +470,-0.032887,0.278417,1.005309,0.1 +471,-0.024394,0.296466,1.256636,0.1 +472,0.33458,0.063257,0.879645,0.1 +473,0.346328,0.079427,1.005309,0.1 +474,0.346328,0.079427,1.005309,0.1 +475,0.357045,0.096314,1.005309,0.1 +476,-0.032887,0.278417,1.005309,0.1 +477,-0.027267,0.286686,0.942477,0.1 +478,0.033595,0.018469,1.005309,0.1 +479,0.042088,0.036518,1.256636,0.1 +480,0.357045,0.096314,1.005309,0.1 +481,0.362665,0.104583,0.942477,0.1 +482,-0.124769,-0.283675,-1.3823,0.1 +483,-0.123517,-0.303583,-1.633627,0.1 +484,0.214758,0.119314,2.261945,0.1 +485,0.201076,0.133884,2.387608,0.1 +486,-0.027267,0.286686,0.942477,0.1 +487,-0.020664,0.294176,0.753982,0.1 +488,0.346328,0.079427,1.005309,0.1 +489,0.351418,0.088033,1.068141,0.1 +490,0.205474,0.123769,2.764599,0.1 +491,0.186466,0.129945,2.890263,0.1 +492,-0.124769,-0.283675,-1.3823,0.1 +493,-0.121984,-0.293264,-1.193804,0.1 +494,0.040039,0.110069,2.827431,0.1 +495,0.030242,0.111938,3.078758,0.1 +496,0.293425,-0.046271,-1.068141,0.1 +497,0.300769,-0.064818,-1.319468,0.1 +498,-0.020664,0.294176,0.753982,0.1 +499,-0.002863,0.302552,0.125664,0.1 +500,0.282269,-0.039088,-1.633627,0.1 +501,0.282896,-0.049042,-1.3823,0.1 +502,-0.063969,0.181642,2.890263,0.1 +503,-0.083759,0.181642,3.392917,0.1 +504,0.220632,0.111229,2.136281,0.1 +505,0.212139,0.129278,1.884954,0.1 +506,0.351418,0.088033,1.068141,0.1 +507,0.355957,0.096942,1.130972,0.1 +508,-0.083759,0.181642,3.392917,0.1 +509,-0.103602,0.180393,3.015926,0.1 +510,-0.002863,0.302552,0.125664,0.1 +511,0.016045,0.308696,0.502654,0.1 +512,-0.12976,-0.303348,-1.884954,0.1 +513,-0.140364,-0.320058,-2.387608,0.1 +514,-0.121984,-0.293264,-1.193804,0.1 +515,-0.119198,-0.302853,-1.3823,0.1 +516,-0.140364,-0.320058,-2.387608,0.1 +517,-0.155764,-0.332798,-2.513272,0.1 +518,-0.028853,0.214289,2.261945,0.1 +519,-0.035465,0.221789,2.324777,0.1 +520,-0.103602,0.180393,3.015926,0.1 +521,-0.113576,0.180393,3.267254,0.1 +522,0.340822,0.048209,-0.062832,0.1 +523,0.350776,0.047268,-0.125664,0.1 +524,0.220632,0.111229,2.136281,0.1 +525,0.213313,0.129715,1.75929,0.1 +526,-0.121984,-0.293264,-1.193804,0.1 +527,-0.118013,-0.30244,-1.130972,0.1 +528,0.346328,0.079427,1.005309,0.1 +529,0.350861,0.088324,1.193804,0.1 +530,-0.002863,0.302552,0.125664,0.1 +531,0.006881,0.30473,0.314159,0.1 +532,0.201076,0.133884,2.387608,0.1 +533,0.194473,0.141374,2.199113,0.1 +534,-0.103602,0.180393,3.015926,0.1 +535,-0.123236,0.177913,3.518581,0.1 +536,0.300769,-0.064818,-1.319468,0.1 +537,0.310303,-0.08216,-0.816813,0.1 +538,-0.12976,-0.303348,-1.884954,0.1 +539,-0.13285,-0.312859,-1.884954,0.1 +540,-0.002863,0.302552,0.125664,0.1 +541,0.016771,0.300072,-0.376991,0.1 +542,-0.118013,-0.30244,-1.130972,0.1 +543,-0.112669,-0.310861,-0.879645,0.1 +544,-0.112669,-0.310861,-0.879645,0.1 +545,-0.107324,-0.319282,-1.130972,0.1 +546,0.281957,-0.029121,-1.570795,0.1 +547,0.282896,-0.039062,-1.3823,0.1 +548,-0.103602,0.180393,3.015926,0.1 +549,-0.113477,0.181957,2.953095,0.1 +550,-0.074526,-0.156029,-2.638936,0.1 +551,-0.082395,-0.162133,-2.324777,0.1 +552,0.016771,0.300072,-0.376991,0.1 +553,0.025343,0.295002,-0.69115,0.1 +554,-0.002863,0.302552,0.125664,0.1 +555,0.016457,0.307513,0.376991,0.1 +556,-0.112669,-0.310861,-0.879645,0.1 +557,-0.106795,-0.318946,-1.005309,0.1 +558,-0.13285,-0.312859,-1.884954,0.1 +559,-0.13782,-0.332218,-1.75929,0.1 +560,-0.155764,-0.332798,-2.513272,0.1 +561,-0.164637,-0.337319,-2.827431,0.1 +562,-0.043249,0.250571,1.507963,0.1 +563,-0.043563,0.260551,1.696459,0.1 +564,0.362665,0.104583,0.942477,0.1 +565,0.368019,0.113021,1.068141,0.1 +566,-0.164637,-0.337319,-2.827431,0.1 +567,-0.184362,-0.339811,-3.204422,0.1 +568,-0.112669,-0.310861,-0.879645,0.1 +569,-0.106795,-0.318946,-1.005309,0.1 +570,-0.043563,0.260551,1.696459,0.1 +571,-0.048523,0.279872,1.947786,0.1 +572,0.362665,0.104583,0.942477,0.1 +573,0.37858,0.116146,0.314159,0.1 +574,-0.184362,-0.339811,-3.204422,0.1 +575,-0.194356,-0.339811,-3.078758,0.1 +576,-0.113477,0.181957,2.953095,0.1 +577,-0.122847,0.185331,2.638936,0.1 +578,-0.155764,-0.332798,-2.513272,0.1 +579,-0.163034,-0.339625,-2.261945,0.1 +580,-0.112669,-0.310861,-0.879645,0.1 +581,-0.104242,-0.328768,-1.3823,0.1 +582,0.025343,0.295002,-0.69115,0.1 +583,0.032843,0.28839,-0.753982,0.1 +584,0.282269,-0.039088,-1.633627,0.1 +585,0.285978,-0.058527,-1.130972,0.1 +586,0.016045,0.308696,0.502654,0.1 +587,0.025209,0.312662,0.314159,0.1 +588,-0.002863,0.302552,0.125664,0.1 +589,0.00711,0.30318,-0.0,0.1 +590,0.300769,-0.064818,-1.319468,0.1 +591,0.30295,-0.074576,-1.3823,0.1 +592,0.282269,-0.039088,-1.633627,0.1 +593,0.280401,-0.048885,-1.884954,0.1 +594,0.350776,0.047268,-0.125664,0.1 +595,0.370723,0.046013,-0.0,0.1 +596,0.368019,0.113021,1.068141,0.1 +597,0.377654,0.130547,1.068141,0.1 +598,-0.048523,0.279872,1.947786,0.1 +599,-0.057033,0.297956,2.073449,0.1 +600,0.280401,-0.048885,-1.884954,0.1 +601,0.276435,-0.058049,-2.073449,0.1 +602,0.377654,0.130547,1.068141,0.1 +603,0.391995,0.144014,0.439823,0.1 +604,0.391995,0.144014,0.439823,0.1 +605,0.411513,0.146479,-0.188495,0.1 +606,-0.112669,-0.310861,-0.879645,0.1 +607,-0.096058,-0.321402,-0.251327,0.1 +608,-0.155764,-0.332798,-2.513272,0.1 +609,-0.171164,-0.345538,-2.387608,0.1 +610,-0.194356,-0.339811,-3.078758,0.1 +611,-0.214185,-0.342316,-2.953095,0.1 +612,-0.096058,-0.321402,-0.251327,0.1 +613,-0.086196,-0.322964,-0.062832,0.1 +614,-0.171164,-0.345538,-2.387608,0.1 +615,-0.178864,-0.351908,-2.513272,0.1 +616,0.391995,0.144014,0.439823,0.1 +617,0.410092,0.152529,0.439823,0.1 +618,0.30295,-0.074576,-1.3823,0.1 +619,0.311376,-0.092482,-0.879645,0.1 +620,0.411513,0.146479,-0.188495,0.1 +621,0.421192,0.143994,-0.314159,0.1 +622,0.30295,-0.074576,-1.3823,0.1 +623,0.306697,-0.094221,-1.3823,0.1 +624,-0.104242,-0.328768,-1.3823,0.1 +625,-0.105485,-0.348519,-1.884954,0.1 +626,-0.086196,-0.322964,-0.062832,0.1 +627,-0.076281,-0.322027,0.251327,0.1 +628,0.421192,0.143994,-0.314159,0.1 +629,0.430217,0.139748,-0.565486,0.1 +630,0.370723,0.046013,-0.0,0.1 +631,0.380697,0.046641,0.125664,0.1 +632,-0.106795,-0.318946,-1.005309,0.1 +633,-0.097166,-0.336461,-1.130972,0.1 +634,0.430217,0.139748,-0.565486,0.1 +635,0.438301,0.133874,-0.69115,0.1 +636,0.438301,0.133874,-0.69115,0.1 +637,0.446723,0.128529,-0.439823,0.1 +638,-0.076281,-0.322027,0.251327,0.1 +639,-0.067008,-0.318356,0.502654,0.1 +640,0.410092,0.152529,0.439823,0.1 +641,0.418849,0.157344,0.565486,0.1 +642,0.276435,-0.058049,-2.073449,0.1 +643,0.27218,-0.067091,-1.947786,0.1 +644,0.438301,0.133874,-0.69115,0.1 +645,0.446386,0.128,-0.565486,0.1 +646,-0.020664,0.294176,0.753982,0.1 +647,-0.003877,0.304829,0.376991,0.1 +648,-0.067008,-0.318356,0.502654,0.1 +649,-0.058402,-0.313266,0.565486,0.1 +650,0.446723,0.128529,-0.439823,0.1 +651,0.465694,0.122365,-0.188495,0.1 +652,-0.178864,-0.351908,-2.513272,0.1 +653,-0.197264,-0.359193,-3.015926,0.1 +654,0.418849,0.157344,0.565486,0.1 +655,0.427746,0.161877,0.376991,0.1 +656,0.465694,0.122365,-0.188495,0.1 +657,0.484179,0.115046,-0.565486,0.1 +658,0.438301,0.133874,-0.69115,0.1 +659,0.446723,0.128529,-0.439823,0.1 +660,0.484179,0.115046,-0.565486,0.1 +661,0.491864,0.108689,-0.816813,0.1 +662,-0.067008,-0.318356,0.502654,0.1 +663,-0.053541,-0.304015,1.130972,0.1 +664,0.276435,-0.058049,-2.073449,0.1 +665,0.270291,-0.076958,-1.696459,0.1 +666,-0.122847,0.185331,2.638936,0.1 +667,-0.141394,0.192674,2.890263,0.1 +668,-0.13782,-0.332218,-1.75929,0.1 +669,-0.142791,-0.351577,-1.884954,0.1 +670,0.377654,0.130547,1.068141,0.1 +671,0.390328,0.145866,0.69115,0.1 +672,-0.086196,-0.322964,-0.062832,0.1 +673,-0.076242,-0.323905,-0.125664,0.1 +674,-0.032887,0.278417,1.005309,0.1 +675,-0.026772,0.297238,1.507963,0.1 +676,0.465694,0.122365,-0.188495,0.1 +677,0.475635,0.121426,-0.0,0.1 +678,-0.057033,0.297956,2.073449,0.1 +679,-0.062896,0.306025,2.324777,0.1 +680,0.475635,0.121426,-0.0,0.1 +681,0.485628,0.121112,-0.062832,0.1 +682,-0.053541,-0.304015,1.130972,0.1 +683,-0.049833,-0.284575,1.633627,0.1 +684,-0.214185,-0.342316,-2.953095,0.1 +685,-0.223864,-0.344801,-2.827431,0.1 +686,0.025209,0.312662,0.314159,0.1 +687,0.035006,0.314531,0.062832,0.1 +688,-0.178864,-0.351908,-2.513272,0.1 +689,-0.194264,-0.364648,-2.387608,0.1 +690,0.025343,0.295002,-0.69115,0.1 +691,0.036975,0.278992,-1.193804,0.1 +692,-0.223864,-0.344801,-2.827431,0.1 +693,-0.233544,-0.347287,-2.953095,0.1 +694,0.205474,0.123769,2.764599,0.1 +695,0.196902,0.128838,2.45044,0.1 +696,-0.067008,-0.318356,0.502654,0.1 +697,-0.05857,-0.313001,0.628318,0.1 +698,0.491864,0.108689,-0.816813,0.1 +699,0.497726,0.10062,-1.068141,0.1 +700,-0.020664,0.294176,0.753982,0.1 +701,-0.012964,0.300546,0.628318,0.1 +702,0.036975,0.278992,-1.193804,0.1 +703,0.039761,0.269403,-1.3823,0.1 +704,-0.197264,-0.359193,-3.015926,0.1 +705,-0.216897,-0.362938,-2.890263,0.1 +706,-0.216897,-0.362938,-2.890263,0.1 +707,-0.22617,-0.36661,-2.638936,0.1 +708,0.036975,0.278992,-1.193804,0.1 +709,0.046585,0.261512,-0.942477,0.1 +710,-0.142791,-0.351577,-1.884954,0.1 +711,-0.152369,-0.368999,-2.261945,0.1 +712,-0.026772,0.297238,1.507963,0.1 +713,-0.027085,0.307218,1.696459,0.1 +714,0.418849,0.157344,0.565486,0.1 +715,0.432396,0.17177,1.068141,0.1 +716,0.497726,0.10062,-1.068141,0.1 +717,0.503589,0.092551,-0.816813,0.1 +718,-0.096058,-0.321402,-0.251327,0.1 +719,-0.076268,-0.323902,0.0,0.1 +720,0.276435,-0.058049,-2.073449,0.1 +721,0.272749,-0.077373,-1.445131,0.1 +722,0.497726,0.10062,-1.068141,0.1 +723,0.502816,0.092014,-1.005309,0.1 +724,0.025343,0.295002,-0.69115,0.1 +725,0.032843,0.28839,-0.753982,0.1 +726,0.497726,0.10062,-1.068141,0.1 +727,0.501398,0.091347,-1.319468,0.1 +728,0.484179,0.115046,-0.565486,0.1 +729,0.501066,0.10433,-0.565486,0.1 +730,-0.027085,0.307218,1.696459,0.1 +731,-0.027085,0.317192,1.445131,0.1 +732,-0.027085,0.317192,1.445131,0.1 +733,-0.02583,0.33714,1.570795,0.1 +734,-0.002863,0.302552,0.125664,0.1 +735,0.016045,0.308696,0.502654,0.1 +736,0.497726,0.10062,-1.068141,0.1 +737,0.502816,0.092014,-1.005309,0.1 +738,0.432396,0.17177,1.068141,0.1 +739,0.436935,0.180679,1.130972,0.1 +740,0.485628,0.121112,-0.062832,0.1 +741,0.495621,0.121112,0.062832,0.1 +742,0.495621,0.121112,0.062832,0.1 +743,0.515061,0.117403,-0.439823,0.1 +744,-0.121984,-0.293264,-1.193804,0.1 +745,-0.117179,-0.302004,-0.942477,0.1 +746,0.495621,0.121112,0.062832,0.1 +747,0.505615,0.121426,-0.0,0.1 +748,-0.053541,-0.304015,1.130972,0.1 +749,-0.048458,-0.29542,0.942477,0.1 +750,0.515061,0.117403,-0.439823,0.1 +751,0.524237,0.113432,-0.376991,0.1 +752,-0.067008,-0.318356,0.502654,0.1 +753,-0.048099,-0.312212,0.125664,0.1 +754,-0.062896,0.306025,2.324777,0.1 +755,-0.080135,0.315503,2.953095,0.1 +756,0.501398,0.091347,-1.319468,0.1 +757,0.508741,0.0728,-1.068141,0.1 +758,0.436935,0.180679,1.130972,0.1 +759,0.4431,0.19965,1.3823,0.1 +760,0.039761,0.269403,-1.3823,0.1 +761,0.04708,0.250918,-1.005309,0.1 +762,-0.080135,0.315503,2.953095,0.1 +763,-0.100043,0.316755,3.204422,0.1 +764,-0.122847,0.185331,2.638936,0.1 +765,-0.131453,0.19042,2.576104,0.1 +766,-0.053541,-0.304015,1.130972,0.1 +767,-0.048727,-0.295258,1.005309,0.1 +768,0.501398,0.091347,-1.319468,0.1 +769,0.503898,0.071557,-1.570795,0.1 +770,-0.112669,-0.310861,-0.879645,0.1 +771,-0.106795,-0.318946,-1.005309,0.1 +772,-0.097166,-0.336461,-1.130972,0.1 +773,-0.092627,-0.345369,-1.068141,0.1 +774,0.524237,0.113432,-0.376991,0.1 +775,0.533741,0.110344,-0.251327,0.1 +776,0.533741,0.110344,-0.251327,0.1 +777,0.543604,0.108782,-0.062832,0.1 +778,-0.100043,0.316755,3.204422,0.1 +779,-0.119483,0.320464,2.701767,0.1 +780,0.533741,0.110344,-0.251327,0.1 +781,0.553375,0.11158,0.376991,0.1 +782,0.503898,0.071557,-1.570795,0.1 +783,0.505456,0.06172,-1.256636,0.1 +784,-0.22617,-0.36661,-2.638936,0.1 +785,-0.245339,-0.371532,-3.14159,0.1 +786,-0.086196,-0.322964,-0.062832,0.1 +787,-0.066288,-0.321712,0.188495,0.1 +788,-0.119483,0.320464,2.701767,0.1 +789,-0.135567,0.33215,2.324777,0.1 +790,-0.049833,-0.284575,1.633627,0.1 +791,-0.051085,-0.274661,1.75929,0.1 +792,-0.076281,-0.322027,0.251327,0.1 +793,-0.066386,-0.320777,0.0,0.1 +794,0.503898,0.071557,-1.570795,0.1 +795,0.505153,0.051609,-1.445131,0.1 +796,-0.002863,0.302552,0.125664,0.1 +797,0.007012,0.304116,0.188495,0.1 +798,0.553375,0.11158,0.376991,0.1 +799,0.561947,0.116649,0.69115,0.1 +800,0.503898,0.071557,-1.570795,0.1 +801,0.505148,0.061661,-1.319468,0.1 +802,0.039761,0.269403,-1.3823,0.1 +803,0.040701,0.259462,-1.570795,0.1 +804,0.561947,0.116649,0.69115,0.1 +805,0.576517,0.130331,0.816813,0.1 +806,-0.122314,-0.254321,-2.010618,0.1 +807,-0.126284,-0.263497,-1.947786,0.1 +808,-0.092627,-0.345369,-1.068141,0.1 +809,-0.078286,-0.358836,-0.439823,0.1 +810,0.576517,0.130331,0.816813,0.1 +811,0.582887,0.138031,0.942477,0.1 +812,-0.078286,-0.358836,-0.439823,0.1 +813,-0.070049,-0.364434,-0.753982,0.1 +814,0.505153,0.051609,-1.445131,0.1 +815,0.503905,0.031767,-1.822122,0.1 +816,-0.053541,-0.304015,1.130972,0.1 +817,-0.048197,-0.295594,0.879645,0.1 +818,-0.049833,-0.284575,1.633627,0.1 +819,-0.04858,-0.264667,1.3823,0.1 +820,0.508741,0.0728,-1.068141,0.1 +821,0.51328,0.063891,-1.130972,0.1 +822,-0.003877,0.304829,0.376991,0.1 +823,0.00502,0.309362,0.565486,0.1 +824,-0.049833,-0.284575,1.633627,0.1 +825,-0.049519,-0.274595,1.445131,0.1 +826,-0.096058,-0.321402,-0.251327,0.1 +827,-0.077512,-0.328745,-0.502654,0.1 +828,0.501398,0.091347,-1.319468,0.1 +829,0.501398,0.071557,-1.822122,0.1 +830,0.533741,0.110344,-0.251327,0.1 +831,0.553531,0.110344,0.251327,0.1 +832,0.501398,0.071557,-1.822122,0.1 +833,0.497727,0.062283,-2.073449,0.1 +834,-0.135567,0.33215,2.324777,0.1 +835,-0.151652,0.343836,2.701767,0.1 +836,0.582887,0.138031,0.942477,0.1 +837,0.588507,0.1463,1.005309,0.1 +838,0.025343,0.295002,-0.69115,0.1 +839,0.031929,0.287532,-1.005309,0.1 +840,-0.112669,-0.310861,-0.879645,0.1 +841,-0.096658,-0.322494,-0.376991,0.1 +842,-0.051085,-0.274661,1.75929,0.1 +843,-0.052649,-0.264785,1.696459,0.1 +844,-0.070049,-0.364434,-0.753982,0.1 +845,-0.062159,-0.370554,-0.565486,0.1 +846,-0.151652,0.343836,2.701767,0.1 +847,-0.170235,0.351194,2.827431,0.1 +848,-0.22617,-0.36661,-2.638936,0.1 +849,-0.235444,-0.370282,-2.890263,0.1 +850,-0.078286,-0.358836,-0.439823,0.1 +851,-0.068994,-0.362515,-0.314159,0.1 +852,-0.053541,-0.304015,1.130972,0.1 +853,-0.049862,-0.294723,1.256636,0.1 +854,-0.170235,0.351194,2.827431,0.1 +855,-0.17926,0.35544,2.576104,0.1 +856,-0.05857,-0.313001,0.628318,0.1 +857,-0.040581,-0.304536,0.251327,0.1 +858,-0.068994,-0.362515,-0.314159,0.1 +859,-0.059484,-0.365605,-0.314159,0.1 +860,-0.059484,-0.365605,-0.314159,0.1 +861,-0.050076,-0.368992,-0.376991,0.1 +862,0.588507,0.1463,1.005309,0.1 +863,0.59304,0.155197,1.193804,0.1 +864,-0.17926,0.35544,2.576104,0.1 +865,-0.198081,0.361556,3.078758,0.1 +866,0.533741,0.110344,-0.251327,0.1 +867,0.543636,0.109094,-0.0,0.1 +868,-0.053541,-0.304015,1.130972,0.1 +869,-0.051076,-0.284497,1.75929,0.1 +870,-0.22617,-0.36661,-2.638936,0.1 +871,-0.244717,-0.373953,-2.890263,0.1 +872,0.59304,0.155197,1.193804,0.1 +873,0.595826,0.164786,1.3823,0.1 +874,-0.051076,-0.284497,1.75929,0.1 +875,-0.04861,-0.26498,1.130972,0.1 +876,0.497727,0.062283,-2.073449,0.1 +877,0.492114,0.054025,-2.261945,0.1 +878,-0.012964,0.300546,0.628318,0.1 +879,0.003217,0.312302,0.628318,0.1 +880,-0.053541,-0.304015,1.130972,0.1 +881,-0.051076,-0.284497,1.75929,0.1 +882,0.492114,0.054025,-2.261945,0.1 +883,0.476104,0.042392,-2.764599,0.1 +884,0.588507,0.1463,1.005309,0.1 +885,0.595826,0.164786,1.3823,0.1 +886,-0.051076,-0.284497,1.75929,0.1 +887,-0.059502,-0.266591,2.261945,0.1 +888,0.588507,0.1463,1.005309,0.1 +889,0.600255,0.16247,0.879645,0.1 +890,-0.096658,-0.322494,-0.376991,0.1 +891,-0.087761,-0.327027,-0.565486,0.1 +892,0.600255,0.16247,0.879645,0.1 +893,0.616265,0.174102,0.376991,0.1 +894,-0.053541,-0.304015,1.130972,0.1 +895,-0.045026,-0.285918,1.130972,0.1 +896,0.616265,0.174102,0.376991,0.1 +897,0.633745,0.183712,0.628318,0.1 +898,-0.051076,-0.284497,1.75929,0.1 +899,-0.056046,-0.265138,1.884954,0.1 +900,0.616265,0.174102,0.376991,0.1 +901,0.631423,0.186642,1.005309,0.1 +902,-0.197264,-0.359193,-3.015926,0.1 +903,-0.216897,-0.362938,-2.890263,0.1 +904,0.616265,0.174102,0.376991,0.1 +905,0.625162,0.178636,0.565486,0.1 +906,0.040701,0.259462,-1.570795,0.1 +907,0.0382,0.239672,-1.822122,0.1 +908,0.040701,0.259462,-1.570795,0.1 +909,0.04164,0.249521,-1.3823,0.1 +910,-0.078286,-0.358836,-0.439823,0.1 +911,-0.06911,-0.362807,-0.376991,0.1 +912,0.503905,0.031767,-1.822122,0.1 +913,0.497729,0.012758,-1.947786,0.1 +914,0.031929,0.287532,-1.005309,0.1 +915,0.037287,0.279089,-1.005309,0.1 +916,-0.032887,0.278417,1.005309,0.1 +917,-0.021139,0.294586,0.879645,0.1 +918,-0.050076,-0.368992,-0.376991,0.1 +919,-0.041179,-0.373525,-0.565486,0.1 +920,0.616265,0.174102,0.376991,0.1 +921,0.625162,0.178636,0.565486,0.1 +922,-0.059502,-0.266591,2.261945,0.1 +923,-0.073184,-0.252021,2.387608,0.1 +924,-0.17926,0.35544,2.576104,0.1 +925,-0.187529,0.36106,2.513272,0.1 +926,-0.051076,-0.284497,1.75929,0.1 +927,-0.051702,-0.274543,1.507963,0.1 +928,0.497729,0.012758,-1.947786,0.1 +929,0.493758,0.003582,-2.010618,0.1 +930,-0.187529,0.36106,2.513272,0.1 +931,-0.195019,0.367664,2.324777,0.1 +932,-0.195019,0.367664,2.324777,0.1 +933,-0.202509,0.374267,2.513272,0.1 +934,0.616265,0.174102,0.376991,0.1 +935,0.625985,0.176275,0.062832,0.1 +936,0.306697,-0.094221,-1.3823,0.1 +937,0.30795,-0.104136,-1.507963,0.1 +938,-0.202509,0.374267,2.513272,0.1 +939,-0.219989,0.383877,2.764599,0.1 +940,-0.067008,-0.318356,0.502654,0.1 +941,-0.057735,-0.314684,0.251327,0.1 +942,0.633745,0.183712,0.628318,0.1 +943,0.640788,0.190754,0.942477,0.1 +944,0.025343,0.295002,-0.69115,0.1 +945,0.033048,0.288628,-0.69115,0.1 +946,0.640788,0.190754,0.942477,0.1 +947,0.646665,0.198844,0.942477,0.1 +948,-0.051076,-0.284497,1.75929,0.1 +949,-0.052015,-0.274557,1.570795,0.1 +950,-0.041179,-0.373525,-0.565486,0.1 +951,-0.032422,-0.378339,-0.439823,0.1 +952,-0.219989,0.383877,2.764599,0.1 +953,-0.229031,0.388132,2.638936,0.1 +954,-0.244717,-0.373953,-2.890263,0.1 +955,-0.263264,-0.381296,-2.638936,0.1 +956,-0.263264,-0.381296,-2.638936,0.1 +957,-0.272634,-0.38467,-2.953095,0.1 +958,-0.027267,0.286686,0.942477,0.1 +959,-0.021389,0.294776,0.942477,0.1 +960,-0.272634,-0.38467,-2.953095,0.1 +961,-0.292385,-0.383427,-3.455749,0.1 +962,-0.292385,-0.383427,-3.455749,0.1 +963,-0.302064,-0.380942,-3.330085,0.1 +964,-0.229031,0.388132,2.638936,0.1 +965,-0.244351,0.400805,2.261945,0.1 +966,-0.302064,-0.380942,-3.330085,0.1 +967,-0.321893,-0.378437,-3.204422,0.1 +968,-0.067008,-0.318356,0.502654,0.1 +969,-0.05857,-0.313001,0.628318,0.1 +970,0.016771,0.300072,-0.376991,0.1 +971,0.026178,0.296685,-0.314159,0.1 +972,0.646665,0.198844,0.942477,0.1 +973,0.659405,0.214244,0.816813,0.1 +974,-0.041179,-0.373525,-0.565486,0.1 +975,-0.027632,-0.387951,-1.068141,0.1 +976,0.493758,0.003582,-2.010618,0.1 +977,0.490375,-0.005813,-1.822122,0.1 +978,0.659405,0.214244,0.816813,0.1 +979,0.674775,0.226959,0.565486,0.1 +980,-0.04138,0.260368,1.256636,0.1 +981,-0.04138,0.28004,1.884954,0.1 +982,0.674775,0.226959,0.565486,0.1 +983,0.691662,0.237676,0.565486,0.1 +984,-0.027632,-0.387951,-1.068141,0.1 +985,-0.02177,-0.39602,-0.816813,0.1 +986,-0.059502,-0.266591,2.261945,0.1 +987,-0.06908,-0.249168,1.884954,0.1 +988,-0.263264,-0.381296,-2.638936,0.1 +989,-0.280139,-0.392006,-2.513272,0.1 +990,-0.244351,0.400805,2.261945,0.1 +991,-0.250963,0.408305,2.324777,0.1 +992,0.501398,0.071557,-1.822122,0.1 +993,0.498898,0.051766,-1.570795,0.1 +994,0.490375,-0.005813,-1.822122,0.1 +995,0.485402,-0.025185,-1.822122,0.1 +996,-0.321893,-0.378437,-3.204422,0.1 +997,-0.341723,-0.375932,-3.330085,0.1 +998,-0.051076,-0.284497,1.75929,0.1 +999,-0.052015,-0.274557,1.570795,0.1 +1000,-0.250963,0.408305,2.324777,0.1 +1001,-0.266332,0.42102,2.576104,0.1 +1002,-0.266332,0.42102,2.576104,0.1 +1003,-0.284381,0.429513,2.827431,0.1 +1004,0.691662,0.237676,0.565486,0.1 +1005,0.699747,0.24355,0.69115,0.1 +1006,-0.02177,-0.39602,-0.816813,0.1 +1007,-0.014485,-0.402861,-0.69115,0.1 +1008,-0.096058,-0.321402,-0.251327,0.1 +1009,-0.086663,-0.324785,-0.439823,0.1 +1010,-0.341723,-0.375932,-3.330085,0.1 +1011,-0.351677,-0.375306,-3.078758,0.1 +1012,-0.059502,-0.266591,2.261945,0.1 +1013,-0.066772,-0.259763,2.513272,0.1 +1014,0.501398,0.071557,-1.822122,0.1 +1015,0.501398,0.051766,-1.319468,0.1 +1016,0.699747,0.24355,0.69115,0.1 +1017,0.716589,0.254238,0.439823,0.1 +1018,-0.066772,-0.259763,2.513272,0.1 +1019,-0.084252,-0.250153,2.764599,0.1 +1020,0.595826,0.164786,1.3823,0.1 +1021,0.598311,0.174466,1.256636,0.1 +1022,0.501398,0.071557,-1.822122,0.1 +1023,0.497727,0.062283,-2.073449,0.1 +1024,-0.280139,-0.392006,-2.513272,0.1 +1025,-0.298539,-0.399291,-3.015926,0.1 +1026,-0.066772,-0.259763,2.513272,0.1 +1027,-0.074043,-0.252936,2.261945,0.1 +1028,-0.250963,0.408305,2.324777,0.1 +1029,-0.261616,0.425092,1.947786,0.1 +1030,-0.351677,-0.375306,-3.078758,0.1 +1031,-0.36167,-0.375306,-3.204422,0.1 +1032,-0.078286,-0.358836,-0.439823,0.1 +1033,-0.069238,-0.363094,-0.439823,0.1 +1034,0.59304,0.155197,1.193804,0.1 +1035,0.597295,0.16424,1.068141,0.1 +1036,0.485402,-0.025185,-1.822122,0.1 +1037,0.482314,-0.034689,-1.947786,0.1 +1038,-0.284381,0.429513,2.827431,0.1 +1039,-0.293406,0.43376,2.576104,0.1 +1040,-0.261616,0.425092,1.947786,0.1 +1041,-0.273248,0.441102,2.45044,0.1 +1042,-0.088878,-0.182539,-1.822122,0.1 +1043,-0.099419,-0.199149,-2.45044,0.1 +1044,-0.051076,-0.284497,1.75929,0.1 +1045,-0.05724,-0.265526,2.010618,0.1 +1046,-0.117179,-0.302004,-0.942477,0.1 +1047,-0.110575,-0.309494,-0.753982,0.1 +1048,-0.053541,-0.304015,1.130972,0.1 +1049,-0.042853,-0.287173,0.879645,0.1 +1050,0.476104,0.042392,-2.764599,0.1 +1051,0.456574,0.038667,-3.14159,0.1 +1052,-0.068994,-0.362515,-0.314159,0.1 +1053,-0.052285,-0.373119,-0.816813,0.1 +1054,0.0382,0.239672,-1.822122,0.1 +1055,0.035714,0.229986,-1.822122,0.1 +1056,-0.261616,0.425092,1.947786,0.1 +1057,-0.274156,0.44025,2.576104,0.1 +1058,-0.032422,-0.378339,-0.439823,0.1 +1059,-0.023828,-0.383422,-0.628318,0.1 +1060,0.482314,-0.034689,-1.947786,0.1 +1061,0.478059,-0.043731,-2.073449,0.1 +1062,0.492114,0.054025,-2.261945,0.1 +1063,0.476104,0.042392,-2.764599,0.1 +1064,0.716589,0.254238,0.439823,0.1 +1065,0.731837,0.266853,0.942477,0.1 +1066,-0.351677,-0.375306,-3.078758,0.1 +1067,-0.361631,-0.37468,-3.330085,0.1 +1068,-0.053541,-0.304015,1.130972,0.1 +1069,-0.046184,-0.285432,1.256636,0.1 +1070,-0.078286,-0.358836,-0.439823,0.1 +1071,-0.068722,-0.361615,-0.125664,0.1 +1072,0.716589,0.254238,0.439823,0.1 +1073,0.725984,0.257621,0.251327,0.1 +1074,-0.293406,0.43376,2.576104,0.1 +1075,-0.311891,0.441079,2.953095,0.1 +1076,0.016771,0.300072,-0.376991,0.1 +1077,0.036405,0.297592,0.125664,0.1 +1078,-0.051076,-0.284497,1.75929,0.1 +1079,-0.053257,-0.27474,1.822122,0.1 +1080,-0.197264,-0.359193,-3.015926,0.1 +1081,-0.215665,-0.366479,-2.513272,0.1 +1082,0.036975,0.278992,-1.193804,0.1 +1083,0.039455,0.259358,-1.696459,0.1 +1084,0.731837,0.266853,0.942477,0.1 +1085,0.747086,0.279468,0.439823,0.1 +1086,-0.051076,-0.284497,1.75929,0.1 +1087,-0.052015,-0.274557,1.570795,0.1 +1088,-0.261616,0.425092,1.947786,0.1 +1089,-0.271226,0.442572,2.199113,0.1 +1090,-0.280139,-0.392006,-2.513272,0.1 +1091,-0.297619,-0.401616,-2.764599,0.1 +1092,0.731837,0.266853,0.942477,0.1 +1093,0.747086,0.279468,0.439823,0.1 +1094,0.725984,0.257621,0.251327,0.1 +1095,0.735846,0.259183,0.062832,0.1 +1096,0.731837,0.266853,0.942477,0.1 +1097,0.744577,0.282253,0.816813,0.1 +1098,0.735846,0.259183,0.062832,0.1 +1099,0.755286,0.255474,-0.439823,0.1 +1100,0.747086,0.279468,0.439823,0.1 +1101,0.766343,0.284412,0.062832,0.1 +1102,-0.273248,0.441102,2.45044,0.1 +1103,-0.280533,0.447943,2.324777,0.1 +1104,-0.067008,-0.318356,0.502654,0.1 +1105,-0.04784,-0.313434,0.0,0.1 +1106,-0.067008,-0.318356,0.502654,0.1 +1107,-0.04784,-0.313434,0.0,0.1 +1108,0.731837,0.266853,0.942477,0.1 +1109,0.738207,0.274553,0.816813,0.1 +1110,0.738207,0.274553,0.816813,0.1 +1111,0.748861,0.29134,1.193804,0.1 +1112,0.0382,0.239672,-1.822122,0.1 +1113,0.036328,0.229856,-1.696459,0.1 +1114,-0.002863,0.302552,0.125664,0.1 +1115,0.006797,0.305033,0.376991,0.1 +1116,0.478059,-0.043731,-2.073449,0.1 +1117,0.464511,-0.058158,-2.576104,0.1 +1118,-0.076281,-0.322027,0.251327,0.1 +1119,-0.06668,-0.319238,0.314159,0.1 +1120,-0.261616,0.425092,1.947786,0.1 +1121,-0.272269,0.441878,2.324777,0.1 +1122,-0.014485,-0.402861,-0.69115,0.1 +1123,-0.0064,-0.408735,-0.565486,0.1 +1124,-0.084252,-0.250153,2.764599,0.1 +1125,-0.101732,-0.240544,2.513272,0.1 +1126,-0.053541,-0.304015,1.130972,0.1 +1127,-0.047377,-0.285044,1.3823,0.1 +1128,0.748861,0.29134,1.193804,0.1 +1129,0.760493,0.30735,0.69115,0.1 +1130,0.016771,0.300072,-0.376991,0.1 +1131,0.034251,0.290462,-0.628318,0.1 +1132,0.501398,0.071557,-1.822122,0.1 +1133,0.499526,0.06174,-1.696459,0.1 +1134,0.748861,0.29134,1.193804,0.1 +1135,0.755037,0.310348,1.319468,0.1 +1136,-0.051076,-0.284497,1.75929,0.1 +1137,-0.04861,-0.26498,1.130972,0.1 +1138,0.464511,-0.058158,-2.576104,0.1 +1139,0.456826,-0.064515,-2.324777,0.1 +1140,0.031929,0.287532,-1.005309,0.1 +1141,0.038286,0.279847,-0.753982,0.1 +1142,0.748861,0.29134,1.193804,0.1 +1143,0.7614,0.306498,0.565486,0.1 +1144,-0.311891,0.441079,2.953095,0.1 +1145,-0.321845,0.441705,3.204422,0.1 +1146,-0.076281,-0.322027,0.251327,0.1 +1147,-0.066596,-0.31954,0.251327,0.1 +1148,0.755286,0.255474,-0.439823,0.1 +1149,0.764462,0.251504,-0.376991,0.1 +1150,-0.351677,-0.375306,-3.078758,0.1 +1151,-0.361474,-0.377175,-2.827431,0.1 +1152,-0.361474,-0.377175,-2.827431,0.1 +1153,-0.371153,-0.37966,-2.953095,0.1 +1154,-0.261616,0.425092,1.947786,0.1 +1155,-0.270126,0.443176,2.073449,0.1 +1156,-0.068722,-0.361615,-0.125664,0.1 +1157,-0.058906,-0.363487,-0.251327,0.1 +1158,-0.261616,0.425092,1.947786,0.1 +1159,-0.264704,0.434596,1.822122,0.1 +1160,-0.051076,-0.284497,1.75929,0.1 +1161,-0.053581,-0.264668,1.633627,0.1 +1162,-0.068722,-0.361615,-0.125664,0.1 +1163,-0.059062,-0.364095,-0.376991,0.1 +1164,0.755037,0.310348,1.319468,0.1 +1165,0.755974,0.320263,1.633627,0.1 +1166,0.035006,0.314531,0.062832,0.1 +1167,0.054446,0.310822,-0.439823,0.1 +1168,0.755974,0.320263,1.633627,0.1 +1169,0.75566,0.330257,1.570795,0.1 +1170,0.755974,0.320263,1.633627,0.1 +1171,0.752236,0.339857,1.884954,0.1 +1172,0.7614,0.306498,0.565486,0.1 +1173,0.76967,0.312118,0.628318,0.1 +1174,0.755286,0.255474,-0.439823,0.1 +1175,0.76468,0.252092,-0.251327,0.1 +1176,0.752236,0.339857,1.884954,0.1 +1177,0.747266,0.359216,1.75929,0.1 +1178,-0.053541,-0.304015,1.130972,0.1 +1179,-0.048197,-0.295594,0.879645,0.1 +1180,-0.264704,0.434596,1.822122,0.1 +1181,-0.265954,0.444491,1.570795,0.1 +1182,0.0382,0.239672,-1.822122,0.1 +1183,0.0357,0.219882,-1.570795,0.1 +1184,0.755286,0.255474,-0.439823,0.1 +1185,0.764194,0.250935,-0.502654,0.1 +1186,0.75566,0.330257,1.570795,0.1 +1187,0.759386,0.349786,1.193804,0.1 +1188,0.764194,0.250935,-0.502654,0.1 +1189,0.782741,0.243592,-0.251327,0.1 +1190,-0.280533,0.447943,2.324777,0.1 +1191,-0.295903,0.460658,2.576104,0.1 +1192,0.464511,-0.058158,-2.576104,0.1 +1193,0.456242,-0.063778,-2.513272,0.1 +1194,0.464511,-0.058158,-2.576104,0.1 +1195,0.456621,-0.064278,-2.387608,0.1 +1196,-0.265954,0.444491,1.570795,0.1 +1197,-0.269679,0.464021,1.947786,0.1 +1198,0.755974,0.320263,1.633627,0.1 +1199,0.7566,0.330217,1.3823,0.1 +1200,0.764194,0.250935,-0.502654,0.1 +1201,0.783362,0.246014,-0.0,0.1 +1202,0.764194,0.250935,-0.502654,0.1 +1203,0.773236,0.24668,-0.376991,0.1 +1204,0.035006,0.314531,0.062832,0.1 +1205,0.04496,0.313904,-0.188495,0.1 +1206,0.503898,0.071557,-1.570795,0.1 +1207,0.500173,0.052027,-1.947786,0.1 +1208,0.764194,0.250935,-0.502654,0.1 +1209,0.773564,0.247562,-0.188495,0.1 +1210,0.025343,0.295002,-0.69115,0.1 +1211,0.032843,0.28839,-0.753982,0.1 +1212,-0.295903,0.460658,2.576104,0.1 +1213,-0.303988,0.466532,2.45044,0.1 +1214,-0.269679,0.464021,1.947786,0.1 +1215,-0.274213,0.472917,2.136281,0.1 +1216,-0.361474,-0.377175,-2.827431,0.1 +1217,-0.380495,-0.383355,-2.827431,0.1 +1218,-0.067008,-0.318356,0.502654,0.1 +1219,-0.048461,-0.311012,0.251327,0.1 +1220,0.76967,0.312118,0.628318,0.1 +1221,0.776712,0.31916,0.942477,0.1 +1222,-0.380495,-0.383355,-2.827431,0.1 +1223,-0.389659,-0.387321,-2.638936,0.1 +1224,0.00711,0.30318,-0.0,0.1 +1225,0.0269,0.30068,-0.251327,0.1 +1226,0.783362,0.246014,-0.0,0.1 +1227,0.793362,0.246014,-0.0,0.1 +1228,0.759386,0.349786,1.193804,0.1 +1229,0.771925,0.364944,0.565486,0.1 +1230,0.0382,0.239672,-1.822122,0.1 +1231,0.027659,0.223062,-2.45044,0.1 +1232,0.025343,0.295002,-0.69115,0.1 +1233,0.033243,0.288874,-0.628318,0.1 +1234,0.764194,0.250935,-0.502654,0.1 +1235,0.773564,0.247562,-0.188495,0.1 +1236,-0.053541,-0.304015,1.130972,0.1 +1237,-0.042853,-0.287173,0.879645,0.1 +1238,0.027659,0.223062,-2.45044,0.1 +1239,0.020832,0.215791,-2.199113,0.1 +1240,0.764194,0.250935,-0.502654,0.1 +1241,0.773103,0.246396,-0.439823,0.1 +1242,-0.068722,-0.361615,-0.125664,0.1 +1243,-0.050322,-0.3689,-0.628318,0.1 +1244,0.793362,0.246014,-0.0,0.1 +1245,0.812531,0.250935,0.502654,0.1 +1246,-0.389659,-0.387321,-2.638936,0.1 +1247,-0.404085,-0.400868,-2.136281,0.1 +1248,-0.303988,0.466532,2.45044,0.1 +1249,-0.318557,0.480214,2.324777,0.1 +1250,-0.404085,-0.400868,-2.136281,0.1 +1251,-0.408978,-0.419923,-1.507963,0.1 +1252,-0.408978,-0.419923,-1.507963,0.1 +1253,-0.41023,-0.439831,-1.75929,0.1 +1254,-0.408978,-0.419923,-1.507963,0.1 +1255,-0.411469,-0.439648,-1.884954,0.1 +1256,0.764194,0.250935,-0.502654,0.1 +1257,0.783518,0.247249,0.125664,0.1 +1258,-0.051076,-0.284497,1.75929,0.1 +1259,-0.053561,-0.274818,1.884954,0.1 +1260,0.782741,0.243592,-0.251327,0.1 +1261,0.792655,0.242655,0.062832,0.1 +1262,0.771925,0.364944,0.565486,0.1 +1263,0.785473,0.379371,1.068141,0.1 +1264,-0.318557,0.480214,2.324777,0.1 +1265,-0.331297,0.495614,2.199113,0.1 +1266,0.764194,0.250935,-0.502654,0.1 +1267,0.773236,0.24668,-0.376991,0.1 +1268,-0.265954,0.444491,1.570795,0.1 +1269,-0.266894,0.454432,1.75929,0.1 +1270,0.785473,0.379371,1.068141,0.1 +1271,0.798146,0.39469,0.69115,0.1 +1272,0.755974,0.320263,1.633627,0.1 +1273,0.759682,0.339703,1.130972,0.1 +1274,-0.0064,-0.408735,-0.565486,0.1 +1275,0.00977,-0.420483,-0.69115,0.1 +1276,-0.331297,0.495614,2.199113,0.1 +1277,-0.336652,0.504052,2.073449,0.1 +1278,0.798146,0.39469,0.69115,0.1 +1279,0.805206,0.40175,0.879645,0.1 +1280,-0.059502,-0.266591,2.261945,0.1 +1281,-0.073184,-0.252021,2.387608,0.1 +1282,-0.411469,-0.439648,-1.884954,0.1 +1283,-0.414259,-0.449249,-1.822122,0.1 +1284,0.805206,0.40175,0.879645,0.1 +1285,0.811818,0.40925,0.816813,0.1 +1286,0.752236,0.339857,1.884954,0.1 +1287,0.74885,0.349264,1.947786,0.1 +1288,0.811818,0.40925,0.816813,0.1 +1289,0.828528,0.419854,0.314159,0.1 +1290,0.00977,-0.420483,-0.69115,0.1 +1291,0.018191,-0.425827,-0.439823,0.1 +1292,-0.265954,0.444491,1.570795,0.1 +1293,-0.269679,0.464021,1.947786,0.1 +1294,0.792655,0.242655,0.062832,0.1 +1295,0.812642,0.242655,-0.062832,0.1 +1296,0.018191,-0.425827,-0.439823,0.1 +1297,0.026785,-0.43091,-0.628318,0.1 +1298,0.456621,-0.064278,-2.387608,0.1 +1299,0.449781,-0.071563,-2.261945,0.1 +1300,-0.408978,-0.419923,-1.507963,0.1 +1301,-0.40524,-0.439517,-1.256636,0.1 +1302,0.811818,0.40925,0.816813,0.1 +1303,0.827903,0.420936,0.439823,0.1 +1304,0.773103,0.246396,-0.439823,0.1 +1305,0.782151,0.242138,-0.439823,0.1 +1306,0.020832,0.215791,-2.199113,0.1 +1307,0.007177,0.20125,-2.45044,0.1 +1308,0.782151,0.242138,-0.439823,0.1 +1309,0.790388,0.236541,-0.753982,0.1 +1310,0.501398,0.071557,-1.822122,0.1 +1311,0.495222,0.052548,-1.947786,0.1 +1312,0.828528,0.419854,0.314159,0.1 +1313,0.845237,0.430458,0.816813,0.1 +1314,0.74885,0.349264,1.947786,0.1 +1315,0.745124,0.368794,1.570795,0.1 +1316,0.812531,0.250935,0.502654,0.1 +1317,0.821695,0.254901,0.314159,0.1 +1318,0.790388,0.236541,-0.753982,0.1 +1319,0.802074,0.220456,-1.130972,0.1 +1320,-0.336652,0.504052,2.073449,0.1 +1321,-0.341574,0.52322,1.570795,0.1 +1322,-0.414259,-0.449249,-1.822122,0.1 +1323,-0.41644,-0.459007,-1.75929,0.1 +1324,0.031929,0.287532,-1.005309,0.1 +1325,0.038515,0.280062,-0.69115,0.1 +1326,0.595826,0.164786,1.3823,0.1 +1327,0.59336,0.184304,2.010618,0.1 +1328,0.845237,0.430458,0.816813,0.1 +1329,0.861947,0.441062,0.314159,0.1 +1330,0.845237,0.430458,0.816813,0.1 +1331,0.856962,0.446596,1.068141,0.1 From 6ca9086033171c4bbbab14f57c3730829287df35 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 22 Nov 2022 23:10:38 -0600 Subject: [PATCH 20/23] Add files via upload --- rrt_tree.csv | 669 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 669 insertions(+) create mode 100644 rrt_tree.csv diff --git a/rrt_tree.csv b/rrt_tree.csv new file mode 100644 index 0000000..6be1340 --- /dev/null +++ b/rrt_tree.csv @@ -0,0 +1,669 @@ +,,,,x,y,theta,v +Info:,,,,0.0,0.0,0.0,0.1 +Info:,,,,0.030397,0.00344,0.184027,0.512563 +Info:,,,,0.0,0.0,0.0,0.1 +Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 +Info:,,,,0.030397,0.00344,0.184027,0.512563 +Info:,,,,0.008441,0.004292,0.029858,-0.730183 +Info:,,,,0.030397,0.00344,0.184027,0.512563 +Info:,,,,0.096732,0.023543,0.386783,0.876031 +Info:,,,,0.096732,0.023543,0.386783,0.876031 +Info:,,,,0.137412,0.042945,0.556632,0.026141 +Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 +Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 +Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 +Info:,,,,-0.542103,0.015466,-0.276416,-2.067361 +Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 +Info:,,,,-0.913925,-0.252615,0.334649,-3.305902 +Info:,,,,0.008441,0.004292,0.029858,-0.730183 +Info:,,,,-0.143831,0.022815,-0.266852,-0.809396 +Info:,,,,0.096732,0.023543,0.386783,0.876031 +Info:,,,,0.197032,0.063939,0.379448,1.286562 +Info:,,,,0.197032,0.063939,0.379448,1.286562 +Info:,,,,0.293213,0.108264,0.492284,0.832614 +Info:,,,,-0.542103,0.015466,-0.276416,-2.067361 +Info:,,,,-0.716739,0.050912,-0.115559,-1.5004 +Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 +Info:,,,,-0.968277,-0.344558,0.7178,-1.063784 +Info:,,,,-0.913925,-0.252615,0.334649,-3.305902 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,0.293213,0.108264,0.492284,0.832614 +Info:,,,,0.332505,0.132279,0.646347,0.089088 +Info:,,,,0.332505,0.132279,0.646347,0.089088 +Info:,,,,0.417407,0.259613,1.16561,1.454124 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.206836,-0.461448,-0.096476,-5.025442 +Info:,,,,0.197032,0.063939,0.379448,1.286562 +Info:,,,,0.362434,0.146953,0.576363,0.566937 +Info:,,,,-0.968277,-0.344558,0.7178,-1.063784 +Info:,,,,-1.163226,-0.695306,1.31392,-3.004474 +Info:,,,,0.417407,0.259613,1.16561,1.454124 +Info:,,,,0.463907,0.356412,1.068933,0.694458 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.192428,-0.51822,0.138193,-4.81164 +Info:,,,,-2.206836,-0.461448,-0.096476,-5.025442 +Info:,,,,-3.148497,-0.419554,0.00989,-4.404922 +Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 +Info:,,,,-1.262031,-0.188411,-0.225617,-3.554714 +Info:,,,,0.008441,0.004292,0.029858,-0.730183 +Info:,,,,-0.149457,-0.003927,0.073059,-0.85105 +Info:,,,,0.197032,0.063939,0.379448,1.286562 +Info:,,,,0.337421,0.114387,0.313519,1.697529 +Info:,,,,0.337421,0.114387,0.313519,1.697529 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,0.738751,0.234722,0.269219,1.719667 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,0.787375,0.249323,0.27501,2.734974 +Info:,,,,-0.968277,-0.344558,0.7178,-1.063784 +Info:,,,,-1.040239,-0.407299,0.71624,-0.845662 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,1.061148,0.39642,0.494462,3.213058 +Info:,,,,1.061148,0.39642,0.494462,3.213058 +Info:,,,,1.375278,0.528094,0.303093,3.609547 +Info:,,,,1.375278,0.528094,0.303093,3.609547 +Info:,,,,1.699434,0.582303,0.019346,2.985639 +Info:,,,,-1.040239,-0.407299,0.71624,-0.845662 +Info:,,,,-1.178257,-0.512097,0.583711,-0.888567 +Info:,,,,1.699434,0.582303,0.019346,2.985639 +Info:,,,,1.960533,0.572645,-0.098896,2.242939 +Info:,,,,-3.148497,-0.419554,0.00989,-4.404922 +Info:,,,,-3.583883,-0.43399,0.056572,-4.308368 +Info:,,,,-3.583883,-0.43399,0.056572,-4.308368 +Info:,,,,-3.991416,-0.394593,-0.254301,-3.913338 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,0.796966,0.268863,0.388118,3.03976 +Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 +Info:,,,,-1.094289,-0.267612,0.110476,-1.938622 +Info:,,,,1.960533,0.572645,-0.098896,2.242939 +Info:,,,,2.453999,0.577966,0.113882,2.701305 +Info:,,,,-3.991416,-0.394593,-0.254301,-3.913338 +Info:,,,,-4.333298,-0.265414,-0.473238,-3.41072 +Info:,,,,2.453999,0.577966,0.113882,2.701305 +Info:,,,,2.883443,0.625473,0.105797,1.619344 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 +Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 +Info:,,,,-3.111249,-0.105893,-0.58648,-4.687379 +Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 +Info:,,,,-0.413769,-0.115662,0.694253,-0.978194 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.154279,-0.582972,0.445557,-4.384024 +Info:,,,,2.883443,0.625473,0.105797,1.619344 +Info:,,,,3.014372,0.627589,-0.088706,1.00363 +Info:,,,,-1.178257,-0.512097,0.583711,-0.888567 +Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 +Info:,,,,3.014372,0.627589,-0.088706,1.00363 +Info:,,,,3.14438,0.607763,-0.240533,0.312627 +Info:,,,,0.417407,0.259613,1.16561,1.454124 +Info:,,,,0.667113,0.64001,0.852228,3.114055 +Info:,,,,2.453999,0.577966,0.113882,2.701305 +Info:,,,,2.86924,0.71279,0.547038,1.698215 +Info:,,,,3.14438,0.607763,-0.240533,0.312627 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.189006,-0.506611,0.092168,-4.713944 +Info:,,,,-3.991416,-0.394593,-0.254301,-3.913338 +Info:,,,,-4.357702,-0.331386,-0.084538,-3.529577 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,2.923932,0.579327,0.016404,-0.111099 +Info:,,,,0.796966,0.268863,0.388118,3.03976 +Info:,,,,1.323103,0.396083,0.07394,2.395459 +Info:,,,,0.796966,0.268863,0.388118,3.03976 +Info:,,,,1.081146,0.437955,0.677276,3.596929 +Info:,,,,3.14438,0.607763,-0.240533,0.312627 +Info:,,,,3.135672,0.613548,-0.53732,-0.518403 +Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 +Info:,,,,-3.128613,-0.076483,-0.651582,-5.28948 +Info:,,,,2.453999,0.577966,0.113882,2.701305 +Info:,,,,3.059334,0.690725,0.248899,3.460823 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.198129,-0.448557,-0.149908,-4.858853 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,2.967696,0.591353,-0.10281,-0.542625 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.177465,-0.55963,0.319807,-4.68636 +Info:,,,,1.081146,0.437955,0.677276,3.596929 +Info:,,,,1.347615,0.659931,0.712271,3.339686 +Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 +Info:,,,,-3.343247,0.134754,-0.879993,-3.159555 +Info:,,,,0.796966,0.268863,0.388118,3.03976 +Info:,,,,1.456607,0.619263,0.576692,4.440507 +Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 +Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,0.795673,0.287117,0.508119,3.157515 +Info:,,,,3.059334,0.690725,0.248899,3.460823 +Info:,,,,3.354248,0.737738,0.057218,2.521013 +Info:,,,,3.14438,0.607763,-0.240533,0.312627 +Info:,,,,3.059386,0.593015,0.283682,-1.175398 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,2.936916,0.585854,-0.124326,0.023712 +Info:,,,,-1.262031,-0.188411,-0.225617,-3.554714 +Info:,,,,-1.634316,-0.157788,0.05662,-3.940968 +Info:,,,,3.059334,0.690725,0.248899,3.460823 +Info:,,,,3.769762,0.706334,-0.199846,3.705128 +Info:,,,,3.14438,0.607763,-0.240533,0.312627 +Info:,,,,3.149918,0.608631,-0.544865,-0.264596 +Info:,,,,-4.357702,-0.331386,-0.084538,-3.529577 +Info:,,,,-4.703017,-0.331979,0.089177,-3.385429 +Info:,,,,-4.703017,-0.331979,0.089177,-3.385429 +Info:,,,,-5.055142,-0.312431,-0.195971,-3.691848 +Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 +Info:,,,,-1.289248,-0.590961,0.636602,-1.258158 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,2.948806,0.580399,0.110523,-0.938025 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,2.898944,0.551284,0.357057,-2.044603 +Info:,,,,3.769762,0.706334,-0.199846,3.705128 +Info:,,,,4.138434,0.645765,-0.126036,3.768842 +Info:,,,,4.138434,0.645765,-0.126036,3.768842 +Info:,,,,4.955468,0.436483,-0.366769,4.685598 +Info:,,,,-1.262031,-0.188411,-0.225617,-3.554714 +Info:,,,,-1.623517,-0.11088,-0.197301,-3.839663 +Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 +Info:,,,,-1.284108,-0.618192,1.12193,-0.64768 +Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 +Info:,,,,-2.74305,-0.611093,-0.007592,-4.803206 +Info:,,,,-1.284108,-0.618192,1.12193,-0.64768 +Info:,,,,-1.329647,-0.762888,1.396237,-0.873983 +Info:,,,,4.955468,0.436483,-0.366769,4.685598 +Info:,,,,5.716537,0.378117,0.257269,3.07088 +Info:,,,,-5.055142,-0.312431,-0.195971,-3.691848 +Info:,,,,-5.59363,-0.16671,-0.349045,-1.891975 +Info:,,,,3.769762,0.706334,-0.199846,3.705128 +Info:,,,,4.57005,0.795019,0.401723,4.469078 +Info:,,,,-1.163226,-0.695306,1.31392,-3.004474 +Info:,,,,-1.234353,-0.975401,1.330532,-2.775298 +Info:,,,,3.769762,0.706334,-0.199846,3.705128 +Info:,,,,4.310202,0.640121,-0.022755,1.746494 +Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 +Info:,,,,-1.248355,-0.561029,0.637514,-0.244601 +Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 +Info:,,,,-2.744487,-0.67336,0.231102,-5.02403 +Info:,,,,-5.59363,-0.16671,-0.349045,-1.891975 +Info:,,,,-5.934314,0.032052,-0.701856,-2.072803 +Info:,,,,5.716537,0.378117,0.257269,3.07088 +Info:,,,,6.018792,0.448113,0.198076,3.135099 +Info:,,,,-2.744487,-0.67336,0.231102,-5.02403 +Info:,,,,-3.80714,-0.610063,-0.337006,-5.765614 +Info:,,,,6.018792,0.448113,0.198076,3.135099 +Info:,,,,6.296993,0.533699,0.403993,2.696545 +Info:,,,,6.296993,0.533699,0.403993,2.696545 +Info:,,,,6.57759,0.626695,0.240897,3.222121 +Info:,,,,-3.80714,-0.610063,-0.337006,-5.765614 +Info:,,,,-4.819938,-0.141895,-0.531048,-5.409596 +Info:,,,,6.57759,0.626695,0.240897,3.222121 +Info:,,,,7.342017,0.714113,4.4e-05,4.490435 +Info:,,,,7.342017,0.714113,4.4e-05,4.490435 +Info:,,,,7.766908,0.704736,-0.045025,4.010162 +Info:,,,,-1.248355,-0.561029,0.637514,-0.244601 +Info:,,,,-1.264314,-0.570583,0.418552,-0.12814 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,0.815864,0.213302,-0.016365,3.167673 +Info:,,,,1.456607,0.619263,0.576692,4.440507 +Info:,,,,2.366086,1.123306,0.442029,5.965434 +Info:,,,,0.815864,0.213302,-0.016365,3.167673 +Info:,,,,1.61266,0.03496,-0.395091,5.04558 +Info:,,,,-1.234353,-0.975401,1.330532,-2.775298 +Info:,,,,-1.27358,-1.295056,1.556299,-3.679361 +Info:,,,,-5.934314,0.032052,-0.701856,-2.072803 +Info:,,,,-6.084545,0.133956,-0.479864,-1.565248 +Info:,,,,3.149918,0.608631,-0.544865,-0.264596 +Info:,,,,3.138141,0.615748,-0.541212,-0.010613 +Info:,,,,6.57759,0.626695,0.240897,3.222121 +Info:,,,,6.930401,0.686344,0.098821,3.940244 +Info:,,,,7.342017,0.714113,4.4e-05,4.490435 +Info:,,,,8.285006,0.455114,-0.520131,5.399478 +Info:,,,,2.366086,1.123306,0.442029,5.965434 +Info:,,,,2.87024,1.446501,0.697546,6.044284 +Info:,,,,2.87024,1.446501,0.697546,6.044284 +Info:,,,,3.318262,1.825019,0.705546,5.686054 +Info:,,,,-3.80714,-0.610063,-0.337006,-5.765614 +Info:,,,,-4.371821,-0.368042,-0.47006,-6.530643 +Info:,,,,8.285006,0.455114,-0.520131,5.399478 +Info:,,,,8.967058,-0.181585,-1.005651,4.022626 +Info:,,,,2.86924,0.71279,0.547038,1.698215 +Info:,,,,3.026334,0.806677,0.53073,1.962063 +Info:,,,,0.667113,0.64001,0.852228,3.114055 +Info:,,,,0.922082,1.190838,1.424661,3.039375 +Info:,,,,-6.084545,0.133956,-0.479864,-1.565248 +Info:,,,,-6.266963,0.204615,-0.273116,-2.35413 +Info:,,,,4.955468,0.436483,-0.366769,4.685598 +Info:,,,,5.364672,0.213031,-0.633046,4.666788 +Info:,,,,2.898944,0.551284,0.357057,-2.044603 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,8.285006,0.455114,-0.520131,5.399478 +Info:,,,,9.419893,0.18836,0.042241,6.413349 +Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 +Info:,,,,-2.743734,-0.733317,0.446634,-5.37018 +Info:,,,,6.296993,0.533699,0.403993,2.696545 +Info:,,,,6.68314,0.800819,0.826131,2.033614 +Info:,,,,-6.266963,0.204615,-0.273116,-2.35413 +Info:,,,,-6.449542,0.281455,-0.540075,-1.619326 +Info:,,,,1.61266,0.03496,-0.395091,5.04558 +Info:,,,,2.089271,-0.217421,-0.574956,5.75514 +Info:,,,,6.68314,0.800819,0.826131,2.033614 +Info:,,,,6.838824,0.973521,0.847334,2.61679 +Info:,,,,-4.703017,-0.331979,0.089177,-3.385429 +Info:,,,,-5.414807,-0.574702,0.551457,-4.202058 +Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 +Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 +Info:,,,,-4.819938,-0.141895,-0.531048,-5.409596 +Info:,,,,-5.496437,0.607028,-1.152721,-4.846862 +Info:,,,,0.667113,0.64001,0.852228,3.114055 +Info:,,,,0.87763,0.83078,0.612754,2.581438 +Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 +Info:,,,,-4.266658,-0.515371,0.042385,-7.433546 +Info:,,,,2.089271,-0.217421,-0.574956,5.75514 +Info:,,,,2.543181,-0.529935,-0.631805,5.268124 +Info:,,,,2.366086,1.123306,0.442029,5.965434 +Info:,,,,3.587714,1.398129,0.008449,6.654679 +Info:,,,,2.543181,-0.529935,-0.631805,5.268124 +Info:,,,,2.981639,-0.820152,-0.537544,5.251885 +Info:,,,,2.981639,-0.820152,-0.537544,5.251885 +Info:,,,,3.411727,-1.092272,-0.591273,4.928222 +Info:,,,,6.838824,0.973521,0.847334,2.61679 +Info:,,,,7.030275,1.193612,0.861925,3.217419 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,2.005973,0.462672,0.024641,-3.39812 +Info:,,,,0.922082,1.190838,1.424661,3.039375 +Info:,,,,0.996277,1.724153,1.441174,2.345206 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,1.55704,0.691637,-0.517741,-4.831726 +Info:,,,,3.054914,0.597758,0.20958,-1.213214 +Info:,,,,2.961867,0.569834,0.388264,-0.73226 +Info:,,,,7.030275,1.193612,0.861925,3.217419 +Info:,,,,7.364176,1.862713,1.33082,4.328894 +Info:,,,,-6.449542,0.281455,-0.540075,-1.619326 +Info:,,,,-6.590751,0.36214,-0.498215,-1.633599 +Info:,,,,7.766908,0.704736,-0.045025,4.010162 +Info:,,,,8.757784,0.790306,0.201241,5.960336 +Info:,,,,-5.496437,0.607028,-1.152721,-4.846862 +Info:,,,,-5.740589,1.041199,-0.966101,-5.129822 +Info:,,,,7.364176,1.862713,1.33082,4.328894 +Info:,,,,7.519173,2.674727,1.435182,3.941603 +Info:,,,,5.716537,0.378117,0.257269,3.07088 +Info:,,,,6.022438,0.417899,0.001995,3.115444 +Info:,,,,0.996277,1.724153,1.441174,2.345206 +Info:,,,,1.15776,2.267829,1.140639,3.347477 +Info:,,,,1.61266,0.03496,-0.395091,5.04558 +Info:,,,,2.417269,-0.063318,0.197094,3.177878 +Info:,,,,7.519173,2.674727,1.435182,3.941603 +Info:,,,,7.584557,3.517843,1.549027,4.519431 +Info:,,,,-5.414807,-0.574702,0.551457,-4.202058 +Info:,,,,-6.306258,-0.992296,0.335375,-5.661112 +Info:,,,,1.15776,2.267829,1.140639,3.347477 +Info:,,,,1.325066,2.526129,0.843101,2.83024 +Info:,,,,1.61266,0.03496,-0.395091,5.04558 +Info:,,,,2.018393,-0.179903,-0.585123,4.150483 +Info:,,,,0.815864,0.213302,-0.016365,3.167673 +Info:,,,,1.152962,0.230356,0.114744,3.587744 +Info:,,,,2.089271,-0.217421,-0.574956,5.75514 +Info:,,,,2.551926,-0.607253,-0.821207,6.375348 +Info:,,,,-6.084545,0.133956,-0.479864,-1.565248 +Info:,,,,-6.526816,0.372011,-0.504595,-3.457561 +Info:,,,,1.325066,2.526129,0.843101,2.83024 +Info:,,,,1.617753,2.959379,1.117476,2.414658 +Info:,,,,3.135672,0.613548,-0.53732,-0.518403 +Info:,,,,3.066137,0.665774,-0.725639,-1.223303 +Info:,,,,-5.59363,-0.16671,-0.349045,-1.891975 +Info:,,,,-5.720398,-0.106939,-0.556137,-0.915897 +Info:,,,,2.551926,-0.607253,-0.821207,6.375348 +Info:,,,,2.935058,-1.142013,-1.074192,6.81666 +Info:,,,,-6.590751,0.36214,-0.498215,-1.633599 +Info:,,,,-6.689943,0.432165,-0.761194,-0.801525 +Info:,,,,7.584557,3.517843,1.549027,4.519431 +Info:,,,,7.591527,3.968908,1.56167,4.503005 +Info:,,,,8.757784,0.790306,0.201241,5.960336 +Info:,,,,9.986265,1.182968,0.412054,6.960616 +Info:,,,,1.15776,2.267829,1.140639,3.347477 +Info:,,,,1.259943,2.623194,1.431471,4.073859 +Info:,,,,3.411727,-1.092272,-0.591273,4.928222 +Info:,,,,3.832702,-1.309689,-0.359255,4.569133 +Info:,,,,2.898944,0.551284,0.357057,-2.044603 +Info:,,,,2.632051,0.489811,0.044906,-0.70447 +Info:,,,,-6.689943,0.432165,-0.761194,-0.801525 +Info:,,,,-6.77131,0.520396,-0.877601,-1.600211 +Info:,,,,2.089271,-0.217421,-0.574956,5.75514 +Info:,,,,2.59939,-0.532671,-0.532701,6.239139 +Info:,,,,1.617753,2.959379,1.117476,2.414658 +Info:,,,,1.799747,3.177484,0.49144,0.465626 +Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 +Info:,,,,-2.783996,-0.690676,0.257802,-5.874199 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,1.998882,0.422753,0.248072,-3.609629 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,1.997769,0.465833,0.006247,-3.561785 +Info:,,,,1.55704,0.691637,-0.517741,-4.831726 +Info:,,,,1.106859,0.934285,-0.471824,-5.397385 +Info:,,,,-5.720398,-0.106939,-0.556137,-0.915897 +Info:,,,,-5.797205,-0.053592,-0.705762,-0.019868 +Info:,,,,-5.797205,-0.053592,-0.705762,-0.019868 +Info:,,,,-5.784177,-0.069044,-0.946644,0.424671 +Info:,,,,1.106859,0.934285,-0.471824,-5.397385 +Info:,,,,0.565206,1.120763,-0.196884,-6.095824 +Info:,,,,-5.784177,-0.069044,-0.946644,0.424671 +Info:,,,,-5.724084,-0.20417,-1.306524,1.061713 +Info:,,,,1.55704,0.691637,-0.517741,-4.831726 +Info:,,,,0.838216,1.156263,-0.634911,-3.732272 +Info:,,,,0.565206,1.120763,-0.196884,-6.095824 +Info:,,,,-0.520632,1.499595,-0.479822,-5.442839 +Info:,,,,0.53693,0.176481,0.291335,2.481543 +Info:,,,,1.156647,0.288015,0.079847,3.826764 +Info:,,,,4.57005,0.795019,0.401723,4.469078 +Info:,,,,5.040544,0.915575,0.1081,5.279706 +Info:,,,,-6.306258,-0.992296,0.335375,-5.661112 +Info:,,,,-6.875543,-1.097257,0.031892,-5.961031 +Info:,,,,6.930401,0.686344,0.098821,3.940244 +Info:,,,,7.329634,0.791661,0.41184,4.351346 +Info:,,,,0.565206,1.120763,-0.196884,-6.095824 +Info:,,,,-0.057942,1.147372,0.108833,-6.427188 +Info:,,,,0.197032,0.063939,0.379448,1.286562 +Info:,,,,0.367181,0.110358,0.172013,2.246959 +Info:,,,,1.259943,2.623194,1.431471,4.073859 +Info:,,,,1.323809,2.996416,1.369603,3.500285 +Info:,,,,1.323809,2.996416,1.369603,3.500285 +Info:,,,,1.319226,3.565051,1.821478,2.234122 +Info:,,,,1.799747,3.177484,0.49144,0.465626 +Info:,,,,2.032028,3.241521,0.122408,1.955822 +Info:,,,,7.591527,3.968908,1.56167,4.503005 +Info:,,,,7.540308,4.42786,1.80004,4.754916 +Info:,,,,7.540308,4.42786,1.80004,4.754916 +Info:,,,,7.454419,5.418937,1.518873,5.225819 +Info:,,,,-5.724084,-0.20417,-1.306524,1.061713 +Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 +Info:,,,,-6.875543,-1.097257,0.031892,-5.961031 +Info:,,,,-8.127534,-0.911584,-0.318982,-6.760892 +Info:,,,,-6.306258,-0.992296,0.335375,-5.661112 +Info:,,,,-6.855092,-1.20048,0.389091,-6.080141 +Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 +Info:,,,,-5.810292,-0.933992,-1.954602,1.443114 +Info:,,,,-0.520632,1.499595,-0.479822,-5.442839 +Info:,,,,-1.00691,1.712681,-0.345074,-5.183515 +Info:,,,,2.032028,3.241521,0.122408,1.955822 +Info:,,,,2.476358,3.436467,0.667328,2.956028 +Info:,,,,1.259943,2.623194,1.431471,4.073859 +Info:,,,,1.350365,3.005242,1.243053,3.789808 +Info:,,,,6.68314,0.800819,0.826131,2.033614 +Info:,,,,7.140922,1.047518,0.209959,3.248316 +Info:,,,,6.68314,0.800819,0.826131,2.033614 +Info:,,,,6.815491,0.978755,1.030637,2.409327 +Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 +Info:,,,,-5.835852,-0.917024,-2.124806,1.370859 +Info:,,,,3.832702,-1.309689,-0.359255,4.569133 +Info:,,,,4.266232,-1.42961,-0.179615,4.439186 +Info:,,,,2.935058,-1.142013,-1.074192,6.81666 +Info:,,,,3.203447,-1.777606,-1.267423,7.003535 +Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 +Info:,,,,-5.875146,-1.063688,-2.038906,2.884015 +Info:,,,,1.55704,0.691637,-0.517741,-4.831726 +Info:,,,,0.634162,0.916473,0.040585,-4.791493 +Info:,,,,3.203447,-1.777606,-1.267423,7.003535 +Info:,,,,3.473476,-2.449249,-1.111382,7.489004 +Info:,,,,4.266232,-1.42961,-0.179615,4.439186 +Info:,,,,4.688165,-1.451964,0.077855,4.034669 +Info:,,,,7.454419,5.418937,1.518873,5.225819 +Info:,,,,7.468873,5.977768,1.569895,5.955749 +Info:,,,,-1.329647,-0.762888,1.396237,-0.873983 +Info:,,,,-1.346709,-0.863707,1.409416,-1.17108 +Info:,,,,4.688165,-1.451964,0.077855,4.034669 +Info:,,,,5.110756,-1.405665,0.139346,4.46907 +Info:,,,,1.319226,3.565051,1.821478,2.234122 +Info:,,,,1.226285,4.065405,1.692692,2.858502 +Info:,,,,1.55704,0.691637,-0.517741,-4.831726 +Info:,,,,0.658724,1.374203,-0.769539,-6.480065 +Info:,,,,0.367181,0.110358,0.172013,2.246959 +Info:,,,,0.61273,0.178158,0.35935,2.855222 +Info:,,,,2.032028,3.241521,0.122408,1.955822 +Info:,,,,2.425668,3.25937,-0.031356,1.988508 +Info:,,,,-1.27358,-1.295056,1.556299,-3.679361 +Info:,,,,-1.333015,-1.89268,1.373399,-2.334603 +Info:,,,,1.156647,0.288015,0.079847,3.826764 +Info:,,,,2.020113,0.287104,-0.076005,4.816604 +Info:,,,,1.799747,3.177484,0.49144,0.465626 +Info:,,,,1.981684,3.200435,-0.135442,1.39596 +Info:,,,,-1.333015,-1.89268,1.373399,-2.334603 +Info:,,,,-1.345334,-2.204167,1.75088,-0.799796 +Info:,,,,-6.855092,-1.20048,0.389091,-6.080141 +Info:,,,,-7.858917,-1.906814,0.83464,-6.296214 +Info:,,,,3.473476,-2.449249,-1.111382,7.489004 +Info:,,,,3.841433,-3.105052,-1.00775,7.557274 +Info:,,,,1.226285,4.065405,1.692692,2.858502 +Info:,,,,1.154685,4.33183,1.977081,2.677697 +Info:,,,,-6.77131,0.520396,-0.877601,-1.600211 +Info:,,,,-7.133881,0.791827,-0.450296,-2.962548 +Info:,,,,-1.333015,-1.89268,1.373399,-2.334603 +Info:,,,,-1.351846,-2.176703,1.7062,-0.523267 +Info:,,,,1.998882,0.422753,0.248072,-3.609629 +Info:,,,,1.652269,0.385843,-0.038961,-3.385798 +Info:,,,,-5.875146,-1.063688,-2.038906,2.884015 +Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 +Info:,,,,8.967058,-0.181585,-1.005651,4.022626 +Info:,,,,9.255328,-0.512687,-0.711771,4.789132 +Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 +Info:,,,,-4.240979,-0.36168,-0.377242,-7.460259 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,2.028536,0.485226,-0.116992,-2.962037 +Info:,,,,3.841433,-3.105052,-1.00775,7.557274 +Info:,,,,4.78796,-4.274429,-0.772731,7.52186 +Info:,,,,-0.057942,1.147372,0.108833,-6.427188 +Info:,,,,-0.711478,1.122803,-0.032828,-6.663722 +Info:,,,,-1.345334,-2.204167,1.75088,-0.799796 +Info:,,,,-1.282389,-2.388162,2.032994,-1.151233 +Info:,,,,7.454419,5.418937,1.518873,5.225819 +Info:,,,,7.46349,5.903125,1.587049,4.461514 +Info:,,,,-5.740589,1.041199,-0.966101,-5.129822 +Info:,,,,-6.08157,1.471458,-0.838017,-5.857493 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,1.818962,0.518094,-0.20804,-1.84213 +Info:,,,,9.419893,0.18836,0.042241,6.413349 +Info:,,,,10.04085,0.209138,0.024465,6.012898 +Info:,,,,-7.133881,0.791827,-0.450296,-2.962548 +Info:,,,,-7.685432,1.015894,-0.321698,-2.994834 +Info:,,,,3.841433,-3.105052,-1.00775,7.557274 +Info:,,,,4.19113,-3.751971,-1.143932,7.161826 +Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 +Info:,,,,-5.998005,-1.958108,-1.137429,1.544105 +Info:,,,,7.46349,5.903125,1.587049,4.461514 +Info:,,,,7.492746,6.330178,1.415398,4.110092 +Info:,,,,3.841433,-3.105052,-1.00775,7.557274 +Info:,,,,4.17009,-3.774878,-1.22233,7.393633 +Info:,,,,-6.08157,1.471458,-0.838017,-5.857493 +Info:,,,,-6.637062,2.699577,-1.4258,-7.81621 +Info:,,,,1.154685,4.33183,1.977081,2.677697 +Info:,,,,1.096498,4.540942,1.684935,1.678652 +Info:,,,,-1.282389,-2.388162,2.032994,-1.151233 +Info:,,,,-1.208494,-2.516703,2.1438,-1.815607 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,2.012073,0.43723,0.175955,-3.308127 +Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 +Info:,,,,-6.079183,-1.764781,-1.782664,1.57011 +Info:,,,,0.565206,1.120763,-0.196884,-6.095824 +Info:,,,,-0.429518,1.46361,-0.481664,-4.461027 +Info:,,,,-6.637062,2.699577,-1.4258,-7.81621 +Info:,,,,-6.730953,3.444278,-1.465504,-7.196705 +Info:,,,,3.587714,1.398129,0.008449,6.654679 +Info:,,,,4.72168,1.107859,-0.531965,5.193518 +Info:,,,,1.799747,3.177484,0.49144,0.465626 +Info:,,,,1.819465,3.188473,0.544079,-0.014132 +Info:,,,,7.468873,5.977768,1.569895,5.955749 +Info:,,,,7.508776,6.55978,1.433878,5.720821 +Info:,,,,5.364672,0.213031,-0.633046,4.666788 +Info:,,,,5.719484,-0.12559,-0.886738,5.168841 +Info:,,,,-1.208494,-2.516703,2.1438,-1.815607 +Info:,,,,-1.113214,-2.656989,2.192168,-1.576386 +Info:,,,,4.78796,-4.274429,-0.772731,7.52186 +Info:,,,,6.0417,-5.036536,-0.317124,7.277787 +Info:,,,,6.0417,-5.036536,-0.317124,7.277787 +Info:,,,,7.250332,-5.447003,-0.338666,5.486766 +Info:,,,,-4.266658,-0.515371,0.042385,-7.433546 +Info:,,,,-4.978058,-0.494552,-0.10301,-6.813076 +Info:,,,,1.61266,0.03496,-0.395091,5.04558 +Info:,,,,2.278574,-0.513779,-1.014754,3.721725 +Info:,,,,2.898944,0.551284,0.357057,-2.044603 +Info:,,,,2.709106,0.450224,0.616815,-2.268734 +Info:,,,,1.154685,4.33183,1.977081,2.677697 +Info:,,,,1.053193,4.585995,1.924724,2.796518 +Info:,,,,-7.858917,-1.906814,0.83464,-6.296214 +Info:,,,,-8.657253,-2.626475,0.620495,-4.472421 +Info:,,,,3.587714,1.398129,0.008449,6.654679 +Info:,,,,5.047811,1.017383,-0.497085,8.595553 +Info:,,,,0.658724,1.374203,-0.769539,-6.480065 +Info:,,,,-0.444755,2.070983,-0.358801,-6.662673 +Info:,,,,-5.998005,-1.958108,-1.137429,1.544105 +Info:,,,,-5.881306,-2.122673,-0.693425,0.488482 +Info:,,,,-1.289248,-0.590961,0.636602,-1.258158 +Info:,,,,-1.470178,-0.84433,1.224681,-1.899907 +Info:,,,,-7.858917,-1.906814,0.83464,-6.296214 +Info:,,,,-8.316648,-2.391753,0.794611,-7.041611 +Info:,,,,-1.351846,-2.176703,1.7062,-0.523267 +Info:,,,,-1.350491,-2.187429,1.775484,0.307213 +Info:,,,,1.096498,4.540942,1.684935,1.678652 +Info:,,,,1.086417,4.692879,1.585786,1.368003 +Info:,,,,4.78796,-4.274429,-0.772731,7.52186 +Info:,,,,5.793953,-5.257496,-0.775068,6.543857 +Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 +Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 +Info:,,,,5.793953,-5.257496,-0.775068,6.543857 +Info:,,,,6.491091,-6.218569,-1.122653,5.388851 +Info:,,,,-1.00691,1.712681,-0.345074,-5.183515 +Info:,,,,-1.491093,1.921346,-0.468033,-5.367782 +Info:,,,,-8.657253,-2.626475,0.620495,-4.472421 +Info:,,,,-9.068583,-2.841448,0.346282,-4.839089 +Info:,,,,5.047811,1.017383,-0.497085,8.595553 +Info:,,,,6.751986,0.460448,-0.140155,9.428624 +Info:,,,,0.367181,0.110358,0.172013,2.246959 +Info:,,,,0.585411,0.1332,0.035509,2.144899 +Info:,,,,5.110756,-1.405665,0.139346,4.46907 +Info:,,,,5.559002,-1.329808,0.195617,4.624507 +Info:,,,,7.492746,6.330178,1.415398,4.110092 +Info:,,,,7.857885,7.105415,0.855803,4.571873 +Info:,,,,-1.208494,-2.516703,2.1438,-1.815607 +Info:,,,,-0.955984,-2.777413,2.53586,-1.837224 +Info:,,,,1.053193,4.585995,1.924724,2.796518 +Info:,,,,0.927944,4.818047,2.212198,2.495592 +Info:,,,,7.250332,-5.447003,-0.338666,5.486766 +Info:,,,,8.293169,-5.517313,0.210791,5.097859 +Info:,,,,1.819465,3.188473,0.544079,-0.014132 +Info:,,,,1.854647,3.209505,0.536268,0.833918 +Info:,,,,-5.881306,-2.122673,-0.693425,0.488482 +Info:,,,,-5.874788,-2.1282,-0.658925,-0.317606 +Info:,,,,7.857885,7.105415,0.855803,4.571873 +Info:,,,,8.376249,7.90766,1.134222,5.010462 +Info:,,,,0.927944,4.818047,2.212198,2.495592 +Info:,,,,0.63776,5.099138,2.558557,1.564347 +Info:,,,,2.35201,0.464949,-0.011265,-3.523142 +Info:,,,,2.040853,0.440697,0.174731,-2.727818 +Info:,,,,1.086417,4.692879,1.585786,1.368003 +Info:,,,,1.056063,4.924073,1.830834,0.969567 +Info:,,,,-8.127534,-0.911584,-0.318982,-6.760892 +Info:,,,,-9.567421,-0.603013,-0.109079,-7.99191 +Info:,,,,6.491091,-6.218569,-1.122653,5.388851 +Info:,,,,7.157958,-7.091138,-0.717246,5.668914 +Info:,,,,4.688165,-1.451964,0.077855,4.034669 +Info:,,,,5.1239,-1.450961,-0.069572,4.687934 +Info:,,,,-5.875146,-1.063688,-2.038906,2.884015 +Info:,,,,-5.985202,-1.464064,-1.58143,1.302937 +Info:,,,,-5.881306,-2.122673,-0.693425,0.488482 +Info:,,,,-5.831631,-2.152483,-0.403049,0.674228 +Info:,,,,1.259943,2.623194,1.431471,4.073859 +Info:,,,,1.333459,3.019437,1.342916,3.988887 +Info:,,,,4.266232,-1.42961,-0.179615,4.439186 +Info:,,,,4.939661,-1.707412,-0.634606,2.90789 +Info:,,,,7.857885,7.105415,0.855803,4.571873 +Info:,,,,8.32462,7.737202,1.022299,3.292041 +Info:,,,,-7.685432,1.015894,-0.321698,-2.994834 +Info:,,,,-8.240404,1.154956,-0.166975,-2.732167 +Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 +Info:,,,,-4.992351,0.07566,-0.629847,-8.690103 +Info:,,,,-6.08157,1.471458,-0.838017,-5.857493 +Info:,,,,-6.806864,2.210395,-0.747457,-4.500155 +Info:,,,,1.086417,4.692879,1.585786,1.368003 +Info:,,,,1.085309,4.790791,1.577321,0.59037 +Info:,,,,-9.567421,-0.603013,-0.109079,-7.99191 +Info:,,,,-11.218155,-0.310736,-0.239355,-8.784033 +Info:,,,,-9.068583,-2.841448,0.346282,-4.839089 +Info:,,,,-9.961037,-3.520313,0.925425,-6.531052 +Info:,,,,9.255328,-0.512687,-0.711771,4.789132 +Info:,,,,10.019502,-0.986925,-0.392624,4.242791 +Info:,,,,7.508776,6.55978,1.433878,5.720821 +Info:,,,,7.908084,7.496134,0.881187,4.588788 +Info:,,,,1.55704,0.691637,-0.517741,-4.831726 +Info:,,,,1.155046,0.981956,-0.73124,-5.104487 +Info:,,,,-0.444755,2.070983,-0.358801,-6.662673 +Info:,,,,-1.034557,2.288428,-0.347402,-5.909569 +Info:,,,,4.17009,-3.774878,-1.22233,7.393633 +Info:,,,,5.012009,-5.143061,-0.827281,8.775773 +Info:,,,,-8.240404,1.154956,-0.166975,-2.732167 +Info:,,,,-8.701813,1.169412,0.121638,-1.900069 +Info:,,,,1.259943,2.623194,1.431471,4.073859 +Info:,,,,1.314174,3.629916,1.592163,6.018676 +Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 +Info:,,,,-4.224598,-0.485342,-0.048775,-6.632062 +Info:,,,,7.157958,-7.091138,-0.717246,5.668914 +Info:,,,,7.602872,-7.383828,-0.440873,5.016135 +Info:,,,,-0.955984,-2.777413,2.53586,-1.837224 +Info:,,,,-0.771741,-2.967748,2.087654,-0.833038 +Info:,,,,-5.724084,-0.20417,-1.306524,1.061713 +Info:,,,,-5.70236,-0.430786,-1.636066,1.225151 +Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 +Info:,,,,-5.934452,-2.368634,-1.030449,1.883823 +Info:,,,,6.68314,0.800819,0.826131,2.033614 +Info:,,,,6.792424,0.92099,0.840714,1.215056 +Info:,,,,1.314174,3.629916,1.592163,6.018676 +Info:,,,,1.598339,4.670352,0.996274,4.927468 +Info:,,,,1.085309,4.790791,1.577321,0.59037 +Info:,,,,1.085637,4.83705,1.547327,0.334875 +Info:,,,,8.293169,-5.517313,0.210791,5.097859 +Info:,,,,9.442621,-5.452401,-0.0863,6.457229 +Info:,,,,7.602872,-7.383828,-0.440873,5.016135 +Info:,,,,8.576084,-7.831741,-0.4222,5.69741 +Info:,,,,-5.934452,-2.368634,-1.030449,1.883823 +Info:,,,,-5.756652,-2.587906,-0.713661,0.950578 +Info:,,,,8.32462,7.737202,1.022299,3.292041 +Info:,,,,8.532771,8.010762,0.821359,3.594457 +Info:,,,,-6.806864,2.210395,-0.747457,-4.500155 +Info:,,,,-7.105691,2.48566,-0.741072,-3.625579 +Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 +Info:,,,,-4.228644,-0.442096,-0.17011,-6.829554 +Info:,,,,-7.105691,2.48566,-0.741072,-3.625579 +Info:,,,,-7.789189,3.030573,-0.612381,-5.121682 +Info:,,,,-6.730953,3.444278,-1.465504,-7.196705 +Info:,,,,-6.660479,4.797158,-1.786385,-6.408667 +Info:,,,,1.314174,3.629916,1.592163,6.018676 +Info:,,,,1.317981,4.711016,1.540432,4.793597 +Info:,,,,1.317981,4.711016,1.540432,4.793597 +Info:,,,,1.535703,5.534887,1.066259,3.807945 +Info:,,,,1.317981,4.711016,1.540432,4.793597 +Info:,,,,1.370879,5.172264,1.371022,4.502926 +Info:,,,,0.565206,1.120763,-0.196884,-6.095824 +Info:,,,,-0.066409,1.209033,-0.082528,-6.666189 +Info:,,,,8.532771,8.010762,0.821359,3.594457 +Info:,,,,8.818121,8.281629,0.700864,4.279058 +Info:,,,,6.792424,0.92099,0.840714,1.215056 +Info:,,,,7.006144,1.18638,0.935838,2.193652 +Info:,,,,-5.784177,-0.069044,-0.946644,0.424671 +Info:,,,,-5.776849,-0.080674,-0.778003,-0.288508 +Info:,,,,7.602872,-7.383828,-0.440873,5.016135 +Info:,,,,8.057968,-7.578732,-0.368088,4.887567 +Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 +Info:,,,,-6.168065,-2.497944,-1.910163,3.07304 +Info:,,,,-1.27358,-1.295056,1.556299,-3.679361 +Info:,,,,-1.227505,-1.649935,1.84589,-3.502868 +Info:,,,,1.085637,4.83705,1.547327,0.334875 +Info:,,,,1.083257,4.818375,1.465308,-0.522829 +Info:,,,,1.598339,4.670352,0.996274,4.927468 +Info:,,,,2.122889,5.463944,0.976973,4.585519 +Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 +Info:,,,,-6.24908,-2.647633,-2.01726,4.737371 +Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 +Info:,,,,-5.591046,-1.19228,-1.101672,4.107236 +Info:,,,,5.012009,-5.143061,-0.827281,8.775773 +Info:,,,,6.305329,-6.280095,-0.613851,8.47764 +Info:,,,,-5.756652,-2.587906,-0.713661,0.950578 +Info:,,,,-5.687456,-2.641031,-0.592256,0.795244 +Info:,,,,-0.913925,-0.252615,0.334649,-3.305902 +Info:,,,,-1.369004,-0.352542,0.05957,-1.367177 +Info:,,,,8.32462,7.737202,1.022299,3.292041 +Info:,,,,8.488491,8.25369,1.539782,2.186669 From 8bc9a4b0b9e933b17ec24f486a7cf95f975f6c60 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 22 Nov 2022 23:14:58 -0600 Subject: [PATCH 21/23] Delete rrt_tree.csv --- rrt_tree.csv | 669 --------------------------------------------------- 1 file changed, 669 deletions(-) delete mode 100644 rrt_tree.csv diff --git a/rrt_tree.csv b/rrt_tree.csv deleted file mode 100644 index 6be1340..0000000 --- a/rrt_tree.csv +++ /dev/null @@ -1,669 +0,0 @@ -,,,,x,y,theta,v -Info:,,,,0.0,0.0,0.0,0.1 -Info:,,,,0.030397,0.00344,0.184027,0.512563 -Info:,,,,0.0,0.0,0.0,0.1 -Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 -Info:,,,,0.030397,0.00344,0.184027,0.512563 -Info:,,,,0.008441,0.004292,0.029858,-0.730183 -Info:,,,,0.030397,0.00344,0.184027,0.512563 -Info:,,,,0.096732,0.023543,0.386783,0.876031 -Info:,,,,0.096732,0.023543,0.386783,0.876031 -Info:,,,,0.137412,0.042945,0.556632,0.026141 -Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 -Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 -Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 -Info:,,,,-0.542103,0.015466,-0.276416,-2.067361 -Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 -Info:,,,,-0.913925,-0.252615,0.334649,-3.305902 -Info:,,,,0.008441,0.004292,0.029858,-0.730183 -Info:,,,,-0.143831,0.022815,-0.266852,-0.809396 -Info:,,,,0.096732,0.023543,0.386783,0.876031 -Info:,,,,0.197032,0.063939,0.379448,1.286562 -Info:,,,,0.197032,0.063939,0.379448,1.286562 -Info:,,,,0.293213,0.108264,0.492284,0.832614 -Info:,,,,-0.542103,0.015466,-0.276416,-2.067361 -Info:,,,,-0.716739,0.050912,-0.115559,-1.5004 -Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 -Info:,,,,-0.968277,-0.344558,0.7178,-1.063784 -Info:,,,,-0.913925,-0.252615,0.334649,-3.305902 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,0.293213,0.108264,0.492284,0.832614 -Info:,,,,0.332505,0.132279,0.646347,0.089088 -Info:,,,,0.332505,0.132279,0.646347,0.089088 -Info:,,,,0.417407,0.259613,1.16561,1.454124 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.206836,-0.461448,-0.096476,-5.025442 -Info:,,,,0.197032,0.063939,0.379448,1.286562 -Info:,,,,0.362434,0.146953,0.576363,0.566937 -Info:,,,,-0.968277,-0.344558,0.7178,-1.063784 -Info:,,,,-1.163226,-0.695306,1.31392,-3.004474 -Info:,,,,0.417407,0.259613,1.16561,1.454124 -Info:,,,,0.463907,0.356412,1.068933,0.694458 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.192428,-0.51822,0.138193,-4.81164 -Info:,,,,-2.206836,-0.461448,-0.096476,-5.025442 -Info:,,,,-3.148497,-0.419554,0.00989,-4.404922 -Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 -Info:,,,,-1.262031,-0.188411,-0.225617,-3.554714 -Info:,,,,0.008441,0.004292,0.029858,-0.730183 -Info:,,,,-0.149457,-0.003927,0.073059,-0.85105 -Info:,,,,0.197032,0.063939,0.379448,1.286562 -Info:,,,,0.337421,0.114387,0.313519,1.697529 -Info:,,,,0.337421,0.114387,0.313519,1.697529 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,0.738751,0.234722,0.269219,1.719667 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,0.787375,0.249323,0.27501,2.734974 -Info:,,,,-0.968277,-0.344558,0.7178,-1.063784 -Info:,,,,-1.040239,-0.407299,0.71624,-0.845662 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,1.061148,0.39642,0.494462,3.213058 -Info:,,,,1.061148,0.39642,0.494462,3.213058 -Info:,,,,1.375278,0.528094,0.303093,3.609547 -Info:,,,,1.375278,0.528094,0.303093,3.609547 -Info:,,,,1.699434,0.582303,0.019346,2.985639 -Info:,,,,-1.040239,-0.407299,0.71624,-0.845662 -Info:,,,,-1.178257,-0.512097,0.583711,-0.888567 -Info:,,,,1.699434,0.582303,0.019346,2.985639 -Info:,,,,1.960533,0.572645,-0.098896,2.242939 -Info:,,,,-3.148497,-0.419554,0.00989,-4.404922 -Info:,,,,-3.583883,-0.43399,0.056572,-4.308368 -Info:,,,,-3.583883,-0.43399,0.056572,-4.308368 -Info:,,,,-3.991416,-0.394593,-0.254301,-3.913338 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,0.796966,0.268863,0.388118,3.03976 -Info:,,,,-0.619578,-0.141138,0.390347,-2.989907 -Info:,,,,-1.094289,-0.267612,0.110476,-1.938622 -Info:,,,,1.960533,0.572645,-0.098896,2.242939 -Info:,,,,2.453999,0.577966,0.113882,2.701305 -Info:,,,,-3.991416,-0.394593,-0.254301,-3.913338 -Info:,,,,-4.333298,-0.265414,-0.473238,-3.41072 -Info:,,,,2.453999,0.577966,0.113882,2.701305 -Info:,,,,2.883443,0.625473,0.105797,1.619344 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 -Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 -Info:,,,,-3.111249,-0.105893,-0.58648,-4.687379 -Info:,,,,-0.164225,-0.014587,0.128977,-1.749376 -Info:,,,,-0.413769,-0.115662,0.694253,-0.978194 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.154279,-0.582972,0.445557,-4.384024 -Info:,,,,2.883443,0.625473,0.105797,1.619344 -Info:,,,,3.014372,0.627589,-0.088706,1.00363 -Info:,,,,-1.178257,-0.512097,0.583711,-0.888567 -Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 -Info:,,,,3.014372,0.627589,-0.088706,1.00363 -Info:,,,,3.14438,0.607763,-0.240533,0.312627 -Info:,,,,0.417407,0.259613,1.16561,1.454124 -Info:,,,,0.667113,0.64001,0.852228,3.114055 -Info:,,,,2.453999,0.577966,0.113882,2.701305 -Info:,,,,2.86924,0.71279,0.547038,1.698215 -Info:,,,,3.14438,0.607763,-0.240533,0.312627 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.189006,-0.506611,0.092168,-4.713944 -Info:,,,,-3.991416,-0.394593,-0.254301,-3.913338 -Info:,,,,-4.357702,-0.331386,-0.084538,-3.529577 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,2.923932,0.579327,0.016404,-0.111099 -Info:,,,,0.796966,0.268863,0.388118,3.03976 -Info:,,,,1.323103,0.396083,0.07394,2.395459 -Info:,,,,0.796966,0.268863,0.388118,3.03976 -Info:,,,,1.081146,0.437955,0.677276,3.596929 -Info:,,,,3.14438,0.607763,-0.240533,0.312627 -Info:,,,,3.135672,0.613548,-0.53732,-0.518403 -Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 -Info:,,,,-3.128613,-0.076483,-0.651582,-5.28948 -Info:,,,,2.453999,0.577966,0.113882,2.701305 -Info:,,,,3.059334,0.690725,0.248899,3.460823 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.198129,-0.448557,-0.149908,-4.858853 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,2.967696,0.591353,-0.10281,-0.542625 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.177465,-0.55963,0.319807,-4.68636 -Info:,,,,1.081146,0.437955,0.677276,3.596929 -Info:,,,,1.347615,0.659931,0.712271,3.339686 -Info:,,,,-2.683818,-0.332109,-0.389182,-5.000372 -Info:,,,,-3.343247,0.134754,-0.879993,-3.159555 -Info:,,,,0.796966,0.268863,0.388118,3.03976 -Info:,,,,1.456607,0.619263,0.576692,4.440507 -Info:,,,,-1.71141,-0.447081,0.155406,-4.913486 -Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,0.795673,0.287117,0.508119,3.157515 -Info:,,,,3.059334,0.690725,0.248899,3.460823 -Info:,,,,3.354248,0.737738,0.057218,2.521013 -Info:,,,,3.14438,0.607763,-0.240533,0.312627 -Info:,,,,3.059386,0.593015,0.283682,-1.175398 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,2.936916,0.585854,-0.124326,0.023712 -Info:,,,,-1.262031,-0.188411,-0.225617,-3.554714 -Info:,,,,-1.634316,-0.157788,0.05662,-3.940968 -Info:,,,,3.059334,0.690725,0.248899,3.460823 -Info:,,,,3.769762,0.706334,-0.199846,3.705128 -Info:,,,,3.14438,0.607763,-0.240533,0.312627 -Info:,,,,3.149918,0.608631,-0.544865,-0.264596 -Info:,,,,-4.357702,-0.331386,-0.084538,-3.529577 -Info:,,,,-4.703017,-0.331979,0.089177,-3.385429 -Info:,,,,-4.703017,-0.331979,0.089177,-3.385429 -Info:,,,,-5.055142,-0.312431,-0.195971,-3.691848 -Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 -Info:,,,,-1.289248,-0.590961,0.636602,-1.258158 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,2.948806,0.580399,0.110523,-0.938025 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,2.898944,0.551284,0.357057,-2.044603 -Info:,,,,3.769762,0.706334,-0.199846,3.705128 -Info:,,,,4.138434,0.645765,-0.126036,3.768842 -Info:,,,,4.138434,0.645765,-0.126036,3.768842 -Info:,,,,4.955468,0.436483,-0.366769,4.685598 -Info:,,,,-1.262031,-0.188411,-0.225617,-3.554714 -Info:,,,,-1.623517,-0.11088,-0.197301,-3.839663 -Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 -Info:,,,,-1.284108,-0.618192,1.12193,-0.64768 -Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 -Info:,,,,-2.74305,-0.611093,-0.007592,-4.803206 -Info:,,,,-1.284108,-0.618192,1.12193,-0.64768 -Info:,,,,-1.329647,-0.762888,1.396237,-0.873983 -Info:,,,,4.955468,0.436483,-0.366769,4.685598 -Info:,,,,5.716537,0.378117,0.257269,3.07088 -Info:,,,,-5.055142,-0.312431,-0.195971,-3.691848 -Info:,,,,-5.59363,-0.16671,-0.349045,-1.891975 -Info:,,,,3.769762,0.706334,-0.199846,3.705128 -Info:,,,,4.57005,0.795019,0.401723,4.469078 -Info:,,,,-1.163226,-0.695306,1.31392,-3.004474 -Info:,,,,-1.234353,-0.975401,1.330532,-2.775298 -Info:,,,,3.769762,0.706334,-0.199846,3.705128 -Info:,,,,4.310202,0.640121,-0.022755,1.746494 -Info:,,,,-1.226822,-0.545326,0.623082,-0.288404 -Info:,,,,-1.248355,-0.561029,0.637514,-0.244601 -Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 -Info:,,,,-2.744487,-0.67336,0.231102,-5.02403 -Info:,,,,-5.59363,-0.16671,-0.349045,-1.891975 -Info:,,,,-5.934314,0.032052,-0.701856,-2.072803 -Info:,,,,5.716537,0.378117,0.257269,3.07088 -Info:,,,,6.018792,0.448113,0.198076,3.135099 -Info:,,,,-2.744487,-0.67336,0.231102,-5.02403 -Info:,,,,-3.80714,-0.610063,-0.337006,-5.765614 -Info:,,,,6.018792,0.448113,0.198076,3.135099 -Info:,,,,6.296993,0.533699,0.403993,2.696545 -Info:,,,,6.296993,0.533699,0.403993,2.696545 -Info:,,,,6.57759,0.626695,0.240897,3.222121 -Info:,,,,-3.80714,-0.610063,-0.337006,-5.765614 -Info:,,,,-4.819938,-0.141895,-0.531048,-5.409596 -Info:,,,,6.57759,0.626695,0.240897,3.222121 -Info:,,,,7.342017,0.714113,4.4e-05,4.490435 -Info:,,,,7.342017,0.714113,4.4e-05,4.490435 -Info:,,,,7.766908,0.704736,-0.045025,4.010162 -Info:,,,,-1.248355,-0.561029,0.637514,-0.244601 -Info:,,,,-1.264314,-0.570583,0.418552,-0.12814 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,0.815864,0.213302,-0.016365,3.167673 -Info:,,,,1.456607,0.619263,0.576692,4.440507 -Info:,,,,2.366086,1.123306,0.442029,5.965434 -Info:,,,,0.815864,0.213302,-0.016365,3.167673 -Info:,,,,1.61266,0.03496,-0.395091,5.04558 -Info:,,,,-1.234353,-0.975401,1.330532,-2.775298 -Info:,,,,-1.27358,-1.295056,1.556299,-3.679361 -Info:,,,,-5.934314,0.032052,-0.701856,-2.072803 -Info:,,,,-6.084545,0.133956,-0.479864,-1.565248 -Info:,,,,3.149918,0.608631,-0.544865,-0.264596 -Info:,,,,3.138141,0.615748,-0.541212,-0.010613 -Info:,,,,6.57759,0.626695,0.240897,3.222121 -Info:,,,,6.930401,0.686344,0.098821,3.940244 -Info:,,,,7.342017,0.714113,4.4e-05,4.490435 -Info:,,,,8.285006,0.455114,-0.520131,5.399478 -Info:,,,,2.366086,1.123306,0.442029,5.965434 -Info:,,,,2.87024,1.446501,0.697546,6.044284 -Info:,,,,2.87024,1.446501,0.697546,6.044284 -Info:,,,,3.318262,1.825019,0.705546,5.686054 -Info:,,,,-3.80714,-0.610063,-0.337006,-5.765614 -Info:,,,,-4.371821,-0.368042,-0.47006,-6.530643 -Info:,,,,8.285006,0.455114,-0.520131,5.399478 -Info:,,,,8.967058,-0.181585,-1.005651,4.022626 -Info:,,,,2.86924,0.71279,0.547038,1.698215 -Info:,,,,3.026334,0.806677,0.53073,1.962063 -Info:,,,,0.667113,0.64001,0.852228,3.114055 -Info:,,,,0.922082,1.190838,1.424661,3.039375 -Info:,,,,-6.084545,0.133956,-0.479864,-1.565248 -Info:,,,,-6.266963,0.204615,-0.273116,-2.35413 -Info:,,,,4.955468,0.436483,-0.366769,4.685598 -Info:,,,,5.364672,0.213031,-0.633046,4.666788 -Info:,,,,2.898944,0.551284,0.357057,-2.044603 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,8.285006,0.455114,-0.520131,5.399478 -Info:,,,,9.419893,0.18836,0.042241,6.413349 -Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 -Info:,,,,-2.743734,-0.733317,0.446634,-5.37018 -Info:,,,,6.296993,0.533699,0.403993,2.696545 -Info:,,,,6.68314,0.800819,0.826131,2.033614 -Info:,,,,-6.266963,0.204615,-0.273116,-2.35413 -Info:,,,,-6.449542,0.281455,-0.540075,-1.619326 -Info:,,,,1.61266,0.03496,-0.395091,5.04558 -Info:,,,,2.089271,-0.217421,-0.574956,5.75514 -Info:,,,,6.68314,0.800819,0.826131,2.033614 -Info:,,,,6.838824,0.973521,0.847334,2.61679 -Info:,,,,-4.703017,-0.331979,0.089177,-3.385429 -Info:,,,,-5.414807,-0.574702,0.551457,-4.202058 -Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 -Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 -Info:,,,,-4.819938,-0.141895,-0.531048,-5.409596 -Info:,,,,-5.496437,0.607028,-1.152721,-4.846862 -Info:,,,,0.667113,0.64001,0.852228,3.114055 -Info:,,,,0.87763,0.83078,0.612754,2.581438 -Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 -Info:,,,,-4.266658,-0.515371,0.042385,-7.433546 -Info:,,,,2.089271,-0.217421,-0.574956,5.75514 -Info:,,,,2.543181,-0.529935,-0.631805,5.268124 -Info:,,,,2.366086,1.123306,0.442029,5.965434 -Info:,,,,3.587714,1.398129,0.008449,6.654679 -Info:,,,,2.543181,-0.529935,-0.631805,5.268124 -Info:,,,,2.981639,-0.820152,-0.537544,5.251885 -Info:,,,,2.981639,-0.820152,-0.537544,5.251885 -Info:,,,,3.411727,-1.092272,-0.591273,4.928222 -Info:,,,,6.838824,0.973521,0.847334,2.61679 -Info:,,,,7.030275,1.193612,0.861925,3.217419 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,2.005973,0.462672,0.024641,-3.39812 -Info:,,,,0.922082,1.190838,1.424661,3.039375 -Info:,,,,0.996277,1.724153,1.441174,2.345206 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,1.55704,0.691637,-0.517741,-4.831726 -Info:,,,,3.054914,0.597758,0.20958,-1.213214 -Info:,,,,2.961867,0.569834,0.388264,-0.73226 -Info:,,,,7.030275,1.193612,0.861925,3.217419 -Info:,,,,7.364176,1.862713,1.33082,4.328894 -Info:,,,,-6.449542,0.281455,-0.540075,-1.619326 -Info:,,,,-6.590751,0.36214,-0.498215,-1.633599 -Info:,,,,7.766908,0.704736,-0.045025,4.010162 -Info:,,,,8.757784,0.790306,0.201241,5.960336 -Info:,,,,-5.496437,0.607028,-1.152721,-4.846862 -Info:,,,,-5.740589,1.041199,-0.966101,-5.129822 -Info:,,,,7.364176,1.862713,1.33082,4.328894 -Info:,,,,7.519173,2.674727,1.435182,3.941603 -Info:,,,,5.716537,0.378117,0.257269,3.07088 -Info:,,,,6.022438,0.417899,0.001995,3.115444 -Info:,,,,0.996277,1.724153,1.441174,2.345206 -Info:,,,,1.15776,2.267829,1.140639,3.347477 -Info:,,,,1.61266,0.03496,-0.395091,5.04558 -Info:,,,,2.417269,-0.063318,0.197094,3.177878 -Info:,,,,7.519173,2.674727,1.435182,3.941603 -Info:,,,,7.584557,3.517843,1.549027,4.519431 -Info:,,,,-5.414807,-0.574702,0.551457,-4.202058 -Info:,,,,-6.306258,-0.992296,0.335375,-5.661112 -Info:,,,,1.15776,2.267829,1.140639,3.347477 -Info:,,,,1.325066,2.526129,0.843101,2.83024 -Info:,,,,1.61266,0.03496,-0.395091,5.04558 -Info:,,,,2.018393,-0.179903,-0.585123,4.150483 -Info:,,,,0.815864,0.213302,-0.016365,3.167673 -Info:,,,,1.152962,0.230356,0.114744,3.587744 -Info:,,,,2.089271,-0.217421,-0.574956,5.75514 -Info:,,,,2.551926,-0.607253,-0.821207,6.375348 -Info:,,,,-6.084545,0.133956,-0.479864,-1.565248 -Info:,,,,-6.526816,0.372011,-0.504595,-3.457561 -Info:,,,,1.325066,2.526129,0.843101,2.83024 -Info:,,,,1.617753,2.959379,1.117476,2.414658 -Info:,,,,3.135672,0.613548,-0.53732,-0.518403 -Info:,,,,3.066137,0.665774,-0.725639,-1.223303 -Info:,,,,-5.59363,-0.16671,-0.349045,-1.891975 -Info:,,,,-5.720398,-0.106939,-0.556137,-0.915897 -Info:,,,,2.551926,-0.607253,-0.821207,6.375348 -Info:,,,,2.935058,-1.142013,-1.074192,6.81666 -Info:,,,,-6.590751,0.36214,-0.498215,-1.633599 -Info:,,,,-6.689943,0.432165,-0.761194,-0.801525 -Info:,,,,7.584557,3.517843,1.549027,4.519431 -Info:,,,,7.591527,3.968908,1.56167,4.503005 -Info:,,,,8.757784,0.790306,0.201241,5.960336 -Info:,,,,9.986265,1.182968,0.412054,6.960616 -Info:,,,,1.15776,2.267829,1.140639,3.347477 -Info:,,,,1.259943,2.623194,1.431471,4.073859 -Info:,,,,3.411727,-1.092272,-0.591273,4.928222 -Info:,,,,3.832702,-1.309689,-0.359255,4.569133 -Info:,,,,2.898944,0.551284,0.357057,-2.044603 -Info:,,,,2.632051,0.489811,0.044906,-0.70447 -Info:,,,,-6.689943,0.432165,-0.761194,-0.801525 -Info:,,,,-6.77131,0.520396,-0.877601,-1.600211 -Info:,,,,2.089271,-0.217421,-0.574956,5.75514 -Info:,,,,2.59939,-0.532671,-0.532701,6.239139 -Info:,,,,1.617753,2.959379,1.117476,2.414658 -Info:,,,,1.799747,3.177484,0.49144,0.465626 -Info:,,,,-2.227272,-0.550056,0.236854,-5.610195 -Info:,,,,-2.783996,-0.690676,0.257802,-5.874199 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,1.998882,0.422753,0.248072,-3.609629 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,1.997769,0.465833,0.006247,-3.561785 -Info:,,,,1.55704,0.691637,-0.517741,-4.831726 -Info:,,,,1.106859,0.934285,-0.471824,-5.397385 -Info:,,,,-5.720398,-0.106939,-0.556137,-0.915897 -Info:,,,,-5.797205,-0.053592,-0.705762,-0.019868 -Info:,,,,-5.797205,-0.053592,-0.705762,-0.019868 -Info:,,,,-5.784177,-0.069044,-0.946644,0.424671 -Info:,,,,1.106859,0.934285,-0.471824,-5.397385 -Info:,,,,0.565206,1.120763,-0.196884,-6.095824 -Info:,,,,-5.784177,-0.069044,-0.946644,0.424671 -Info:,,,,-5.724084,-0.20417,-1.306524,1.061713 -Info:,,,,1.55704,0.691637,-0.517741,-4.831726 -Info:,,,,0.838216,1.156263,-0.634911,-3.732272 -Info:,,,,0.565206,1.120763,-0.196884,-6.095824 -Info:,,,,-0.520632,1.499595,-0.479822,-5.442839 -Info:,,,,0.53693,0.176481,0.291335,2.481543 -Info:,,,,1.156647,0.288015,0.079847,3.826764 -Info:,,,,4.57005,0.795019,0.401723,4.469078 -Info:,,,,5.040544,0.915575,0.1081,5.279706 -Info:,,,,-6.306258,-0.992296,0.335375,-5.661112 -Info:,,,,-6.875543,-1.097257,0.031892,-5.961031 -Info:,,,,6.930401,0.686344,0.098821,3.940244 -Info:,,,,7.329634,0.791661,0.41184,4.351346 -Info:,,,,0.565206,1.120763,-0.196884,-6.095824 -Info:,,,,-0.057942,1.147372,0.108833,-6.427188 -Info:,,,,0.197032,0.063939,0.379448,1.286562 -Info:,,,,0.367181,0.110358,0.172013,2.246959 -Info:,,,,1.259943,2.623194,1.431471,4.073859 -Info:,,,,1.323809,2.996416,1.369603,3.500285 -Info:,,,,1.323809,2.996416,1.369603,3.500285 -Info:,,,,1.319226,3.565051,1.821478,2.234122 -Info:,,,,1.799747,3.177484,0.49144,0.465626 -Info:,,,,2.032028,3.241521,0.122408,1.955822 -Info:,,,,7.591527,3.968908,1.56167,4.503005 -Info:,,,,7.540308,4.42786,1.80004,4.754916 -Info:,,,,7.540308,4.42786,1.80004,4.754916 -Info:,,,,7.454419,5.418937,1.518873,5.225819 -Info:,,,,-5.724084,-0.20417,-1.306524,1.061713 -Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 -Info:,,,,-6.875543,-1.097257,0.031892,-5.961031 -Info:,,,,-8.127534,-0.911584,-0.318982,-6.760892 -Info:,,,,-6.306258,-0.992296,0.335375,-5.661112 -Info:,,,,-6.855092,-1.20048,0.389091,-6.080141 -Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 -Info:,,,,-5.810292,-0.933992,-1.954602,1.443114 -Info:,,,,-0.520632,1.499595,-0.479822,-5.442839 -Info:,,,,-1.00691,1.712681,-0.345074,-5.183515 -Info:,,,,2.032028,3.241521,0.122408,1.955822 -Info:,,,,2.476358,3.436467,0.667328,2.956028 -Info:,,,,1.259943,2.623194,1.431471,4.073859 -Info:,,,,1.350365,3.005242,1.243053,3.789808 -Info:,,,,6.68314,0.800819,0.826131,2.033614 -Info:,,,,7.140922,1.047518,0.209959,3.248316 -Info:,,,,6.68314,0.800819,0.826131,2.033614 -Info:,,,,6.815491,0.978755,1.030637,2.409327 -Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 -Info:,,,,-5.835852,-0.917024,-2.124806,1.370859 -Info:,,,,3.832702,-1.309689,-0.359255,4.569133 -Info:,,,,4.266232,-1.42961,-0.179615,4.439186 -Info:,,,,2.935058,-1.142013,-1.074192,6.81666 -Info:,,,,3.203447,-1.777606,-1.267423,7.003535 -Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 -Info:,,,,-5.875146,-1.063688,-2.038906,2.884015 -Info:,,,,1.55704,0.691637,-0.517741,-4.831726 -Info:,,,,0.634162,0.916473,0.040585,-4.791493 -Info:,,,,3.203447,-1.777606,-1.267423,7.003535 -Info:,,,,3.473476,-2.449249,-1.111382,7.489004 -Info:,,,,4.266232,-1.42961,-0.179615,4.439186 -Info:,,,,4.688165,-1.451964,0.077855,4.034669 -Info:,,,,7.454419,5.418937,1.518873,5.225819 -Info:,,,,7.468873,5.977768,1.569895,5.955749 -Info:,,,,-1.329647,-0.762888,1.396237,-0.873983 -Info:,,,,-1.346709,-0.863707,1.409416,-1.17108 -Info:,,,,4.688165,-1.451964,0.077855,4.034669 -Info:,,,,5.110756,-1.405665,0.139346,4.46907 -Info:,,,,1.319226,3.565051,1.821478,2.234122 -Info:,,,,1.226285,4.065405,1.692692,2.858502 -Info:,,,,1.55704,0.691637,-0.517741,-4.831726 -Info:,,,,0.658724,1.374203,-0.769539,-6.480065 -Info:,,,,0.367181,0.110358,0.172013,2.246959 -Info:,,,,0.61273,0.178158,0.35935,2.855222 -Info:,,,,2.032028,3.241521,0.122408,1.955822 -Info:,,,,2.425668,3.25937,-0.031356,1.988508 -Info:,,,,-1.27358,-1.295056,1.556299,-3.679361 -Info:,,,,-1.333015,-1.89268,1.373399,-2.334603 -Info:,,,,1.156647,0.288015,0.079847,3.826764 -Info:,,,,2.020113,0.287104,-0.076005,4.816604 -Info:,,,,1.799747,3.177484,0.49144,0.465626 -Info:,,,,1.981684,3.200435,-0.135442,1.39596 -Info:,,,,-1.333015,-1.89268,1.373399,-2.334603 -Info:,,,,-1.345334,-2.204167,1.75088,-0.799796 -Info:,,,,-6.855092,-1.20048,0.389091,-6.080141 -Info:,,,,-7.858917,-1.906814,0.83464,-6.296214 -Info:,,,,3.473476,-2.449249,-1.111382,7.489004 -Info:,,,,3.841433,-3.105052,-1.00775,7.557274 -Info:,,,,1.226285,4.065405,1.692692,2.858502 -Info:,,,,1.154685,4.33183,1.977081,2.677697 -Info:,,,,-6.77131,0.520396,-0.877601,-1.600211 -Info:,,,,-7.133881,0.791827,-0.450296,-2.962548 -Info:,,,,-1.333015,-1.89268,1.373399,-2.334603 -Info:,,,,-1.351846,-2.176703,1.7062,-0.523267 -Info:,,,,1.998882,0.422753,0.248072,-3.609629 -Info:,,,,1.652269,0.385843,-0.038961,-3.385798 -Info:,,,,-5.875146,-1.063688,-2.038906,2.884015 -Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 -Info:,,,,8.967058,-0.181585,-1.005651,4.022626 -Info:,,,,9.255328,-0.512687,-0.711771,4.789132 -Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 -Info:,,,,-4.240979,-0.36168,-0.377242,-7.460259 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,2.028536,0.485226,-0.116992,-2.962037 -Info:,,,,3.841433,-3.105052,-1.00775,7.557274 -Info:,,,,4.78796,-4.274429,-0.772731,7.52186 -Info:,,,,-0.057942,1.147372,0.108833,-6.427188 -Info:,,,,-0.711478,1.122803,-0.032828,-6.663722 -Info:,,,,-1.345334,-2.204167,1.75088,-0.799796 -Info:,,,,-1.282389,-2.388162,2.032994,-1.151233 -Info:,,,,7.454419,5.418937,1.518873,5.225819 -Info:,,,,7.46349,5.903125,1.587049,4.461514 -Info:,,,,-5.740589,1.041199,-0.966101,-5.129822 -Info:,,,,-6.08157,1.471458,-0.838017,-5.857493 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,1.818962,0.518094,-0.20804,-1.84213 -Info:,,,,9.419893,0.18836,0.042241,6.413349 -Info:,,,,10.04085,0.209138,0.024465,6.012898 -Info:,,,,-7.133881,0.791827,-0.450296,-2.962548 -Info:,,,,-7.685432,1.015894,-0.321698,-2.994834 -Info:,,,,3.841433,-3.105052,-1.00775,7.557274 -Info:,,,,4.19113,-3.751971,-1.143932,7.161826 -Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 -Info:,,,,-5.998005,-1.958108,-1.137429,1.544105 -Info:,,,,7.46349,5.903125,1.587049,4.461514 -Info:,,,,7.492746,6.330178,1.415398,4.110092 -Info:,,,,3.841433,-3.105052,-1.00775,7.557274 -Info:,,,,4.17009,-3.774878,-1.22233,7.393633 -Info:,,,,-6.08157,1.471458,-0.838017,-5.857493 -Info:,,,,-6.637062,2.699577,-1.4258,-7.81621 -Info:,,,,1.154685,4.33183,1.977081,2.677697 -Info:,,,,1.096498,4.540942,1.684935,1.678652 -Info:,,,,-1.282389,-2.388162,2.032994,-1.151233 -Info:,,,,-1.208494,-2.516703,2.1438,-1.815607 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,2.012073,0.43723,0.175955,-3.308127 -Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 -Info:,,,,-6.079183,-1.764781,-1.782664,1.57011 -Info:,,,,0.565206,1.120763,-0.196884,-6.095824 -Info:,,,,-0.429518,1.46361,-0.481664,-4.461027 -Info:,,,,-6.637062,2.699577,-1.4258,-7.81621 -Info:,,,,-6.730953,3.444278,-1.465504,-7.196705 -Info:,,,,3.587714,1.398129,0.008449,6.654679 -Info:,,,,4.72168,1.107859,-0.531965,5.193518 -Info:,,,,1.799747,3.177484,0.49144,0.465626 -Info:,,,,1.819465,3.188473,0.544079,-0.014132 -Info:,,,,7.468873,5.977768,1.569895,5.955749 -Info:,,,,7.508776,6.55978,1.433878,5.720821 -Info:,,,,5.364672,0.213031,-0.633046,4.666788 -Info:,,,,5.719484,-0.12559,-0.886738,5.168841 -Info:,,,,-1.208494,-2.516703,2.1438,-1.815607 -Info:,,,,-1.113214,-2.656989,2.192168,-1.576386 -Info:,,,,4.78796,-4.274429,-0.772731,7.52186 -Info:,,,,6.0417,-5.036536,-0.317124,7.277787 -Info:,,,,6.0417,-5.036536,-0.317124,7.277787 -Info:,,,,7.250332,-5.447003,-0.338666,5.486766 -Info:,,,,-4.266658,-0.515371,0.042385,-7.433546 -Info:,,,,-4.978058,-0.494552,-0.10301,-6.813076 -Info:,,,,1.61266,0.03496,-0.395091,5.04558 -Info:,,,,2.278574,-0.513779,-1.014754,3.721725 -Info:,,,,2.898944,0.551284,0.357057,-2.044603 -Info:,,,,2.709106,0.450224,0.616815,-2.268734 -Info:,,,,1.154685,4.33183,1.977081,2.677697 -Info:,,,,1.053193,4.585995,1.924724,2.796518 -Info:,,,,-7.858917,-1.906814,0.83464,-6.296214 -Info:,,,,-8.657253,-2.626475,0.620495,-4.472421 -Info:,,,,3.587714,1.398129,0.008449,6.654679 -Info:,,,,5.047811,1.017383,-0.497085,8.595553 -Info:,,,,0.658724,1.374203,-0.769539,-6.480065 -Info:,,,,-0.444755,2.070983,-0.358801,-6.662673 -Info:,,,,-5.998005,-1.958108,-1.137429,1.544105 -Info:,,,,-5.881306,-2.122673,-0.693425,0.488482 -Info:,,,,-1.289248,-0.590961,0.636602,-1.258158 -Info:,,,,-1.470178,-0.84433,1.224681,-1.899907 -Info:,,,,-7.858917,-1.906814,0.83464,-6.296214 -Info:,,,,-8.316648,-2.391753,0.794611,-7.041611 -Info:,,,,-1.351846,-2.176703,1.7062,-0.523267 -Info:,,,,-1.350491,-2.187429,1.775484,0.307213 -Info:,,,,1.096498,4.540942,1.684935,1.678652 -Info:,,,,1.086417,4.692879,1.585786,1.368003 -Info:,,,,4.78796,-4.274429,-0.772731,7.52186 -Info:,,,,5.793953,-5.257496,-0.775068,6.543857 -Info:,,,,-6.04209,-1.567534,-1.734205,2.444361 -Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 -Info:,,,,5.793953,-5.257496,-0.775068,6.543857 -Info:,,,,6.491091,-6.218569,-1.122653,5.388851 -Info:,,,,-1.00691,1.712681,-0.345074,-5.183515 -Info:,,,,-1.491093,1.921346,-0.468033,-5.367782 -Info:,,,,-8.657253,-2.626475,0.620495,-4.472421 -Info:,,,,-9.068583,-2.841448,0.346282,-4.839089 -Info:,,,,5.047811,1.017383,-0.497085,8.595553 -Info:,,,,6.751986,0.460448,-0.140155,9.428624 -Info:,,,,0.367181,0.110358,0.172013,2.246959 -Info:,,,,0.585411,0.1332,0.035509,2.144899 -Info:,,,,5.110756,-1.405665,0.139346,4.46907 -Info:,,,,5.559002,-1.329808,0.195617,4.624507 -Info:,,,,7.492746,6.330178,1.415398,4.110092 -Info:,,,,7.857885,7.105415,0.855803,4.571873 -Info:,,,,-1.208494,-2.516703,2.1438,-1.815607 -Info:,,,,-0.955984,-2.777413,2.53586,-1.837224 -Info:,,,,1.053193,4.585995,1.924724,2.796518 -Info:,,,,0.927944,4.818047,2.212198,2.495592 -Info:,,,,7.250332,-5.447003,-0.338666,5.486766 -Info:,,,,8.293169,-5.517313,0.210791,5.097859 -Info:,,,,1.819465,3.188473,0.544079,-0.014132 -Info:,,,,1.854647,3.209505,0.536268,0.833918 -Info:,,,,-5.881306,-2.122673,-0.693425,0.488482 -Info:,,,,-5.874788,-2.1282,-0.658925,-0.317606 -Info:,,,,7.857885,7.105415,0.855803,4.571873 -Info:,,,,8.376249,7.90766,1.134222,5.010462 -Info:,,,,0.927944,4.818047,2.212198,2.495592 -Info:,,,,0.63776,5.099138,2.558557,1.564347 -Info:,,,,2.35201,0.464949,-0.011265,-3.523142 -Info:,,,,2.040853,0.440697,0.174731,-2.727818 -Info:,,,,1.086417,4.692879,1.585786,1.368003 -Info:,,,,1.056063,4.924073,1.830834,0.969567 -Info:,,,,-8.127534,-0.911584,-0.318982,-6.760892 -Info:,,,,-9.567421,-0.603013,-0.109079,-7.99191 -Info:,,,,6.491091,-6.218569,-1.122653,5.388851 -Info:,,,,7.157958,-7.091138,-0.717246,5.668914 -Info:,,,,4.688165,-1.451964,0.077855,4.034669 -Info:,,,,5.1239,-1.450961,-0.069572,4.687934 -Info:,,,,-5.875146,-1.063688,-2.038906,2.884015 -Info:,,,,-5.985202,-1.464064,-1.58143,1.302937 -Info:,,,,-5.881306,-2.122673,-0.693425,0.488482 -Info:,,,,-5.831631,-2.152483,-0.403049,0.674228 -Info:,,,,1.259943,2.623194,1.431471,4.073859 -Info:,,,,1.333459,3.019437,1.342916,3.988887 -Info:,,,,4.266232,-1.42961,-0.179615,4.439186 -Info:,,,,4.939661,-1.707412,-0.634606,2.90789 -Info:,,,,7.857885,7.105415,0.855803,4.571873 -Info:,,,,8.32462,7.737202,1.022299,3.292041 -Info:,,,,-7.685432,1.015894,-0.321698,-2.994834 -Info:,,,,-8.240404,1.154956,-0.166975,-2.732167 -Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 -Info:,,,,-4.992351,0.07566,-0.629847,-8.690103 -Info:,,,,-6.08157,1.471458,-0.838017,-5.857493 -Info:,,,,-6.806864,2.210395,-0.747457,-4.500155 -Info:,,,,1.086417,4.692879,1.585786,1.368003 -Info:,,,,1.085309,4.790791,1.577321,0.59037 -Info:,,,,-9.567421,-0.603013,-0.109079,-7.99191 -Info:,,,,-11.218155,-0.310736,-0.239355,-8.784033 -Info:,,,,-9.068583,-2.841448,0.346282,-4.839089 -Info:,,,,-9.961037,-3.520313,0.925425,-6.531052 -Info:,,,,9.255328,-0.512687,-0.711771,4.789132 -Info:,,,,10.019502,-0.986925,-0.392624,4.242791 -Info:,,,,7.508776,6.55978,1.433878,5.720821 -Info:,,,,7.908084,7.496134,0.881187,4.588788 -Info:,,,,1.55704,0.691637,-0.517741,-4.831726 -Info:,,,,1.155046,0.981956,-0.73124,-5.104487 -Info:,,,,-0.444755,2.070983,-0.358801,-6.662673 -Info:,,,,-1.034557,2.288428,-0.347402,-5.909569 -Info:,,,,4.17009,-3.774878,-1.22233,7.393633 -Info:,,,,5.012009,-5.143061,-0.827281,8.775773 -Info:,,,,-8.240404,1.154956,-0.166975,-2.732167 -Info:,,,,-8.701813,1.169412,0.121638,-1.900069 -Info:,,,,1.259943,2.623194,1.431471,4.073859 -Info:,,,,1.314174,3.629916,1.592163,6.018676 -Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 -Info:,,,,-4.224598,-0.485342,-0.048775,-6.632062 -Info:,,,,7.157958,-7.091138,-0.717246,5.668914 -Info:,,,,7.602872,-7.383828,-0.440873,5.016135 -Info:,,,,-0.955984,-2.777413,2.53586,-1.837224 -Info:,,,,-0.771741,-2.967748,2.087654,-0.833038 -Info:,,,,-5.724084,-0.20417,-1.306524,1.061713 -Info:,,,,-5.70236,-0.430786,-1.636066,1.225151 -Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 -Info:,,,,-5.934452,-2.368634,-1.030449,1.883823 -Info:,,,,6.68314,0.800819,0.826131,2.033614 -Info:,,,,6.792424,0.92099,0.840714,1.215056 -Info:,,,,1.314174,3.629916,1.592163,6.018676 -Info:,,,,1.598339,4.670352,0.996274,4.927468 -Info:,,,,1.085309,4.790791,1.577321,0.59037 -Info:,,,,1.085637,4.83705,1.547327,0.334875 -Info:,,,,8.293169,-5.517313,0.210791,5.097859 -Info:,,,,9.442621,-5.452401,-0.0863,6.457229 -Info:,,,,7.602872,-7.383828,-0.440873,5.016135 -Info:,,,,8.576084,-7.831741,-0.4222,5.69741 -Info:,,,,-5.934452,-2.368634,-1.030449,1.883823 -Info:,,,,-5.756652,-2.587906,-0.713661,0.950578 -Info:,,,,8.32462,7.737202,1.022299,3.292041 -Info:,,,,8.532771,8.010762,0.821359,3.594457 -Info:,,,,-6.806864,2.210395,-0.747457,-4.500155 -Info:,,,,-7.105691,2.48566,-0.741072,-3.625579 -Info:,,,,-3.525192,-0.569217,-0.187197,-7.46753 -Info:,,,,-4.228644,-0.442096,-0.17011,-6.829554 -Info:,,,,-7.105691,2.48566,-0.741072,-3.625579 -Info:,,,,-7.789189,3.030573,-0.612381,-5.121682 -Info:,,,,-6.730953,3.444278,-1.465504,-7.196705 -Info:,,,,-6.660479,4.797158,-1.786385,-6.408667 -Info:,,,,1.314174,3.629916,1.592163,6.018676 -Info:,,,,1.317981,4.711016,1.540432,4.793597 -Info:,,,,1.317981,4.711016,1.540432,4.793597 -Info:,,,,1.535703,5.534887,1.066259,3.807945 -Info:,,,,1.317981,4.711016,1.540432,4.793597 -Info:,,,,1.370879,5.172264,1.371022,4.502926 -Info:,,,,0.565206,1.120763,-0.196884,-6.095824 -Info:,,,,-0.066409,1.209033,-0.082528,-6.666189 -Info:,,,,8.532771,8.010762,0.821359,3.594457 -Info:,,,,8.818121,8.281629,0.700864,4.279058 -Info:,,,,6.792424,0.92099,0.840714,1.215056 -Info:,,,,7.006144,1.18638,0.935838,2.193652 -Info:,,,,-5.784177,-0.069044,-0.946644,0.424671 -Info:,,,,-5.776849,-0.080674,-0.778003,-0.288508 -Info:,,,,7.602872,-7.383828,-0.440873,5.016135 -Info:,,,,8.057968,-7.578732,-0.368088,4.887567 -Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 -Info:,,,,-6.168065,-2.497944,-1.910163,3.07304 -Info:,,,,-1.27358,-1.295056,1.556299,-3.679361 -Info:,,,,-1.227505,-1.649935,1.84589,-3.502868 -Info:,,,,1.085637,4.83705,1.547327,0.334875 -Info:,,,,1.083257,4.818375,1.465308,-0.522829 -Info:,,,,1.598339,4.670352,0.996274,4.927468 -Info:,,,,2.122889,5.463944,0.976973,4.585519 -Info:,,,,-6.063444,-1.859885,-1.562763,3.425356 -Info:,,,,-6.24908,-2.647633,-2.01726,4.737371 -Info:,,,,-5.712412,-0.555442,-1.714179,2.476087 -Info:,,,,-5.591046,-1.19228,-1.101672,4.107236 -Info:,,,,5.012009,-5.143061,-0.827281,8.775773 -Info:,,,,6.305329,-6.280095,-0.613851,8.47764 -Info:,,,,-5.756652,-2.587906,-0.713661,0.950578 -Info:,,,,-5.687456,-2.641031,-0.592256,0.795244 -Info:,,,,-0.913925,-0.252615,0.334649,-3.305902 -Info:,,,,-1.369004,-0.352542,0.05957,-1.367177 -Info:,,,,8.32462,7.737202,1.022299,3.292041 -Info:,,,,8.488491,8.25369,1.539782,2.186669 From 5b2a70ba66eaa23ec116a261c260db48123bc528 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Tue, 22 Nov 2022 23:15:10 -0600 Subject: [PATCH 22/23] Add files via upload --- rrt_tree.csv | 669 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 669 insertions(+) create mode 100644 rrt_tree.csv diff --git a/rrt_tree.csv b/rrt_tree.csv new file mode 100644 index 0000000..1e2d6eb --- /dev/null +++ b/rrt_tree.csv @@ -0,0 +1,669 @@ +,x,y,theta,v +0,0.0,0.0,0.0,0.1 +1,0.030397,0.00344,0.184027,0.512563 +2,0.0,0.0,0.0,0.1 +3,-0.164225,-0.014587,0.128977,-1.749376 +4,0.030397,0.00344,0.184027,0.512563 +5,0.008441,0.004292,0.029858,-0.730183 +6,0.030397,0.00344,0.184027,0.512563 +7,0.096732,0.023543,0.386783,0.876031 +8,0.096732,0.023543,0.386783,0.876031 +9,0.137412,0.042945,0.556632,0.026141 +10,-0.164225,-0.014587,0.128977,-1.749376 +11,-0.619578,-0.141138,0.390347,-2.989907 +12,-0.164225,-0.014587,0.128977,-1.749376 +13,-0.542103,0.015466,-0.276416,-2.067361 +14,-0.619578,-0.141138,0.390347,-2.989907 +15,-0.913925,-0.252615,0.334649,-3.305902 +16,0.008441,0.004292,0.029858,-0.730183 +17,-0.143831,0.022815,-0.266852,-0.809396 +18,0.096732,0.023543,0.386783,0.876031 +19,0.197032,0.063939,0.379448,1.286562 +20,0.197032,0.063939,0.379448,1.286562 +21,0.293213,0.108264,0.492284,0.832614 +22,-0.542103,0.015466,-0.276416,-2.067361 +23,-0.716739,0.050912,-0.115559,-1.5004 +24,-0.619578,-0.141138,0.390347,-2.989907 +25,-0.968277,-0.344558,0.7178,-1.063784 +26,-0.913925,-0.252615,0.334649,-3.305902 +27,-1.71141,-0.447081,0.155406,-4.913486 +28,0.293213,0.108264,0.492284,0.832614 +29,0.332505,0.132279,0.646347,0.089088 +30,0.332505,0.132279,0.646347,0.089088 +31,0.417407,0.259613,1.16561,1.454124 +32,-1.71141,-0.447081,0.155406,-4.913486 +33,-2.206836,-0.461448,-0.096476,-5.025442 +34,0.197032,0.063939,0.379448,1.286562 +35,0.362434,0.146953,0.576363,0.566937 +36,-0.968277,-0.344558,0.7178,-1.063784 +37,-1.163226,-0.695306,1.31392,-3.004474 +38,0.417407,0.259613,1.16561,1.454124 +39,0.463907,0.356412,1.068933,0.694458 +40,-1.71141,-0.447081,0.155406,-4.913486 +41,-2.192428,-0.51822,0.138193,-4.81164 +42,-2.206836,-0.461448,-0.096476,-5.025442 +43,-3.148497,-0.419554,0.00989,-4.404922 +44,-0.619578,-0.141138,0.390347,-2.989907 +45,-1.262031,-0.188411,-0.225617,-3.554714 +46,0.008441,0.004292,0.029858,-0.730183 +47,-0.149457,-0.003927,0.073059,-0.85105 +48,0.197032,0.063939,0.379448,1.286562 +49,0.337421,0.114387,0.313519,1.697529 +50,0.337421,0.114387,0.313519,1.697529 +51,0.53693,0.176481,0.291335,2.481543 +52,0.53693,0.176481,0.291335,2.481543 +53,0.738751,0.234722,0.269219,1.719667 +54,0.53693,0.176481,0.291335,2.481543 +55,0.787375,0.249323,0.27501,2.734974 +56,-0.968277,-0.344558,0.7178,-1.063784 +57,-1.040239,-0.407299,0.71624,-0.845662 +58,0.53693,0.176481,0.291335,2.481543 +59,1.061148,0.39642,0.494462,3.213058 +60,1.061148,0.39642,0.494462,3.213058 +61,1.375278,0.528094,0.303093,3.609547 +62,1.375278,0.528094,0.303093,3.609547 +63,1.699434,0.582303,0.019346,2.985639 +64,-1.040239,-0.407299,0.71624,-0.845662 +65,-1.178257,-0.512097,0.583711,-0.888567 +66,1.699434,0.582303,0.019346,2.985639 +67,1.960533,0.572645,-0.098896,2.242939 +68,-3.148497,-0.419554,0.00989,-4.404922 +69,-3.583883,-0.43399,0.056572,-4.308368 +70,-3.583883,-0.43399,0.056572,-4.308368 +71,-3.991416,-0.394593,-0.254301,-3.913338 +72,0.53693,0.176481,0.291335,2.481543 +73,0.796966,0.268863,0.388118,3.03976 +74,-0.619578,-0.141138,0.390347,-2.989907 +75,-1.094289,-0.267612,0.110476,-1.938622 +76,1.960533,0.572645,-0.098896,2.242939 +77,2.453999,0.577966,0.113882,2.701305 +78,-3.991416,-0.394593,-0.254301,-3.913338 +79,-4.333298,-0.265414,-0.473238,-3.41072 +80,2.453999,0.577966,0.113882,2.701305 +81,2.883443,0.625473,0.105797,1.619344 +82,-1.71141,-0.447081,0.155406,-4.913486 +83,-2.683818,-0.332109,-0.389182,-5.000372 +84,-2.683818,-0.332109,-0.389182,-5.000372 +85,-3.111249,-0.105893,-0.58648,-4.687379 +86,-0.164225,-0.014587,0.128977,-1.749376 +87,-0.413769,-0.115662,0.694253,-0.978194 +88,-1.71141,-0.447081,0.155406,-4.913486 +89,-2.154279,-0.582972,0.445557,-4.384024 +90,2.883443,0.625473,0.105797,1.619344 +91,3.014372,0.627589,-0.088706,1.00363 +92,-1.178257,-0.512097,0.583711,-0.888567 +93,-1.226822,-0.545326,0.623082,-0.288404 +94,3.014372,0.627589,-0.088706,1.00363 +95,3.14438,0.607763,-0.240533,0.312627 +96,0.417407,0.259613,1.16561,1.454124 +97,0.667113,0.64001,0.852228,3.114055 +98,2.453999,0.577966,0.113882,2.701305 +99,2.86924,0.71279,0.547038,1.698215 +100,3.14438,0.607763,-0.240533,0.312627 +101,3.054914,0.597758,0.20958,-1.213214 +102,-1.71141,-0.447081,0.155406,-4.913486 +103,-2.189006,-0.506611,0.092168,-4.713944 +104,-3.991416,-0.394593,-0.254301,-3.913338 +105,-4.357702,-0.331386,-0.084538,-3.529577 +106,3.054914,0.597758,0.20958,-1.213214 +107,2.923932,0.579327,0.016404,-0.111099 +108,0.796966,0.268863,0.388118,3.03976 +109,1.323103,0.396083,0.07394,2.395459 +110,0.796966,0.268863,0.388118,3.03976 +111,1.081146,0.437955,0.677276,3.596929 +112,3.14438,0.607763,-0.240533,0.312627 +113,3.135672,0.613548,-0.53732,-0.518403 +114,-2.683818,-0.332109,-0.389182,-5.000372 +115,-3.128613,-0.076483,-0.651582,-5.28948 +116,2.453999,0.577966,0.113882,2.701305 +117,3.059334,0.690725,0.248899,3.460823 +118,-1.71141,-0.447081,0.155406,-4.913486 +119,-2.198129,-0.448557,-0.149908,-4.858853 +120,3.054914,0.597758,0.20958,-1.213214 +121,2.967696,0.591353,-0.10281,-0.542625 +122,-1.71141,-0.447081,0.155406,-4.913486 +123,-2.177465,-0.55963,0.319807,-4.68636 +124,1.081146,0.437955,0.677276,3.596929 +125,1.347615,0.659931,0.712271,3.339686 +126,-2.683818,-0.332109,-0.389182,-5.000372 +127,-3.343247,0.134754,-0.879993,-3.159555 +128,0.796966,0.268863,0.388118,3.03976 +129,1.456607,0.619263,0.576692,4.440507 +130,-1.71141,-0.447081,0.155406,-4.913486 +131,-2.227272,-0.550056,0.236854,-5.610195 +132,0.53693,0.176481,0.291335,2.481543 +133,0.795673,0.287117,0.508119,3.157515 +134,3.059334,0.690725,0.248899,3.460823 +135,3.354248,0.737738,0.057218,2.521013 +136,3.14438,0.607763,-0.240533,0.312627 +137,3.059386,0.593015,0.283682,-1.175398 +138,3.054914,0.597758,0.20958,-1.213214 +139,2.936916,0.585854,-0.124326,0.023712 +140,-1.262031,-0.188411,-0.225617,-3.554714 +141,-1.634316,-0.157788,0.05662,-3.940968 +142,3.059334,0.690725,0.248899,3.460823 +143,3.769762,0.706334,-0.199846,3.705128 +144,3.14438,0.607763,-0.240533,0.312627 +145,3.149918,0.608631,-0.544865,-0.264596 +146,-4.357702,-0.331386,-0.084538,-3.529577 +147,-4.703017,-0.331979,0.089177,-3.385429 +148,-4.703017,-0.331979,0.089177,-3.385429 +149,-5.055142,-0.312431,-0.195971,-3.691848 +150,-1.226822,-0.545326,0.623082,-0.288404 +151,-1.289248,-0.590961,0.636602,-1.258158 +152,3.054914,0.597758,0.20958,-1.213214 +153,2.948806,0.580399,0.110523,-0.938025 +154,3.054914,0.597758,0.20958,-1.213214 +155,2.898944,0.551284,0.357057,-2.044603 +156,3.769762,0.706334,-0.199846,3.705128 +157,4.138434,0.645765,-0.126036,3.768842 +158,4.138434,0.645765,-0.126036,3.768842 +159,4.955468,0.436483,-0.366769,4.685598 +160,-1.262031,-0.188411,-0.225617,-3.554714 +161,-1.623517,-0.11088,-0.197301,-3.839663 +162,-1.226822,-0.545326,0.623082,-0.288404 +163,-1.284108,-0.618192,1.12193,-0.64768 +164,-2.227272,-0.550056,0.236854,-5.610195 +165,-2.74305,-0.611093,-0.007592,-4.803206 +166,-1.284108,-0.618192,1.12193,-0.64768 +167,-1.329647,-0.762888,1.396237,-0.873983 +168,4.955468,0.436483,-0.366769,4.685598 +169,5.716537,0.378117,0.257269,3.07088 +170,-5.055142,-0.312431,-0.195971,-3.691848 +171,-5.59363,-0.16671,-0.349045,-1.891975 +172,3.769762,0.706334,-0.199846,3.705128 +173,4.57005,0.795019,0.401723,4.469078 +174,-1.163226,-0.695306,1.31392,-3.004474 +175,-1.234353,-0.975401,1.330532,-2.775298 +176,3.769762,0.706334,-0.199846,3.705128 +177,4.310202,0.640121,-0.022755,1.746494 +178,-1.226822,-0.545326,0.623082,-0.288404 +179,-1.248355,-0.561029,0.637514,-0.244601 +180,-2.227272,-0.550056,0.236854,-5.610195 +181,-2.744487,-0.67336,0.231102,-5.02403 +182,-5.59363,-0.16671,-0.349045,-1.891975 +183,-5.934314,0.032052,-0.701856,-2.072803 +184,5.716537,0.378117,0.257269,3.07088 +185,6.018792,0.448113,0.198076,3.135099 +186,-2.744487,-0.67336,0.231102,-5.02403 +187,-3.80714,-0.610063,-0.337006,-5.765614 +188,6.018792,0.448113,0.198076,3.135099 +189,6.296993,0.533699,0.403993,2.696545 +190,6.296993,0.533699,0.403993,2.696545 +191,6.57759,0.626695,0.240897,3.222121 +192,-3.80714,-0.610063,-0.337006,-5.765614 +193,-4.819938,-0.141895,-0.531048,-5.409596 +194,6.57759,0.626695,0.240897,3.222121 +195,7.342017,0.714113,4.4e-05,4.490435 +196,7.342017,0.714113,4.4e-05,4.490435 +197,7.766908,0.704736,-0.045025,4.010162 +198,-1.248355,-0.561029,0.637514,-0.244601 +199,-1.264314,-0.570583,0.418552,-0.12814 +200,0.53693,0.176481,0.291335,2.481543 +201,0.815864,0.213302,-0.016365,3.167673 +202,1.456607,0.619263,0.576692,4.440507 +203,2.366086,1.123306,0.442029,5.965434 +204,0.815864,0.213302,-0.016365,3.167673 +205,1.61266,0.03496,-0.395091,5.04558 +206,-1.234353,-0.975401,1.330532,-2.775298 +207,-1.27358,-1.295056,1.556299,-3.679361 +208,-5.934314,0.032052,-0.701856,-2.072803 +209,-6.084545,0.133956,-0.479864,-1.565248 +210,3.149918,0.608631,-0.544865,-0.264596 +211,3.138141,0.615748,-0.541212,-0.010613 +212,6.57759,0.626695,0.240897,3.222121 +213,6.930401,0.686344,0.098821,3.940244 +214,7.342017,0.714113,4.4e-05,4.490435 +215,8.285006,0.455114,-0.520131,5.399478 +216,2.366086,1.123306,0.442029,5.965434 +217,2.87024,1.446501,0.697546,6.044284 +218,2.87024,1.446501,0.697546,6.044284 +219,3.318262,1.825019,0.705546,5.686054 +220,-3.80714,-0.610063,-0.337006,-5.765614 +221,-4.371821,-0.368042,-0.47006,-6.530643 +222,8.285006,0.455114,-0.520131,5.399478 +223,8.967058,-0.181585,-1.005651,4.022626 +224,2.86924,0.71279,0.547038,1.698215 +225,3.026334,0.806677,0.53073,1.962063 +226,0.667113,0.64001,0.852228,3.114055 +227,0.922082,1.190838,1.424661,3.039375 +228,-6.084545,0.133956,-0.479864,-1.565248 +229,-6.266963,0.204615,-0.273116,-2.35413 +230,4.955468,0.436483,-0.366769,4.685598 +231,5.364672,0.213031,-0.633046,4.666788 +232,2.898944,0.551284,0.357057,-2.044603 +233,2.35201,0.464949,-0.011265,-3.523142 +234,8.285006,0.455114,-0.520131,5.399478 +235,9.419893,0.18836,0.042241,6.413349 +236,-2.227272,-0.550056,0.236854,-5.610195 +237,-2.743734,-0.733317,0.446634,-5.37018 +238,6.296993,0.533699,0.403993,2.696545 +239,6.68314,0.800819,0.826131,2.033614 +240,-6.266963,0.204615,-0.273116,-2.35413 +241,-6.449542,0.281455,-0.540075,-1.619326 +242,1.61266,0.03496,-0.395091,5.04558 +243,2.089271,-0.217421,-0.574956,5.75514 +244,6.68314,0.800819,0.826131,2.033614 +245,6.838824,0.973521,0.847334,2.61679 +246,-4.703017,-0.331979,0.089177,-3.385429 +247,-5.414807,-0.574702,0.551457,-4.202058 +248,-2.227272,-0.550056,0.236854,-5.610195 +249,-3.525192,-0.569217,-0.187197,-7.46753 +250,-4.819938,-0.141895,-0.531048,-5.409596 +251,-5.496437,0.607028,-1.152721,-4.846862 +252,0.667113,0.64001,0.852228,3.114055 +253,0.87763,0.83078,0.612754,2.581438 +254,-3.525192,-0.569217,-0.187197,-7.46753 +255,-4.266658,-0.515371,0.042385,-7.433546 +256,2.089271,-0.217421,-0.574956,5.75514 +257,2.543181,-0.529935,-0.631805,5.268124 +258,2.366086,1.123306,0.442029,5.965434 +259,3.587714,1.398129,0.008449,6.654679 +260,2.543181,-0.529935,-0.631805,5.268124 +261,2.981639,-0.820152,-0.537544,5.251885 +262,2.981639,-0.820152,-0.537544,5.251885 +263,3.411727,-1.092272,-0.591273,4.928222 +264,6.838824,0.973521,0.847334,2.61679 +265,7.030275,1.193612,0.861925,3.217419 +266,2.35201,0.464949,-0.011265,-3.523142 +267,2.005973,0.462672,0.024641,-3.39812 +268,0.922082,1.190838,1.424661,3.039375 +269,0.996277,1.724153,1.441174,2.345206 +270,2.35201,0.464949,-0.011265,-3.523142 +271,1.55704,0.691637,-0.517741,-4.831726 +272,3.054914,0.597758,0.20958,-1.213214 +273,2.961867,0.569834,0.388264,-0.73226 +274,7.030275,1.193612,0.861925,3.217419 +275,7.364176,1.862713,1.33082,4.328894 +276,-6.449542,0.281455,-0.540075,-1.619326 +277,-6.590751,0.36214,-0.498215,-1.633599 +278,7.766908,0.704736,-0.045025,4.010162 +279,8.757784,0.790306,0.201241,5.960336 +280,-5.496437,0.607028,-1.152721,-4.846862 +281,-5.740589,1.041199,-0.966101,-5.129822 +282,7.364176,1.862713,1.33082,4.328894 +283,7.519173,2.674727,1.435182,3.941603 +284,5.716537,0.378117,0.257269,3.07088 +285,6.022438,0.417899,0.001995,3.115444 +286,0.996277,1.724153,1.441174,2.345206 +287,1.15776,2.267829,1.140639,3.347477 +288,1.61266,0.03496,-0.395091,5.04558 +289,2.417269,-0.063318,0.197094,3.177878 +290,7.519173,2.674727,1.435182,3.941603 +291,7.584557,3.517843,1.549027,4.519431 +292,-5.414807,-0.574702,0.551457,-4.202058 +293,-6.306258,-0.992296,0.335375,-5.661112 +294,1.15776,2.267829,1.140639,3.347477 +295,1.325066,2.526129,0.843101,2.83024 +296,1.61266,0.03496,-0.395091,5.04558 +297,2.018393,-0.179903,-0.585123,4.150483 +298,0.815864,0.213302,-0.016365,3.167673 +299,1.152962,0.230356,0.114744,3.587744 +300,2.089271,-0.217421,-0.574956,5.75514 +301,2.551926,-0.607253,-0.821207,6.375348 +302,-6.084545,0.133956,-0.479864,-1.565248 +303,-6.526816,0.372011,-0.504595,-3.457561 +304,1.325066,2.526129,0.843101,2.83024 +305,1.617753,2.959379,1.117476,2.414658 +306,3.135672,0.613548,-0.53732,-0.518403 +307,3.066137,0.665774,-0.725639,-1.223303 +308,-5.59363,-0.16671,-0.349045,-1.891975 +309,-5.720398,-0.106939,-0.556137,-0.915897 +310,2.551926,-0.607253,-0.821207,6.375348 +311,2.935058,-1.142013,-1.074192,6.81666 +312,-6.590751,0.36214,-0.498215,-1.633599 +313,-6.689943,0.432165,-0.761194,-0.801525 +314,7.584557,3.517843,1.549027,4.519431 +315,7.591527,3.968908,1.56167,4.503005 +316,8.757784,0.790306,0.201241,5.960336 +317,9.986265,1.182968,0.412054,6.960616 +318,1.15776,2.267829,1.140639,3.347477 +319,1.259943,2.623194,1.431471,4.073859 +320,3.411727,-1.092272,-0.591273,4.928222 +321,3.832702,-1.309689,-0.359255,4.569133 +322,2.898944,0.551284,0.357057,-2.044603 +323,2.632051,0.489811,0.044906,-0.70447 +324,-6.689943,0.432165,-0.761194,-0.801525 +325,-6.77131,0.520396,-0.877601,-1.600211 +326,2.089271,-0.217421,-0.574956,5.75514 +327,2.59939,-0.532671,-0.532701,6.239139 +328,1.617753,2.959379,1.117476,2.414658 +329,1.799747,3.177484,0.49144,0.465626 +330,-2.227272,-0.550056,0.236854,-5.610195 +331,-2.783996,-0.690676,0.257802,-5.874199 +332,2.35201,0.464949,-0.011265,-3.523142 +333,1.998882,0.422753,0.248072,-3.609629 +334,2.35201,0.464949,-0.011265,-3.523142 +335,1.997769,0.465833,0.006247,-3.561785 +336,1.55704,0.691637,-0.517741,-4.831726 +337,1.106859,0.934285,-0.471824,-5.397385 +338,-5.720398,-0.106939,-0.556137,-0.915897 +339,-5.797205,-0.053592,-0.705762,-0.019868 +340,-5.797205,-0.053592,-0.705762,-0.019868 +341,-5.784177,-0.069044,-0.946644,0.424671 +342,1.106859,0.934285,-0.471824,-5.397385 +343,0.565206,1.120763,-0.196884,-6.095824 +344,-5.784177,-0.069044,-0.946644,0.424671 +345,-5.724084,-0.20417,-1.306524,1.061713 +346,1.55704,0.691637,-0.517741,-4.831726 +347,0.838216,1.156263,-0.634911,-3.732272 +348,0.565206,1.120763,-0.196884,-6.095824 +349,-0.520632,1.499595,-0.479822,-5.442839 +350,0.53693,0.176481,0.291335,2.481543 +351,1.156647,0.288015,0.079847,3.826764 +352,4.57005,0.795019,0.401723,4.469078 +353,5.040544,0.915575,0.1081,5.279706 +354,-6.306258,-0.992296,0.335375,-5.661112 +355,-6.875543,-1.097257,0.031892,-5.961031 +356,6.930401,0.686344,0.098821,3.940244 +357,7.329634,0.791661,0.41184,4.351346 +358,0.565206,1.120763,-0.196884,-6.095824 +359,-0.057942,1.147372,0.108833,-6.427188 +360,0.197032,0.063939,0.379448,1.286562 +361,0.367181,0.110358,0.172013,2.246959 +362,1.259943,2.623194,1.431471,4.073859 +363,1.323809,2.996416,1.369603,3.500285 +364,1.323809,2.996416,1.369603,3.500285 +365,1.319226,3.565051,1.821478,2.234122 +366,1.799747,3.177484,0.49144,0.465626 +367,2.032028,3.241521,0.122408,1.955822 +368,7.591527,3.968908,1.56167,4.503005 +369,7.540308,4.42786,1.80004,4.754916 +370,7.540308,4.42786,1.80004,4.754916 +371,7.454419,5.418937,1.518873,5.225819 +372,-5.724084,-0.20417,-1.306524,1.061713 +373,-5.712412,-0.555442,-1.714179,2.476087 +374,-6.875543,-1.097257,0.031892,-5.961031 +375,-8.127534,-0.911584,-0.318982,-6.760892 +376,-6.306258,-0.992296,0.335375,-5.661112 +377,-6.855092,-1.20048,0.389091,-6.080141 +378,-5.712412,-0.555442,-1.714179,2.476087 +379,-5.810292,-0.933992,-1.954602,1.443114 +380,-0.520632,1.499595,-0.479822,-5.442839 +381,-1.00691,1.712681,-0.345074,-5.183515 +382,2.032028,3.241521,0.122408,1.955822 +383,2.476358,3.436467,0.667328,2.956028 +384,1.259943,2.623194,1.431471,4.073859 +385,1.350365,3.005242,1.243053,3.789808 +386,6.68314,0.800819,0.826131,2.033614 +387,7.140922,1.047518,0.209959,3.248316 +388,6.68314,0.800819,0.826131,2.033614 +389,6.815491,0.978755,1.030637,2.409327 +390,-5.712412,-0.555442,-1.714179,2.476087 +391,-5.835852,-0.917024,-2.124806,1.370859 +392,3.832702,-1.309689,-0.359255,4.569133 +393,4.266232,-1.42961,-0.179615,4.439186 +394,2.935058,-1.142013,-1.074192,6.81666 +395,3.203447,-1.777606,-1.267423,7.003535 +396,-5.712412,-0.555442,-1.714179,2.476087 +397,-5.875146,-1.063688,-2.038906,2.884015 +398,1.55704,0.691637,-0.517741,-4.831726 +399,0.634162,0.916473,0.040585,-4.791493 +400,3.203447,-1.777606,-1.267423,7.003535 +401,3.473476,-2.449249,-1.111382,7.489004 +402,4.266232,-1.42961,-0.179615,4.439186 +403,4.688165,-1.451964,0.077855,4.034669 +404,7.454419,5.418937,1.518873,5.225819 +405,7.468873,5.977768,1.569895,5.955749 +406,-1.329647,-0.762888,1.396237,-0.873983 +407,-1.346709,-0.863707,1.409416,-1.17108 +408,4.688165,-1.451964,0.077855,4.034669 +409,5.110756,-1.405665,0.139346,4.46907 +410,1.319226,3.565051,1.821478,2.234122 +411,1.226285,4.065405,1.692692,2.858502 +412,1.55704,0.691637,-0.517741,-4.831726 +413,0.658724,1.374203,-0.769539,-6.480065 +414,0.367181,0.110358,0.172013,2.246959 +415,0.61273,0.178158,0.35935,2.855222 +416,2.032028,3.241521,0.122408,1.955822 +417,2.425668,3.25937,-0.031356,1.988508 +418,-1.27358,-1.295056,1.556299,-3.679361 +419,-1.333015,-1.89268,1.373399,-2.334603 +420,1.156647,0.288015,0.079847,3.826764 +421,2.020113,0.287104,-0.076005,4.816604 +422,1.799747,3.177484,0.49144,0.465626 +423,1.981684,3.200435,-0.135442,1.39596 +424,-1.333015,-1.89268,1.373399,-2.334603 +425,-1.345334,-2.204167,1.75088,-0.799796 +426,-6.855092,-1.20048,0.389091,-6.080141 +427,-7.858917,-1.906814,0.83464,-6.296214 +428,3.473476,-2.449249,-1.111382,7.489004 +429,3.841433,-3.105052,-1.00775,7.557274 +430,1.226285,4.065405,1.692692,2.858502 +431,1.154685,4.33183,1.977081,2.677697 +432,-6.77131,0.520396,-0.877601,-1.600211 +433,-7.133881,0.791827,-0.450296,-2.962548 +434,-1.333015,-1.89268,1.373399,-2.334603 +435,-1.351846,-2.176703,1.7062,-0.523267 +436,1.998882,0.422753,0.248072,-3.609629 +437,1.652269,0.385843,-0.038961,-3.385798 +438,-5.875146,-1.063688,-2.038906,2.884015 +439,-6.04209,-1.567534,-1.734205,2.444361 +440,8.967058,-0.181585,-1.005651,4.022626 +441,9.255328,-0.512687,-0.711771,4.789132 +442,-3.525192,-0.569217,-0.187197,-7.46753 +443,-4.240979,-0.36168,-0.377242,-7.460259 +444,2.35201,0.464949,-0.011265,-3.523142 +445,2.028536,0.485226,-0.116992,-2.962037 +446,3.841433,-3.105052,-1.00775,7.557274 +447,4.78796,-4.274429,-0.772731,7.52186 +448,-0.057942,1.147372,0.108833,-6.427188 +449,-0.711478,1.122803,-0.032828,-6.663722 +450,-1.345334,-2.204167,1.75088,-0.799796 +451,-1.282389,-2.388162,2.032994,-1.151233 +452,7.454419,5.418937,1.518873,5.225819 +453,7.46349,5.903125,1.587049,4.461514 +454,-5.740589,1.041199,-0.966101,-5.129822 +455,-6.08157,1.471458,-0.838017,-5.857493 +456,2.35201,0.464949,-0.011265,-3.523142 +457,1.818962,0.518094,-0.20804,-1.84213 +458,9.419893,0.18836,0.042241,6.413349 +459,10.04085,0.209138,0.024465,6.012898 +460,-7.133881,0.791827,-0.450296,-2.962548 +461,-7.685432,1.015894,-0.321698,-2.994834 +462,3.841433,-3.105052,-1.00775,7.557274 +463,4.19113,-3.751971,-1.143932,7.161826 +464,-6.04209,-1.567534,-1.734205,2.444361 +465,-5.998005,-1.958108,-1.137429,1.544105 +466,7.46349,5.903125,1.587049,4.461514 +467,7.492746,6.330178,1.415398,4.110092 +468,3.841433,-3.105052,-1.00775,7.557274 +469,4.17009,-3.774878,-1.22233,7.393633 +470,-6.08157,1.471458,-0.838017,-5.857493 +471,-6.637062,2.699577,-1.4258,-7.81621 +472,1.154685,4.33183,1.977081,2.677697 +473,1.096498,4.540942,1.684935,1.678652 +474,-1.282389,-2.388162,2.032994,-1.151233 +475,-1.208494,-2.516703,2.1438,-1.815607 +476,2.35201,0.464949,-0.011265,-3.523142 +477,2.012073,0.43723,0.175955,-3.308127 +478,-6.04209,-1.567534,-1.734205,2.444361 +479,-6.079183,-1.764781,-1.782664,1.57011 +480,0.565206,1.120763,-0.196884,-6.095824 +481,-0.429518,1.46361,-0.481664,-4.461027 +482,-6.637062,2.699577,-1.4258,-7.81621 +483,-6.730953,3.444278,-1.465504,-7.196705 +484,3.587714,1.398129,0.008449,6.654679 +485,4.72168,1.107859,-0.531965,5.193518 +486,1.799747,3.177484,0.49144,0.465626 +487,1.819465,3.188473,0.544079,-0.014132 +488,7.468873,5.977768,1.569895,5.955749 +489,7.508776,6.55978,1.433878,5.720821 +490,5.364672,0.213031,-0.633046,4.666788 +491,5.719484,-0.12559,-0.886738,5.168841 +492,-1.208494,-2.516703,2.1438,-1.815607 +493,-1.113214,-2.656989,2.192168,-1.576386 +494,4.78796,-4.274429,-0.772731,7.52186 +495,6.0417,-5.036536,-0.317124,7.277787 +496,6.0417,-5.036536,-0.317124,7.277787 +497,7.250332,-5.447003,-0.338666,5.486766 +498,-4.266658,-0.515371,0.042385,-7.433546 +499,-4.978058,-0.494552,-0.10301,-6.813076 +500,1.61266,0.03496,-0.395091,5.04558 +501,2.278574,-0.513779,-1.014754,3.721725 +502,2.898944,0.551284,0.357057,-2.044603 +503,2.709106,0.450224,0.616815,-2.268734 +504,1.154685,4.33183,1.977081,2.677697 +505,1.053193,4.585995,1.924724,2.796518 +506,-7.858917,-1.906814,0.83464,-6.296214 +507,-8.657253,-2.626475,0.620495,-4.472421 +508,3.587714,1.398129,0.008449,6.654679 +509,5.047811,1.017383,-0.497085,8.595553 +510,0.658724,1.374203,-0.769539,-6.480065 +511,-0.444755,2.070983,-0.358801,-6.662673 +512,-5.998005,-1.958108,-1.137429,1.544105 +513,-5.881306,-2.122673,-0.693425,0.488482 +514,-1.289248,-0.590961,0.636602,-1.258158 +515,-1.470178,-0.84433,1.224681,-1.899907 +516,-7.858917,-1.906814,0.83464,-6.296214 +517,-8.316648,-2.391753,0.794611,-7.041611 +518,-1.351846,-2.176703,1.7062,-0.523267 +519,-1.350491,-2.187429,1.775484,0.307213 +520,1.096498,4.540942,1.684935,1.678652 +521,1.086417,4.692879,1.585786,1.368003 +522,4.78796,-4.274429,-0.772731,7.52186 +523,5.793953,-5.257496,-0.775068,6.543857 +524,-6.04209,-1.567534,-1.734205,2.444361 +525,-6.063444,-1.859885,-1.562763,3.425356 +526,5.793953,-5.257496,-0.775068,6.543857 +527,6.491091,-6.218569,-1.122653,5.388851 +528,-1.00691,1.712681,-0.345074,-5.183515 +529,-1.491093,1.921346,-0.468033,-5.367782 +530,-8.657253,-2.626475,0.620495,-4.472421 +531,-9.068583,-2.841448,0.346282,-4.839089 +532,5.047811,1.017383,-0.497085,8.595553 +533,6.751986,0.460448,-0.140155,9.428624 +534,0.367181,0.110358,0.172013,2.246959 +535,0.585411,0.1332,0.035509,2.144899 +536,5.110756,-1.405665,0.139346,4.46907 +537,5.559002,-1.329808,0.195617,4.624507 +538,7.492746,6.330178,1.415398,4.110092 +539,7.857885,7.105415,0.855803,4.571873 +540,-1.208494,-2.516703,2.1438,-1.815607 +541,-0.955984,-2.777413,2.53586,-1.837224 +542,1.053193,4.585995,1.924724,2.796518 +543,0.927944,4.818047,2.212198,2.495592 +544,7.250332,-5.447003,-0.338666,5.486766 +545,8.293169,-5.517313,0.210791,5.097859 +546,1.819465,3.188473,0.544079,-0.014132 +547,1.854647,3.209505,0.536268,0.833918 +548,-5.881306,-2.122673,-0.693425,0.488482 +549,-5.874788,-2.1282,-0.658925,-0.317606 +550,7.857885,7.105415,0.855803,4.571873 +551,8.376249,7.90766,1.134222,5.010462 +552,0.927944,4.818047,2.212198,2.495592 +553,0.63776,5.099138,2.558557,1.564347 +554,2.35201,0.464949,-0.011265,-3.523142 +555,2.040853,0.440697,0.174731,-2.727818 +556,1.086417,4.692879,1.585786,1.368003 +557,1.056063,4.924073,1.830834,0.969567 +558,-8.127534,-0.911584,-0.318982,-6.760892 +559,-9.567421,-0.603013,-0.109079,-7.99191 +560,6.491091,-6.218569,-1.122653,5.388851 +561,7.157958,-7.091138,-0.717246,5.668914 +562,4.688165,-1.451964,0.077855,4.034669 +563,5.1239,-1.450961,-0.069572,4.687934 +564,-5.875146,-1.063688,-2.038906,2.884015 +565,-5.985202,-1.464064,-1.58143,1.302937 +566,-5.881306,-2.122673,-0.693425,0.488482 +567,-5.831631,-2.152483,-0.403049,0.674228 +568,1.259943,2.623194,1.431471,4.073859 +569,1.333459,3.019437,1.342916,3.988887 +570,4.266232,-1.42961,-0.179615,4.439186 +571,4.939661,-1.707412,-0.634606,2.90789 +572,7.857885,7.105415,0.855803,4.571873 +573,8.32462,7.737202,1.022299,3.292041 +574,-7.685432,1.015894,-0.321698,-2.994834 +575,-8.240404,1.154956,-0.166975,-2.732167 +576,-3.525192,-0.569217,-0.187197,-7.46753 +577,-4.992351,0.07566,-0.629847,-8.690103 +578,-6.08157,1.471458,-0.838017,-5.857493 +579,-6.806864,2.210395,-0.747457,-4.500155 +580,1.086417,4.692879,1.585786,1.368003 +581,1.085309,4.790791,1.577321,0.59037 +582,-9.567421,-0.603013,-0.109079,-7.99191 +583,-11.218155,-0.310736,-0.239355,-8.784033 +584,-9.068583,-2.841448,0.346282,-4.839089 +585,-9.961037,-3.520313,0.925425,-6.531052 +586,9.255328,-0.512687,-0.711771,4.789132 +587,10.019502,-0.986925,-0.392624,4.242791 +588,7.508776,6.55978,1.433878,5.720821 +589,7.908084,7.496134,0.881187,4.588788 +590,1.55704,0.691637,-0.517741,-4.831726 +591,1.155046,0.981956,-0.73124,-5.104487 +592,-0.444755,2.070983,-0.358801,-6.662673 +593,-1.034557,2.288428,-0.347402,-5.909569 +594,4.17009,-3.774878,-1.22233,7.393633 +595,5.012009,-5.143061,-0.827281,8.775773 +596,-8.240404,1.154956,-0.166975,-2.732167 +597,-8.701813,1.169412,0.121638,-1.900069 +598,1.259943,2.623194,1.431471,4.073859 +599,1.314174,3.629916,1.592163,6.018676 +600,-3.525192,-0.569217,-0.187197,-7.46753 +601,-4.224598,-0.485342,-0.048775,-6.632062 +602,7.157958,-7.091138,-0.717246,5.668914 +603,7.602872,-7.383828,-0.440873,5.016135 +604,-0.955984,-2.777413,2.53586,-1.837224 +605,-0.771741,-2.967748,2.087654,-0.833038 +606,-5.724084,-0.20417,-1.306524,1.061713 +607,-5.70236,-0.430786,-1.636066,1.225151 +608,-6.063444,-1.859885,-1.562763,3.425356 +609,-5.934452,-2.368634,-1.030449,1.883823 +610,6.68314,0.800819,0.826131,2.033614 +611,6.792424,0.92099,0.840714,1.215056 +612,1.314174,3.629916,1.592163,6.018676 +613,1.598339,4.670352,0.996274,4.927468 +614,1.085309,4.790791,1.577321,0.59037 +615,1.085637,4.83705,1.547327,0.334875 +616,8.293169,-5.517313,0.210791,5.097859 +617,9.442621,-5.452401,-0.0863,6.457229 +618,7.602872,-7.383828,-0.440873,5.016135 +619,8.576084,-7.831741,-0.4222,5.69741 +620,-5.934452,-2.368634,-1.030449,1.883823 +621,-5.756652,-2.587906,-0.713661,0.950578 +622,8.32462,7.737202,1.022299,3.292041 +623,8.532771,8.010762,0.821359,3.594457 +624,-6.806864,2.210395,-0.747457,-4.500155 +625,-7.105691,2.48566,-0.741072,-3.625579 +626,-3.525192,-0.569217,-0.187197,-7.46753 +627,-4.228644,-0.442096,-0.17011,-6.829554 +628,-7.105691,2.48566,-0.741072,-3.625579 +629,-7.789189,3.030573,-0.612381,-5.121682 +630,-6.730953,3.444278,-1.465504,-7.196705 +631,-6.660479,4.797158,-1.786385,-6.408667 +632,1.314174,3.629916,1.592163,6.018676 +633,1.317981,4.711016,1.540432,4.793597 +634,1.317981,4.711016,1.540432,4.793597 +635,1.535703,5.534887,1.066259,3.807945 +636,1.317981,4.711016,1.540432,4.793597 +637,1.370879,5.172264,1.371022,4.502926 +638,0.565206,1.120763,-0.196884,-6.095824 +639,-0.066409,1.209033,-0.082528,-6.666189 +640,8.532771,8.010762,0.821359,3.594457 +641,8.818121,8.281629,0.700864,4.279058 +642,6.792424,0.92099,0.840714,1.215056 +643,7.006144,1.18638,0.935838,2.193652 +644,-5.784177,-0.069044,-0.946644,0.424671 +645,-5.776849,-0.080674,-0.778003,-0.288508 +646,7.602872,-7.383828,-0.440873,5.016135 +647,8.057968,-7.578732,-0.368088,4.887567 +648,-6.063444,-1.859885,-1.562763,3.425356 +649,-6.168065,-2.497944,-1.910163,3.07304 +650,-1.27358,-1.295056,1.556299,-3.679361 +651,-1.227505,-1.649935,1.84589,-3.502868 +652,1.085637,4.83705,1.547327,0.334875 +653,1.083257,4.818375,1.465308,-0.522829 +654,1.598339,4.670352,0.996274,4.927468 +655,2.122889,5.463944,0.976973,4.585519 +656,-6.063444,-1.859885,-1.562763,3.425356 +657,-6.24908,-2.647633,-2.01726,4.737371 +658,-5.712412,-0.555442,-1.714179,2.476087 +659,-5.591046,-1.19228,-1.101672,4.107236 +660,5.012009,-5.143061,-0.827281,8.775773 +661,6.305329,-6.280095,-0.613851,8.47764 +662,-5.756652,-2.587906,-0.713661,0.950578 +663,-5.687456,-2.641031,-0.592256,0.795244 +664,-0.913925,-0.252615,0.334649,-3.305902 +665,-1.369004,-0.352542,0.05957,-1.367177 +666,8.32462,7.737202,1.022299,3.292041 +667,8.488491,8.25369,1.539782,2.186669 From 0dffdc92f233a75092292ad283c0548675304944 Mon Sep 17 00:00:00 2001 From: "Simon (Du, Guoliang)" <101145370+SimonDuGL@users.noreply.github.com> Date: Fri, 16 Dec 2022 19:56:16 -0600 Subject: [PATCH 23/23] Add files via upload --- test_graph_square_test_.txt | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 test_graph_square_test_.txt diff --git a/test_graph_square_test_.txt b/test_graph_square_test_.txt new file mode 100644 index 0000000..20964c4 --- /dev/null +++ b/test_graph_square_test_.txt @@ -0,0 +1,38 @@ + + + + + + + 0, 5,-0.514258,2.75129 + + + 5,5,0,0.1 + + + 0,0,-0.770999,-4.98738 + + + 5,0,6.40131,-32.7235 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + \ No newline at end of file