From 7417ebfc49ae8616b5b81e89b13a8968c04ce89d Mon Sep 17 00:00:00 2001 From: Yihuai Date: Mon, 5 Feb 2024 00:11:52 -0800 Subject: [PATCH 01/12] Update crc converter --- .gitignore | 1 + .vscode/settings.json | 16 +++++++++ example/low_level/CMakeLists.txt | 23 +++++++++++++ example/low_level/crc_module.so | Bin 0 -> 763624 bytes example/low_level/crc_pybind.cpp | 57 +++++++++++++++++++++++++++++++ example/low_level/low_level.cpp | 31 +++++++++-------- example/low_level/test_crc.py | 7 ++++ 7 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 example/low_level/CMakeLists.txt create mode 100755 example/low_level/crc_module.so create mode 100644 example/low_level/crc_pybind.cpp create mode 100644 example/low_level/test_crc.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c795b05 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0478e07 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "files.associations": { + "*.ino": "cpp", + "*.m": "matlab", + "*.cls": "latex", + "*.dtx": "latex", + "*.lsf": "matlab", + "tuple": "cpp", + "array": "cpp", + "string_view": "cpp", + "bitset": "cpp", + "initializer_list": "cpp", + "regex": "cpp", + "utility": "cpp" + } +} \ No newline at end of file diff --git a/example/low_level/CMakeLists.txt b/example/low_level/CMakeLists.txt new file mode 100644 index 0000000..72b316b --- /dev/null +++ b/example/low_level/CMakeLists.txt @@ -0,0 +1,23 @@ +project(crc_module) +cmake_minimum_required(VERSION 3.5) + +find_package(pybind11 REQUIRED PATHS /home/unitree/miniforge3/lib/python3.10/site-packages/pybind11/share/cmake/pybind11 NO_DEFAULT_PATH) + +add_library(crc_module MODULE crc_pybind.cpp) +include_directories(/usr/local/include/ddscxx /usr/local/include/iceoryx/v2.0.2) +link_libraries(unitree_sdk2 ddsc ddscxx rt pthread) + + +# Link pybind11 to your module +target_link_libraries(crc_module PRIVATE pybind11::module) + +# Disable symbol visibility for other targets +set_target_properties(crc_module PROPERTIES CXX_VISIBILITY_PRESET "hidden") + +# Optional: set the output directory for the built module +set_target_properties(crc_module PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") + +set_target_properties(crc_module PROPERTIES PREFIX "") + +# Set C++ standard, pybind11 requires C++14 or later +set_property(TARGET crc_module PROPERTY CXX_STANDARD 14) \ No newline at end of file diff --git a/example/low_level/crc_module.so b/example/low_level/crc_module.so new file mode 100755 index 0000000000000000000000000000000000000000..c4b437804e733c6f8bec0526345e666972f07713 GIT binary patch literal 763624 zcmeEv31AdO)An+Q(|{l-5f=ywh?;}|K~V!qAmLn-fKic6vROzV7n@B8iV_YH5hV&L zDrgWy@IX`)R8&AzzzY?9Q9y0)oGxjb7*8sHSlFhi1l8Rk z-=M$ZNp>fCp53XLq%-bk5U=BWSMN0hEZ*oDM(_0uqxaN3R1n}&_YnH(XpFlE4t{RF zhclhJOIl!pyZCIEPJRvLL6^F_zVK&>_xvvrC-Z&o#YC^}D!xnb9_5S~R&xvG=gAzO zT{@RiF*(#-)wqbaJwhXdVWY=79C>3x&fIkRbsKjcDmpxQ!n8K+?s`E)(H!M=2=`co zRtQ^?9g89xHgGyZyE^7JJk8m-tkKA_9*$cJ=Qa-Q6WS(hyVJS-n~8gGZPRin-n?PE z^ODAn-K}16g=}s2wsS6GbM`DdHoM!HvYn@-ymE4zd$--Ns#|CW=hoA@g*ND0URE(M zqDfhE$By=U!ne05KQcJRcS(7l_vZ9U2oH5cj4Ufl?-l>4b4a_{r_68Cc5%6*ae4Fd z^c|zoY_ID-ctLja!3)AW+`9d(^M<#MYTjUW)9m%3jYGpv?;hH`JY?m#TYqi(-ptVK zh?{noH!UkmOb<TVlhx=XakK>1*5I@=G$xHqV{gqUHYZ zwxQ0+P1<(d5!>kC4GlYW8oZ_AeaG`3%yTBX=FN45uDkVtStpleB`01R-tLx84MQBK zy*z&Du$VH(!cILFI^N2SZBlyQg2C;wJ0zdms#*Dh^_dMq6KBtNmN_!ASKJUkynJU^ zc#G!k%N^U=uL}9X5jwhSmq>@R?bAJ+Ekc{PG98Wu;o-d-I|g?PTbUI%&XJHkzdY16 z_heUW$d1@v+e2G)b2wTI32)HW;TWD|~K?aI%KA=g+6$-U;C}{@#V}XYgI{=!VbT5yBbkfqO6h z+z0n_5zgc95qyv2dlc^d5Y9)q0AUb9EW%)fI0SXY^XH+sCn5|-7=L`e;cA2#2;#aH_nG`z zd@sZ2*$8tHu0xoIa6Q6&goOy=x(WB25y}y6L0F8i1mQM>+Yy!`+=Fm0g1A=TzKTDK z@AvcP)wr)gco5+sgmnnwdJOl+`SVk_Z{*L<;Qk!K^9WlQqc`a9R>rpR{YBhgLU;vX z2f|JSaqYtWb%fmrZzKE*;R6IQoPC7w8Nycx>iPzszePC2*!Q^qfbcWIafIIx#PuiN z|KhtCKN=&bs|h|gLlAPZHREk?KM6sNMeXppJwgYBjtJuFgnJmm=?GmI>&|zgKwHN5 z9*muZdvAoZ5zb*u(4B|Rk=l3luDC}5kLG6sa35%*J0IT%AzXwon4b;7J&r#o;698$ z3x31-^C;X$^XDfvp;X#Cl5FSQQ*E)QD6k$EWV+chx=ZH_xZcP zKH$$E^8I7n4c-}7C3K8nvjARI&Z1>rctuL%D} zP*(#C^9_Y!!B-=EZj8_bp&3GRgcbe;$N;EJ7SY0>V&)M1&CtqY%V3 zhVPf)o{BIIAr0Yj1aVE^dj{?vgo*r}o;nd3-u1-RGcHe@k@VG@w7jYGZW<-YiR%fHTPo$;b4D)P~L-#N2?_tpjLUm7~|j^syf z>iKol!Yj}EsQJBJJ{Z(5=9j!x&CdC$rT>9{ee?ZC6;GYlKKtI(28#!LvU<-OxBT?@ zk6Rv3y*~M-5q;h}{@BEBAC*@8`@1Vf4;(r(W81nHPdoD5{;%$Ts>9X4+%jg{Drd*G z%WuB;!QM{}zc{Ad_T$g2-B{4%r^gSRHuvY~-@3G%-E+`^4q3gM+%Ui2@_DB|)giUT zGewimytdN|nPGRF`ekYB_dA}^yTvubuV24#wWCeyk(RBKKJ6X4^VHkU{5k*1W?joi z^!y`wd54zk8$UUx(V)E1EBC+he2?YLZ+h(gGjAEOX4`v>53U>)H9KT%7 zU-`b}gSVc#?w0aNs~TlTMZQ1foHftS?*HN+pIv&!!ZS`e>FCa(GcR59!5@E|{cw5f zpT>5c4t}d0kG;S1>^XN2`s(W6J0HFHlH{xUAN;K7*#}Cl8-MiSHrF3~=&ToRy5#1) zspS_Ao%v$%$E}x4NZc6i>)-dXZ}Qg5YCOJU_SB8{gn18s)AP33&g(`m8#iI> zsf*tHdh42T^FBWO_OdfR8GWtmtD$56@^m`1Z^~(Jp0cF0V)B>Klh_;0t zb=PGLmfrpB$h;A=`bEXu_(S3?kG(%;_LA}MEh#VPF)U(h(H{$k3|aEnt?%wU*z@j} z{{3L+;YD)?oa6s}*7?Ub<=r@V%Z4i#UAcAOBUh$Qj-2pyf#TV zzts7+ug`jNV$Qd1ZuxS>XEF0HkK65e;Kv2$wVDwY`o^!H&i^1OY|-tX`Focg%UZvD z^^Am$_qTra$lxcZU6wm_<8Ql`wfy|2wW9~T=-T^x>ABBOAMnum`TJK7jXUc8sqFBC zU2lE-eDqsC#dM2mG_K>2)_2|Q{$<7FKVDzm?&psSH=Z?c^4hcC{rQE|_jaXqdhYq( zN8kEq>2*84y>9VCpD$Q?+18$?+*w|*=(D&bS?^?jU6#N0*-@n-SD%qNVOL3{|M!$1 z7R{X+arWA4J{T2x+cT%064vJHwM~Az;N}>AaqpKtdiS-X-bHg4zy0L2&%V82z1akZ@45r=9R7C zpKnYb@L9xfnRhu;Z`?K^zx0vw*Nxcs<-C|3O-c^_P|+u0afhZmmJRb?y7h+%yUy>n z?%SK@ym_$2-G#^Y{P}&vX;+>5;WeHq_x_&nUPkK?1KKTnA#-BZ-QjEYb~yUr-D4v= zzx4J)SEWy!uuRX_Kd(C+KCzb`v*+48C=)nU+dKX@_ z_U1!9?l_X#=(>~EpOKh3rSZSMIDgRSeGh;B`w`#UhsU~3ZM|gg6@wgu|9#!TwS7)n zH0tc?zIR7%)566a9y*%%`1X%BxF2Zwx&V*0N`3J#zD*qS;@)|IwetI~&K1T+;cAquJ-(`snU5 zcj~+sw?3KQW%!k!?mH6uY}4G0({79Va?%CfjnNf7AA4%n9jhO|y3IW~*KFIr=J*Q@ zm+X1&%?9`P`KWK|t#PlvQ2I&J-_QAV=*RoEHfc7v*|c>R_iy%EzxyUc4}3AKcdzAh z8g-ob`VQ}{{T`nE@s^^#S>BTbulK z-G?2XxN!W;OMffweoDv0r5_AG`{GCMykURG34gtmyrSjiy;tOfP4GX{`KK42x&50@ zMn=rKqQ_GANmGCPb$j$J*TzR)|NFO>&29KjSf6)Kxo?*9yXk2!47_~gvAp8$TNkxy z*fDRs^Yr#JZ~ywdyYfPseKu`t>Qi5T`SY;5UEwolO}+im-6=&YJ{sEQ^Jm_2FJF9h z&c^8Zb1weZ&f>@We{kpg)vtSA-g@iW`HqvnKDzUQ?G2Y4Nss9?Z(vuDoj_1(>hpXY1|+mW{HF! z(=pp0eD9;P-nn3Vv+i&C_V+kY7CB=3m1pmHZhb=BI|bdodhoT^_y6^KhlIa&HN2(g z%vs&`cDQe6gNLrFm^|MVnzelK{C1x|^Xl_=&+MP@Zs)6i?*8P!!B<>7^Mf6i4Quzy z#=^B%KOEiZ_da_%e7LM_v@7eAg7KqX>+$Q5_5WJ7cv93A1LubPu(|WNFPb<`Tld+X zO?x_D+H?H69{2y&Z)Mg+SGJ!0SKOjcrfs~jRaCpq5<82mSw6kL7S(oJBlk0KZyeRSV z$FFPjYQrac-f-pO^gf=aG#A_IVzUe%W{a;cr53 z+cq?Q+PlRAub6lJfqQZq=6@A2Km3Qc2mbCH)##<4=RVx=xjmiVJY~Oo{qvVKd_Csa z(vj0{{;n5hf0^qd9?fod^wQhLEtq?K%L|qiCnPpJKK6s$Z;mya-UoU^lb470h%Q~% zBI*3I|J6M0jw?pYn>q8L?}s;?cK+CDX=7UKjLDq%@~2yFe0b7pE#8h8agK9F(Y2@b zdiF@d@F(xvpLE9=o^P8zcHqx_t+VcLd-nDI<)eFDTatR`XTALQ?^={y{PeKaQ`b#$ z-28N2n}*rty+66;r=y2scTDjted+U?fB7(CSJT)QZ@>G)tA#@ry%n+cxuQ$$iNx;&ClH=Nvu!`{h5~*QIpPjqTrhqw|I3se|wKgh#e4dAaF%gf{6 zY%~AswYyuqeXz&%GoGB?=Gk*vK6W6paP=os+h$xG-tVOLzrS?j!kaopuiX6W(ZlbA zbvU&5+voPLUh!0iyW^r)PyS}vLWsEcN^Ydy{(io9zqhk$GQ(d(zGx z`uUaZrzOqpxBSYyqlYs$FO5p*@KlEyG_yw3- z;lkEr6>q5xzRw0fwYxR{iz}@8cYqtoD&DVwTcr~o2}`^`+KCmPRW{}MQXgwRt&lIP z_W3;$W5qwyru{Uu>37a}>v;cYVa>mVP5lb{g;jbs^|em_OCYu?&oY~Ka@Zz4`S4R& z#d}UyYkY|fpE8?%o$0Yo|EJ;B=|9lZI^Lh7t@$j9u%`e0Icxqy(cZctn6Ffu@*HQ= z-mbN2594gw)iFeBRn7~X)_92x9=6juU-35Ws_zZf{70i+tlG~HXIs;+wvqE!UvEu6 z#YPUye84*1iKq~(^c2|i$5uAu*F8zr>Dge@K2QGGx?Q!lDd#RWd{Kx{`rx^fhJw)T4y7# zI+R=2a+3?w5BljX~+WBuNA1nS}*tE|*Ahs(1#m`!o zXS0i}`IpTKGT~2-8SX$DD)qz{N8BOPNpJWEBZIV->Mu2q5W9V zUu?rarmr>qw>IVTQy1%a<810>9!kur++uCY;VK(B++@EspJO)hR&2MV)Z^_o zxWh(|y~-w?@iya;NV^lke3jXxKctm){eECGU-+%Bb@^vHt@(V2c4AeYrO@lF@Pjt> z*w&_9<)RZ=wa?M8Cs^Sx+w`OFY|>d~)8C`|S(ift6g-Ne($&$X-j}2Nt>nNhv#iVK zH=A)P0)=T+o@oA->ACJa>+-o1iLv4{GQygE9SYfs{&Smlm4tR^m0!1w-n$azZ&iO>C;t+-3^fuwCw_zZ| z)rsj}?N9jb9>iw}<0-j>FWW&lidSAJ-A4@FFxPkLdfAA&3ca&0k&<*7^0P;c9OW0{d?_&JOO2YrRfav2HPajWs z;*CVF_L zaSq|pVi6cFRX&$voE7=X{*}sS8S^=-knkD1h<_~OEjAK<%uW2G85e731)oE_VA9F> zCeBx%zlcvFS^yr(iAb0N_$6$|ok zrOUrqTV_-K#qSgSl6!;GKNsV*SjD}jb2G^yl=(~?LiFh)DPMlZ3x^WE=}N*?`K7MtIj`q(9?A4$ z(uqDoEK#bh6uU@InpjkfOY#3`4dDlqiBGJ2>TnD|bb>xYEJVho z_$=;7_#Try{33+#c(Gs^*HZZx>rO`#zQol2=b>W?{+n68Ihnqn>RytnE&W^2=93Z;eN(LZRGr-XijH1@mJ-r{3gOv zoy14A&n`Cdf9ZXko&mw}x*+GCBd~I2?USh<+1~`w@&s z?IJvO9?_REen$x5g+Eb+DEfyzgwJ>~IQ_3}Vw~eu>F>z(a?DTs75)PXM3nz-v4|L# zDxcM>2`_C)^wFFiu|8eU@BNO_6T|q!FA^Rxjp+L@9Tu%8H>*=}uj66p5wVv^7c2GLEoEkjtHyT2GmL^fTiM<8l zD&0%Cxt|^$Pxz7>iC&dYN7ggVDc%^W2FHV3zdcR$d-f~DC;Vz^|KS|3Yc1jBtd}Z$+XIA~ z<^1@agtwYYe3mhv&MgSvE;cXWn#=ejHuC%p9`|F;r}V4(?ZM@FjP*k&^Ervz;VQ0Q zB?qEzqj<-6qx1}7`l(#MW_&xhlZ9ea2rku6BUld1;Bip#88npmA7H&yrE@mRv2>PW zs{I_UAo?vl-&FKJ%_6+j9~3W=A+Je1jtshr@G!<#-b?hyOymBu@r2L6g6NMi{rmf= z-|aT(+c)t%bhBw5`rBmUv!j^!sB~WOGT{-^sXVioe>2ASl@hM#kIg0eRm}+xXZj;7 zC)@M9Nzq@!a(e^IZ70*8%I$Cy>+`A{`f)p)-EYD|E`w{ych5Tv7<5~ps zzxxixSzjH`_<6{nlviv&QRQ~oBZO}l7hDd@HxZuB%>RZ@9Jv^U(fwZwVw}`5N@uo{gH&5$BWpj2tUI1 zB_-!K<`5prb}c0bTJZRLyo~Bg)#J?biGB&|fni+!Y0T%ishsjP#ve{U?&o8@!p6NH=f|E9YMU%H6+XK{OIHkbLZT_~RMo*{()!Fr3*OV8kT zVs1bCFC_XIy{SB%%x59D!)1dASA4!|O7!M=cMFh-etqaLRk%t|{4Bz=P4m7;o^P&s znfR-A_2Mw1U&HoT)vmf_5$9r%O;d^*|RPwD61gzk*h1;Q$pXFx~9^R1JPdf9t>v_V{ih|4Mw+jeg z&+`pjsH-D7yH9X%}^5;6v*Idq*;vcrnntynI!Z(}7 z*-N;8&EWpkhvU5|is)yE4a~Sye_U`b;byzvhdgesG0F2T#Y8{Iq@O?DjPRvDqT+C+ z$-g*rW(VOF*HHPaVSFspM>Bl{<56>oemBcK)ovHAB0TIu;-lJm{(hl1wsv%Sk??lR z=R>aFxm>@B|GDoHpFyk_#WMZ;F@&4PuWwjC-@y90>Mt*_oodr^idVI(%U>lvTi9Nq z>US0QyS?1+RC_2mkLaB|k5>4Tcu}<58K(Kv)8T}N9jAJ9a{6Og-%G!n(xdA4nyZOE zjpdsvw;3UXo9!p}CJ-LM^M(1$|C$#G?^8njRXLo+>6aVlL95c!jLUPgsr~fZNPK#x z2dDEqoAEl5?M_?RkC4vkxs}^b7Pp^h##^Njf3v)L?QO!#*x#q(2d=R%Vm`^`s*z7xvR@~h%eRGW&v9~ko_&t_OeOv*J$KF^+}zI7 zY{r)kvxz?1G@m`r?PLSD6V;FQO(6Pg_Qxf1dhX%$tk0wLD0$oPS)w<~tHWHLeb~;h zl=*zc{bd=;bCuukSk8p7UvE6qf5QDDn)UE>#y4^M*~j()g-0Tt!k=}}WY_AwlhS#7 zPH=riWf7j5PxYeu`>!R0A7uGo!SQ-no+Pq8R<+v~kzmmt#p80Z zXCosbot5Mm5+?8sms7dL%2;r&&~n04&!Twoy1XVb{V}Fj>3{G-qR-}egi2>c7sA8D zVK=y(@-NPb;c;^*kDI7gc{RS9==b%YcomeJqFb70dZj<=MI)@jqr7r=H|^ z{U(2Cd>PTt;Q5r|^Hx*BojiW2{`+_c;T7E9=W_YCyq@qSPf_|6pP$%{I-mVws+?cm zLi9U${8Hs}J@>D<+`kqw|G2Y>es3u8|AX;;oL{s2?E5;=k6b|IzlP~Uxc!%!?0D&O zh(4Ozn@WFf8^Sm6fj}z#H@gULWwJvSaDMx6ew`fe6{isWcpldjpArpZl+M?f zz6;BZ)XtP&)vhuViQX)q`!N1F>;Hw!=kiO5{vhiQ2N@q8LbzFOFJe7sq^bSfFo5XI za`-GY?y%nCWd0TR5dC3y4oN>vc}X_mvYq zp2tBn19_EQNcc#W+e%&?y_fKiKEdU%XAt4Ld7i8C+rEtOv=4*Z;YnO>>X0QTMe7)0 zGcH8ENqi2leP%Ax-*h_ROTVIujbMCNcfyZNB3$u*X9(eDdEVkm!q>3Aah&O9 z-WClApU>;oqM81wy@W4iy;Qa5b~fY7;;nA!YA$jsT zl0~?A{p1-eH^R6-s(M+%`5npmRrsk+;?zvlVrqddRJ<@tq5&toqW{Sx+DDf`tQ9>UG?d=`&)=5gc#mT$Qx`L^_W;!|-d z<*StQdnVWK91|3wa!mSNv_}xh=0H zdh@!(!%q=@fY*7ddc1)BQ;ED@ROR=M*+jpD=bPyq@1-oCBTVwS(>kJGXtERfpCNqi zBr2a)s6TN{=J7hhR9`J)IGv_>^s8*wHOuY87$`-#Ia!}kav&59M&R?=UaiKFhK~?l z!S-8K4mWov+$^_CI6Y=L?_5Rnv4bdI3n^QUZHa{MGmYan^1L;i?X;bk{>eABI5#f7x5w7yJjnm(l%URKX$?`eIWS6-1J>pZ!b~Z)-Fyxq+Ul;QH8rhWBGi5~Y z*iZ4UVSH&I- zPNwyTci_3Gmuzw9EiRR>G$c>pBYE9vseFpFFF_#iR_qVz#CYEGgqz##)htiiUrFid z!}Q%}68)0hR1S(ymtllwv!1W=yJkD#eM*D*G_aAMM>+l5P3iBNPJE8vLGi|LdUn1` zcsbk8Rr~pJFX4MxAIM_*r1uFgGp(=oy+QbTUf-q4vu9_*+q2y}oB6Ega)@R9Qut{HGJH`dyFlM4xs8<##Fbd7Jh8RTV^^&iGwd5PjqG ziC)FqHHYxyuMn=%*%co|dpKZ{!*MGK-@@%s@wxj{!jGB8yN`JsImY9NYR^7y4`w-; z#Qk*BFiL+or+@mB#6OYezlzVwW!CtouM=KTMtstkPdlDREHlmTMlt_Z%zqHmPhn6g>c|A#c#(&{)A&mVR3ZHWw(U-QN ze5v|MW__uQ^(80sd3Phx?_m8z@hQEV@FQ&3Qt5erEaAs^UXaRsK4`}D?7tY#c+y9N zr>~;)DE>FFzBJNgPv{d*^yQaPdn;!?ixUaYX8Y|R#@!Dwe;%*H86THL_-3A;s`l{1 zeT2ty`&8+CgUii4E}XNU<{hEzj|*Y`D;Ph*cr@c5L!63!F^KiFQpO9}?({k5SJlh? zJiesz_@c_^=BdPIjmaO~4T^-|zlZy~%GZR=Om7;$u5L~EW5n4N=n6lDB7FUAK3osWIjK%BKlnR4=TMVW-#HK z*e=nN>2GBDJcH%4Dxb6pqTj*u{WVMpUdO8!uwrJe2$ssn~Cv+J5BcI=XtycWxGKk$NSnoYHx|#s9yRp-jVhB zKY0DWDxWPC#J}(yqF4F)@FK$ZaC)4~XUA&7cMm0c)ecw8V*1~M<@_6QgzrlwJeK)v z_YiKj|9rsuyxCrK8#07e%>^+f)Nbx$EzBkubHqRqa z9rAL$NPIf6pErVW=abfWdvr9Bo_%Ae98~+?bQj?}On#6EZnxp=Z(YXxGg^eg%%+%E=&5RPh< zS5MYs&3>hdP~x+m57OVx^haX}U&wN-595Ea-WbYym%^8=BKr6XDPC1C+cOAXww&^X zVwcxjBba}8!c{wYgyqk{L4=nv{k0Dg{U0gBU*)%(&G_=zT%zC9fat@RPg|D5`|cz> zo$)_Ih<=}GUsC=&lKON|#{i9~PS z2i@Qv!qa*O^C@|U@bz~PuF`Xm<&0Twf9fUr7$3!pWXtQWaKcCaM)G6^%D5+3FrA;PoCeY@?X)E=>K5-0m+cpPVO(}eZF6#fr;`o%e|(r z6YgibWjgaIM!^bt^M2SCR;kz?;(Lwq85{iovpOjp9q`+RR0oqRi<_nGBn!5-q1wUqLO?8xh)0fd|P^Uj4_l5(aU(W`Ou%sj#y z@1%C9(iz3+H1E${h!+JP^FG|4&mz2{G4YA#^f=t^NqGhN?jnDN&+m3S+)1gU+*w|q zcT!G~-|I^q6_;C(?@i6f%=OYU>nCncX@+}ZPJTvi&Q)HAYkKPRLa#fiD5W^lk53M_ zYq~q$n~|Ga;BmMwAD!YK=q>el3;j6-`EgMRCBRb0>0l+INDvkIeV)8Ram)4QgCfNr z8R<^UD9UzcPWO9@Tq8>I@`{#Sn zMzaES5gEY<>V(Lu=NK26kUS!g_DD~5hR^NyW#ssak~|3mJOz1$89r}ME|rs4m>Zpq&V}5_ekH3%B6Uhzf+ts$b3fUBQPH){ zTy$23Kf|c{+PxobbAW2yhif%$IK=gOPRFIznq zNvh&`WCV&KvpBENU0i5LKMOvQQHn0BU|N1vlmkGRlkf2*2=Sca&&v@##VYA3k*bLM z2IVWzA|p)?xEX?->4B&dl}XbhBmW{5!Ov9Zs`Q{RP!z#$;6V=i#|A7PQDFCn-@gcS-pV*9R(>R z((TE>Xdy+V9kEv2R=l{-5mU4qT48RkJF~>=K|4p)P8QuG#UCwT5CrEa#hpANQ;f0b z%c^pG#rb|Abi6)afiIr4MWK!5LCs7k^|+Jid4hN>AfL~j;`OJ<;g-LT@py`TJ}>kc zcScc>7m6;a98znQDj{S|K#j1B8G3>-u1EF_P82of)FhFgpeKk>D8~M5U%@o~JkjS3 zifU~BG>k*;WN%S%9u#FcJOwk68cJRC0nYtUuiul+pAikJL1^g1l18Qo5$lf2_Ijqs zh=mq`$as*f?HEf1gjUy=WkGEjkY0!a5b2O#iu{;~_(a;!5Npe>pVXL;n~AJ$O`Mop zT$BxNDgMG-do{|wq*L8ctWqQ02||#^xS?T@I#c_!aVgh7Auir77m3m~dXu1zE6DeIOZ|YkMPfcM*zflljfi1XRuC-4$hcf@ zh8QnZTQ-rXhB?$%kY})q&q1pPvn0Pa@6sI1ba~7T@DNYHR1%IBNuwe&4QOJ@Rfpc2 z0M061gNw$d4vpcI3G>oun5po!*dvPLQg6l-sQK>E-f79+i2&j<3X6(!y>4Nb(!S!k z_6;TKD!|Mf4LI-yvO5|L9*8KlOMOu4#^%F3P$W%aL3DxYP|@M#${d3#F15H2$&!8B zC^nHMS%NyuDd(b&gVr*%INu{IXn+R$CKchO6z|kxF|pw>T?3dCzn$zY6nzxx$^f5N zDklNu2lY~&eJg=gnM@c7^Pw#Y^@0=~FEkncez{bKDw$|Nm^B?!Uf45)nkkAEI@~C4 zUV%>(FsX1r#%1Iddvzd5OxAT^Oo`VwF}Glvft6(BipDvlI49SilP}6cuuho{8&RGj zGPItA{G#GuJt*0W9)UilI{DCPS<-GI=VnQ+p(QmbnFJ^=7^M;tp!pgMge`>?SE1aX zfVGEW_FiM|5GSMni?nD=#O%MuOl*^AsDAZkt<(yX7{wsU{RK&Q1K-&uiqE5A!G`&% zlCe@gfGIKFJ29g;7ZyHY$;^_bO!dgZa7pY2X!Xiwf6)gqN5E$4H@uX!Um@qtVy~4}d4ANKPPAQGM`FXZySvm~0CJ7<5Jhar=vk$VnUwc|h(L zlK^^Ak`);?%HZVHT2+iFgk8!#(TCX_9I?uL_Frn>Ii*O0vTH@wFK6uO6(&&WPj+W` zrWWTw?WWlRVLqjIOH(P+Wfu74+_4U(3Rsr&v&dA#4y@XC%6@Rl6nUlpOQtEyn}-1f z3m}B;mgff%#rZjyYzgmwk_R=8kqx%fB>0-}!R0}_ALz}OI$O@fq_lj05hmr419OVp zxtONlJ;Mo=lJn5mVRl21uKp;kz0f%UhKibO%(K*z-t(=BGr#tIZ;!M3FcN5b0CNT0Hznws)D2CKx#7Ef z1(+dW=?~jX#4YG^GGzaBu_#GC8Cg&;rMM6k&eoBnq9l01GGIpmraq2>odiB|<|qsc z;-fMv;O-tO4Bnb8P8!&RAqp0#A`uz0N2?LW9T$wp0W8ivHecBOgxzllgb&klbcWRe z@1|zw6ltRu=(TUc-~}W>m_i1Vtfi+WGG+YJUyX+x_Iu-mqby(AWdxIyj1n(%AbXK? zq~-eq_97*S>NisKleQ#7s@0EKUznjJs}z5}7adEutOLdvcDdJhlAi#@Q;Fkx@zI>7 z_2Lt7X{+Y%@`zbg1k}jja;*H^C>qUX4VR1y9Q=wJ&V0d6__-1iGKHnq9f=_n+CCgQ zhEp5k7JM-Y37C?}($Q8jSrFSspbDjquUAzTQW_NbeOc(-(x|607$~lRQu7k_cA+q+ z6*iUW`gw%4JkUJdNBLF@MS0mgVe@Urg`{^E`mo+wF%QR z=t=Tv9xnzmJyuI5)v_7WW9Z;WwRCFulQ3)Z=0PM&-=J`B)TcbCH0q*N2QpiSxBK~| zQXZ&{+SX?OjKV@8)ukU!F7p+W3U*$g&R`M}?w!F|Su}D6pg1{miy{dS=nb+bO@^GC z4Asi$3#M*6*}m6WziQWInHv3POkk;$5vzS#(5c1*makd9AW6*a$SOY7#?&*xn%+Z& znjTsJU)**Pu2-)Ld>woVMR84RbusazF0s@k^+qz6Ft(R zq=>F#3;hNN9a>GEYs&{sV6d1QxU+L$(lTVVT!~@`?s_t%#vxWGW|Ug2 zPOL3=)g^dALmhf$j3=Wo!-F;QN{H1u32?JP(M}Lc3$UD_PBo~qQ4bcf3)DG&l?N)v z6u)=se{+S3d4^N#Dq%qx5VbG?)@r?i(cIy2NGYT>4zTe`AyxHK2bjmjI$Y^SW&N8C z4tX`O9?&XXG-I;&W7)Y__^gS`db#L~E?s}Wsm98@5hUM>5lZOG!5cynNQT3{kdc)I z&7i1YViGbMur?&Pu<*&6C^9OmATI-ccCYY`YlPCj9`q0$&>Tf%|D1fx<8rX`#Wx8H z3}ImmL`5EYGl3PCDB9UzlLq~v<=X|tes{q{a?60;_dQ=?*-=Tf#CnFfhfmSdef1IG`?=jq$a%A!`hzqOW?f@S*5VfLbm$ zP#V8BJ?oqAokk{dv2wkB?2WEe&t$R*Pt=1}5Hwq={lbk=Xe}8voO2hm+m$4F#fPo@{+8TRdnHB`ZaWlj5j4aQWmT%Cws(NAs#k!$B=w@4Z; zmpR$@4u6!^ErRz$$Q4rYg=12=0~t+wpnFtCA!!o1X zl$F9E{L6yYdVPW0c6ot#V!gURn9an>99lGDxwt?sw~;P4!^miq2AcF}^znej&B$L} z3P*N!Uei!$_>YXpc(sj`D%de7TvSqg);G=s)T!X7@5r=rYQ;sJNZ%P!O`b0H%vJBZ zGCZD8>4Zy7IQHB^keIxC!ntQO+(@gO7-O1TM`_KgKMJL~5{ZnQa*t|PJ6j9p=(F5F@hsA6D0 zT51ll3{14u@QRYKj6|z2%jbAYY>Ah?Lo5PNlVuxb#_*=BBWx|?SW^5D7qlVBt?SK! zS-k1J7+4G3LB=;Tfq52hdM=X>BbYF6h~%?9w0=GjOu6m!qRL89?R3t{0z+jeV2IYL zEZ8U(Ac4j`$}M_OYGFWIkSIU%_6@m@8> zA8f5v(tvVoe1n3fTro5Y2sl{=s0X!>D7ybf7Of^zY$Gy>4Usj~_w3$LY=zXelSR5f z!~qy6KrFf!b_LZQR5`QY3Ap?M7F&KKMFUl>JEOQ1s*s2k=38uXko%H_YlLG@u2*oB7w>kGDg?S!NP4`$r>4>o?;tn z&Lp`$h^8-U2~Y{I|49}L9*2sq098h&)s^=@FmWg@>voDkj-;<>O@?@)7OKfSm?lZS z1msp;LSBN<*WKb!8dMSv7J)xnDl?ekvJJ52&U@%;V!4yW!X;R&wZ&F}w##k~CFSvM zaBt=3H5^|iPnLsAB+PqN3@$Z|(?|(VaoIU!sJkMk28|SaDzyeG-b|>0`p8p9;UI%l z#n53bmlc0Ysj7TeT8*2mN1BIC#H8e(Z8pp@b+WZYRpqH%E=Ida9*k+}2&m8Y%>ui3 zj5T;cEpD<4m08m_Q4_UQr!fUOF}^HONJ7~oeOV0)wM`Bh(%^tgOelOFw1Rp#*!Xw> zsg4NkL?~U-hNhKrW>w`2<;AF(I+QQ`8Cnv=fG3qCN``E4I2Irmc0a$^Bv>~uyMA5} z>oK)+zX*rs=$OLknOMXc8QGssdWph{R2cu=6U9z`IU13+Db^oghKo{6kUmgDn`0Z{ z|KUv=uxIF#Hk^xs6`TGd)fxUNAiDx`x#TVz^Vvdj+K5gPi4nU7KCDV~wr(s7o>e-n ztmy6BQ zv>(jtl}v5u*YZk}w_3VzWYZQ?e`!87X`e`><$SqbiBA}i#RdhTRf-8VEYQllt=CwOU8Z)*3bSK$EBr&v>Q6m5EJGBWM~pi zkoJcEA65iq+YzfzNqXj~(h=i;T2Yk2mYk&Fb!q>??$b|Nf|7>IZUz8bj^whCKv(;Z z?jM&^9Ul0+EFUm=gL$ej$LsM<%fT$iFi^R1Sei<|+=7;nG92bENLo0%QsShUSWW)_ z&o?KjTd>KLx8BK7IWLd&=Ag3}2D<4u1vXL`jR8!I6B|ybvsDZVCB_`b*6&BoR@5%L zGPMb~a+uc4K7#I|T8>NYf)v{z#bLnENhtTQwXmN7YhR(3C5_CBNEjZVm-e~7WJ-m% zQ!G+TN`pByz&pNBZZ$D%qa^;(gKcvNxhJN7y6@C7YH>_PWNqRW2fv|f8x}YC?P_35 zqs6KA+L`7F6&_2aYKycP4p2Eh!-y#M0$RC6t5v{)JfW64a2{AkXr4|{je!$VYn+t8 zajbH}Aci5!cdIfI;~l#s20WtDp~VW7WeietR&vmC3Y$kWFy(bJxfA5z>cO@Un5ki} z_htzfiIrmkzAnn8<~*q?Vc3=G&Yy=e0g`U`T~VyGH&M8;F(kl%94*=4P)<&$rO*)8=D-YHysTW{;;lddMpkYk+GG=4 zG{J0JA{L&IYDF_xYxWP@JeY(tocQch7P3c*DY2DNoMTnlwFyctGKi{5`+k%|*s_UX zuoKLy=c$~2^@4%yn3cTyYzg;BF4SuP-fx12X_i<1U;CmMd+B8j@HmT1*Q*ilu3 zM9T$gV(xA%T~VIJs@t$~-*FF-{yez?MfI5AhFpa|FR&NQzQ+W)@GRT0*l$-!$53v( zI{2tGmrjs7Cn`eC?$lxiw?AVNONm+A0Afd+5Rd`6SeLy# zY}BL)#Xr^r%!h?)tBJ3F$^>O1r^L{Pim*&k9FxPowgfv*67@l2GW?%C*iI%kFvT(a zf+DeQi1)y}TxdGRV#z2acBR``>S+*y%INQM4R9C8Goi_=O^b=`r6dL|vyHaKwq-*H z`J31W^dzyZLg>OuW){-fxN41|m7&jpf&tV@ADVG7mTK%pf{xlBrb@ z)@f#D)D~=ST470*-&kc=^VLkyMr+|%kglN`H!MTbtw*(L`mvTb)t`pKSu zhF&yNxd>4@H+VZ4*`k$?10qYAXT=Vf+G^K`0779*V54KCn-&9$HH2ivJrQi{n?x}$ zQF}4#%?rzXG47G!+VGibUH@-0-3P?4A!h!*xD0Q%5!Z=d6JU{{zabKfocw1!ZDN;% zw1Tn~414se9IVg}|HeW`myI#Zamgw1QqO_n+%-iWA3E8#Z&xI8n+~7@)E3#dsaHZSBYS+na%|)(nxx?b>^Pp#{a8Hwyii zvSYFtAz3g^OC?@cY^=B9Vw!?J>ct@@^uvWX*;OqY|3B}~7Q5tBsU(juJF3-$_<#HY zA>r=D&&}Wj&A>0$>0;K{{_V+yb6TA$UKgE69Q2zIpX$jae=>fB0msxBQVwqGiG^YU zF$O(HOq})B`M;(##RdZTJ8`t$N}5K37B&nHUfA%@Dx)ajIN@a>JYgX-VO7gQ%!aVP zZNI-*k4Ve%4D(h}imF3%D*m(TlQ5`i<~TWj5u)9ks=u#nU{a}Z*$fOmk>SJ~ksv1< z(3Y!9hML<1R?c7@kL^kuLnI}`xmXKrrScrFQhai$Da0VS8uk&=F@?QG{XPvA`M5m8 zc|B1=GQ1HGys+wMQ%JGOM;KhNzDIc8QRl`Ap~w@kLa5p_jSz_vhJ&(<2aXU5~DH9#@^LjFTY=%T{^Jx$lfw4c4r1U ztnnksRlN{cuv6vC2!2$3?n1kzmG9Y=SJ{EBo}q*-*W}1$N1ErD{oh!5VEiI|>*K zW{5%gmjeq?OqF0s6LjpSwW2R#(rYP_lyIvUp?0UZvkL6ieIQp=t$~3gz@#-VV~V%( zQV`|Qg~JzI`qEMn<6LjiP()Q@7AhqQ#%9yn5?awE*E5*jMfSu}E=VKcJ#~v+*wM6g z7myf}?AtkB4fsxkI8(lpDqm3+^D2pgdmK`yrZ48^3uP3H47Zdf2lyxB`%dH^4aBeS z$VTSQ6Gf|rHS^|pl!x>u!7XEqthoF1S<46)2jqC)qW$+Wp?} z6d8sdtnr~2OhN)ScbxfCXNM<#+&Ups$tDb3>M)>!N%&1nxzAUv7K+Krq2Hkp z3tL1H^;3dR`Cy?xRbIL$1ehA&YHRWr<^bANl#r~9B(>!sETZC|Ca8Z@wY6n{VHT-S zXA>(UPi?sv$zY|Uw(moRrI3K~;MabOkQ*@?C`WZ2xM5BW^_UKQQVR=e%|@vfh($*=Sj47I52*Fg!h9M>>Nxa*+8#^H@};(~=?gMz zxp*o*!ten^8_OK(K!_awKQI7ZPh7}c+()Th=^Vp@+0I))p)Pg@KlEL=5T@I$*(Xx?wH z%+xD}U_A(vQPDrMa$Qx<)$0{w&;*j=1HWJwWxXPRcEu|K{-!e1oooHDW=JfRlk+{p z9;WwC_T$qrut7iJ9ErIS?T)TX+oNR)1B99a!y9ec5FIo~KK*Z6s>E{#i}X|3$r(sp zN=g}DM%Zmp*M4&t))-YO!ZITU)mk43T>Zhn@?2c`L&rrJ<*}%#YU?kGg=~ zH2flT(D0}B+|o#;Z02=dr)0ApDA-~wH?-D03MoEdOs6EDIMzaw$i`0{$`b*=T$|q3 zEwNR&5pV>RF&9P;6?KA`$&w_Br%n+{$0!zmXrN&-d!?Yz1$TzjP z6QgiRFA(M^;>=o9m|Q+ng|$&1UxGWpiAhet#*2N1QWdZtO8@S(=%a01jhC`u6_0k1 zLGY%||6X29+7>O);tr#ZiWlp%YCU}j3~~L`;rA#3Q`H#DATY#fLms-9G34R16sp!^ z-Vpn9@Z}@xgYY4vt33%{{J^bRiXsoA#c%Ib=^)UvR#lg!{u;=+siRfeUThR(U1~wB z4yi&)Vk%`wNyF6{kswYXsC9)SD*KZYq6;%}eBv-`=~$&WlP%opf1^XY`ZWjUkxux0 z>6f&z?pXXBfG+gS1B%O|MhD>n*C~UXxu&xw_-qO*4>sz+oS>j%Dzwp5y4gUEDNB&Y z8(Eg=$Jr@W_`CaR{_dJbYW%`lo#wcP8`H|3p&6v?J5pe(B1ZRsHL3C>gq)DIWGa5{ zOZH5CIzz_Rpy>cyNI2EQvMj<;YgHU(Ovs)>*@A1(8htA|CWI97npH!yxZ zooxr=rw)R5^~-(avJFDq^D}8=w{pg6E-$r=L282Jn#Bb<>6NMBh_rY>hKqzI~R^`RI~mQ5lEmVP2lG( z>?nd(HDP6)FJpS0MA^u^NMy=b-%xK(VnKv!`q=y&xw<|c3;nXZV^fF52!V#oTCU;< zpxkk2q~%lkmC4@vRf~gZL}pymM;7Eyau4+t*iH=GAnJqim?#Q%CK^&%?NVunvkqP z2kTasUDXZh9$Ec4m`o{sYwTFY788H%SbI@I!N2DFKgwZSNuSkg&wc_QW$VhS zG)*KWDo7MlYfOPw)n(xH>G^Ue{Y;LZH+Kmd|kQ= z=3mIz@G-(rC63Up!I|6G{eJk#mk=1bq#!+3W z4`E6nyd1&=FApP0z~PMIb6veDu-S_(YGhBw_DE3`Jc9^s^~%gIJ4t0vg{g1rUJZ2C znt3(o2yNY~5u60Ex6a&0l?lS^#n2L<^=M-$ZncbsDX8xA8pAYUHCI9Jurm>3t}X0N zWLC2^5m!Auf`M3_6Fb;VXY!+48P+dpPYSmGT3EWOF#nRtP8!i9n_#P1a6E|E%FwIZ zhb?SsOWajwg4=eCX8RB<8Q*j)BzY_6t>R6;|oJ@_uf&QC*6w<<43|oZi ze)aAv*xQCJD{Op*pG|Ei6@4&Z-&MQ0q?uQA+Ny0YvX^RaTbvS%e48xZC`2*kGG41` zTu=__otnjBuTm%@vmx2!)>ky6+FPA<8*+VZf;pvfV@PU}_?22wNVa`gJPSBst2PGH zcC?^A9UnZp*$kw?kyI^fgJnicjriBu*do^Un50yk9wR!WwDYQcQgzYfq`6lt$ntq7 zCL|AzbdNxv6}m@i626#@UN@f{E>B(7Y_rC8xqtyzjy}9O4lY#QvM0>C^fULyE6Q!a zwEaA}-VC4G9bkGmu&}r&8>{X-Qxe8ZhFNsTbU)5z9bA;+_u*_-1CYj1dOBFx!`-Rk zCogrt^a@ec$EIpz2ey@zLbrJtwAer-r;ZSK=!Ww57)VG2er~WjqoihoweR`WF{#0Z zT(qW2vsBHDYV2F7rxj0GNR>)jSG|_g6J*W~$^y+ZLwPi*yK+a6*9Y&lJHzkx=4U0iCR6`65f1Qqi@d%PaiG6z zIt?yy*fiufOlB|9$lQ5iB(wY8GjWEB&h6ZyZhuCY;{))kxU7RjPgRm&+v#} z&GJl18jfQv5=yj#hO5(#<>3~V+VOu*rAzU9r{WX~y=kGBn~Wl8cd&_wqZ7m~a(J=H z3X+-7AFD+%072KXSC>S0hlN1At)_6odLo7oVN6Ki?J@OLRs%ZH-=dvpEBuGo$qNHj z31t*no8KpdCPf{<#%vbUN-Cc|pe>dZ%UQ&97YTrw%#Y)Cva-;NaD+iMJRq zQfa)hG8P8eB7+Ak!!A$h(pKOK^PO1ZEs`66J-Jza9LX6?OI(C@X|l4>83({&G%yTO zbd(WvF&O>CVNj;Uw^i7!Ya}f7u7j?TU*OAwmsTyHviP;3$|u4Fh85Us1D4waxvrPS zfT4T}GwRDMg)lr+`2%*!E+HJb_4)NW=2LmDW=c?uaokJQYuKv#xjB{Q;NO~?j4=`a z#U>HinEQ&>QT3@}lPfn87vwYw6-}FZmnr!eIyFZX)~U&sWHm?&d5_+ahdu)HE3du7 zqP6@Y`TLT_NMjt|h_ME`l@J5{eO|em81^Wy&ztY@CJB4Av7bni@QkD&AU4I)K>e2v zC)1E4f7(+!zp-)~2`sFv+B7QHD!jd#ctY9nY1O&xcN z4u_~j{a|JZ`BLeG$pQL~8+(PQI>BbO@TPi&90>|cxB^94<*Y#TXSQ($OTQp1XLYg_ zg`wGqtBerE7aUR523(U64~|I7qlLoD#^~VK0_JE;u*?El$aNCm0k2I!zKdUl)V(&9 zoM?7J91)@M=`K9U2qqxo{49|e>$SAPF+Pa8R43$EaMZUsSC`r>{c~q(S`LszsD? znVm)Qs`#Z$C0vMj_G?Q_#xf|KN28 zwuYaYt-(R%20Z-AR91zZ%BnFS&q1>`w96AemlI80P317g8>527V5m#g$|=)o%1Yg^ ziia|&Ya61%<=DgtskiuocpzD#+e)QA z)A@utMZ0pAP&OGrz~3#_J)<_h)rWct%P)` z!nZG0Q$TBm15oxobE%=x7{^nKDN~@)qy$P@6h@ULRjVAk3$b%u98@&LJDm@{mDLf{ znxT5Q@ng~+{D4q#{_pY}!Prhh&+D$+q$L%xe!Lq{V=V@DJDNqiGQ{B6nsH(br|y&3L}em!tzg3PCcbx@Km3~W0hLsN4%-L zh)(=fG~!+Hxs^;8eHJ_fE=pTmlwVOB^cJO>N|{nA^4#E`fB%%gKPB)_3H(z6|Ai88 z$T)|7>~MraPCF4?XHLgJ(#qinCN3eLCuq;_xaD?;^bp4k?RjdY=S{WeA&vq3T=2_2 zeg_7EmX7NgoBr0Lh_8j?cK+^@-e21@9#W11u8&e$1eWv z?{#a47<=C3?^9)b4IQ80yNtgRjZckuD0A*_An`&I9`Y^Wr6zpuKElgPc94JI6a+Acm&fsO}OG8Yr@NzKFx$5XFS`C zbG%zjc*Kj8&K)NF0MqX^;fYLtz=W%G9x>r*On=;jZ{qJE9FHouLZ)|`@N&j`ns8OW zF(!Ny)5n@{Mej1j4L^9##MVUanL*Zo@VHYqa#}_--3q^;eNEojyY2 zKSYbyrQvh5cnfXtQY~JczEq>{sqvq$;Tc*vlxz4-E#9RX-cX}oqv4&k{t~LC=Y3hi z^k==+-*tQo%MDRJI-aKS`BLMvTjQhS*&2N>Ex&~tew&ugr5gU2mfzzxxRUE4ojQGm zM!!-kpYYvrTkPK~~wR=+(pyiDU0q2V`Z_$H0Nj>l;92zs$f`+GQ_#ll>x`vl&>Ce{ido{dJ z!)I!EsfK50c$tRp($X_u!=KUU%Qd`r5gYF8s1prQ?B7%G<>Os z_tW@PX!v%GevO7V(dgG}cpEL9n>4&!tCuYrK3l_gXt-a)cWd}+4d1KbCu#8>(D0A6 zbRN|3L0Z0!X!uf%|8WgpuHlYuf%dQF?jrgS4ezhT8>-=LwRCpU@FI=gsp0K3`koqo zibfxy;Ulzk#%TB~jXqYx%QZYv!#~u@$ED#XYw1bT@IxA&uHo}E{@EJ-n#R9S!`o|o zN;UjdjZc||chKnPYxpS|UasNKYkZb!_--vd6&l`AKFgqY1C?KdjXfO^6 zq^5+1WTop+N+9NAfvM_&Fk{M)*D=XNK?*;b#hevB;S%{BF^k6#jB4??T}ZmGp~+A1vvY z3STYxsTDpd{0iZxNj~d^|E=g~TH!ZI{#OXUQ}}w}hlre&!uOGUHVFTc@N0zMEBspF#|pne_`e9B z6aHD@Hw*t6sjp_?w@dza34f@h_l^zx|BGUWO5slwIbDQ5OValg{sT!L5x$e8A1Hhm zDc3OJZ^W2TsPMCeA1(5e z!lxvk3x&T#9RC%DY*3U0-b${yNdSOZb0?9It=i|4W3g6uz_Mr;G5n3*S@tyM&Jj zf0FP6h0jPnhY4RN`57hrSg~77`0q>lNy3kl^pk~uK=e)%J|^jFgg;i&&k+7}Nk3Eg z_a*&o;m1oplgf*ng~I<`(k~YN3`xIK__>n4R`@d|{R-hflzi3;zfR<=6#hX;-yr<$ zl75ZwJ*D2)3V*Q3*&uvG_?+-VMgC^t7m564;U`FWcL_gP(t85}|KBU}D}|pZa=HjV zRr1+W_(_sJB78#R4;22hl75)*?}_|T!k;baW5S;!{3PL*NO>mfuUkC$?-6+R~X2I23Q{O5#EO8U*h|Bvv^!hcTkxl8!&l2317;Qvj+ zR|z8BzOTq1CH!2G9~1ubB4?8DlO+9Q;a?Gc zn(#O_S@>5Y{O2V9GlcIY{7m7KB7e5<6C{07_{)S}D7+_f77IUJ(k~T0BYds!S4+88 z2!BDLw4PTld|1-26n>cGr$PAXl75ZwA4vMO!q1m{ZV)~sd`|f8!fzJ-3zGk4;rmH` zb_svE^mY-xLge=p{xy*k5&lBS=Ro047dgX(pC;)?3Ex-b$Ao`H z@;OQPi-eyn{1-+3G~pkX^fkf{7rirtUnJ>g3g1D}&ldh7(VGzenh451(eZBBs5`LxdUlBPC!Vi-CuMz%YNxxS3W2D|U2)|S0pxX7O-{Es9*HNqb({0!mG6ge}6zeCc`7XGV}pQP~5 zOa2!M-&^D?7XE7@XQ}WTMNX~oT|~|b;ipOZdg1#@xmF54Q{*%VpAdeH@IMmyYlXjD z_uZx^X!q5KU4V6 zNc!2rUm^KS3jcznUnu;~gkLQDDB+h1f0f9u75*l%!wTVlA^EQtewXkog}++lHwgb{ z$4 z(?$4eh3_f+2+4m$__Ku{DEusuGfenzOZrj5KPh}n`0GT@B;nIiuF1mxTI5U zXG?xo3O`=*(;$4M@N0zsw#Zp4{0+iy5WZ6EnG^ne$>(O_2a4Wi;k$~QUBZtQIo=6@ z{|^zqQuv-Czl-p<3*S@t86qbl{2VFoK;geH`5Y#EH{nMK{{`V=!rv(JCkg+CPOQsMhad25A# zPWTnV-ywXx@JEXLmBP=H{4@yPD*PJZQ^Kzm{=33&5dQ08hn(<-N!TUiiG|T`Bx+BELcSUXq_R!fzKjYlXjEWa!v9P7df|@~y(@+Plkg3~|3vsT!naDf)(U^O z=-nXvGm<_h{7J%Z7JjM7X%_xR!tWCP%Ob}c7Wn_0!dD8vOyqPCexRi9Dg4pGM}+Sv z{xDGZpNRZn!hcrMj}rcyB0nblHIjak@KLFk$--YDa;6EtOw!i~zgqYi!dD4DQ}{t5 zf412!FH4=_&m2l0G8*k0t#;;WtbAVZvV`{3zjP3m+4Hp4exS@b`<}$-@6q z>@!XHHzj?I@E?fY8N&Zc1L#2H`&x`8nZ_6*-%QpDJ>ih3_c* zF5x4>dm{q>A0_fDh2JCj=_34N!uJ$DFY+V8Um*NI;RlJ{VZ#4Tsi+f1${!7yfSHR|@}>Bey#8?iG4N* z|FZBo;XjgcZ5I9&N#88|wdx z1BGuda)t^21>r{t|B&P}Cj2_lJ4yK0g`X_^og#ml@aIcDYlJ^U^v)2zS>(?Y{%T1- zTlhC5eNy;s!Y>qlz2tMT@D0K*75*#2*9yN|%Tp7o_TOjg_nM` zlXvHyInSLd@*odZ~{175$L}R zI4bxG;JDyxfD?je0jC6C51bKv18`RGT;ROm6mYm*pnm~yRPZ9;xZvA>6M~ljr+jRD z?JnSq;AOyB!S@2^1!sW62O0h5`3Hcbg6n|ef*%4-2!0qiCHOJmjNr$Cvx1)n&I`^0 zhua7Gp9hW#ei1k>_*LM9;B~+$!RvuDf;R$Z1-}KH7n}zUcL?;q0~{5+1voBvD{w;a zcHorYoxmBvyMeQU_X6hyhfjz8%0Pd6;Hcn^z;VHyffIte0jC7_0L}>R1)LS!8#pgG z3LHK-(BB_8DtHiZT<{R!gy7-8DZ!@zX9SM{&I%q2oEIDi4tEUnPXLYzJ_|T5_*~$G z;3>cQBX~D( zR`6cnyx{P7=c#|57YoDe((I3;*0a7OS& zz*)f;1Lp-NfWt=x`Y!{H3cdn3F8CVYgy31gDZ$qRX9V8>oE1D5I4?K_96mbGzW_KY zcoA@1@NK{e!ApQsg6{&(2wn!96?`vnUT_9Dd`zJK0pO_MI^ekAhkz4;9|ledehfGx z_;KK@;HQD}g0sNk-huw-fun+71da=S6*wVy9dJtUdf<%UjlfyKZvp28=Yhk00{!m* zM+I*IjtkxjoDjSnI3;)|a7OTM;H==iz@L1ry;5cwN8t9(@ z92I;Pa9r@YzzM-qfK!5}0%rtY1e_IoF>qdR0yx|^(0>_lRPYtRalzLBCj`#|P6@sq zI3xH5;H==ez+{f*%G>34RPXBlvOPtl+1C^MbR$;r@aC=YgYwUj&W|eib+& zcpY#`@Ot2k;Eljp!EXWQ1?Pdo0|Nc;07nIH0gema3Y-wU9XKU;CvZmaZs4roy})_F z;WMFsV4%M}a8z(d;JDzq{4QNeYtXoD%#Pa7OUsz*)gh z1Lp;2fx|-r{m%nO1-}R!7yK%4Lhw4^l;HKi8NnNYvx46O&I`^1hld9G-vN#a-U1vK zycIYhcsp=P@J`^2;N8Gk!Fz%8g2NM_e^{WuJ#bWTN8q^N&cF%5-GEbqdjMwy_X5re z?hTw590d-a80ha092GnWI4*bya6<5K;FRD~fHQ)}0A~e{1NK1)l{R z7kn;oLhuyel;Ekr8Nn9;X9ZsjoEMw`4vz@*Uj`f%d&6*wdKBH*mxi-Gfk6Tsn91O1l) zM+IL292a~Ia6<4b;FRF&fir?{0L}`Y3!E360uG-R=wARF6}$*IF8DU!gy1E>DZzIE zX9O<;&I-O4I4?K@9R5t8{{i5r;5y*A;D>+{f*%G>34RPXBlvOPtl+1C^MbR$;jw}K z=YgYwUj&W|eib+&cpY#`@Ot2k;Eljp!EXWQ1?Pdo;{yHf07nIH0gema3Y-wU9XKU; zCvZmaZs4roy}<)^u8N8q^N&cF%5-GEbqdjMwy_X5re?hTw5 z90d-C0)72~qk;zk#{~}oP6!?joDzHra7OSL;H==Wz+3(f$C4|4i3{|Al=t^ zeh4@r_+j9b;KzV7f*%LY3Vs?mFE|SvZXf7>9yluaMc}yLSAi3P*8!&luLsTu-Uyr( z{1$Lta2`0^A<+L0a8&RX;JDzezzMf-eTn3r+xsI|ceL1C9#5 z0yr-C8sLQBS->g5*8^t+-vFEyJQp}GI0YO&B+$PAI4XD%a9r?hzzM-ifK!6+0?r6t z2AmaqFK}LP1~`0Zp#K5jsNg!_xZsC?6M`QGP6>VtI3xIR;H==Mf%Ag1z~Rn;{^x-vN#a-U1vKycIYhcsp=P@J`^2 z;N8Gk!Fz%8g2UJk40j3iw+D_2?g$(g+!;6_xEpXva1Y>&;9kI4!M%a=f}_CUu7Upk zz)``2fa8LP04D?w2Tln-1vn#k3~*NPSm3XIpnn2zRPb5Aalz*TCj?IcP6?h0 zoDqBxa8~fez5S;2FG^MX^r;qHO{ z1;A0ki-6;TZv##UUILsFd>3#=@G{`6;Cq4df-}J3!vp;f07nJa0mlVD1e_53FmOun zW55}~j{|1~KMkB0oCOZ|2=qS>92NW`a9r@KzzMq^ZsNhAwaly9%Cj>76P6@sXI3su&a8~fWzyyU2 z-fOGzJI?doYw)}afEQPkE(l=Lx>O7ox=QE}0t3B_f=tnobe)=Kve$d)s-h0&_ zoqh+OXI|oOPi#q;=fj2P_sn_PoUh-}$!mE8I&0#WjE;r8lTH3+Ol(Oaz0t8^d`q8y zx8A*>we{|Zmz+`)?=yNwr&!CLIazZi|1FfEb-edlu7lUoSmCwgI>cJMb}?MXT3CkM z5%=}-j`q4CO`7?3dUJ;%J#;rhR_?G^%fBGMkLO+6h&&S;8MxQ{fzQ`~r+&Or(A~qY z)9-W}y0e? zj(OzupIH`3+d99*J{PdeC_B>TV5f-ZEmFNm-^NxZf3R!Ft6%pI$S;?V#v{B{CNJ&0 zZTK6TCNJTSPJcajL~NDU&g+W$8I-FC*X_Xbv?KXI&Qk?{$Q=QD91&}&YUkmT8ObSL zD7o$(JX6!ZVHxD4{rX>R>c4fhEn5d~RqIjsKiI?T*U4_VKFG^s^QT0X*3QZe1>e_O z)z~+-3U#w;oabE`ZSP%xueDFf;h7wG@BO*2H=^EPiywF%(m_t^0Nfi8Th-@A@7jUw zP@X=xMxC6+vf{Leza-vK@kUKVeW5Lk^YEKomzy3+Z?5p_YEX%x z$nZ36-1$uJPV$YAvl;FC_({OHZmeM1P+k07A5W?D(=|o#i+f9UwBC(!!hb?(%D(Hv z*1M}{H{fdECBU>}6Y4x)Q8fr!(huD$T#yf4Edn%7(6|ce#Ydds&3Jq*1HV{nad$FS5Z~>J#h8!^Ex!h z_n9@uXZFl_ykIM**Vt*OZzq$_2H58)ujLK2J5$c1VlAJgtiE1LzAtPF4Ewh%-Q~xJ z`{5HTBkIWc(C9u-de?py`ESF&?OnSN>5c9;CbqOgd7JQT9x_ec|^Y1@>+XR`unH)_v4=b`-k@4ov4o%KGPfbVBC z8>1}@g^qD(x3%!gag~Tc$RF)_Echo_?!jJ*%P(z3z2V$R>D=I0%Xx=TS90Ceu>0Ha z%U?77fFQle#{k4sJm5J0EHLAWply zHKJa^uuZiW#-FZ9uJcd_?QQv)k9OAA{{UO;M*Ax+ZxBCsR8$t~+LRaNXB#zoY6qwB z{i!=Q!*;WJd3P3c!v?B5#`wfGj&vGt_ssd2dM=pQ@>{EC+5z;u@JaNXF|p;xR?pZ2 z==s$r(Nigjj@J>UK$dUAu(pR;2bX*jJ+Xml ze9zkW+xi3OIr9_g8Js@S>Ur`2dIoWAgpUeUDbp0fHj-S}_H>+pi0rdQP z`zL6pu>om(N5Yinngi(h>nG8JxbqvU=Yj+1S^Y`$z^^gzFy$F@06h(kDmLF2VW|y$Dhxk&s){VF*V1^?J%F> zxCmp~TC+PEe9gZE7=5Gj`i9`RG*wUlTe8+zuyAg6C7&~H| zfjNl(UUummY+rLOjJpeSqB+ zTis}F#j@BrZ>dco6Z3>vi?f5XA$it8Ii9vdeeL@`Zw{HOlb=l%3b_?#3@LZQ`EI!)7`^;W+7TrpGvN&m21^wd)b4{xP1T z-?=%xE33;J*FQL3b9LiIIQR0$#Aze9c>IOA)fAJL}=X~ zx%C0g{r?1CLRqhMW#u*J6OEYX(~i8)@w~&0OfPNF*@U)etin9Y`Wo$bDdfg!$0Iej_3 zJ5kPHtnT#sV|BHs+ODgyjk8-Yu6OBku<=aHK~1c{_21A&O5;Q=*2gqX6#UPw#Wk9C zTHKDcj$9n19Zej>ukZiix<|22z_mLUPxLtxBawCu((Ld4o%^_N^rGDl6#sB}r?123 zienGg(70xX_L|39BlF7jqHyK2%lLcxjiDcVUg#y)HUe4RQ{ ze4%Yxo^g^gj4k)^tVts=(SvQqp+8BW-7q$?U!aVF?9%eEO`%L^<0ihdOd+QWu~1_R zX?sCHqX@M(wTMH zib$Qy1JW)sd6u%NpSXHX{LA+x*l7@bXDZsM^BWTbUELmr7*}eG!(yvKmEJ1TSCz9x zWo#9`f76vVi!$9uh=F$9ndS9tdHdj=%XbKIp4ZH~ky~Oflg^j>`GQ==R*@UAavM7& zr!apa`?a#NS?9V=4*5CQgMNkj`vLvie-3p48-zdd(#Zd|SbcJt_tAtqyyow`Ud?ni z-^NZA-g{p6*ph1e_s*EN(a6BFd~T2(x1e35oowSb5#~dDjdeo24;wrGH~xmaQU>z- zQV99sbDk}S$s6xm%rws5)hA5Z(3ddQUj@JL`wxFVp-msez7R1vkMS(~oSH&<7dQRb z&hjO>hvLQ;Hl|Y-#|!*rzN(?KI?}L=>vCK>YOJWJI|}3A+|BU^^XT`Rz&SaL^IRLO z_S(JI4$sBVmT!c9u1)c|J#$=~FCLqXKwm+9&cEGy=ld6i9yGBX>&Z@s>Gy_urr%>Z z(Y_wc-CTim&`UWtj|XmtKed%y*Ej(8@yj*8_mR&Jkl%bocjWo-AkRbF=J`Cy^ZOT` z{@|WDZjG)u-#_GhxhUVkeb-MgMh&36qICXxZlQb_I~=flO&DjPK97e^zs#Skj6L>Q z#*#j`#GhW?>ip07Q*oJ_P)_zW#`p0{AA+A?AEl!1slv0)cZ= zIsc7%ev@*nZx+|{CvPKD=!h-#i9L%dvxkE}#Rk3~c9++XDGn?3=18UCK-6K34{4%*w_Ow0&l&Ag)SZN!{+ zp#N{s$?>vj+uWCcUynoIUvm)pSz@fk=T7zau1w#Hb{yh71N__IIp?XyJQlHMP#9%w ztY|kVVeR8_e#<`FAAfgq^UFMRFdm@)eaVkw@JV3CQ^bc=d?tszkGGkQdtcB&S^j=d z2wemBf7;bef}TTRi$>&w&mrGevR``}`6ibyd6v(dif8lR~ zUjy3B4(v~{JzR=wq$#Y?kc**>a9{Ic*nq!Hh{w#YspnV^>_b)5J;8nvJjOv-Cy2G+ z?|+(ose@@hJo6ssoZvn9+-|m8Tr;i9W9fch5JGN_sA@7fN4tp~4 zR0ErFZNv9f*KZ%#7A`-|1`mG>8yr*41`WOqZYZ(Aan=TFkayakPHYgy-t&KIgU3p2 zaF?~g`}DUmHYoKSmeZ|!wDB3+rWvDMoiHvmTE8(|&W|6A-B&_i-~&g%2de5G|A%Q$ z^&Zl(p1UE2I2&X9(&8QBkGX5%PmpKQnSEEtyAbl6@9SC#-Mr^gU*IcO$L}AW9jK@Pkl3jxrm9cXy@oVe*j(0VVfp~G;ySfnKZ`k zWuK=#g18>U5*=@%Z!~>2%O>$2}bTLl?)P z<1ntMwevb-`}tma1NFKwD$;R$Lu~Sf`|rbM%xh7;5Ti=hQO_*o%Z-Ig#?I5tn9QvG z86A+ZtWY2RGevXxzDQ5KCU3SLkRN|c71TA;JcrnW{9fzYFt3w{*SyEJWzO^P+O{?4 zGa3h2UiwDR{)=^d(59|`>#s)^$A`f77y7nmJO3x1HSHaJ;ud#}e(~?_y2eX?(Z+;6 zIp0ow-u8dbfsIVtg&YshPXadWjTkb{0A{>tM7v|G>BRPndoO_J`kUu@Q}|1pcolws z#dzMh8vS$Mus@GQ9Oz2@z>UlOvqP+J#tE-BlJ1Z6dGNWu{uv|_KfG#l&Z6QyJ{L-F z!dVXLjZiOq{BD+w<7teYp?h1%>b|3l?(K}%`_SE?obCo+_uE^1-3?Z^2Rm}!z25dG zd%&yhT7cDd9{{WE{y}*t!@t0@49vH#**NR{gh!n`oA{z%SDa-9t;8k10sxfpUjXca-r2)^rPLy#6Ll zo@sEe5&7C=uEXXm6`#9_V~KLU6YHOzjWW=m`RvcQ#*XV>FfT~|p!p4@Pej>`k08xY z!4<|*NX!1Tfbq;dicub}=S*;8FFb#z-pBKc7329^6ytf$w@#7gzpMB0d{Qx9vB6wNyz~k7dN6+xx4w_MV*GXeSL22Ly0JS?g|WZ|zl1;SIG<}!FWI@{ zFAFjF1B}niz7S%Llfgc&@je@ep~GW4nI2B>r7s{(FrI#g?aju=$YJnv%WuXWa}4?z z2kAGRPlBI~_v2q~B+fVjoA_7*A03Z&ihEaBSsHU2*xxq!{`xS^xHRILd3YAKCEo$| zG3|kJkjI}RZ`dsBPI<2&5A0`oKO7n0x0~buq^qd=3gWfP+uuhZZ_|Uk9mTu?PuN#} zrdOEua~t!6Yv$)C%nz=c5YII~^O2t+$WQACucdV)$_cqYN4^*z8Pgi)htgva7qBmK zqQ*+U+`gXcOu2nM^G&%c(!Vd!^L6Oy4n6OWh_%qZT%TmS?Z7sS-`w8Uh;I|R>;W^;n82<=t#r+i8ZU$@>I*4mIRdwH_-AsDe{k+(!`)wL$-!EAFC0B1r zU-ulRdz7#Hj1t{TN_3C6ay|<=r-yvqQ>h#I=QxAqy@u`dY`?tKjOU9jC8DvqV~o)`OwoxE0;t)I9;cja$=lgZNu`>mR{|^^e)CK@UF}~ZC-oh8OA2+ zJj!0X7}I!Pahz(vS@VAMW9z>=U?27&22T&A{{=rOVEE;Gz$k#d-!9GZ6l1QRzFoQ% zF^Kbhhd%`7KDxvI1}?}${&oPfKDU|Q?sX&J+ZVs43@TXy3=vE$M+=s)0&wrdy({7%Jx9fN)a`1AO0>JPF!#Exme z=itANMNeRUojouYuzllVbB17OvCnz11AW4kdzLNtqbT>L&92XM>p#Ww8rt|Wrsw+kmkDFf?=biOc3z=uPDTBZNz&%d8 zJ`mIu_7GTCtym|(`!_AEeefT1j;XX0`mbvE70XfK9iNUT%=&SCD0jT6SFdJBdNOR0 zuRxn#jW~chxeCuIUix>`i=DqTurK7k0PrCCHh$|k=R_G-;CHmu8Bv|nOLSt*d<355 zngD&2@!IHX^7XSnS3H~gp>qNC^nq?%oApt9y@GuK^fv>KysE;!BHr-2KfOBe|n`_#4$AWei)UjF9Li$NIJ#Fwl z`y!mvbmOkzIls=iAK}iY+4ajdbk+#i(B#c$;2L+sJh#;pG+*}b3HHhD`7y>2v@e%e+UZU6-VA&hb+FFn(ewex zC(GR(V+XXuqIInZ#y6~wW28RTqu(u8A32O)oL#?e?K+h046)p|sar#oJi?Cj6&DY< zMm&Z618mH;#JJ#m;vpRE~#zO9V>7F^()>y0EXWN90sEdB*&PsMdn{#>?ue1%( z_x@(|xIWO;YuoswX9&O8CN_y5l=$i(=c}u|^Z;CUM|+~*_EW!wjp?`B8JG6qx8IOD z9Jr4<94__r1pJ)wU>>-(e%rQuJp0>$<9cr>R=aK}e2w`reGu;d+ug@JjBT9H zY_YpIGf`0mq$Jivpga6@wpB` ze%xBMO9x*J&VW^*{CH*@*8E-nP)I)?XSnQmz?_FfdEGiY^UgDCp_221rF$P7H$I8F z_wC}&u=sXqb1oY7V8+X^CHiNa4}@LdCqHBx!msY7yRxvHrvBVJ*)BihOU@>`GDAm> zWyWv0GP^x;bIt;KHJ8XMX7ip+o%ZYOFIB`+(n8Xh+vBO`Nc8 zmv%Juh2L<@j*nR0;&6(M9eVH;VcZxsP*XTpx{qjub^%5Ti&)M;}qzpKb?d)K-=iq4b@YqlTsVn zSeu*fr4O;~(wqrEJ3anmwx#=x{o2OeLj7Yus%*U(AFUWfzxcBCZl+i$DkI0M`U%NgJHGV3bYA0sx^l=OS$#&Rz2E==Fr^3DE;`tZJa zVU5b8Uhsc{9dj7lqc2MT&gQ|yKHPi6;*+sXmv2J+Gkz1Udu<4CMR)W5H`{4X*n{oE zmFZbK7TFCOxN*QEnCryKj18Yc-|zb438oJyp65Ks{6R+ttP9XbTp3Hpi!s<~5cQdL zU^ga|e#?$u-1FKdosD{|2iU80c4$||4wqXyJV%|dLyi3wKsn#r{I;`$>+geh$hLg}WEHo! zwsvyz+t_J7*66KY{2H;(+3TDVd)-lDFXt2A6uS)Z?XsBj1?qG2g;C-Y&!X=uo%{B) zwn%*pTl}nzE$kWv#@)I%P*mQLo*8G+wz=_Gn?rdycJ$DOT>Ff0+=2Smz2%tyJqeTU z68NjJ4c4Cyf^Bm1?K=F>Sj%W&u8&i850(YjMhEaEv~9`SrSqx&V!KUP7ozW!+U{M< zeOocd;krEKXW>`OcOE(#r-#yCWIHO!x0Byl$mgCxUG8~vwy~Ng>@~+uZ8@=+6eUA z!}@~$-N@^)sDEBFF8FJlZXGBXtFcYI)P!`15p3hZcuv|4V)QqxEn&Yx+`htczF*wG zZke_3zT zg!KR!p6%-xGoSP40A*w5HEgT4?g#9{|4u}mnwVKLG`+%|IfAa=8Q+z@1A2Q|KbVbY z`e@9A|CY{^er#>!`-oc;wPQKkcjPfPD6*3q)3LrP{ILPgz82{!Q!h#A+Sk}%J<8(TXvCX8{5%HYNc$fr5~i?Wz`xT{yx|C`5K z-^2P1>-A{b)y6}%1sB`*(uTJFeuuTAa`EX|)W7TJ&MK`l$ov)ji#j@$)*0%vw9bYU z{JW&T#~iw}%*=0BpMSVM)XrhJUSs{ijR!a; zd<1zZjjItm4q7R8xpp6RnIm>-2fJ`?`y$&4{MK*7Zk@0=ez-i$fxXNc3d&&W1mmGC zSfAl_sgE$9F6O5tZ)fczZx)x{>h8}bu6D1xpLQ~1E@!7;9gcP?@--V*7*krf ze}{VbT$y}7xu1NqEPSpB>ohx%C(3#svbcWkbd{cs_0WzAb&T|zsT=8MA@4uQ^V;qI zxON|m5nNq6*=9U6(vOeq(_Ww~)c?&Gvz6L^(SFL|?0=%ze+$OZ<=V{qTxWxh2Qhxn zAznAK9RkPMucG}j#`rFYWlWU3PWNxBN>nlmv)Qoi?hvzU^uKQ3f`kpIyyv~2mUC!%=yn^9esvp@64Jie2MXn>rbXngH6o5AHSaMw{rA3i`mxCLHlGIqAzma znPU&+bqcwNZSzmCY&I5Nw~soQi#l-ase^4#uh3`I?q%X$bEC6caolsh`f>WHd(o#9 z=|TBQOzvJTfJ#1TSmlM$6@K@J=bWOnd zq-l$YF&wLK4A(T@OY<8`zMP7>iIju-V!gU&%B{uTgK{zk1mnJ7Z0MdV)#V|tX3UqY zU3U!oD%5>7;tbnbg*Pmn_2%)tj>UFgY_aE^m|nzKV{I40SrC`!d|~aYqORA+%=0(e zD*8a8n8Vg}}f5xfgz=XPt|ym%J+JQpuMH1S2oyO4RYjjc~2oo(A|&AEUwF=SJ& zd<=2#D#1SHS>yLIFZm8)pNW&JafZ*8&CW^gDk&S=1IyvnoS1$Jd#$E?$mdBmpG!*f zStbVkwvbOZz7YSgZHfEML0uQ$e;;w4zT?)qOVc&+I~`bOWLwnOamHZp&eF6l-E8I` z>CL(@f4MGGbHT}}|?>AyzQLeo%;P?z>&~fvj>;o{ie;xOV$IaGW@Wpa%&-4|`i~F~q zqy6c=fqRZ)xzc@urcKmax^Hk`owVm0SaUIL9)8h;JZOK#`1W!0kS&{s;`Vxi^?|_O zi|-%X=6(>{-M*=_gNa=>wsTLi75jZG&%n1}3&wGbqZu1qot`Uo+F>7c+Ld+MDn~goch2mrtj`vHwCi3V{GEDPX*^kip%^($kv#V$otX$?>WT% za9;LE|Mz94i(nkk!~Z>p_-MROi}w)t`*I)r_Qdlzug%|ch`ZzYL;T;Dd*inYobLVnt>GVOTy*Z5e=5Y`>)gFes~{llf`SEIM!+uQi9j+~Hw7PhhThjr#G??m4x znFpf_xF2;v7JZldtMqGP&ef=!`vo7_e4a_&<7__1#ah0CXN_M@w(lZ>GjgyGXygD> zj%nW*b6?f!m*-z-^MAK8hfyZZDVzM98f*EgliAO{9}O;t|3z{UYgF!3EB8;3`5WdVvoE+D{_jt& zdxvozUI-6f`Zhe;f!p0v;>TUC0-yg1o-04>CFDaMn5Nr#G zp$nZ{`@TH6qPzmDFT8GLPKC^Kt<1YA6Jr7+6Y=zN#MT;)K_Qd#QueQ*B)_2?u3K%N zpMdAb+UIY^^KH^cMws-!v+2hm{cxmbzdaJyoMUdoFYySA|7r11i{G_)u*E!2!}J3z zZnU_s#ecQ9kHz$Nra#K!H!VKG;@2#$viKE?53~697I(7vIs6ulkB zV86PwFK9r_GrHDF9oG7FQiFM+_K7@;!*S8ArR9S!l&(wEqkLw4plIFEmJxkm*>Qjy zZ=!5_uy+^u6ux&2pE?t9+>{MvIud0!{W|6~8*uIHRc^2KR+pDf+&6M_lwgd`Icy{J zdGKMbQ+xsOo_#89%6=hK&PFx`+NT5+&6Qm2LGIjS%W*wocmuF;`tj~Ge)I3&%ibMYoANv ze07&0y)S3`Am7s~I$UZFO}oM|D$r8u#a+7 z{Flmc!v9e@KHOB^uUcylKJPm~ecyV3 z`v>xe&mO=|U;p#|^S2OVJGM_R=cPH$GuI8F^gHglHk>}Z)$+-T^cn8Drd|4f+;!}r z^tb+E)6^W4Ug*~8W9`!~yEL`!(_@`Y-}d{SKAZR7*Kn@Zg7Y9IPw2aL@@&X{`i`w_ z?*FdvJ{86w^@Z?KyIM!SO^4;|aG{<+xhRB^}4_$6zpG&NlyJ51z-K z++94sv)n(Q^i6Q)-FS?XhGRdNy!jrFz0dK;&-fhhNysn9e9(I>*BEjmV=d3}d5#$| zZZmy2(ygQofL(q}T8kZ5eQ1zJmg8B-^YAxc5OuP`U#9EG+x2x~Dl?_kaC9p8RAmcz|o z-j20A1z%wKYQUH7^(D#i9nqRo(g&F{P<|ObJjXSl1zhK`vWTm(=M#d@#?_D&888U&m3aM;n&hHf%)E?(-DRr=gi+U>6PZZn)gjz zV0`;?v~ySHrz$a~-5A(lVQ1jCe9Za?{Uuhg57$0Mcg6iY?%O&u-ylL6j->yM52g7& z3fGYnrtZx?yz$li#NziJJe-f~ZRcOi+i>_rH^D=I3*WFpc}JmaTpMBiGX20JjJ5^; zEZj#vwqqZzfRUfE^i$OTY>a)EGoGR>{+{CR%f1UpKbr^tFg8O>abr;DqYd;8#v0gY z|Hw#{^g!u&bmRm-^0&XHve3je+CF^wd)!x_;>GYIWgyTbIM(q$Fk1; zjeKEFUwFr3Uwi3XGv<4q+|zOE!Eex?+#D5q9v=G?%x^csmkMVl&>Xo5%)KB5K32~t|*u1A&UHbT(O^f@S(zYQSf{ZJYVqhicoqd+Fk)eUe@dbRMkyJ z-sZrTejT}Y(2Lh>>^gj4N4K8A_Rq56w@^3m8;(E8{fX@z_{S&{&(WIp4E}Y?pNMDO zp7ItGBfHlf56;zDxiyc;$SY+Q?_c@f>#T+zFTyp8XKjr2`CZ_bpsoTwSj*UkdyVj? z$2XP6${-En?(h2Vf9`Rh`~QF*-%s6pNyYL%&VA-1)Uf|GiW&4tq$^#c;CUy*f5J72 z@3pZ*aU57qd$LWz|4ko;UoYaN`S%vd-H+c6&KK-G^UX2T>963E#j(QQU*kFvd}487 z3~Kk)7CK!luNQhx_nqwcsNSm?oqmev&5*`JES$%D@EUn?ec6{$CKGeeuhsAx@0I#v z9()@B*o`w|j77`6^el3a#hAeU=orQ<@LvVbnB?UD2D)sUHF@VataLr`o(=R%cb2Ny zC$50J{rSwa1Ke*r|9PY^re}G1{;9~Wm;3QCw>oUjsF^xkfpV@6rFT@rE{H2;O&0qt z{{!8`x$&^Uc(f0mT{Y+a@lG#zVdF8zkhd`(9JAy4PF}k__6?=+p{t-=9q=5ud&$wauvdw1 z*0f~!4EAk!{W!0=H#8q*oE}QQCeP=vPe|_XkoPD^0GXX?t<~VvvJP&Df$p{lyxDV!5$93Uo{TzUe4p(f%6o|H{T(|^Iee^=R=Oj zwZ=w!@_oKq_G{y0pI8Q)6AAx>+@8SqE9)pj-j@ufrmx=z6e`nRy;b5fEaR6=I zKzXQ-V<`t|F)n|Ndxn$~vc5L0#Md?)>+3Y%-#HumpU&5CeNu_9{T*qY9h|T2#6n)&=H%Z&WrhqOg)`|{$p?UnS${97l5bHK1) zqm}RXiQ)7QmLAh*FZnViX4;h zUJm!Tzn!}~Xq!o-iQv6F&l{7z0OzP&I{Iv|?@)A3B3(wNN3q3i+ zHD3RV*T`EV?7%tVcFCXdYj7>(@P01qn)#)j_Ggb_ZS1lC{5|wxasHl_{Jl_;zZc8o z&%}uTAb*u@@@KyZim|q_#eL>IlE99L4Q}4|Gu9>S%K07JGwYDogKQl>$NRR=E8IuB zjq?6|zTY+2?=bDeIK++jp4fyj!D`e&UpIEHs_VruAUHF>1mBJIh~Hmg9B6!Xx!>0q z|A?KM9t0U?O`$KpTNkQ3yO(%T$&Ky?`C@VKFbD~?3etxv;8KGJA?lp>po=s{|DWD z%Ia1daX!njALp{Bu30z8|6;^kb>y2;0W3={onlULbe0QHMYe% z<4d#!+fWzU#ykLiPLYvmDBfY ztFO>^AYG)3FH7e!Mg9r9mGxWUoloicV6)x@`!jE>Kd!HF9oE@h?dZ-RxUz(hPv1uP zrYWA$yp?`8&Bd=8oo|iwOdsLCIkW*Xa!tYc4F26cVyELKVCR#F-xyC<)v@p3Hz*kg z$6*XgUyWc4YHc?K{&j7V{SDI2L0Zg*&DxI3N8`xi@l_0IKli39i~kOf+S&LkV;bWu ze;H%>+a|`XD9nkB-CP@drlg;I#gr ztey8@O}o?a8+z~@>Uze+%tG7okT>{r%T4X^za##4hE4E1za0pBc4ygGj>aaxkDVLF z_zBni9;^FyBITK+A>XWIJNBgl*2W;WRIc<~yedzNjqah&xN8%MfwT*JA?VE9cx z*pqX?p}r5zV;i77y|L*#d1iq;#>l6$%^>|TNYDDHLOlBt?lT_Ez%xEvzgAJ)?*~4@y8aMt zc7ML`?g8$%U280sZ~9~CapOl5i|F(4G4r=5cn@pS#_w|YJCQef54tosmv8t!HKEbG zANuO)h+loWg}$n|cL_#(E4q*PR)mi#!M#fGk;S;D7vLFI{|sM$pC`RX52*6siP^foc-cj(T=|d&Tm8hJgKxT zn=v}tb7?y*N{9Py{?9rn+um&&6BkbNedU1ZMir;qGso{YaHfHM@#vuM@OiBJa^0)I z*KnV-<{0~4kF8JaVY|76iK=%P{<^R(inK4=G1(x<`vUyX#LuF$*2QtkKQQa^utP!iEmk(lN4xm4-F!Ou zE`_s$u_MNUv?IoV^&Wi|<0^OE3;l@k>n1OK=TY##<#xUW`D=iUoM|}QzLfr!T<35M zWisO`jFZfG$RA_Y^Ka&UX!ofu#XDDDz<(nj=|U?)=DV3+0(YMB_26;ejbE#g&uZk8 z-{y1Wz6b5u$ia9qltf$QZv)G{!biLt`<(B_kQ@sc z8{|UiKQO;2Kfmd7KFXYjfAC(Y0dpdrE5iAfJmxHhi(oDS+kBRLeMpzby&ZUtb{lE> z!m2uF`_gZ8B;kX4_UCmy%Y)|!@a!GiKgJ^UukqTg`?+s+*nLXz9nN#<2Rt9bdOdz8 z%DDj?$H9I5y74$(X1{@PYc2A?aWU_m$M_4M^BjjXXIbu2+DGQi+{59X4b#I8*n>h` zgO64?e?%V0(H{?n-#S03ILG>{%_r~seS+JI4A%KMhUEB>dELdBjdHSV%r|vXW+;L& zHMrlP-7+sVCHW**3yx`CV64C|&)vBEgeRe0S{?LZKQHb~M}1+;scU5BSiYe)ymtP+){J3UH(on`Z;Wf~+%rSDKK=Kp1wOUFrxy6s z0-svoQww}*fln>)sRcf@z^4}Y)B>Mc;8P3y|I7mJjEeh)gI5zuSMv-i)`+;)*b&$M z8jgG4q0OFoec?R+IDhSiYeHP#xs>1IugBa_lJU@Z; ziS$WWA9U+4HC$H%cg)e?BKS@Sez~uHKi9{=A7Oc}n=XVLuD5UviR(n;aE7CFjm@lG z;k!+Iwo;z`wtd#@S&xJath@32#!)XZ|Hx;uBHakgbY_1!79Z`&*)y)YT({j{*D>cl z%sytg?s}v*=dvM#&(GrXw%m=-^DT$*ezDnO$G-X;ay(~%>zjD(Y%?C~P{2jD0r!1y zrp%DX^0VCfPFe%j$G8?oc?+y;vqz6-e*pY0)_iv0S)57O#}ZCE#o zaZdqj)S;e`a|HMN{dGOVV;!n-T=8B&405Ku?DkmP9(vK*dEhg4?Ho45`*k=&0^e}g zXa6BsJAdwQ*aB;~+&gCdwg9_)$=bQeC)XWyjc^{<2r0j|UHbU9P^XZy1iuULpX+H{ zb8~Cww}4A3U$S-{f}CpP)2^KxeXq3af9)LSs@7Jo9g_}WzmV(d22VaY9XdyF?WlBU zl8-}NYsb2Ii2JBW{~N61m9DLu@+1#R@4}fEx3+#GY{Ip5-g9f~Yq1x`wROWq{I&I2 z*c;&5dME5-y0!J1O)P_1TQ_xcptbdnAh)oe4tq|<^YopEu&4MZwwuCQqgz|I--F}X zO2h_tK9b*(cYb8nf6ucqgn4FrUJ*0zAfL(lM;kKr4}X2`NFTd)b1?S{Y`dxEwX~Zz zkk+-ETE5=_-)}O{BQF(*aj0+VI`w@#hZvTFKONYxMobujR!v-YoyqNH!%&@ z6>LuUG)NTLzreFo}GxYFgCGVh%aoX^BCXAGv2_b*{;m@;m-Ck z)6~Lu3*XcSPv0(le;#?`_v83YZxd&ruM+zH!nNY@p>zgie1_M3@ppOneOv#$gsI=g z^NQOn{3BR9M*3eMJ?nD}>ho);Pk+DEeG4jhpNo46MfJz?J&4D7ey^wjcEOo`_9bSo z0e)iI8*DIudto)WI{~^ML_Jlp7TDG76PSG)_Lb}t z?0Iib_XZey(4H%rk4&3=4B7(EpN8kT-&6K`Pe|ip8f|Cd8QO{2tF(JIpT|BFaj@^% zcE6OddJFUfX@YM-Xd84kG3^h&%KBry(B6#4+(R+#4*O46?m|2Pc5Ttbm74ZuAMc14 zktf{yI%2<(>Gnh5Pp84QrtaZW_am-XdC6{+aWT>&?gaIM_Mr7r3%@M9a|+p0ke+^d zC(Zzv{eQ^#oaJr@_c-%V5gO$CYuk79>94dY{pcopo+j9H4)&xqT{CQ0JO&awqCU#n zkA8x-z`yZh;?iK$Df>6_JWsb8dsKFua1vt*+X>RJ4;)R5G>u5ZIDHzhi!0Tz2W?)F zYoCsvhXui*=g6}aEzrRM^>JVn?>!QII;ZoJ1>huFyR5@TsC+5yKtxHeoC zafQ!(2hY667zMp&AjTKPDEPv@&lrT#qu3|F7rLU}PeZ*I*SUYbjpN#)`nkmVH+&$+ zHq{sPfOh0D_T$>bsp;0=QCGJc-tH9wF9mjIc}L>f*`S8~3ZDCxNl&?WXK+Vw-{U)V z;9gLUb^~{CFFS_AHTMn8xp3qux7UAO<4Fzd$oR&-moW|Yyf(=g13&N@4o<(1y+g(Y zb9U5=72c0{miCAIg`&TltOlEo`3N12Jm4AAFQIH5P_}1TSCIe22UZWx<+FY%i|y)Z z?la=|4Yo=8H2lomhu@mMkA6X)LVO`#%jf(whCA&I$$ytK3i)^Pt8H6!by|AvF9vz5 ze$SZapVM<^>k9K5#x%6qkhjpBdl?6Pw4r-tR&Xv4oweW%%SaI*TpzrR5X6Ru(%&f zqOBLsqav@hcs3Y6u<6ul;w{O8p%9H@;ep z7!isfuETH5bw6+P9DZvDZGe8o?+ks$`5)4t{>*b8+9`eOezd3Gtg-c9=6yoja%3W_<)Q zZQ9Q>?V^3;&Gie+3;b=ZS94hURw=g!ee|(Kh5KF7JeTBb;O>WLU)l;~^JH9EkQ?io z{+2wqfNg>4`}wwrLH^0G!QOwMZNbJI+iiQ*PlIm(jrMKg)^>vN4`m?M`?9QEDXSam zr1%;8Eh3Jq;8U?O?;E*zwuyZLe9nz8Za3`~&ke%8a#^ztL&EOv89m9SC*VB=1IIf$Z%RGyF7u#ny zgRkQAg|TVdzgI+?w;+ZU+qbw*uHVmnj#*K^Q}~^oY3-fAySnw~2mIR{?kuR+HMwpJ z#*6;9Te{bM&-k)`=JV&ApP|hD_gUQetzh0)RL^$K$Nam#{W??Es9W^&Kcjsx7HC}U z&+jUgzX~?qpZp`9-}im`3i|_=|CNJEeI?M-2%BJ>xo#U`ftx3}*y*8f z_hud$ya!p)@wGj3JpYUz|HhqZ&z||)kWHxnw@c&0xR8lQtnUW;+l8ou`4wq=kK*p! zg??OSAC!cx9j@TGm+{o=md+!s=@-yfd=Jl$V+2fx08vrV zzy-ai1fqg~3^Iv9Xb2b)!4#lT5p4*dX;9)-8AK!uiV7kG5Cnv(ZstK`wjrV4-+!IG z>g;psRCOnC@B6*qLqAVHbNu5SImC^=ekxttkMTAIy(n_ z>>oG~dMcMT1KFBkayUgi>eRP1!hQ8{>Ks08%H~g(j~t`3GF8qyeb8{q=09Z)#Q8Z@ z^>ZL~XnXzE5id5{&E{h0eEmJtuAoqcW2R82X-o+?{@gOq5gK%H$7v_e`0gDmA+WtVXesJ zDVk4KV;HLmj1STF?P^<4Kfu9Rn&EsA`tK-}ZmAjH%RRfmQ}NFAPP`TVrP2nKFX2yA zUIo4%C_lq>w|GwdAMqP#wYc25rP1nI;CS409zMKSKJt3m8F*5PXx|~-4>Y@c!`AeC z92?-aFyN7)XE*e$^Q&V6gW-q3;Qfmy_b5jp`veZ(@n=gqkC&XNz35%m`=Nq~@)Ga! zOeIdw$U4Qgqz}oXa_v8L{Ld{N$-DlRhgbhK;o9Z8C)I8^5;JQ54%H z??kIVn=hi@e^kzia<>(Cao=DcIyN*K-pQEO&uqOX9c)Ku^6U!rL%GY(4czNmcBU8k zkS#e5J$JcTBgoBqL2lMDn=!0%+H=BXL}d*tA6{AAe%mW2QNB+s%h6dRC0heYaKAvf z!?QN!>I?AwRu13qwZM0QXzYCz;Cy@z=hF&set(4XUu83(#oa--?$j^+elXztS1TW0 z`HTIwS9YfSZNeFTZ^|6rVsPrOY5GU*mA>2$9BT9&R=H5JNcrcUN@@LzFz%J~t2w!3 zzJ}erk$dUCVlKCxvbPt#p7=@gWo{=o<$bmdHRmqfVmcu|x9N<;hVsm82Rb7iA?K2; zGv(x3_OHw3xogA9a=lXpEMJu0L7o&V%;3FryN2%e4mH2Bqc3TFi}A}lme$kw<*Rt7 zQO~O7%01|X#}KBwq5OlC%hzLD{$=lhAcGSXgQDX_c4L;?Vfvh+K51)b*+BD8aUQV7 zt9{#G=pWb}edFHFQw!t$I)bCRRw9RjZ_5~tBWCpL9ifc^9C4nmDme~)Z5+n8_b%4y zyt-7{#LjuCK|imvj@RK`H@D-}17!!`?}5DIBbb4AIC3falp=d8{Ds3uB@dx~hw2BN zQM;dvPVO&#GNo^)>@;=0FMfyyy9Zqp+~`~q1GM#QKwtSW#e0n@SdD)4Gwg}r-vZvZ zF=oCU_A0>{e!!C{o1aiFg?Q;g(*^t*wkgWHEiQF#RJoG) zBNyu|E|)eo+eh$ddUb?k7Mvx^7jPzDX;{}%&DXiNcZfG%hkOg~q3KM!4!v(Hyxt9s zs3%+fS;b7DOm)Uc#+0K9Wn3>F^RKoFzM)>WKkdj(Uafh>e$ZWZU>A5|^IUj$`!d%b z)`7vZm-ieM8A3HT_a&t$z(Hu-M)zPLTQ?f7tJ!$e zmELUX*o%IcSGMV znUO8pD)5D0)f2x@PHflWQg!3XZF--cesQr)Q`#}J7!mj z-7Mdy`m&`VmYZ5C9n!ISkoTyZ@sE`LpbLvfl{VoVbelIW9@V)?f;+NX10J1C;zfd|)+!}l{&ZYK5> z&1=N*8si!5HQ`$Q_A-}{-#;Edqw6a3j&!UfZungo%XId}a%FGf!LP*)1~cbugGY^+ zK<#~A@;Umf_2C22V~;Q920u4Xyb)b_A0FP-*Iabww#waR*Wg9D6TJvLwlkrS(+Af` za1yMtgP+%$1-jSeaX$D?Q~rK#d*#a4_~m}-W68Pg;;;2DK6fT^(+%H@@7&8~a)9QB z>hDnR&*7jyy}KveyTN&2KXjgFlD#T@T#5d;Ue4k^KaZ#eJ85!99}gMbM`+%{yLkz3 z?~BWpBxQ<6)K~Qo=1O}2F z=Mj~QbRS?jQ+0XfbA&F@CEOzqQ>06x=Vv0kis;$Fo|pd$bxM)%>`;G)By&o&8-Q-M zUnPwHCC2|q)OS}zr!NH9Z0p=J|-q@8f&=e_yWuYvbqie|6@* zy|OL!53Bdj{1-YNT)$tf@-ymx!SAtc=RG>G-~hjeFBfO}8&SC+z6ZbaGxx(PU!(t- z_4dOmYcPI&Z4mfJ#PH+8j+FhLOWeS?yVTpQR+$&~3m@jj_l$c|e2)*=k8$NQj*rXX z^D*%~{5~>s-(Kk_9!dFyk9j7(U$yf2OnuJ(itq8ipNa3mXD8qw_)g>$dd>i^^i2HK zDxZk!gV#snd+_>De2+fu8sDQ=x3OPSYa8-^Kfj)NqMb|8xoDt$^@i`^YE3}%scEby zXLIe@b*~!dvAUkh=GKTGWlJ;%lRuJQ(6xMARcjo&-a7Jk+?Tmmx$Q3q=dgBbAED~f z=K}eDU6Y47*RQc>6~6{f<=kb5Hr@aqOwL``@6`3?#MrDyX>ZVU?%n2f%QjQ?Db<-k z{RzofC#X+dGuH9Crp|8E;XC3R8VnjM>_K>4^LmXnk=QXe*4EKjonfpGs7_eND|K?7 zFLQPEFF0+jM>rCLif*&iCfv(z@9ntyb9_aaxx(j|C+N(icpvjwhB^M*Lzpi+l?lfS{%0s$lBAGdAkmrM)?V~eo=Ey%t z{yNH)ulRKr>y3)rtekUr_^wVfIJCy2dNuGkGqm?LoOoS3t~Ym(dh$CZoe?-|^NQAv z{s1iO$^S(>FYktaR;Meeb2@%0hH;>Mt;{;nOImwFUuwuiFERyRZm+*na9vm#UvKIGq%75niS+Zs2Qu@(;7wJT~t9$8o%n1}5#qHYm&b8~J_dBUSWOUHU0Un5GY}tcx9~9+=2T75sGVbCp>+e5-4>v3`=&?VO#|tu6rW1+)q0Tv;rtd&Q6; zUnn|tsqaH5*ID|CSG`Wi8#b*I)?cc7Mr}L~8O7n<^k16+&4}%%l6O4lGueAvhtZhW z_8*{M#@kSrc&34`7wikX(5-iOYz*!G1vITb9cy=B#r?pYXCCWq3(%cCC zd@|yXU}Rr(viFc@<_jYo*)zyltaCf>->7p-mcTRG*&G#qzDGK-$u#Bw@S1+Bo0Qp) zz#JL)OC9(&`7m8$U-8>Bw~)U$+;~yZ+U~$>FSaYI7SQZ~*^M+i3YyiRnc+QxbwTpc9jvj~+zVPg%s1a0-co?QG>d&n1?#lv zxarv?tfjc_4F>l{z}>);K%c5;Dtc(VC`X|_v2$i`#5d>RuQZ2(_UMxFucEl+wR8@u zy+B*EK_}|4&jkG^#|e!u6^;wTeqZFp-a8R5!m~)|7b;$hct28d^%LX= zd8__}emYB)SMG@Hk?>Nve1qx$$FtFM(K)6`+4`e?po8Vag4`aL!&zqr$?q1yDSZ|V z?kPia(Ez(6yxLfY8yE<(9?C8pmBs0A$|+t7PFh2QW|GNH$-||<73A0C89Gh^7ukG& zmiUXdp0APzv}^GFm}oBDRDbR5mCIxNMdtzKrAqa6=UEzyzBg4p`u;oq-1-_fqOybf zqEE}844>BjEU+5=sDHK2@a5Sua&D$8;HiFAZvx|$tfdj#Y#+Z**Ui|a_O7LST^H7u z@O^74Pg&wz+Ai!Bu}itMExv73&xTry6HVZ`&V6z{=n~IWE}jc#UANLBXmVFrACRs~ z<^_MSDduCxh)&d-6^*k*_EoZ&_cNxOiQT(i^ii%t^@1Of92EKSj-b=C*l!riHMY5Z|*VWNA})khy|8I1oU@r7%(Szm3q-i>k@5Pd-ty z7W>)WBN~0iqrZdaz*40T;5nld{D$bD`!c>&vT>7W#qV&9LtV4Wz;&POa*&tJ4E{!0 ztjJw*Evl@s-Bc3b7= zPCI=^D11l4#tOPOLHrEkSKXiH@~r`vrNIU+tsci1d!kFnB{Du%YZt($d*$nT+ecJ7 zhw;84aD4u^sVx?MF&=G(2QjVlfcXDmu5B+deVN=c)+5O6ByFjWB_=j zYk6B}atZDCh-hDA<7df_&`0%3=y@gIfTOSKaN-iKMTdIa4Bq`=9PzF@*p#&upInpZ z+Eab-`xdmb|yq*DJRr{=cjk zlJ?1Z+=$ATnKzi;_l>NtE8f9esF(Zd>@||Ogjk_m-Nxp>f4&A9`1ny=E4{2zZ&c@a zTf4ODuJNXCpRzHupN#iX!kXVzj8WrWWAx5mlX2R54#W=Vx;lGgI_?ts;MrvwmuIg_ z-f6ci$o+$wH_^wxt$bwVWh)<1xtH>Rd8|zVYjqC%ofB-IzRNc+tX=6jZ7ueqY%AsJ zxEEZ$o+>;_OD0r)ijC=|TrgOD(Il*Eod#^R0QYUmb#Q%GfODyS>GO7e2iloy7tpR# zxmMsCrT7Ydt?BflAE(!$f{kYv8oq1FrY$Y6(lxV}@sPDj^=5FS{+6YZ)%EIw@SIYf5$mSmhYd>q=? zIFr+H65UP483T-0izcCe^<4utjU_)Y)^uh~ucHLl0Gbo++;)`Qm#-8}{Y_J;ov*c)jvm!;9r% zR)Tx#E9RAui?+%G>>oB7%`4!oV&~ym_`3oPtBj-dm^ysM_qLur3_kL3z-aPLzjrZ) z!HjKE*qQLhmOTP0%Cm@3Q#=_KP|s|LXYx+gn4~C6t-JKDD%{ zIx@r|z%oGpMRb1--RV`_D;->tz_gy|2(1(Y_u>a+4>gv2o74KNh}ORfcHlR}2CAdI zFKWB9eyu&QkDS(jjQADx@wKRrg`tl{p^r&w3qA)k?oHwiwD}C}Ym#f|vCXTja}o1F z>uel^4$JS9{QY_AA1a$DJH)(F`B37ArHXs=^$v*Y-3(t;PqIE)aMRBzz_yos>JJb_%3Ji{w?%d#=5=yzV?n8A9N=3b<_IWDciZ!{*?AgE!m>9 z*A~nrwfF2L^jrKpA9!DAU%%%az^w8YRF0gS@aVvTt#f79kn>Z#Sg(gn--P~b7MIcX zCpCEC``CCUKeyjH$^KDqtMBsN_8aQ`GSSa5!1ruBI-%SPG5TEiwbAl{4ZXf>%_+!1 zX8eV1_HD;Z8T|e@{N6YN6K4?&5vE0g={mu*nyp#9`msbnj+zinXx+ zOy@z#F7u5M%bBhT40A~*w^&ROU&%dSTeWm`@CCl7@gZuU> zJg;I)@2B1Udia8k9r`{xzNgP4xQ8am*y2BZeA@4U?I50ilKZ+W zQ8t^htlW&KJjr@vrVN?e3Ej(-(SN_?3zK&f#dGmPdb0y#h<_W2pZBnS=rKcSqS5+b zeCJ=_@q5{$Ejs;~>vu+QejvsR+4=+U)MW2r}b z7yflM&+lx6Z)f1U7?_R?@LkAtef++*${qOl`u&Y<_N|rrJ-Ds~EaKhAop;dc8N~~f zN#0F1fO%M`w;N?g3KnRleGe~<(i*q+KCG4bW{B3wYoi3O?Q5_zgKS^J=B4_+27K=L z8tpfQUz(q~4Xkb6xSqZjW2R@_WY@~C$BwFfx;7o1qriBzO@IS<`jR~sDJ=U0SlBC3 zit>79!+}BXh{%TTivG*?yB;f65e-Wr4lXHI&|a>zLmNBaWL)^ZE$t7GkKqvfWj<~Q?Ig0B8`Ilc6jN;X)&?iH~ zeX=y{B356|<(7WuBky%N00!B!`aSTmwT};mx!9in<#->#_ls{yD?3!Im&m$g^k16|J?-8ZsyN#S1AsOMl zp8nCCafV+#o7`|e@1yJ6dj0xN)aKjrza91!zF%-6^9uT%t@vsJWfMA?Be9(KArY8T;cZ=I;%Utx1j`rn4{9NKp>x5D2O zFFPF+PisBH_ljt4rkGTAPJFyXb_hFgDE%&w3{aNrFY=Jy1?3DW3 zHS}#~Aky~3-0OTW-Z`t>u65GHjv35Fc5Ey>P3>6rEX)k9Qxje32Dee*Ixva#vdR4K z0A6#;m7fn_YxvbW?nzD}k)J8hyE=T8MXIxG9j<4GHA~Ia(E-WlDP_@wYw2kpbZIYF zKA?8A=^fW;-(}oD{)qc8!+-tiooCfMLchazT_oG1cOM+)+Eks9A-Nv*l)ihq1i4nc zX!=9@zY7**`3m$c(W$b%)2uS|d-P(;@4r%G5Z^FINbF1F*^lC-j~Uw(?d$j}`x?y- z!-xD{t|yrDmPcS;81D)5Wt>MOeWl&ZXLEdOqN4^k^>?Gb`k4#NKL_RnR@cw;oXS?P zUKC)xmwo5rMX7`DW5Ji51*hyQ^pz|LpMR(h<8IBkVXk2E)eD^QT%i*={ie~-ztiF{ zWo^Pv`1fWy9q;8j%53=Z2tw=-V3)X^)Fn&J8$Qe`Y--* zssECNrT(A%q}1O%p=+lLCU)&~;iRse7EbQk>7pIFcDi_K*G`vA@7n1nGrD$)d42(L zJvM)7H+HtPBl`@N?Q&=7=@afO|MrNpYqQ7PGBA70Q(e$vV0z~rpFa3_AwJ*&VC~+4cN#cIKG25 z_|vaa-TRGf2=eLi=_$sS(LFaIyFPXiogPR2n(Cfp3EKO->;-g6am)nhQW9UVV?M7@ znS4tkOHS{s?NS@X@UrZv^x+ zKTBWt2?yHUt6yyU0sNksj59vr)$c=m*T}04vE5C1^}QMWQ-{E-3$Y`jQzNe$$D0I= zn~t~RjQ(*$81L&VFy2S%OQ-n!3vBwrxkvmp3$#-*kJU06+bpq`J92?G{x`U z8U1sHFy4br$III0$60eqd{eRQeq@m6y@Nb|XprX*4D$T%gFOFR?z#Ig#Rkxj+-p2% z$l`vw;!k{q>gjiV$rbfeTb`}|`G$N#_PJtqi(BaHu+aBavTZH;-1NU&Kfe$B1RLi( zx8zgbAkSsH)sO8_;kU$n2YX{m%ch@`_}TUzJr_OoyXzo6{b0@Ispqu&Lj#_vAM}`| zsV~F_uEsuai{*oVyO*^W_gAyE?+70wI8SZ^5B$rGf|Ig?^o%xZ5i_~3s^P2RTy`hE z@JZ;L#{KS#QvO+fiCE|+`u!vSMicN8jyprEG3>e09^zpQYdYCjMmQ?Rr&wiIWWeX` zXES~r&pb*jD!C|%W8yij^@YDbi~1fDPleXmIc$oD;1zFwgDj_VoW_q0F*$IyGru+1 zh|fi%NwRl>Es726xsov77Jk!y0Zo}NDSp?OZnO042lQbv9na2y4thRI=h$-ZdYSD% zi^F}yrz!l|XPYUuYoSw{4Dx&@vxqFystc8#97?Xmb7`(yK^C^zM6 zInCng4+nUfjU^g>G#W3?I|v^=)9;@AwxZA8gFGLqt@uzF@2d^;%j$&WAs^qXZLAN5 zJN5p7UpCpZch^0>PvzHbNh!qC&E`LCtc!V_qWRCGl3irInGDJvcpm4Sz*?Ng$;##a zT9bhO&G(>ov$=c<0UQ#j+FU*0*8Y zA{d3&C!%Lf#{s6PTBi#8-;2gmUxNKVqyF5!=z9jvH=8eEUu?b<+E}h{A@i6UOBIuM z<%jSK-liA(l9{Jq`wuZ*>pWx6(d3tVG$I06O8PvseRD9}mR4gj`{Lj%b z)pyq!(?!W9@qy%i3G?DU(Nkr}P%l1I^wj>s>x6qKH+pbgCcieEd9=#4c3Q8`{a~@N z`lp{ejK1`v{FL{fjM>)nHFz4^ky!7oF7!GIxKf?Z=*I2!^9mw8Tpu_sXTo^z&^7DZ zHS|%r(nBQ6%)=R9xdUroq?2Dy_{%q`5}k}?x0QX%$#M!`Bx}zw_px<$8)U7K&+-Maug}x*OW^G^bX*v>aE)pxw(-cQKgU^dq5D6b%hJpKpfQ%e;+s6o z8CT&y;rpnbQ!@U|^|TnT&qiatQP?k`FUghDB2Opj=c0n~%(ijvgWIg8a5VU_!q~ug z-7Gfv1TnnJW>IYL(B-l{`Pd+}KXo32HK+U7Ytf5MOX9szJ;#d%_4ZEt=5S{G9P)Vr z?X@N&I<OA$; zG+xc(d1e@QFg(6Xy;gK+j%Ribe|i{iy$4ntPqmHlG#(8R&(+|+_}TaK{J2?qOjmxZ z#r$n^=C|snj7+tv_q8VZ8rK=qf8t4dkBPNZ_NzAfCdSFfHxB_nu?M~>$%&aQ8pnQ7 za_erNJYJ3S{E~-Lpr7dg_Q2kET9Cf))TNxfzAe%DzRFVRF7;1rRbSr>pw3!)CkX$m z@7zfznLi)dp*>+*=-B_rw&E z*JQuPs2&G4@zheXw{hi&Szc9CJh=+Y{r~R(cysK#}-2F4NebKjn68xL> zFIq7Nu|2GN4{?lnO~#1xp2GJd^yhOs?M;#G81me%b4BOK#rm-w>ZOUz`Jo=L(i9QH+YMJcxE?$DpfV^1QP2&&r86)wkJDbiQb(D}1K~d64Xv z^u8wV{}s)XzGF1>7~g$vMi$ckV_wOBGdJH~b5vwgaQiq#yqeR5S54)CzLnSd&=C8d zo$G%^_0;RTkGJ@wAU_xTBk@;!{p6)Ba>CS+|9u~P$i~6xT+;Wh$p7ZoVzlQ&vY}@d z-;o=gCY~~`%gUBIyQJxw%;3InG&GKV-_xQwWBxA0_(i_28QA;`r`&~9bz zM9&b%c%aD`c{}lE@OC?KGuNW=kbTt~uoG^RS0oR4zvNx=m*fvCx{mXZhr_!#4><{Z zvhtU;Q+0WwpApctRo!cmztomx`}tXjxsMy9k5_=d)fhvaC%+^a0OoxdH``xp8|HF) zwRCO>a=LpH8EU2n#*YwFbq{fjcQqL!FQ?z7KbO;UxLzSS?OL&z%IzYyCObEIe9oQB z0ngxh;kndb2CghWg1w7k=2h6!?ekHSKjw|USI!AP7VOz`Cu9HgzTA(YO|nmIRL>{L zg)QN|IK3}d(iu4H1(dHmK)DO-V7#aJ3G)l1doJf$V#gYNoOm@uIdJ@&uJ30a%lzEt zsc8(Awbx-EMCu#e_ud%x1R_(bDu>Oz*=g+Q?mD-V`)z-h$f{s3^2;S~77m6l^*g99 z{7wXiMLoW6!12iHpY}8hhwU5apRM=qL7q3$zcPDGy6-)GY1jEzJ-_7ie>~rH?-S2= zoKQM1@gK?lld%DY|9YZWCq3UHA7gUNukRUE+t?S4Q(rvi+$7WQB46bF`MR9hQQG)= z4s_nj_jA}d@a9*%#~+U~I*e1dr?i(nwe#D!ejCq?AGE!=-gZ=vVB3~wlJzWX*>|;+ z>vw)zu6Sa}*6oZ2Itz$?F8pbD$00g*tULJsQfG4Z>nf7xdF_jAzl`Q!^M)<5_d;1m z_!v6k@J^Q=@vOELeNP~t$8+JUac&jP*WRZyv5?<7 zAGnVF+EwIKV!!tOhO_TeJ@p*F`gd)tP+@#Oh$!yYGd6W?o?d{@JBGQB66O;5+3oZ9pWjAyigUY4Vd&t?lY z{bj|m?Fz6CosE!h9dkO_?&e1O4Uo80IF&I14R8xzGcA=uZDuK|X(ARqEohCAbNIS)Nk`)M%{!5W-Axvf_s5I&J0PPCaj@Ir zmx)~rC*ZoGi5(8}h*Xw5o}|s~wDH*Vaa~7yH3qnk_G(!BqP-fMB(hxJtKm7uhH*oV z$LB}?)_Cwm@H>5q@;mKyUGa6|%=|0GE6yQxAQN*-m4}8n#*^aN5cU(@O@BT=S}OXi z$UMHAa}NsgKCul_e<{CHz3_NLGJS&1RhCTS>o&wL>o+UMS%0k@k>vJL!OQw!DV!P8 zY@U6M&IX}=v*+LCdHO7kMIFZA?^C{bJldDcU+~?xmpi7|`+WaRE>SXY7O+_iNgeGK zO3s{V>p7G1`aB0b*JXaD`{&t{tT=V znzo|dRP4yX#($@ypFdC-huK)o;=O-96TyS7$M8tkKb{$*?m9qVvxYFb8lG#6TWEk(vLB^YTa~_@`=h6HR9y5p@Jr5@ObUc04-#4MWkNf((pZlMx9oDkcN*cQ1RDk^hd z8Lu8d`Ubv-&V03GGe zI};l}<>l5kabzJc)3IE>T^{1G#5+6h82Vp*QHX`if5<U$lZaU|zq5qSX z0zW>ZO6^Wzhhtl??2Df9L46_jP=>4!A)?`$5{NC+BuDSr{>m5 z$$zcmK9zpgpx?TWrT^3DUo>OS&gjoWH}k#py9WKLd=_PAKuhr|p{JjnwBqzU1l(eJ zKE&8g&!vI`cn)tt&)+d;cY6Mv`a_}To`IgXvDZxfe~5N@dafSP^ER$mgq}LjC8p>0 z!Xwag-H4u7(XYzaplos>JtKX}$*1uee*YR9*o(|~Z22W@o8oboi$|FA)_n-|FSfXR zRL`@_6JuR)dlJvH-Cwvavll-7SwBNTI(t0!RQAkeFR!19r7%Yxd%4+ zVA^S)oS&E0EY><2+Z5Z>ybW(W2d*(5u9nGFu|{roD;En3&ykWL;?eQ^I_=*kn@HKi zAvf)P)Fx(Q%8ZSozH-@;gKxr2wpZ84#pd84n#D4ar(21>;P-lySa-14ApSOi_AcVjG=}E;qMPpR8wx7l zE@`_(LEEb03U50r+qM-ShXb?AK#}|oRwh`f({Pp)DMRcs^3z)xa?kL+}d8?os37kIn&&Eh=4#KxQEsn-!IV|~SFJ0LD*$oSuKO2di zYS!nsu$j%CeW}H>2V0DHPBfm=Q#8uU-~V=5o}Oj=M=WDSuzIew!S;k0r#cQ<7>E8N z3)l4&i0pu_<~sGoAA%w5qfB+G(A>_zq<@_oWwwpq#8xG_ z*kU-da(7)$7rc$^s;%$pSNoCm8}zdke~NTKa|*3@_*}_-sbj~x(@s9#n0HT$9Ow_c{z9mf061yGN)2*(0!V0 zO)Zxjd>I@(H|X_>a)Zm@bDXy;h9`-A;@Crd+x`G-VLQIoWCh&cjm+8}0ntUW1@0yz zl9%XOa_4c!@;Qmm_q?&gYk0Z8XB_owxj6dSKsFq?wR20ApQCL53n)Xb`;co}hYT`% zlwyGiC0lEiJe;g^n`u*VxNi*m0`L}G@g0q$_XKGB8|bfmx_w`WdTZg|>-qH%&lH{G`Mo+nJcpLm8~J_B_gx-Z@hdN{ z7N^3an_ahoGd@FhIpulz%**0$p}UWrfA&mw`m7kPEH2N$uS5=__dtf1GG~f-KZ1+v zhCIIfcL($^`Qv&V*F%W`_Qs~Y(HLM8#u8j9JzDFg#^amS39NHV73Fn?qNAhgGU4`W zka6f+bAeTd*#B$N8)QG-Pm|@7@yOu@2kCPb?`-{lQ#Yka_8FT>GBk7k{%_d*hw5V| zbd1MNWh>COAeOp6*FKhiTTg;EvQN`kQ;6T~Yceaaqq>SUu$gtgypZ(@?yusR*-GlIO-@?AMmU*XyS>DoE2rn*NYVWDBX!yJb>N}t z#t(<68}F|7@4ABBGIu6elPs5~E@#P(xD26?A1t1=QecHfTL^|Kyn?Wj|m1Z=cDA+&oNc|VOaH>&@P z*N?{eR+Dj#iP}Bn?V@o`4DC*&Uc9!6ejZs>E&#mlpqW6YYv-b`u>xkbu zLhoqOIiLt{L0nW%%KAA0xV3Ux{CFIjc?0=4z_Y{O!==Qpp-jJ6v-2OQ^JB+@wvvJF0ADY#2*&HUA5GjQTluk&n;StqJBjg)T!GSbT2+nT>97@^l^(Y z&ZGMN#6tWhW6w|-c0%LrqOrKvv)#EKDH{R|hpLYJD%W4sb+lJy8uyZ2>AB`T&WGB> z#{D*j8y|eXO_O;Fe)?5n3&WZ5r2kpnXyo0efg$BxV;pAj0CHmXV>Y-F7uy_DIu)In z{9ffXEiQLCiE{VCKlV59%Vd#0G)LDy!n_?UDQCj-Q9L*O4SRxnp|QRXsJLsQ)-Sj> ze6iox(U0!Gr{B~;@pGp4`~L!y;Jro;|2VR^8FP254ra7yhOVG(D|+p?w7K-ZzY+ap4JMs2-lnQt)(IvP+3aDDArbc=qtOoB&hK6H~_crtj?}*vUMjYFMY%g{rgs~Q`eHYZoJx8Ma=<(x}P2F{*JF8dquhq{0Gt9Ob&YU6gp^Wq^-n)>|^ zGpXNqxO^@w*|+J(2rkM;D!%l6yga*8`R_P30iV3>?y1w$W1lPSTR2fpGlgMB@Hvbn z`8r&*60Xp39s04c0!&MQQ7|o)9%w%@YyaARaD#F}lrL5uOZ$>%Q{Gpu{Fd@Zpvl9~ zy>BY?pUxPQ;ScfcqwT|b9>!nE$E)qzHLl)Q;ra&w_jGLgUbEiQxw>P7zIy|mu@CmV zPxQ(?2alfti^cTdVKF^z%E6AfUesn}WBN{bxGy*_pYta>zdY7k*U_S~n7<)Mk686LeBF!ij!5hNnCs)^1U)~@wf)r7+jYXlN>NaT^?EQ-{YOM{|4Fw zdy%}S(>`8&oyj=H*K+dCTT$%&yyP&GBWxIBaea-xU<~c)8*GffzrisM8p0T+PfhSZ zMjLPtea>TEXt2-a8;n_=Sp6b;UD5)V!g1(ZJl}VS{h!s)f9l6fS3CH=8GWVxYH)tl zrW4-+$L^w|Y&y9Ar>+y**A&-727?7#@hR^|HX%0`DAw-)uWUZHF<#UD2z|w|z>2ot ztx0?E?60n1&Mx*@LDw2&$m#kn(IC)uN2f;%om;bgZ1sdq4f>a{<#;R$%kQ z?`jj9H;ZR2Y+fQ01^)2S^W0vzKTPGXmHh7_SfJ5hGIv|Of46y!^1lOpx%?N)NZLlc zbARz}+9mRpoeLDnhsld_ki(H{&50yGnjh+3b5icLeqArubFZg%CU2$8n%9cR)Y`!6 zGPSX;2hr889NnBQMYwGq#rj@PcyS%p;nI0^G&fCUGQ_`%(ViIrOt@{-E2+y0}0$7MgBE18YL2Adz_m)vL~GsJJqjWTn- zxSjevtVy5wXAW~LD@A2>IWMsBhcOS8{CPa@?N?4t8-0mjUX!>fUK=@?7&{)bj(?Ds z{MyJW*k{QKFpYOPEm|8{_yeeJMc<*JyQ{wrP^nJ2kXJ`$PI9K2evHnJJ? ztYYJRZR9Y`8zv`hls|mGe9aKnMif68&BEG9H)CsUsV-fk<}O#(OOjq^e~UmKYo)&HQ^kH#6Lxl_S7?}^&I-`hpw ztP#dn|2`h(}2wUeC1F+`Z} zs*f`BF3q7d=1}6;P0^q1yt?Tc`JjHFPh$?^2R4O|u^-q@_mLm?t=12Q;0JbhS_MCF z=|JKKUU?$%iLoEpiZR>|e2D(@e&A;sv%o$pp7nM+c)Q3x|2VXBKOnvL`V+l=ixcQ6kSTpJaYB z+_PSL$6X7M7j&jEzy9mwTjC)ft?$G4aZZo+xoTdE{u%z3XWyrktl>dNdzX#hE56%! zUQeg?Z17BZ%rWFz{v;nfZ^WX9XLR;IvU|cSJ(FK;55B0jNoW7FKTy5li?p7)kz%cR zt1YU|ZmZNdx95}J=RWj#2iJR&hwj$-SJiay%FP-_a!0)yJb6L9k)9HFoeTcNk3CiL zx9qu@xeNEIx3_#AW7f#&R>!qfcEeZK7+>Q~=lYR}f9y^PVv80Lea$G-NQKInf9 z$pARLlQPTwf|KQbd8XX2;atZrmouhLJ*Nyj`JA$BzVo@ZPd47^#E<<2S|xG7ElKWp zF5l`H&X~iKep#1YR2^PkREF1@+iU$svZy_;vO$um8v9fRu-8l4_xoEjzc9;noA^UC zxD0)X{n7F{O>K56qiO7ZdmOtTtFx^JvDufaP87S}sQbuf@6itrhG4Vb>39U2eN(X6 z-+a8$X8(pU+$KKo??#(V7NF2(Ulz5y&D$X#HDpz`;$5Mg+wAVB{taF~vf1Yg*8-b; zcGT`y-Yy#F+o9c_0ksb_KxoXTa|HDg;|2l;QYuc@WY zK1RAvKeCg9#qNiIpWE!C9S_smb_G5tzF&@wjBU2ZqD67l z%Is4;6J8sAgS-e zJCv>R^A5L!zScjqzWjTl`RJZwC`)nhb=~CMhZpw=-)fHi8uNJBF43%vU()-GH<|yL zzDR3POFG!B~-O+fr3h@l@y(2@X%0AGy$=1{$Thm*}){I8kdQ7wn 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 BnGgT~ literal 0 HcmV?d00001 diff --git a/example/low_level/crc_pybind.cpp b/example/low_level/crc_pybind.cpp new file mode 100644 index 0000000..6d59cba --- /dev/null +++ b/example/low_level/crc_pybind.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +// #include +#include +namespace py = pybind11; + +uint32_t crc32_core(uint32_t* ptr, uint32_t len) +{ + unsigned int xbit = 0; + unsigned int data = 0; + unsigned int CRC32 = 0xFFFFFFFF; + const unsigned int dwPolynomial = 0x04c11db7; + + for (unsigned int i = 0; i < len; i++) + { + xbit = 1 << 31; + data = ptr[i]; + for (unsigned int bits = 0; bits < 32; bits++) + { + if (CRC32 & 0x80000000) + { + CRC32 <<= 1; + CRC32 ^= dwPolynomial; + } + else + { + CRC32 <<= 1; + } + + if (data & xbit) + CRC32 ^= dwPolynomial; + xbit >>= 1; + } + } + + return CRC32; +} + +uint32_t get_crc(py::object msg) +{ + // LowCmd raw; + std::vector head = py::cast>(msg.attr("head")); + auto size = head.size(); + printf("head len: %ld, vals: %d %d\n", size, head[0], head[1]); + return 0; + + // uint32_t crc = crc32_core((uint32_t *)&raw, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); + // return crc; +} + +PYBIND11_MODULE(crc_module, m) { + m.doc() = "pybind11 example plugin"; // optional module docstring + + m.def("crc32_core", &crc32_core, "A function which calculates the crc32 of a given array of uint32_t"); + m.def("get_crc", &get_crc, "A function which calculates the crc32 of a given LowCmd_ message"); +} \ No newline at end of file diff --git a/example/low_level/low_level.cpp b/example/low_level/low_level.cpp index 3a72803..e1f08c8 100644 --- a/example/low_level/low_level.cpp +++ b/example/low_level/low_level.cpp @@ -195,21 +195,22 @@ void Custom::LowCmdWrite() int main(int argc, const char** argv) { - if (argc < 2) - { - std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; - exit(-1); - } - - ChannelFactory::Instance()->Init(0, argv[1]); - - Custom custom; - custom.Init(); - - while (1) - { - sleep(10); - } + printf("lowcmd length: %d\n", sizeof(unitree_go::msg::dds_::LowCmd_)); + // if (argc < 2) + // { + // std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; + // exit(-1); + // } + + // ChannelFactory::Instance()->Init(0, argv[1]); + + // Custom custom; + // custom.Init(); + + // while (1) + // { + // sleep(10); + // } return 0; } diff --git a/example/low_level/test_crc.py b/example/low_level/test_crc.py new file mode 100644 index 0000000..d3fc85d --- /dev/null +++ b/example/low_level/test_crc.py @@ -0,0 +1,7 @@ +from crc_module import get_crc + +from unitree_go.msg import LowCmd + +lowcmd = LowCmd() +lowcmd.head = [20, 30] +get_crc(lowcmd) \ No newline at end of file From 70bf6be97762c8fadf301865dadd0e4718159120 Mon Sep 17 00:00:00 2001 From: Yihuai Date: Mon, 5 Feb 2024 12:41:43 -0800 Subject: [PATCH 02/12] Reorganize files & add dds message pack --- .gitignore | 4 +- {example/low_level => python}/CMakeLists.txt | 0 {example/low_level => python}/crc_module.so | Bin {example/low_level => python}/crc_pybind.cpp | 3 +- {example/low_level => python}/test_crc.py | 0 python/unitree_go/__init__.py | 0 python/unitree_go/msg/__init__.py | 22 + python/unitree_go/msg/_audio_data.py | 161 ++++ python/unitree_go/msg/_audio_data_s.c | 221 ++++++ python/unitree_go/msg/_bms_cmd.py | 168 ++++ python/unitree_go/msg/_bms_cmd_s.c | 143 ++++ python/unitree_go/msg/_bms_state.py | 357 +++++++++ python/unitree_go/msg/_bms_state_s.c | 327 ++++++++ python/unitree_go/msg/_error.py | 145 ++++ python/unitree_go/msg/_error_s.c | 118 +++ .../unitree_go/msg/_go2_front_video_data.py | 231 ++++++ .../unitree_go/msg/_go2_front_video_data_s.c | 461 +++++++++++ python/unitree_go/msg/_height_map.py | 283 +++++++ python/unitree_go/msg/_height_map_s.c | 357 +++++++++ python/unitree_go/msg/_imu_state.py | 294 +++++++ python/unitree_go/msg/_imu_state_s.c | 269 +++++++ python/unitree_go/msg/_interface_config.py | 189 +++++ python/unitree_go/msg/_interface_config_s.c | 163 ++++ python/unitree_go/msg/_lidar_state.py | 461 +++++++++++ python/unitree_go/msg/_lidar_state_s.c | 482 ++++++++++++ python/unitree_go/msg/_low_cmd.py | 547 +++++++++++++ python/unitree_go/msg/_low_cmd_s.c | 535 +++++++++++++ python/unitree_go/msg/_low_state.py | 734 ++++++++++++++++++ python/unitree_go/msg/_low_state_s.c | 724 +++++++++++++++++ python/unitree_go/msg/_motor_cmd.py | 263 +++++++ python/unitree_go/msg/_motor_cmd_s.c | 243 ++++++ python/unitree_go/msg/_motor_state.py | 343 ++++++++ python/unitree_go/msg/_motor_state_s.c | 323 ++++++++ python/unitree_go/msg/_path_point.py | 236 ++++++ python/unitree_go/msg/_path_point_s.c | 218 ++++++ python/unitree_go/msg/_req.py | 141 ++++ python/unitree_go/msg/_req_s.c | 145 ++++ python/unitree_go/msg/_res.py | 178 +++++ python/unitree_go/msg/_res_s.c | 268 +++++++ python/unitree_go/msg/_sport_mode_cmd.py | 415 ++++++++++ python/unitree_go/msg/_sport_mode_cmd_s.c | 409 ++++++++++ python/unitree_go/msg/_sport_mode_state.py | 546 +++++++++++++ python/unitree_go/msg/_sport_mode_state_s.c | 527 +++++++++++++ python/unitree_go/msg/_time_spec.py | 145 ++++ python/unitree_go/msg/_time_spec_s.c | 118 +++ python/unitree_go/msg/_uwb_state.py | 484 ++++++++++++ python/unitree_go/msg/_uwb_state_s.c | 465 +++++++++++ python/unitree_go/msg/_uwb_switch.py | 124 +++ python/unitree_go/msg/_uwb_switch_s.c | 98 +++ python/unitree_go/msg/_wireless_controller.py | 200 +++++ .../unitree_go/msg/_wireless_controller_s.c | 178 +++++ 51 files changed, 13463 insertions(+), 3 deletions(-) rename {example/low_level => python}/CMakeLists.txt (100%) rename {example/low_level => python}/crc_module.so (100%) rename {example/low_level => python}/crc_pybind.cpp (96%) rename {example/low_level => python}/test_crc.py (100%) create mode 100644 python/unitree_go/__init__.py create mode 100644 python/unitree_go/msg/__init__.py create mode 100644 python/unitree_go/msg/_audio_data.py create mode 100644 python/unitree_go/msg/_audio_data_s.c create mode 100644 python/unitree_go/msg/_bms_cmd.py create mode 100644 python/unitree_go/msg/_bms_cmd_s.c create mode 100644 python/unitree_go/msg/_bms_state.py create mode 100644 python/unitree_go/msg/_bms_state_s.c create mode 100644 python/unitree_go/msg/_error.py create mode 100644 python/unitree_go/msg/_error_s.c create mode 100644 python/unitree_go/msg/_go2_front_video_data.py create mode 100644 python/unitree_go/msg/_go2_front_video_data_s.c create mode 100644 python/unitree_go/msg/_height_map.py create mode 100644 python/unitree_go/msg/_height_map_s.c create mode 100644 python/unitree_go/msg/_imu_state.py create mode 100644 python/unitree_go/msg/_imu_state_s.c create mode 100644 python/unitree_go/msg/_interface_config.py create mode 100644 python/unitree_go/msg/_interface_config_s.c create mode 100644 python/unitree_go/msg/_lidar_state.py create mode 100644 python/unitree_go/msg/_lidar_state_s.c create mode 100644 python/unitree_go/msg/_low_cmd.py create mode 100644 python/unitree_go/msg/_low_cmd_s.c create mode 100644 python/unitree_go/msg/_low_state.py create mode 100644 python/unitree_go/msg/_low_state_s.c create mode 100644 python/unitree_go/msg/_motor_cmd.py create mode 100644 python/unitree_go/msg/_motor_cmd_s.c create mode 100644 python/unitree_go/msg/_motor_state.py create mode 100644 python/unitree_go/msg/_motor_state_s.c create mode 100644 python/unitree_go/msg/_path_point.py create mode 100644 python/unitree_go/msg/_path_point_s.c create mode 100644 python/unitree_go/msg/_req.py create mode 100644 python/unitree_go/msg/_req_s.c create mode 100644 python/unitree_go/msg/_res.py create mode 100644 python/unitree_go/msg/_res_s.c create mode 100644 python/unitree_go/msg/_sport_mode_cmd.py create mode 100644 python/unitree_go/msg/_sport_mode_cmd_s.c create mode 100644 python/unitree_go/msg/_sport_mode_state.py create mode 100644 python/unitree_go/msg/_sport_mode_state_s.c create mode 100644 python/unitree_go/msg/_time_spec.py create mode 100644 python/unitree_go/msg/_time_spec_s.c create mode 100644 python/unitree_go/msg/_uwb_state.py create mode 100644 python/unitree_go/msg/_uwb_state_s.c create mode 100644 python/unitree_go/msg/_uwb_switch.py create mode 100644 python/unitree_go/msg/_uwb_switch_s.c create mode 100644 python/unitree_go/msg/_wireless_controller.py create mode 100644 python/unitree_go/msg/_wireless_controller_s.c diff --git a/.gitignore b/.gitignore index c795b05..2b33733 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -build \ No newline at end of file +build +__pycache__ +*cpython* \ No newline at end of file diff --git a/example/low_level/CMakeLists.txt b/python/CMakeLists.txt similarity index 100% rename from example/low_level/CMakeLists.txt rename to python/CMakeLists.txt diff --git a/example/low_level/crc_module.so b/python/crc_module.so similarity index 100% rename from example/low_level/crc_module.so rename to python/crc_module.so diff --git a/example/low_level/crc_pybind.cpp b/python/crc_pybind.cpp similarity index 96% rename from example/low_level/crc_pybind.cpp rename to python/crc_pybind.cpp index 6d59cba..33b6d82 100644 --- a/example/low_level/crc_pybind.cpp +++ b/python/crc_pybind.cpp @@ -1,8 +1,7 @@ #include #include #include -// #include -#include + namespace py = pybind11; uint32_t crc32_core(uint32_t* ptr, uint32_t len) diff --git a/example/low_level/test_crc.py b/python/test_crc.py similarity index 100% rename from example/low_level/test_crc.py rename to python/test_crc.py diff --git a/python/unitree_go/__init__.py b/python/unitree_go/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/unitree_go/msg/__init__.py b/python/unitree_go/msg/__init__.py new file mode 100644 index 0000000..5c00080 --- /dev/null +++ b/python/unitree_go/msg/__init__.py @@ -0,0 +1,22 @@ +from unitree_go.msg._audio_data import AudioData # noqa: F401 +from unitree_go.msg._bms_cmd import BmsCmd # noqa: F401 +from unitree_go.msg._bms_state import BmsState # noqa: F401 +from unitree_go.msg._error import Error # noqa: F401 +from unitree_go.msg._go2_front_video_data import Go2FrontVideoData # noqa: F401 +from unitree_go.msg._height_map import HeightMap # noqa: F401 +from unitree_go.msg._imu_state import IMUState # noqa: F401 +from unitree_go.msg._interface_config import InterfaceConfig # noqa: F401 +from unitree_go.msg._lidar_state import LidarState # noqa: F401 +from unitree_go.msg._low_cmd import LowCmd # noqa: F401 +from unitree_go.msg._low_state import LowState # noqa: F401 +from unitree_go.msg._motor_cmd import MotorCmd # noqa: F401 +from unitree_go.msg._motor_state import MotorState # noqa: F401 +from unitree_go.msg._path_point import PathPoint # noqa: F401 +from unitree_go.msg._req import Req # noqa: F401 +from unitree_go.msg._res import Res # noqa: F401 +from unitree_go.msg._sport_mode_cmd import SportModeCmd # noqa: F401 +from unitree_go.msg._sport_mode_state import SportModeState # noqa: F401 +from unitree_go.msg._time_spec import TimeSpec # noqa: F401 +from unitree_go.msg._uwb_state import UwbState # noqa: F401 +from unitree_go.msg._uwb_switch import UwbSwitch # noqa: F401 +from unitree_go.msg._wireless_controller import WirelessController # noqa: F401 diff --git a/python/unitree_go/msg/_audio_data.py b/python/unitree_go/msg/_audio_data.py new file mode 100644 index 0000000..9c9cf86 --- /dev/null +++ b/python/unitree_go/msg/_audio_data.py @@ -0,0 +1,161 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/AudioData.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'data' +import array # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_AudioData(type): + """Metaclass of message 'AudioData'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.AudioData') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__audio_data + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__audio_data + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__audio_data + cls._TYPE_SUPPORT = module.type_support_msg__msg__audio_data + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__audio_data + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class AudioData(metaclass=Metaclass_AudioData): + """Message class 'AudioData'.""" + + __slots__ = [ + '_time_frame', + '_data', + ] + + _fields_and_field_types = { + 'time_frame': 'uint64', + 'data': 'sequence', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint64'), # noqa: E501 + rosidl_parser.definition.UnboundedSequence(rosidl_parser.definition.BasicType('uint8')), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.time_frame = kwargs.get('time_frame', int()) + self.data = array.array('B', kwargs.get('data', [])) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.time_frame != other.time_frame: + return False + if self.data != other.data: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def time_frame(self): + """Message field 'time_frame'.""" + return self._time_frame + + @time_frame.setter + def time_frame(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'time_frame' field must be of type 'int'" + assert value >= 0 and value < 18446744073709551616, \ + "The 'time_frame' field must be an unsigned integer in [0, 18446744073709551615]" + self._time_frame = value + + @property + def data(self): + """Message field 'data'.""" + return self._data + + @data.setter + def data(self, value): + if isinstance(value, array.array): + assert value.typecode == 'B', \ + "The 'data' array.array() must have the type code of 'B'" + self._data = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'data' field must be a set or sequence and each value of type 'int' and each unsigned integer in [0, 255]" + self._data = array.array('B', value) diff --git a/python/unitree_go/msg/_audio_data_s.c b/python/unitree_go/msg/_audio_data_s.c new file mode 100644 index 0000000..e85e1b1 --- /dev/null +++ b/python/unitree_go/msg/_audio_data_s.c @@ -0,0 +1,221 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/AudioData.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/audio_data__struct.h" +#include "unitree_go/msg/detail/audio_data__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__audio_data__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[37]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._audio_data.AudioData", full_classname_dest, 36) == 0); + } + unitree_go__msg__AudioData * ros_message = _ros_message; + { // time_frame + PyObject * field = PyObject_GetAttrString(_pymsg, "time_frame"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->time_frame = PyLong_AsUnsignedLongLong(field); + Py_DECREF(field); + } + { // data + PyObject * field = PyObject_GetAttrString(_pymsg, "data"); + if (!field) { + return false; + } + if (PyObject_CheckBuffer(field)) { + // Optimization for converting arrays of primitives + Py_buffer view; + int rc = PyObject_GetBuffer(field, &view, PyBUF_SIMPLE); + if (rc < 0) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = view.len / sizeof(uint8_t); + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->data), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->data.data; + rc = PyBuffer_ToContiguous(dest, &view, view.len, 'C'); + if (rc < 0) { + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + PyBuffer_Release(&view); + } else { + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'data'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = PySequence_Size(field); + if (-1 == size) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->data), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->data.data; + for (Py_ssize_t i = 0; i < size; ++i) { + PyObject * item = PySequence_Fast_GET_ITEM(seq_field, i); + if (!item) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + assert(PyLong_Check(item)); + uint8_t tmp = (uint8_t)PyLong_AsUnsignedLong(item); + + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__audio_data__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of AudioData */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._audio_data"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "AudioData"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__AudioData * ros_message = (unitree_go__msg__AudioData *)raw_ros_message; + { // time_frame + PyObject * field = NULL; + field = PyLong_FromUnsignedLongLong(ros_message->time_frame); + { + int rc = PyObject_SetAttrString(_pymessage, "time_frame", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // data + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "data"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "array.array") == 0); + // ensure that itemsize matches the sizeof of the ROS message field + PyObject * itemsize_attr = PyObject_GetAttrString(field, "itemsize"); + assert(itemsize_attr != NULL); + size_t itemsize = PyLong_AsSize_t(itemsize_attr); + Py_DECREF(itemsize_attr); + if (itemsize != sizeof(uint8_t)) { + PyErr_SetString(PyExc_RuntimeError, "itemsize doesn't match expectation"); + Py_DECREF(field); + return NULL; + } + // clear the array, poor approach to remove potential default values + Py_ssize_t length = PyObject_Length(field); + if (-1 == length) { + Py_DECREF(field); + return NULL; + } + if (length > 0) { + PyObject * pop = PyObject_GetAttrString(field, "pop"); + assert(pop != NULL); + for (Py_ssize_t i = 0; i < length; ++i) { + PyObject * ret = PyObject_CallFunctionObjArgs(pop, NULL); + if (!ret) { + Py_DECREF(pop); + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(pop); + } + if (ros_message->data.size > 0) { + // populating the array.array using the frombytes method + PyObject * frombytes = PyObject_GetAttrString(field, "frombytes"); + assert(frombytes != NULL); + uint8_t * src = &(ros_message->data.data[0]); + PyObject * data = PyBytes_FromStringAndSize((const char *)src, ros_message->data.size * sizeof(uint8_t)); + assert(data != NULL); + PyObject * ret = PyObject_CallFunctionObjArgs(frombytes, data, NULL); + Py_DECREF(data); + Py_DECREF(frombytes); + if (!ret) { + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_bms_cmd.py b/python/unitree_go/msg/_bms_cmd.py new file mode 100644 index 0000000..6034fde --- /dev/null +++ b/python/unitree_go/msg/_bms_cmd.py @@ -0,0 +1,168 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/BmsCmd.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'reserve' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_BmsCmd(type): + """Metaclass of message 'BmsCmd'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.BmsCmd') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__bms_cmd + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__bms_cmd + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__bms_cmd + cls._TYPE_SUPPORT = module.type_support_msg__msg__bms_cmd + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__bms_cmd + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class BmsCmd(metaclass=Metaclass_BmsCmd): + """Message class 'BmsCmd'.""" + + __slots__ = [ + '_off', + '_reserve', + ] + + _fields_and_field_types = { + 'off': 'uint8', + 'reserve': 'uint8[3]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 3), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.off = kwargs.get('off', int()) + if 'reserve' not in kwargs: + self.reserve = numpy.zeros(3, dtype=numpy.uint8) + else: + self.reserve = numpy.array(kwargs.get('reserve'), dtype=numpy.uint8) + assert self.reserve.shape == (3, ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.off != other.off: + return False + if all(self.reserve != other.reserve): + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def off(self): + """Message field 'off'.""" + return self._off + + @off.setter + def off(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'off' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'off' field must be an unsigned integer in [0, 255]" + self._off = value + + @property + def reserve(self): + """Message field 'reserve'.""" + return self._reserve + + @reserve.setter + def reserve(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'reserve' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 3, \ + "The 'reserve' numpy.ndarray() must have a size of 3" + self._reserve = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'reserve' field must be a set or sequence with length 3 and each value of type 'int' and each unsigned integer in [0, 255]" + self._reserve = numpy.array(value, dtype=numpy.uint8) diff --git a/python/unitree_go/msg/_bms_cmd_s.c b/python/unitree_go/msg/_bms_cmd_s.c new file mode 100644 index 0000000..6c1efbd --- /dev/null +++ b/python/unitree_go/msg/_bms_cmd_s.c @@ -0,0 +1,143 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/BmsCmd.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/bms_cmd__struct.h" +#include "unitree_go/msg/detail/bms_cmd__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__bms_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[31]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._bms_cmd.BmsCmd", full_classname_dest, 30) == 0); + } + unitree_go__msg__BmsCmd * ros_message = _ros_message; + { // off + PyObject * field = PyObject_GetAttrString(_pymsg, "off"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->off = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "reserve"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 3; + uint8_t * dest = ros_message->reserve; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__bms_cmd__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of BmsCmd */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._bms_cmd"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "BmsCmd"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__BmsCmd * ros_message = (unitree_go__msg__BmsCmd *)raw_ros_message; + { // off + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->off); + { + int rc = PyObject_SetAttrString(_pymessage, "off", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // reserve + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "reserve"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->reserve[0]); + memcpy(dst, src, 3 * sizeof(uint8_t)); + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_bms_state.py b/python/unitree_go/msg/_bms_state.py new file mode 100644 index 0000000..e727d62 --- /dev/null +++ b/python/unitree_go/msg/_bms_state.py @@ -0,0 +1,357 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/BmsState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'bq_ntc' +# Member 'mcu_ntc' +# Member 'cell_vol' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_BmsState(type): + """Metaclass of message 'BmsState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.BmsState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__bms_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__bms_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__bms_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__bms_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__bms_state + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class BmsState(metaclass=Metaclass_BmsState): + """Message class 'BmsState'.""" + + __slots__ = [ + '_version_high', + '_version_low', + '_status', + '_soc', + '_current', + '_cycle', + '_bq_ntc', + '_mcu_ntc', + '_cell_vol', + ] + + _fields_and_field_types = { + 'version_high': 'uint8', + 'version_low': 'uint8', + 'status': 'uint8', + 'soc': 'uint8', + 'current': 'int32', + 'cycle': 'uint16', + 'bq_ntc': 'int8[2]', + 'mcu_ntc': 'int8[2]', + 'cell_vol': 'uint16[15]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('int32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint16'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('int8'), 2), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('int8'), 2), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint16'), 15), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.version_high = kwargs.get('version_high', int()) + self.version_low = kwargs.get('version_low', int()) + self.status = kwargs.get('status', int()) + self.soc = kwargs.get('soc', int()) + self.current = kwargs.get('current', int()) + self.cycle = kwargs.get('cycle', int()) + if 'bq_ntc' not in kwargs: + self.bq_ntc = numpy.zeros(2, dtype=numpy.int8) + else: + self.bq_ntc = numpy.array(kwargs.get('bq_ntc'), dtype=numpy.int8) + assert self.bq_ntc.shape == (2, ) + if 'mcu_ntc' not in kwargs: + self.mcu_ntc = numpy.zeros(2, dtype=numpy.int8) + else: + self.mcu_ntc = numpy.array(kwargs.get('mcu_ntc'), dtype=numpy.int8) + assert self.mcu_ntc.shape == (2, ) + if 'cell_vol' not in kwargs: + self.cell_vol = numpy.zeros(15, dtype=numpy.uint16) + else: + self.cell_vol = numpy.array(kwargs.get('cell_vol'), dtype=numpy.uint16) + assert self.cell_vol.shape == (15, ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.version_high != other.version_high: + return False + if self.version_low != other.version_low: + return False + if self.status != other.status: + return False + if self.soc != other.soc: + return False + if self.current != other.current: + return False + if self.cycle != other.cycle: + return False + if all(self.bq_ntc != other.bq_ntc): + return False + if all(self.mcu_ntc != other.mcu_ntc): + return False + if all(self.cell_vol != other.cell_vol): + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def version_high(self): + """Message field 'version_high'.""" + return self._version_high + + @version_high.setter + def version_high(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'version_high' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'version_high' field must be an unsigned integer in [0, 255]" + self._version_high = value + + @property + def version_low(self): + """Message field 'version_low'.""" + return self._version_low + + @version_low.setter + def version_low(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'version_low' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'version_low' field must be an unsigned integer in [0, 255]" + self._version_low = value + + @property + def status(self): + """Message field 'status'.""" + return self._status + + @status.setter + def status(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'status' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'status' field must be an unsigned integer in [0, 255]" + self._status = value + + @property + def soc(self): + """Message field 'soc'.""" + return self._soc + + @soc.setter + def soc(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'soc' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'soc' field must be an unsigned integer in [0, 255]" + self._soc = value + + @property + def current(self): + """Message field 'current'.""" + return self._current + + @current.setter + def current(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'current' field must be of type 'int'" + assert value >= -2147483648 and value < 2147483648, \ + "The 'current' field must be an integer in [-2147483648, 2147483647]" + self._current = value + + @property + def cycle(self): + """Message field 'cycle'.""" + return self._cycle + + @cycle.setter + def cycle(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'cycle' field must be of type 'int'" + assert value >= 0 and value < 65536, \ + "The 'cycle' field must be an unsigned integer in [0, 65535]" + self._cycle = value + + @property + def bq_ntc(self): + """Message field 'bq_ntc'.""" + return self._bq_ntc + + @bq_ntc.setter + def bq_ntc(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.int8, \ + "The 'bq_ntc' numpy.ndarray() must have the dtype of 'numpy.int8'" + assert value.size == 2, \ + "The 'bq_ntc' numpy.ndarray() must have a size of 2" + self._bq_ntc = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= -128 and val < 128 for val in value)), \ + "The 'bq_ntc' field must be a set or sequence with length 2 and each value of type 'int' and each integer in [-128, 127]" + self._bq_ntc = numpy.array(value, dtype=numpy.int8) + + @property + def mcu_ntc(self): + """Message field 'mcu_ntc'.""" + return self._mcu_ntc + + @mcu_ntc.setter + def mcu_ntc(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.int8, \ + "The 'mcu_ntc' numpy.ndarray() must have the dtype of 'numpy.int8'" + assert value.size == 2, \ + "The 'mcu_ntc' numpy.ndarray() must have a size of 2" + self._mcu_ntc = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= -128 and val < 128 for val in value)), \ + "The 'mcu_ntc' field must be a set or sequence with length 2 and each value of type 'int' and each integer in [-128, 127]" + self._mcu_ntc = numpy.array(value, dtype=numpy.int8) + + @property + def cell_vol(self): + """Message field 'cell_vol'.""" + return self._cell_vol + + @cell_vol.setter + def cell_vol(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint16, \ + "The 'cell_vol' numpy.ndarray() must have the dtype of 'numpy.uint16'" + assert value.size == 15, \ + "The 'cell_vol' numpy.ndarray() must have a size of 15" + self._cell_vol = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 15 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 65536 for val in value)), \ + "The 'cell_vol' field must be a set or sequence with length 15 and each value of type 'int' and each unsigned integer in [0, 65535]" + self._cell_vol = numpy.array(value, dtype=numpy.uint16) diff --git a/python/unitree_go/msg/_bms_state_s.c b/python/unitree_go/msg/_bms_state_s.c new file mode 100644 index 0000000..6e26973 --- /dev/null +++ b/python/unitree_go/msg/_bms_state_s.c @@ -0,0 +1,327 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/BmsState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/bms_state__struct.h" +#include "unitree_go/msg/detail/bms_state__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__bms_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[35]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._bms_state.BmsState", full_classname_dest, 34) == 0); + } + unitree_go__msg__BmsState * ros_message = _ros_message; + { // version_high + PyObject * field = PyObject_GetAttrString(_pymsg, "version_high"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->version_high = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // version_low + PyObject * field = PyObject_GetAttrString(_pymsg, "version_low"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->version_low = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // status + PyObject * field = PyObject_GetAttrString(_pymsg, "status"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->status = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // soc + PyObject * field = PyObject_GetAttrString(_pymsg, "soc"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->soc = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // current + PyObject * field = PyObject_GetAttrString(_pymsg, "current"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->current = (int32_t)PyLong_AsLong(field); + Py_DECREF(field); + } + { // cycle + PyObject * field = PyObject_GetAttrString(_pymsg, "cycle"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->cycle = (uint16_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // bq_ntc + PyObject * field = PyObject_GetAttrString(_pymsg, "bq_ntc"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT8); + Py_ssize_t size = 2; + int8_t * dest = ros_message->bq_ntc; + for (Py_ssize_t i = 0; i < size; ++i) { + int8_t tmp = *(npy_int8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(int8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // mcu_ntc + PyObject * field = PyObject_GetAttrString(_pymsg, "mcu_ntc"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT8); + Py_ssize_t size = 2; + int8_t * dest = ros_message->mcu_ntc; + for (Py_ssize_t i = 0; i < size; ++i) { + int8_t tmp = *(npy_int8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(int8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // cell_vol + PyObject * field = PyObject_GetAttrString(_pymsg, "cell_vol"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT16); + Py_ssize_t size = 15; + uint16_t * dest = ros_message->cell_vol; + for (Py_ssize_t i = 0; i < size; ++i) { + uint16_t tmp = *(npy_uint16 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint16_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__bms_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of BmsState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._bms_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "BmsState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__BmsState * ros_message = (unitree_go__msg__BmsState *)raw_ros_message; + { // version_high + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->version_high); + { + int rc = PyObject_SetAttrString(_pymessage, "version_high", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // version_low + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->version_low); + { + int rc = PyObject_SetAttrString(_pymessage, "version_low", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // status + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->status); + { + int rc = PyObject_SetAttrString(_pymessage, "status", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // soc + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->soc); + { + int rc = PyObject_SetAttrString(_pymessage, "soc", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // current + PyObject * field = NULL; + field = PyLong_FromLong(ros_message->current); + { + int rc = PyObject_SetAttrString(_pymessage, "current", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // cycle + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->cycle); + { + int rc = PyObject_SetAttrString(_pymessage, "cycle", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // bq_ntc + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "bq_ntc"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT8); + assert(sizeof(npy_int8) == sizeof(int8_t)); + npy_int8 * dst = (npy_int8 *)PyArray_GETPTR1(seq_field, 0); + int8_t * src = &(ros_message->bq_ntc[0]); + memcpy(dst, src, 2 * sizeof(int8_t)); + Py_DECREF(field); + } + { // mcu_ntc + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "mcu_ntc"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT8); + assert(sizeof(npy_int8) == sizeof(int8_t)); + npy_int8 * dst = (npy_int8 *)PyArray_GETPTR1(seq_field, 0); + int8_t * src = &(ros_message->mcu_ntc[0]); + memcpy(dst, src, 2 * sizeof(int8_t)); + Py_DECREF(field); + } + { // cell_vol + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "cell_vol"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT16); + assert(sizeof(npy_uint16) == sizeof(uint16_t)); + npy_uint16 * dst = (npy_uint16 *)PyArray_GETPTR1(seq_field, 0); + uint16_t * src = &(ros_message->cell_vol[0]); + memcpy(dst, src, 15 * sizeof(uint16_t)); + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_error.py b/python/unitree_go/msg/_error.py new file mode 100644 index 0000000..142341a --- /dev/null +++ b/python/unitree_go/msg/_error.py @@ -0,0 +1,145 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/Error.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_Error(type): + """Metaclass of message 'Error'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.Error') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__error + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__error + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__error + cls._TYPE_SUPPORT = module.type_support_msg__msg__error + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__error + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class Error(metaclass=Metaclass_Error): + """Message class 'Error'.""" + + __slots__ = [ + '_source', + '_state', + ] + + _fields_and_field_types = { + 'source': 'uint32', + 'state': 'uint32', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.source = kwargs.get('source', int()) + self.state = kwargs.get('state', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.source != other.source: + return False + if self.state != other.state: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def source(self): + """Message field 'source'.""" + return self._source + + @source.setter + def source(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'source' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'source' field must be an unsigned integer in [0, 4294967295]" + self._source = value + + @property + def state(self): + """Message field 'state'.""" + return self._state + + @state.setter + def state(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'state' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'state' field must be an unsigned integer in [0, 4294967295]" + self._state = value diff --git a/python/unitree_go/msg/_error_s.c b/python/unitree_go/msg/_error_s.c new file mode 100644 index 0000000..4cafeba --- /dev/null +++ b/python/unitree_go/msg/_error_s.c @@ -0,0 +1,118 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/Error.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/error__struct.h" +#include "unitree_go/msg/detail/error__functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__error__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[28]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._error.Error", full_classname_dest, 27) == 0); + } + unitree_go__msg__Error * ros_message = _ros_message; + { // source + PyObject * field = PyObject_GetAttrString(_pymsg, "source"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->source = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // state + PyObject * field = PyObject_GetAttrString(_pymsg, "state"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->state = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__error__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of Error */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._error"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "Error"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__Error * ros_message = (unitree_go__msg__Error *)raw_ros_message; + { // source + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->source); + { + int rc = PyObject_SetAttrString(_pymessage, "source", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // state + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->state); + { + int rc = PyObject_SetAttrString(_pymessage, "state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_go2_front_video_data.py b/python/unitree_go/msg/_go2_front_video_data.py new file mode 100644 index 0000000..81c366c --- /dev/null +++ b/python/unitree_go/msg/_go2_front_video_data.py @@ -0,0 +1,231 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/Go2FrontVideoData.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'video720p' +# Member 'video360p' +# Member 'video180p' +import array # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_Go2FrontVideoData(type): + """Metaclass of message 'Go2FrontVideoData'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.Go2FrontVideoData') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__go2_front_video_data + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__go2_front_video_data + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__go2_front_video_data + cls._TYPE_SUPPORT = module.type_support_msg__msg__go2_front_video_data + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__go2_front_video_data + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class Go2FrontVideoData(metaclass=Metaclass_Go2FrontVideoData): + """Message class 'Go2FrontVideoData'.""" + + __slots__ = [ + '_time_frame', + '_video720p', + '_video360p', + '_video180p', + ] + + _fields_and_field_types = { + 'time_frame': 'uint64', + 'video720p': 'sequence', + 'video360p': 'sequence', + 'video180p': 'sequence', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint64'), # noqa: E501 + rosidl_parser.definition.UnboundedSequence(rosidl_parser.definition.BasicType('uint8')), # noqa: E501 + rosidl_parser.definition.UnboundedSequence(rosidl_parser.definition.BasicType('uint8')), # noqa: E501 + rosidl_parser.definition.UnboundedSequence(rosidl_parser.definition.BasicType('uint8')), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.time_frame = kwargs.get('time_frame', int()) + self.video720p = array.array('B', kwargs.get('video720p', [])) + self.video360p = array.array('B', kwargs.get('video360p', [])) + self.video180p = array.array('B', kwargs.get('video180p', [])) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.time_frame != other.time_frame: + return False + if self.video720p != other.video720p: + return False + if self.video360p != other.video360p: + return False + if self.video180p != other.video180p: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def time_frame(self): + """Message field 'time_frame'.""" + return self._time_frame + + @time_frame.setter + def time_frame(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'time_frame' field must be of type 'int'" + assert value >= 0 and value < 18446744073709551616, \ + "The 'time_frame' field must be an unsigned integer in [0, 18446744073709551615]" + self._time_frame = value + + @property + def video720p(self): + """Message field 'video720p'.""" + return self._video720p + + @video720p.setter + def video720p(self, value): + if isinstance(value, array.array): + assert value.typecode == 'B', \ + "The 'video720p' array.array() must have the type code of 'B'" + self._video720p = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'video720p' field must be a set or sequence and each value of type 'int' and each unsigned integer in [0, 255]" + self._video720p = array.array('B', value) + + @property + def video360p(self): + """Message field 'video360p'.""" + return self._video360p + + @video360p.setter + def video360p(self, value): + if isinstance(value, array.array): + assert value.typecode == 'B', \ + "The 'video360p' array.array() must have the type code of 'B'" + self._video360p = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'video360p' field must be a set or sequence and each value of type 'int' and each unsigned integer in [0, 255]" + self._video360p = array.array('B', value) + + @property + def video180p(self): + """Message field 'video180p'.""" + return self._video180p + + @video180p.setter + def video180p(self, value): + if isinstance(value, array.array): + assert value.typecode == 'B', \ + "The 'video180p' array.array() must have the type code of 'B'" + self._video180p = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'video180p' field must be a set or sequence and each value of type 'int' and each unsigned integer in [0, 255]" + self._video180p = array.array('B', value) diff --git a/python/unitree_go/msg/_go2_front_video_data_s.c b/python/unitree_go/msg/_go2_front_video_data_s.c new file mode 100644 index 0000000..2492f40 --- /dev/null +++ b/python/unitree_go/msg/_go2_front_video_data_s.c @@ -0,0 +1,461 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/Go2FrontVideoData.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/go2_front_video_data__struct.h" +#include "unitree_go/msg/detail/go2_front_video_data__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__go2_front_video_data__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[55]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._go2_front_video_data.Go2FrontVideoData", full_classname_dest, 54) == 0); + } + unitree_go__msg__Go2FrontVideoData * ros_message = _ros_message; + { // time_frame + PyObject * field = PyObject_GetAttrString(_pymsg, "time_frame"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->time_frame = PyLong_AsUnsignedLongLong(field); + Py_DECREF(field); + } + { // video720p + PyObject * field = PyObject_GetAttrString(_pymsg, "video720p"); + if (!field) { + return false; + } + if (PyObject_CheckBuffer(field)) { + // Optimization for converting arrays of primitives + Py_buffer view; + int rc = PyObject_GetBuffer(field, &view, PyBUF_SIMPLE); + if (rc < 0) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = view.len / sizeof(uint8_t); + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->video720p), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->video720p.data; + rc = PyBuffer_ToContiguous(dest, &view, view.len, 'C'); + if (rc < 0) { + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + PyBuffer_Release(&view); + } else { + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'video720p'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = PySequence_Size(field); + if (-1 == size) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->video720p), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->video720p.data; + for (Py_ssize_t i = 0; i < size; ++i) { + PyObject * item = PySequence_Fast_GET_ITEM(seq_field, i); + if (!item) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + assert(PyLong_Check(item)); + uint8_t tmp = (uint8_t)PyLong_AsUnsignedLong(item); + + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // video360p + PyObject * field = PyObject_GetAttrString(_pymsg, "video360p"); + if (!field) { + return false; + } + if (PyObject_CheckBuffer(field)) { + // Optimization for converting arrays of primitives + Py_buffer view; + int rc = PyObject_GetBuffer(field, &view, PyBUF_SIMPLE); + if (rc < 0) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = view.len / sizeof(uint8_t); + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->video360p), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->video360p.data; + rc = PyBuffer_ToContiguous(dest, &view, view.len, 'C'); + if (rc < 0) { + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + PyBuffer_Release(&view); + } else { + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'video360p'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = PySequence_Size(field); + if (-1 == size) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->video360p), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->video360p.data; + for (Py_ssize_t i = 0; i < size; ++i) { + PyObject * item = PySequence_Fast_GET_ITEM(seq_field, i); + if (!item) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + assert(PyLong_Check(item)); + uint8_t tmp = (uint8_t)PyLong_AsUnsignedLong(item); + + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // video180p + PyObject * field = PyObject_GetAttrString(_pymsg, "video180p"); + if (!field) { + return false; + } + if (PyObject_CheckBuffer(field)) { + // Optimization for converting arrays of primitives + Py_buffer view; + int rc = PyObject_GetBuffer(field, &view, PyBUF_SIMPLE); + if (rc < 0) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = view.len / sizeof(uint8_t); + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->video180p), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->video180p.data; + rc = PyBuffer_ToContiguous(dest, &view, view.len, 'C'); + if (rc < 0) { + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + PyBuffer_Release(&view); + } else { + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'video180p'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = PySequence_Size(field); + if (-1 == size) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->video180p), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->video180p.data; + for (Py_ssize_t i = 0; i < size; ++i) { + PyObject * item = PySequence_Fast_GET_ITEM(seq_field, i); + if (!item) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + assert(PyLong_Check(item)); + uint8_t tmp = (uint8_t)PyLong_AsUnsignedLong(item); + + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__go2_front_video_data__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of Go2FrontVideoData */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._go2_front_video_data"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "Go2FrontVideoData"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__Go2FrontVideoData * ros_message = (unitree_go__msg__Go2FrontVideoData *)raw_ros_message; + { // time_frame + PyObject * field = NULL; + field = PyLong_FromUnsignedLongLong(ros_message->time_frame); + { + int rc = PyObject_SetAttrString(_pymessage, "time_frame", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // video720p + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "video720p"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "array.array") == 0); + // ensure that itemsize matches the sizeof of the ROS message field + PyObject * itemsize_attr = PyObject_GetAttrString(field, "itemsize"); + assert(itemsize_attr != NULL); + size_t itemsize = PyLong_AsSize_t(itemsize_attr); + Py_DECREF(itemsize_attr); + if (itemsize != sizeof(uint8_t)) { + PyErr_SetString(PyExc_RuntimeError, "itemsize doesn't match expectation"); + Py_DECREF(field); + return NULL; + } + // clear the array, poor approach to remove potential default values + Py_ssize_t length = PyObject_Length(field); + if (-1 == length) { + Py_DECREF(field); + return NULL; + } + if (length > 0) { + PyObject * pop = PyObject_GetAttrString(field, "pop"); + assert(pop != NULL); + for (Py_ssize_t i = 0; i < length; ++i) { + PyObject * ret = PyObject_CallFunctionObjArgs(pop, NULL); + if (!ret) { + Py_DECREF(pop); + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(pop); + } + if (ros_message->video720p.size > 0) { + // populating the array.array using the frombytes method + PyObject * frombytes = PyObject_GetAttrString(field, "frombytes"); + assert(frombytes != NULL); + uint8_t * src = &(ros_message->video720p.data[0]); + PyObject * data = PyBytes_FromStringAndSize((const char *)src, ros_message->video720p.size * sizeof(uint8_t)); + assert(data != NULL); + PyObject * ret = PyObject_CallFunctionObjArgs(frombytes, data, NULL); + Py_DECREF(data); + Py_DECREF(frombytes); + if (!ret) { + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(field); + } + { // video360p + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "video360p"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "array.array") == 0); + // ensure that itemsize matches the sizeof of the ROS message field + PyObject * itemsize_attr = PyObject_GetAttrString(field, "itemsize"); + assert(itemsize_attr != NULL); + size_t itemsize = PyLong_AsSize_t(itemsize_attr); + Py_DECREF(itemsize_attr); + if (itemsize != sizeof(uint8_t)) { + PyErr_SetString(PyExc_RuntimeError, "itemsize doesn't match expectation"); + Py_DECREF(field); + return NULL; + } + // clear the array, poor approach to remove potential default values + Py_ssize_t length = PyObject_Length(field); + if (-1 == length) { + Py_DECREF(field); + return NULL; + } + if (length > 0) { + PyObject * pop = PyObject_GetAttrString(field, "pop"); + assert(pop != NULL); + for (Py_ssize_t i = 0; i < length; ++i) { + PyObject * ret = PyObject_CallFunctionObjArgs(pop, NULL); + if (!ret) { + Py_DECREF(pop); + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(pop); + } + if (ros_message->video360p.size > 0) { + // populating the array.array using the frombytes method + PyObject * frombytes = PyObject_GetAttrString(field, "frombytes"); + assert(frombytes != NULL); + uint8_t * src = &(ros_message->video360p.data[0]); + PyObject * data = PyBytes_FromStringAndSize((const char *)src, ros_message->video360p.size * sizeof(uint8_t)); + assert(data != NULL); + PyObject * ret = PyObject_CallFunctionObjArgs(frombytes, data, NULL); + Py_DECREF(data); + Py_DECREF(frombytes); + if (!ret) { + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(field); + } + { // video180p + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "video180p"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "array.array") == 0); + // ensure that itemsize matches the sizeof of the ROS message field + PyObject * itemsize_attr = PyObject_GetAttrString(field, "itemsize"); + assert(itemsize_attr != NULL); + size_t itemsize = PyLong_AsSize_t(itemsize_attr); + Py_DECREF(itemsize_attr); + if (itemsize != sizeof(uint8_t)) { + PyErr_SetString(PyExc_RuntimeError, "itemsize doesn't match expectation"); + Py_DECREF(field); + return NULL; + } + // clear the array, poor approach to remove potential default values + Py_ssize_t length = PyObject_Length(field); + if (-1 == length) { + Py_DECREF(field); + return NULL; + } + if (length > 0) { + PyObject * pop = PyObject_GetAttrString(field, "pop"); + assert(pop != NULL); + for (Py_ssize_t i = 0; i < length; ++i) { + PyObject * ret = PyObject_CallFunctionObjArgs(pop, NULL); + if (!ret) { + Py_DECREF(pop); + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(pop); + } + if (ros_message->video180p.size > 0) { + // populating the array.array using the frombytes method + PyObject * frombytes = PyObject_GetAttrString(field, "frombytes"); + assert(frombytes != NULL); + uint8_t * src = &(ros_message->video180p.data[0]); + PyObject * data = PyBytes_FromStringAndSize((const char *)src, ros_message->video180p.size * sizeof(uint8_t)); + assert(data != NULL); + PyObject * ret = PyObject_CallFunctionObjArgs(frombytes, data, NULL); + Py_DECREF(data); + Py_DECREF(frombytes); + if (!ret) { + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_height_map.py b/python/unitree_go/msg/_height_map.py new file mode 100644 index 0000000..935feda --- /dev/null +++ b/python/unitree_go/msg/_height_map.py @@ -0,0 +1,283 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/HeightMap.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'data' +import array # noqa: E402, I100 + +# Member 'origin' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_HeightMap(type): + """Metaclass of message 'HeightMap'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.HeightMap') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__height_map + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__height_map + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__height_map + cls._TYPE_SUPPORT = module.type_support_msg__msg__height_map + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__height_map + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class HeightMap(metaclass=Metaclass_HeightMap): + """Message class 'HeightMap'.""" + + __slots__ = [ + '_stamp', + '_frame_id', + '_resolution', + '_width', + '_height', + '_origin', + '_data', + ] + + _fields_and_field_types = { + 'stamp': 'double', + 'frame_id': 'string', + 'resolution': 'float', + 'width': 'uint32', + 'height': 'uint32', + 'origin': 'float[2]', + 'data': 'sequence', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('double'), # noqa: E501 + rosidl_parser.definition.UnboundedString(), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 2), # noqa: E501 + rosidl_parser.definition.UnboundedSequence(rosidl_parser.definition.BasicType('float')), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.stamp = kwargs.get('stamp', float()) + self.frame_id = kwargs.get('frame_id', str()) + self.resolution = kwargs.get('resolution', float()) + self.width = kwargs.get('width', int()) + self.height = kwargs.get('height', int()) + if 'origin' not in kwargs: + self.origin = numpy.zeros(2, dtype=numpy.float32) + else: + self.origin = numpy.array(kwargs.get('origin'), dtype=numpy.float32) + assert self.origin.shape == (2, ) + self.data = array.array('f', kwargs.get('data', [])) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.stamp != other.stamp: + return False + if self.frame_id != other.frame_id: + return False + if self.resolution != other.resolution: + return False + if self.width != other.width: + return False + if self.height != other.height: + return False + if all(self.origin != other.origin): + return False + if self.data != other.data: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def stamp(self): + """Message field 'stamp'.""" + return self._stamp + + @stamp.setter + def stamp(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'stamp' field must be of type 'float'" + self._stamp = value + + @property + def frame_id(self): + """Message field 'frame_id'.""" + return self._frame_id + + @frame_id.setter + def frame_id(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'frame_id' field must be of type 'str'" + self._frame_id = value + + @property + def resolution(self): + """Message field 'resolution'.""" + return self._resolution + + @resolution.setter + def resolution(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'resolution' field must be of type 'float'" + self._resolution = value + + @property + def width(self): + """Message field 'width'.""" + return self._width + + @width.setter + def width(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'width' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'width' field must be an unsigned integer in [0, 4294967295]" + self._width = value + + @property + def height(self): + """Message field 'height'.""" + return self._height + + @height.setter + def height(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'height' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'height' field must be an unsigned integer in [0, 4294967295]" + self._height = value + + @property + def origin(self): + """Message field 'origin'.""" + return self._origin + + @origin.setter + def origin(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'origin' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 2, \ + "The 'origin' numpy.ndarray() must have a size of 2" + self._origin = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'origin' field must be a set or sequence with length 2 and each value of type 'float'" + self._origin = numpy.array(value, dtype=numpy.float32) + + @property + def data(self): + """Message field 'data'.""" + return self._data + + @data.setter + def data(self, value): + if isinstance(value, array.array): + assert value.typecode == 'f', \ + "The 'data' array.array() must have the type code of 'f'" + self._data = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + all(isinstance(v, float) for v in value) and + True), \ + "The 'data' field must be a set or sequence and each value of type 'float'" + self._data = array.array('f', value) diff --git a/python/unitree_go/msg/_height_map_s.c b/python/unitree_go/msg/_height_map_s.c new file mode 100644 index 0000000..c8b312c --- /dev/null +++ b/python/unitree_go/msg/_height_map_s.c @@ -0,0 +1,357 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/HeightMap.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/height_map__struct.h" +#include "unitree_go/msg/detail/height_map__functions.h" + +#include "rosidl_runtime_c/string.h" +#include "rosidl_runtime_c/string_functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__height_map__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[37]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._height_map.HeightMap", full_classname_dest, 36) == 0); + } + unitree_go__msg__HeightMap * ros_message = _ros_message; + { // stamp + PyObject * field = PyObject_GetAttrString(_pymsg, "stamp"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->stamp = PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // frame_id + PyObject * field = PyObject_GetAttrString(_pymsg, "frame_id"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->frame_id, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + { // resolution + PyObject * field = PyObject_GetAttrString(_pymsg, "resolution"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->resolution = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // width + PyObject * field = PyObject_GetAttrString(_pymsg, "width"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->width = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // height + PyObject * field = PyObject_GetAttrString(_pymsg, "height"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->height = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // origin + PyObject * field = PyObject_GetAttrString(_pymsg, "origin"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 2; + float * dest = ros_message->origin; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // data + PyObject * field = PyObject_GetAttrString(_pymsg, "data"); + if (!field) { + return false; + } + if (PyObject_CheckBuffer(field)) { + // Optimization for converting arrays of primitives + Py_buffer view; + int rc = PyObject_GetBuffer(field, &view, PyBUF_SIMPLE); + if (rc < 0) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = view.len / sizeof(float); + if (!rosidl_runtime_c__float__Sequence__init(&(ros_message->data), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create float__Sequence ros_message"); + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + float * dest = ros_message->data.data; + rc = PyBuffer_ToContiguous(dest, &view, view.len, 'C'); + if (rc < 0) { + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + PyBuffer_Release(&view); + } else { + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'data'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = PySequence_Size(field); + if (-1 == size) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + if (!rosidl_runtime_c__float__Sequence__init(&(ros_message->data), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create float__Sequence ros_message"); + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + float * dest = ros_message->data.data; + for (Py_ssize_t i = 0; i < size; ++i) { + PyObject * item = PySequence_Fast_GET_ITEM(seq_field, i); + if (!item) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + assert(PyFloat_Check(item)); + float tmp = (float)PyFloat_AS_DOUBLE(item); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__height_map__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of HeightMap */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._height_map"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "HeightMap"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__HeightMap * ros_message = (unitree_go__msg__HeightMap *)raw_ros_message; + { // stamp + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->stamp); + { + int rc = PyObject_SetAttrString(_pymessage, "stamp", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // frame_id + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->frame_id.data, + strlen(ros_message->frame_id.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "frame_id", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // resolution + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->resolution); + { + int rc = PyObject_SetAttrString(_pymessage, "resolution", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // width + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->width); + { + int rc = PyObject_SetAttrString(_pymessage, "width", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // height + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->height); + { + int rc = PyObject_SetAttrString(_pymessage, "height", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // origin + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "origin"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->origin[0]); + memcpy(dst, src, 2 * sizeof(float)); + Py_DECREF(field); + } + { // data + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "data"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "array.array") == 0); + // ensure that itemsize matches the sizeof of the ROS message field + PyObject * itemsize_attr = PyObject_GetAttrString(field, "itemsize"); + assert(itemsize_attr != NULL); + size_t itemsize = PyLong_AsSize_t(itemsize_attr); + Py_DECREF(itemsize_attr); + if (itemsize != sizeof(float)) { + PyErr_SetString(PyExc_RuntimeError, "itemsize doesn't match expectation"); + Py_DECREF(field); + return NULL; + } + // clear the array, poor approach to remove potential default values + Py_ssize_t length = PyObject_Length(field); + if (-1 == length) { + Py_DECREF(field); + return NULL; + } + if (length > 0) { + PyObject * pop = PyObject_GetAttrString(field, "pop"); + assert(pop != NULL); + for (Py_ssize_t i = 0; i < length; ++i) { + PyObject * ret = PyObject_CallFunctionObjArgs(pop, NULL); + if (!ret) { + Py_DECREF(pop); + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(pop); + } + if (ros_message->data.size > 0) { + // populating the array.array using the frombytes method + PyObject * frombytes = PyObject_GetAttrString(field, "frombytes"); + assert(frombytes != NULL); + float * src = &(ros_message->data.data[0]); + PyObject * data = PyBytes_FromStringAndSize((const char *)src, ros_message->data.size * sizeof(float)); + assert(data != NULL); + PyObject * ret = PyObject_CallFunctionObjArgs(frombytes, data, NULL); + Py_DECREF(data); + Py_DECREF(frombytes); + if (!ret) { + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_imu_state.py b/python/unitree_go/msg/_imu_state.py new file mode 100644 index 0000000..78f6d31 --- /dev/null +++ b/python/unitree_go/msg/_imu_state.py @@ -0,0 +1,294 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/IMUState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'quaternion' +# Member 'gyroscope' +# Member 'accelerometer' +# Member 'rpy' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_IMUState(type): + """Metaclass of message 'IMUState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.IMUState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__imu_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__imu_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__imu_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__imu_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__imu_state + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class IMUState(metaclass=Metaclass_IMUState): + """Message class 'IMUState'.""" + + __slots__ = [ + '_quaternion', + '_gyroscope', + '_accelerometer', + '_rpy', + '_temperature', + ] + + _fields_and_field_types = { + 'quaternion': 'float[4]', + 'gyroscope': 'float[3]', + 'accelerometer': 'float[3]', + 'rpy': 'float[3]', + 'temperature': 'int8', + } + + SLOT_TYPES = ( + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 4), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.BasicType('int8'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + if 'quaternion' not in kwargs: + self.quaternion = numpy.zeros(4, dtype=numpy.float32) + else: + self.quaternion = numpy.array(kwargs.get('quaternion'), dtype=numpy.float32) + assert self.quaternion.shape == (4, ) + if 'gyroscope' not in kwargs: + self.gyroscope = numpy.zeros(3, dtype=numpy.float32) + else: + self.gyroscope = numpy.array(kwargs.get('gyroscope'), dtype=numpy.float32) + assert self.gyroscope.shape == (3, ) + if 'accelerometer' not in kwargs: + self.accelerometer = numpy.zeros(3, dtype=numpy.float32) + else: + self.accelerometer = numpy.array(kwargs.get('accelerometer'), dtype=numpy.float32) + assert self.accelerometer.shape == (3, ) + if 'rpy' not in kwargs: + self.rpy = numpy.zeros(3, dtype=numpy.float32) + else: + self.rpy = numpy.array(kwargs.get('rpy'), dtype=numpy.float32) + assert self.rpy.shape == (3, ) + self.temperature = kwargs.get('temperature', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if all(self.quaternion != other.quaternion): + return False + if all(self.gyroscope != other.gyroscope): + return False + if all(self.accelerometer != other.accelerometer): + return False + if all(self.rpy != other.rpy): + return False + if self.temperature != other.temperature: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def quaternion(self): + """Message field 'quaternion'.""" + return self._quaternion + + @quaternion.setter + def quaternion(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'quaternion' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 4, \ + "The 'quaternion' numpy.ndarray() must have a size of 4" + self._quaternion = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 4 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'quaternion' field must be a set or sequence with length 4 and each value of type 'float'" + self._quaternion = numpy.array(value, dtype=numpy.float32) + + @property + def gyroscope(self): + """Message field 'gyroscope'.""" + return self._gyroscope + + @gyroscope.setter + def gyroscope(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'gyroscope' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'gyroscope' numpy.ndarray() must have a size of 3" + self._gyroscope = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'gyroscope' field must be a set or sequence with length 3 and each value of type 'float'" + self._gyroscope = numpy.array(value, dtype=numpy.float32) + + @property + def accelerometer(self): + """Message field 'accelerometer'.""" + return self._accelerometer + + @accelerometer.setter + def accelerometer(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'accelerometer' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'accelerometer' numpy.ndarray() must have a size of 3" + self._accelerometer = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'accelerometer' field must be a set or sequence with length 3 and each value of type 'float'" + self._accelerometer = numpy.array(value, dtype=numpy.float32) + + @property + def rpy(self): + """Message field 'rpy'.""" + return self._rpy + + @rpy.setter + def rpy(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'rpy' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'rpy' numpy.ndarray() must have a size of 3" + self._rpy = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'rpy' field must be a set or sequence with length 3 and each value of type 'float'" + self._rpy = numpy.array(value, dtype=numpy.float32) + + @property + def temperature(self): + """Message field 'temperature'.""" + return self._temperature + + @temperature.setter + def temperature(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'temperature' field must be of type 'int'" + assert value >= -128 and value < 128, \ + "The 'temperature' field must be an integer in [-128, 127]" + self._temperature = value diff --git a/python/unitree_go/msg/_imu_state_s.c b/python/unitree_go/msg/_imu_state_s.c new file mode 100644 index 0000000..55cdeb7 --- /dev/null +++ b/python/unitree_go/msg/_imu_state_s.c @@ -0,0 +1,269 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/IMUState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/imu_state__struct.h" +#include "unitree_go/msg/detail/imu_state__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__imu_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[35]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._imu_state.IMUState", full_classname_dest, 34) == 0); + } + unitree_go__msg__IMUState * ros_message = _ros_message; + { // quaternion + PyObject * field = PyObject_GetAttrString(_pymsg, "quaternion"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 4; + float * dest = ros_message->quaternion; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // gyroscope + PyObject * field = PyObject_GetAttrString(_pymsg, "gyroscope"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->gyroscope; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // accelerometer + PyObject * field = PyObject_GetAttrString(_pymsg, "accelerometer"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->accelerometer; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // rpy + PyObject * field = PyObject_GetAttrString(_pymsg, "rpy"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->rpy; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // temperature + PyObject * field = PyObject_GetAttrString(_pymsg, "temperature"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->temperature = (int8_t)PyLong_AsLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__imu_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of IMUState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._imu_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "IMUState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__IMUState * ros_message = (unitree_go__msg__IMUState *)raw_ros_message; + { // quaternion + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "quaternion"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->quaternion[0]); + memcpy(dst, src, 4 * sizeof(float)); + Py_DECREF(field); + } + { // gyroscope + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "gyroscope"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->gyroscope[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // accelerometer + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "accelerometer"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->accelerometer[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // rpy + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "rpy"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->rpy[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // temperature + PyObject * field = NULL; + field = PyLong_FromLong(ros_message->temperature); + { + int rc = PyObject_SetAttrString(_pymessage, "temperature", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_interface_config.py b/python/unitree_go/msg/_interface_config.py new file mode 100644 index 0000000..cee6940 --- /dev/null +++ b/python/unitree_go/msg/_interface_config.py @@ -0,0 +1,189 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/InterfaceConfig.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'reserve' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_InterfaceConfig(type): + """Metaclass of message 'InterfaceConfig'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.InterfaceConfig') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__interface_config + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__interface_config + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__interface_config + cls._TYPE_SUPPORT = module.type_support_msg__msg__interface_config + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__interface_config + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class InterfaceConfig(metaclass=Metaclass_InterfaceConfig): + """Message class 'InterfaceConfig'.""" + + __slots__ = [ + '_mode', + '_value', + '_reserve', + ] + + _fields_and_field_types = { + 'mode': 'uint8', + 'value': 'uint8', + 'reserve': 'uint8[2]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 2), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.mode = kwargs.get('mode', int()) + self.value = kwargs.get('value', int()) + if 'reserve' not in kwargs: + self.reserve = numpy.zeros(2, dtype=numpy.uint8) + else: + self.reserve = numpy.array(kwargs.get('reserve'), dtype=numpy.uint8) + assert self.reserve.shape == (2, ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.mode != other.mode: + return False + if self.value != other.value: + return False + if all(self.reserve != other.reserve): + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def mode(self): + """Message field 'mode'.""" + return self._mode + + @mode.setter + def mode(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'mode' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'mode' field must be an unsigned integer in [0, 255]" + self._mode = value + + @property + def value(self): + """Message field 'value'.""" + return self._value + + @value.setter + def value(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'value' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'value' field must be an unsigned integer in [0, 255]" + self._value = value + + @property + def reserve(self): + """Message field 'reserve'.""" + return self._reserve + + @reserve.setter + def reserve(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'reserve' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 2, \ + "The 'reserve' numpy.ndarray() must have a size of 2" + self._reserve = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'reserve' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 255]" + self._reserve = numpy.array(value, dtype=numpy.uint8) diff --git a/python/unitree_go/msg/_interface_config_s.c b/python/unitree_go/msg/_interface_config_s.c new file mode 100644 index 0000000..024a5c5 --- /dev/null +++ b/python/unitree_go/msg/_interface_config_s.c @@ -0,0 +1,163 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/InterfaceConfig.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/interface_config__struct.h" +#include "unitree_go/msg/detail/interface_config__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__interface_config__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[49]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._interface_config.InterfaceConfig", full_classname_dest, 48) == 0); + } + unitree_go__msg__InterfaceConfig * ros_message = _ros_message; + { // mode + PyObject * field = PyObject_GetAttrString(_pymsg, "mode"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->mode = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // value + PyObject * field = PyObject_GetAttrString(_pymsg, "value"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->value = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "reserve"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 2; + uint8_t * dest = ros_message->reserve; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__interface_config__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of InterfaceConfig */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._interface_config"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "InterfaceConfig"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__InterfaceConfig * ros_message = (unitree_go__msg__InterfaceConfig *)raw_ros_message; + { // mode + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->mode); + { + int rc = PyObject_SetAttrString(_pymessage, "mode", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // value + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->value); + { + int rc = PyObject_SetAttrString(_pymessage, "value", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // reserve + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "reserve"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->reserve[0]); + memcpy(dst, src, 2 * sizeof(uint8_t)); + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_lidar_state.py b/python/unitree_go/msg/_lidar_state.py new file mode 100644 index 0000000..6b6da0b --- /dev/null +++ b/python/unitree_go/msg/_lidar_state.py @@ -0,0 +1,461 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/LidarState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'imu_rpy' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_LidarState(type): + """Metaclass of message 'LidarState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.LidarState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__lidar_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__lidar_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__lidar_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__lidar_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__lidar_state + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class LidarState(metaclass=Metaclass_LidarState): + """Message class 'LidarState'.""" + + __slots__ = [ + '_stamp', + '_firmware_version', + '_software_version', + '_sdk_version', + '_sys_rotation_speed', + '_com_rotation_speed', + '_error_state', + '_cloud_frequency', + '_cloud_packet_loss_rate', + '_cloud_size', + '_cloud_scan_num', + '_imu_frequency', + '_imu_packet_loss_rate', + '_imu_rpy', + '_serial_recv_stamp', + '_serial_buffer_size', + '_serial_buffer_read', + ] + + _fields_and_field_types = { + 'stamp': 'double', + 'firmware_version': 'string', + 'software_version': 'string', + 'sdk_version': 'string', + 'sys_rotation_speed': 'float', + 'com_rotation_speed': 'float', + 'error_state': 'uint8', + 'cloud_frequency': 'float', + 'cloud_packet_loss_rate': 'float', + 'cloud_size': 'uint32', + 'cloud_scan_num': 'uint32', + 'imu_frequency': 'float', + 'imu_packet_loss_rate': 'float', + 'imu_rpy': 'float[3]', + 'serial_recv_stamp': 'double', + 'serial_buffer_size': 'uint32', + 'serial_buffer_read': 'uint32', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('double'), # noqa: E501 + rosidl_parser.definition.UnboundedString(), # noqa: E501 + rosidl_parser.definition.UnboundedString(), # noqa: E501 + rosidl_parser.definition.UnboundedString(), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.BasicType('double'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.stamp = kwargs.get('stamp', float()) + self.firmware_version = kwargs.get('firmware_version', str()) + self.software_version = kwargs.get('software_version', str()) + self.sdk_version = kwargs.get('sdk_version', str()) + self.sys_rotation_speed = kwargs.get('sys_rotation_speed', float()) + self.com_rotation_speed = kwargs.get('com_rotation_speed', float()) + self.error_state = kwargs.get('error_state', int()) + self.cloud_frequency = kwargs.get('cloud_frequency', float()) + self.cloud_packet_loss_rate = kwargs.get('cloud_packet_loss_rate', float()) + self.cloud_size = kwargs.get('cloud_size', int()) + self.cloud_scan_num = kwargs.get('cloud_scan_num', int()) + self.imu_frequency = kwargs.get('imu_frequency', float()) + self.imu_packet_loss_rate = kwargs.get('imu_packet_loss_rate', float()) + if 'imu_rpy' not in kwargs: + self.imu_rpy = numpy.zeros(3, dtype=numpy.float32) + else: + self.imu_rpy = numpy.array(kwargs.get('imu_rpy'), dtype=numpy.float32) + assert self.imu_rpy.shape == (3, ) + self.serial_recv_stamp = kwargs.get('serial_recv_stamp', float()) + self.serial_buffer_size = kwargs.get('serial_buffer_size', int()) + self.serial_buffer_read = kwargs.get('serial_buffer_read', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.stamp != other.stamp: + return False + if self.firmware_version != other.firmware_version: + return False + if self.software_version != other.software_version: + return False + if self.sdk_version != other.sdk_version: + return False + if self.sys_rotation_speed != other.sys_rotation_speed: + return False + if self.com_rotation_speed != other.com_rotation_speed: + return False + if self.error_state != other.error_state: + return False + if self.cloud_frequency != other.cloud_frequency: + return False + if self.cloud_packet_loss_rate != other.cloud_packet_loss_rate: + return False + if self.cloud_size != other.cloud_size: + return False + if self.cloud_scan_num != other.cloud_scan_num: + return False + if self.imu_frequency != other.imu_frequency: + return False + if self.imu_packet_loss_rate != other.imu_packet_loss_rate: + return False + if all(self.imu_rpy != other.imu_rpy): + return False + if self.serial_recv_stamp != other.serial_recv_stamp: + return False + if self.serial_buffer_size != other.serial_buffer_size: + return False + if self.serial_buffer_read != other.serial_buffer_read: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def stamp(self): + """Message field 'stamp'.""" + return self._stamp + + @stamp.setter + def stamp(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'stamp' field must be of type 'float'" + self._stamp = value + + @property + def firmware_version(self): + """Message field 'firmware_version'.""" + return self._firmware_version + + @firmware_version.setter + def firmware_version(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'firmware_version' field must be of type 'str'" + self._firmware_version = value + + @property + def software_version(self): + """Message field 'software_version'.""" + return self._software_version + + @software_version.setter + def software_version(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'software_version' field must be of type 'str'" + self._software_version = value + + @property + def sdk_version(self): + """Message field 'sdk_version'.""" + return self._sdk_version + + @sdk_version.setter + def sdk_version(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'sdk_version' field must be of type 'str'" + self._sdk_version = value + + @property + def sys_rotation_speed(self): + """Message field 'sys_rotation_speed'.""" + return self._sys_rotation_speed + + @sys_rotation_speed.setter + def sys_rotation_speed(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'sys_rotation_speed' field must be of type 'float'" + self._sys_rotation_speed = value + + @property + def com_rotation_speed(self): + """Message field 'com_rotation_speed'.""" + return self._com_rotation_speed + + @com_rotation_speed.setter + def com_rotation_speed(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'com_rotation_speed' field must be of type 'float'" + self._com_rotation_speed = value + + @property + def error_state(self): + """Message field 'error_state'.""" + return self._error_state + + @error_state.setter + def error_state(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'error_state' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'error_state' field must be an unsigned integer in [0, 255]" + self._error_state = value + + @property + def cloud_frequency(self): + """Message field 'cloud_frequency'.""" + return self._cloud_frequency + + @cloud_frequency.setter + def cloud_frequency(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'cloud_frequency' field must be of type 'float'" + self._cloud_frequency = value + + @property + def cloud_packet_loss_rate(self): + """Message field 'cloud_packet_loss_rate'.""" + return self._cloud_packet_loss_rate + + @cloud_packet_loss_rate.setter + def cloud_packet_loss_rate(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'cloud_packet_loss_rate' field must be of type 'float'" + self._cloud_packet_loss_rate = value + + @property + def cloud_size(self): + """Message field 'cloud_size'.""" + return self._cloud_size + + @cloud_size.setter + def cloud_size(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'cloud_size' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'cloud_size' field must be an unsigned integer in [0, 4294967295]" + self._cloud_size = value + + @property + def cloud_scan_num(self): + """Message field 'cloud_scan_num'.""" + return self._cloud_scan_num + + @cloud_scan_num.setter + def cloud_scan_num(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'cloud_scan_num' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'cloud_scan_num' field must be an unsigned integer in [0, 4294967295]" + self._cloud_scan_num = value + + @property + def imu_frequency(self): + """Message field 'imu_frequency'.""" + return self._imu_frequency + + @imu_frequency.setter + def imu_frequency(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'imu_frequency' field must be of type 'float'" + self._imu_frequency = value + + @property + def imu_packet_loss_rate(self): + """Message field 'imu_packet_loss_rate'.""" + return self._imu_packet_loss_rate + + @imu_packet_loss_rate.setter + def imu_packet_loss_rate(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'imu_packet_loss_rate' field must be of type 'float'" + self._imu_packet_loss_rate = value + + @property + def imu_rpy(self): + """Message field 'imu_rpy'.""" + return self._imu_rpy + + @imu_rpy.setter + def imu_rpy(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'imu_rpy' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'imu_rpy' numpy.ndarray() must have a size of 3" + self._imu_rpy = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'imu_rpy' field must be a set or sequence with length 3 and each value of type 'float'" + self._imu_rpy = numpy.array(value, dtype=numpy.float32) + + @property + def serial_recv_stamp(self): + """Message field 'serial_recv_stamp'.""" + return self._serial_recv_stamp + + @serial_recv_stamp.setter + def serial_recv_stamp(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'serial_recv_stamp' field must be of type 'float'" + self._serial_recv_stamp = value + + @property + def serial_buffer_size(self): + """Message field 'serial_buffer_size'.""" + return self._serial_buffer_size + + @serial_buffer_size.setter + def serial_buffer_size(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'serial_buffer_size' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'serial_buffer_size' field must be an unsigned integer in [0, 4294967295]" + self._serial_buffer_size = value + + @property + def serial_buffer_read(self): + """Message field 'serial_buffer_read'.""" + return self._serial_buffer_read + + @serial_buffer_read.setter + def serial_buffer_read(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'serial_buffer_read' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'serial_buffer_read' field must be an unsigned integer in [0, 4294967295]" + self._serial_buffer_read = value diff --git a/python/unitree_go/msg/_lidar_state_s.c b/python/unitree_go/msg/_lidar_state_s.c new file mode 100644 index 0000000..fe94967 --- /dev/null +++ b/python/unitree_go/msg/_lidar_state_s.c @@ -0,0 +1,482 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/LidarState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/lidar_state__struct.h" +#include "unitree_go/msg/detail/lidar_state__functions.h" + +#include "rosidl_runtime_c/string.h" +#include "rosidl_runtime_c/string_functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__lidar_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[39]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._lidar_state.LidarState", full_classname_dest, 38) == 0); + } + unitree_go__msg__LidarState * ros_message = _ros_message; + { // stamp + PyObject * field = PyObject_GetAttrString(_pymsg, "stamp"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->stamp = PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // firmware_version + PyObject * field = PyObject_GetAttrString(_pymsg, "firmware_version"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->firmware_version, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + { // software_version + PyObject * field = PyObject_GetAttrString(_pymsg, "software_version"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->software_version, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + { // sdk_version + PyObject * field = PyObject_GetAttrString(_pymsg, "sdk_version"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->sdk_version, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + { // sys_rotation_speed + PyObject * field = PyObject_GetAttrString(_pymsg, "sys_rotation_speed"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->sys_rotation_speed = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // com_rotation_speed + PyObject * field = PyObject_GetAttrString(_pymsg, "com_rotation_speed"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->com_rotation_speed = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // error_state + PyObject * field = PyObject_GetAttrString(_pymsg, "error_state"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->error_state = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // cloud_frequency + PyObject * field = PyObject_GetAttrString(_pymsg, "cloud_frequency"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->cloud_frequency = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // cloud_packet_loss_rate + PyObject * field = PyObject_GetAttrString(_pymsg, "cloud_packet_loss_rate"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->cloud_packet_loss_rate = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // cloud_size + PyObject * field = PyObject_GetAttrString(_pymsg, "cloud_size"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->cloud_size = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // cloud_scan_num + PyObject * field = PyObject_GetAttrString(_pymsg, "cloud_scan_num"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->cloud_scan_num = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // imu_frequency + PyObject * field = PyObject_GetAttrString(_pymsg, "imu_frequency"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->imu_frequency = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // imu_packet_loss_rate + PyObject * field = PyObject_GetAttrString(_pymsg, "imu_packet_loss_rate"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->imu_packet_loss_rate = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // imu_rpy + PyObject * field = PyObject_GetAttrString(_pymsg, "imu_rpy"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->imu_rpy; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // serial_recv_stamp + PyObject * field = PyObject_GetAttrString(_pymsg, "serial_recv_stamp"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->serial_recv_stamp = PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // serial_buffer_size + PyObject * field = PyObject_GetAttrString(_pymsg, "serial_buffer_size"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->serial_buffer_size = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // serial_buffer_read + PyObject * field = PyObject_GetAttrString(_pymsg, "serial_buffer_read"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->serial_buffer_read = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__lidar_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of LidarState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._lidar_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "LidarState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__LidarState * ros_message = (unitree_go__msg__LidarState *)raw_ros_message; + { // stamp + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->stamp); + { + int rc = PyObject_SetAttrString(_pymessage, "stamp", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // firmware_version + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->firmware_version.data, + strlen(ros_message->firmware_version.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "firmware_version", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // software_version + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->software_version.data, + strlen(ros_message->software_version.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "software_version", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // sdk_version + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->sdk_version.data, + strlen(ros_message->sdk_version.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "sdk_version", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // sys_rotation_speed + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->sys_rotation_speed); + { + int rc = PyObject_SetAttrString(_pymessage, "sys_rotation_speed", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // com_rotation_speed + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->com_rotation_speed); + { + int rc = PyObject_SetAttrString(_pymessage, "com_rotation_speed", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // error_state + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->error_state); + { + int rc = PyObject_SetAttrString(_pymessage, "error_state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // cloud_frequency + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->cloud_frequency); + { + int rc = PyObject_SetAttrString(_pymessage, "cloud_frequency", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // cloud_packet_loss_rate + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->cloud_packet_loss_rate); + { + int rc = PyObject_SetAttrString(_pymessage, "cloud_packet_loss_rate", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // cloud_size + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->cloud_size); + { + int rc = PyObject_SetAttrString(_pymessage, "cloud_size", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // cloud_scan_num + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->cloud_scan_num); + { + int rc = PyObject_SetAttrString(_pymessage, "cloud_scan_num", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // imu_frequency + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->imu_frequency); + { + int rc = PyObject_SetAttrString(_pymessage, "imu_frequency", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // imu_packet_loss_rate + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->imu_packet_loss_rate); + { + int rc = PyObject_SetAttrString(_pymessage, "imu_packet_loss_rate", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // imu_rpy + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "imu_rpy"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->imu_rpy[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // serial_recv_stamp + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->serial_recv_stamp); + { + int rc = PyObject_SetAttrString(_pymessage, "serial_recv_stamp", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // serial_buffer_size + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->serial_buffer_size); + { + int rc = PyObject_SetAttrString(_pymessage, "serial_buffer_size", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // serial_buffer_read + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->serial_buffer_read); + { + int rc = PyObject_SetAttrString(_pymessage, "serial_buffer_read", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_low_cmd.py b/python/unitree_go/msg/_low_cmd.py new file mode 100644 index 0000000..566e4de --- /dev/null +++ b/python/unitree_go/msg/_low_cmd.py @@ -0,0 +1,547 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/LowCmd.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'head' +# Member 'sn' +# Member 'version' +# Member 'wireless_remote' +# Member 'led' +# Member 'fan' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_LowCmd(type): + """Metaclass of message 'LowCmd'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.LowCmd') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__low_cmd + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__low_cmd + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__low_cmd + cls._TYPE_SUPPORT = module.type_support_msg__msg__low_cmd + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__low_cmd + + from unitree_go.msg import BmsCmd + if BmsCmd.__class__._TYPE_SUPPORT is None: + BmsCmd.__class__.__import_type_support__() + + from unitree_go.msg import MotorCmd + if MotorCmd.__class__._TYPE_SUPPORT is None: + MotorCmd.__class__.__import_type_support__() + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class LowCmd(metaclass=Metaclass_LowCmd): + """Message class 'LowCmd'.""" + + __slots__ = [ + '_head', + '_level_flag', + '_frame_reserve', + '_sn', + '_version', + '_bandwidth', + '_motor_cmd', + '_bms_cmd', + '_wireless_remote', + '_led', + '_fan', + '_gpio', + '_reserve', + '_crc', + ] + + _fields_and_field_types = { + 'head': 'uint8[2]', + 'level_flag': 'uint8', + 'frame_reserve': 'uint8', + 'sn': 'uint32[2]', + 'version': 'uint32[2]', + 'bandwidth': 'uint16', + 'motor_cmd': 'unitree_go/MotorCmd[20]', + 'bms_cmd': 'unitree_go/BmsCmd', + 'wireless_remote': 'uint8[40]', + 'led': 'uint8[12]', + 'fan': 'uint8[2]', + 'gpio': 'uint8', + 'reserve': 'uint32', + 'crc': 'uint32', + } + + SLOT_TYPES = ( + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint32'), 2), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint32'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint16'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'MotorCmd'), 20), # noqa: E501 + rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'BmsCmd'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 40), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 12), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + if 'head' not in kwargs: + self.head = numpy.zeros(2, dtype=numpy.uint8) + else: + self.head = numpy.array(kwargs.get('head'), dtype=numpy.uint8) + assert self.head.shape == (2, ) + self.level_flag = kwargs.get('level_flag', int()) + self.frame_reserve = kwargs.get('frame_reserve', int()) + if 'sn' not in kwargs: + self.sn = numpy.zeros(2, dtype=numpy.uint32) + else: + self.sn = numpy.array(kwargs.get('sn'), dtype=numpy.uint32) + assert self.sn.shape == (2, ) + if 'version' not in kwargs: + self.version = numpy.zeros(2, dtype=numpy.uint32) + else: + self.version = numpy.array(kwargs.get('version'), dtype=numpy.uint32) + assert self.version.shape == (2, ) + self.bandwidth = kwargs.get('bandwidth', int()) + from unitree_go.msg import MotorCmd + self.motor_cmd = kwargs.get( + 'motor_cmd', + [MotorCmd() for x in range(20)] + ) + from unitree_go.msg import BmsCmd + self.bms_cmd = kwargs.get('bms_cmd', BmsCmd()) + if 'wireless_remote' not in kwargs: + self.wireless_remote = numpy.zeros(40, dtype=numpy.uint8) + else: + self.wireless_remote = numpy.array(kwargs.get('wireless_remote'), dtype=numpy.uint8) + assert self.wireless_remote.shape == (40, ) + if 'led' not in kwargs: + self.led = numpy.zeros(12, dtype=numpy.uint8) + else: + self.led = numpy.array(kwargs.get('led'), dtype=numpy.uint8) + assert self.led.shape == (12, ) + if 'fan' not in kwargs: + self.fan = numpy.zeros(2, dtype=numpy.uint8) + else: + self.fan = numpy.array(kwargs.get('fan'), dtype=numpy.uint8) + assert self.fan.shape == (2, ) + self.gpio = kwargs.get('gpio', int()) + self.reserve = kwargs.get('reserve', int()) + self.crc = kwargs.get('crc', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if all(self.head != other.head): + return False + if self.level_flag != other.level_flag: + return False + if self.frame_reserve != other.frame_reserve: + return False + if all(self.sn != other.sn): + return False + if all(self.version != other.version): + return False + if self.bandwidth != other.bandwidth: + return False + if self.motor_cmd != other.motor_cmd: + return False + if self.bms_cmd != other.bms_cmd: + return False + if all(self.wireless_remote != other.wireless_remote): + return False + if all(self.led != other.led): + return False + if all(self.fan != other.fan): + return False + if self.gpio != other.gpio: + return False + if self.reserve != other.reserve: + return False + if self.crc != other.crc: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def head(self): + """Message field 'head'.""" + return self._head + + @head.setter + def head(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'head' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 2, \ + "The 'head' numpy.ndarray() must have a size of 2" + self._head = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'head' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 255]" + self._head = numpy.array(value, dtype=numpy.uint8) + + @property + def level_flag(self): + """Message field 'level_flag'.""" + return self._level_flag + + @level_flag.setter + def level_flag(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'level_flag' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'level_flag' field must be an unsigned integer in [0, 255]" + self._level_flag = value + + @property + def frame_reserve(self): + """Message field 'frame_reserve'.""" + return self._frame_reserve + + @frame_reserve.setter + def frame_reserve(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'frame_reserve' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'frame_reserve' field must be an unsigned integer in [0, 255]" + self._frame_reserve = value + + @property + def sn(self): + """Message field 'sn'.""" + return self._sn + + @sn.setter + def sn(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint32, \ + "The 'sn' numpy.ndarray() must have the dtype of 'numpy.uint32'" + assert value.size == 2, \ + "The 'sn' numpy.ndarray() must have a size of 2" + self._sn = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 4294967296 for val in value)), \ + "The 'sn' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 4294967295]" + self._sn = numpy.array(value, dtype=numpy.uint32) + + @property + def version(self): + """Message field 'version'.""" + return self._version + + @version.setter + def version(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint32, \ + "The 'version' numpy.ndarray() must have the dtype of 'numpy.uint32'" + assert value.size == 2, \ + "The 'version' numpy.ndarray() must have a size of 2" + self._version = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 4294967296 for val in value)), \ + "The 'version' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 4294967295]" + self._version = numpy.array(value, dtype=numpy.uint32) + + @property + def bandwidth(self): + """Message field 'bandwidth'.""" + return self._bandwidth + + @bandwidth.setter + def bandwidth(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'bandwidth' field must be of type 'int'" + assert value >= 0 and value < 65536, \ + "The 'bandwidth' field must be an unsigned integer in [0, 65535]" + self._bandwidth = value + + @property + def motor_cmd(self): + """Message field 'motor_cmd'.""" + return self._motor_cmd + + @motor_cmd.setter + def motor_cmd(self, value): + if __debug__: + from unitree_go.msg import MotorCmd + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 20 and + all(isinstance(v, MotorCmd) for v in value) and + True), \ + "The 'motor_cmd' field must be a set or sequence with length 20 and each value of type 'MotorCmd'" + self._motor_cmd = value + + @property + def bms_cmd(self): + """Message field 'bms_cmd'.""" + return self._bms_cmd + + @bms_cmd.setter + def bms_cmd(self, value): + if __debug__: + from unitree_go.msg import BmsCmd + assert \ + isinstance(value, BmsCmd), \ + "The 'bms_cmd' field must be a sub message of type 'BmsCmd'" + self._bms_cmd = value + + @property + def wireless_remote(self): + """Message field 'wireless_remote'.""" + return self._wireless_remote + + @wireless_remote.setter + def wireless_remote(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'wireless_remote' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 40, \ + "The 'wireless_remote' numpy.ndarray() must have a size of 40" + self._wireless_remote = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 40 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'wireless_remote' field must be a set or sequence with length 40 and each value of type 'int' and each unsigned integer in [0, 255]" + self._wireless_remote = numpy.array(value, dtype=numpy.uint8) + + @property + def led(self): + """Message field 'led'.""" + return self._led + + @led.setter + def led(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'led' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 12, \ + "The 'led' numpy.ndarray() must have a size of 12" + self._led = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 12 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'led' field must be a set or sequence with length 12 and each value of type 'int' and each unsigned integer in [0, 255]" + self._led = numpy.array(value, dtype=numpy.uint8) + + @property + def fan(self): + """Message field 'fan'.""" + return self._fan + + @fan.setter + def fan(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'fan' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 2, \ + "The 'fan' numpy.ndarray() must have a size of 2" + self._fan = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'fan' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 255]" + self._fan = numpy.array(value, dtype=numpy.uint8) + + @property + def gpio(self): + """Message field 'gpio'.""" + return self._gpio + + @gpio.setter + def gpio(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'gpio' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'gpio' field must be an unsigned integer in [0, 255]" + self._gpio = value + + @property + def reserve(self): + """Message field 'reserve'.""" + return self._reserve + + @reserve.setter + def reserve(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'reserve' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'reserve' field must be an unsigned integer in [0, 4294967295]" + self._reserve = value + + @property + def crc(self): + """Message field 'crc'.""" + return self._crc + + @crc.setter + def crc(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'crc' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'crc' field must be an unsigned integer in [0, 4294967295]" + self._crc = value diff --git a/python/unitree_go/msg/_low_cmd_s.c b/python/unitree_go/msg/_low_cmd_s.c new file mode 100644 index 0000000..d868365 --- /dev/null +++ b/python/unitree_go/msg/_low_cmd_s.c @@ -0,0 +1,535 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/LowCmd.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/low_cmd__struct.h" +#include "unitree_go/msg/detail/low_cmd__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + +// Nested array functions includes +#include "unitree_go/msg/detail/motor_cmd__functions.h" +// end nested array functions include +bool unitree_go__msg__motor_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__motor_cmd__convert_to_py(void * raw_ros_message); +bool unitree_go__msg__bms_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__bms_cmd__convert_to_py(void * raw_ros_message); + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__low_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[31]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._low_cmd.LowCmd", full_classname_dest, 30) == 0); + } + unitree_go__msg__LowCmd * ros_message = _ros_message; + { // head + PyObject * field = PyObject_GetAttrString(_pymsg, "head"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 2; + uint8_t * dest = ros_message->head; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // level_flag + PyObject * field = PyObject_GetAttrString(_pymsg, "level_flag"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->level_flag = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // frame_reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "frame_reserve"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->frame_reserve = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // sn + PyObject * field = PyObject_GetAttrString(_pymsg, "sn"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + Py_ssize_t size = 2; + uint32_t * dest = ros_message->sn; + for (Py_ssize_t i = 0; i < size; ++i) { + uint32_t tmp = *(npy_uint32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint32_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // version + PyObject * field = PyObject_GetAttrString(_pymsg, "version"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + Py_ssize_t size = 2; + uint32_t * dest = ros_message->version; + for (Py_ssize_t i = 0; i < size; ++i) { + uint32_t tmp = *(npy_uint32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint32_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // bandwidth + PyObject * field = PyObject_GetAttrString(_pymsg, "bandwidth"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->bandwidth = (uint16_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // motor_cmd + PyObject * field = PyObject_GetAttrString(_pymsg, "motor_cmd"); + if (!field) { + return false; + } + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'motor_cmd'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = 20; + unitree_go__msg__MotorCmd * dest = ros_message->motor_cmd; + for (Py_ssize_t i = 0; i < size; ++i) { + if (!unitree_go__msg__motor_cmd__convert_from_py(PySequence_Fast_GET_ITEM(seq_field, i), &dest[i])) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + } + Py_DECREF(seq_field); + Py_DECREF(field); + } + { // bms_cmd + PyObject * field = PyObject_GetAttrString(_pymsg, "bms_cmd"); + if (!field) { + return false; + } + if (!unitree_go__msg__bms_cmd__convert_from_py(field, &ros_message->bms_cmd)) { + Py_DECREF(field); + return false; + } + Py_DECREF(field); + } + { // wireless_remote + PyObject * field = PyObject_GetAttrString(_pymsg, "wireless_remote"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 40; + uint8_t * dest = ros_message->wireless_remote; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // led + PyObject * field = PyObject_GetAttrString(_pymsg, "led"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 12; + uint8_t * dest = ros_message->led; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // fan + PyObject * field = PyObject_GetAttrString(_pymsg, "fan"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 2; + uint8_t * dest = ros_message->fan; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // gpio + PyObject * field = PyObject_GetAttrString(_pymsg, "gpio"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->gpio = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "reserve"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->reserve = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // crc + PyObject * field = PyObject_GetAttrString(_pymsg, "crc"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->crc = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__low_cmd__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of LowCmd */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._low_cmd"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "LowCmd"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__LowCmd * ros_message = (unitree_go__msg__LowCmd *)raw_ros_message; + { // head + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "head"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->head[0]); + memcpy(dst, src, 2 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // level_flag + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->level_flag); + { + int rc = PyObject_SetAttrString(_pymessage, "level_flag", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // frame_reserve + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->frame_reserve); + { + int rc = PyObject_SetAttrString(_pymessage, "frame_reserve", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // sn + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "sn"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + assert(sizeof(npy_uint32) == sizeof(uint32_t)); + npy_uint32 * dst = (npy_uint32 *)PyArray_GETPTR1(seq_field, 0); + uint32_t * src = &(ros_message->sn[0]); + memcpy(dst, src, 2 * sizeof(uint32_t)); + Py_DECREF(field); + } + { // version + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "version"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + assert(sizeof(npy_uint32) == sizeof(uint32_t)); + npy_uint32 * dst = (npy_uint32 *)PyArray_GETPTR1(seq_field, 0); + uint32_t * src = &(ros_message->version[0]); + memcpy(dst, src, 2 * sizeof(uint32_t)); + Py_DECREF(field); + } + { // bandwidth + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->bandwidth); + { + int rc = PyObject_SetAttrString(_pymessage, "bandwidth", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // motor_cmd + PyObject * field = NULL; + size_t size = 20; + field = PyList_New(size); + if (!field) { + return NULL; + } + unitree_go__msg__MotorCmd * item; + for (size_t i = 0; i < size; ++i) { + item = &(ros_message->motor_cmd[i]); + PyObject * pyitem = unitree_go__msg__motor_cmd__convert_to_py(item); + if (!pyitem) { + Py_DECREF(field); + return NULL; + } + int rc = PyList_SetItem(field, i, pyitem); + (void)rc; + assert(rc == 0); + } + assert(PySequence_Check(field)); + { + int rc = PyObject_SetAttrString(_pymessage, "motor_cmd", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // bms_cmd + PyObject * field = NULL; + field = unitree_go__msg__bms_cmd__convert_to_py(&ros_message->bms_cmd); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "bms_cmd", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // wireless_remote + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "wireless_remote"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->wireless_remote[0]); + memcpy(dst, src, 40 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // led + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "led"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->led[0]); + memcpy(dst, src, 12 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // fan + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "fan"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->fan[0]); + memcpy(dst, src, 2 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // gpio + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->gpio); + { + int rc = PyObject_SetAttrString(_pymessage, "gpio", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // reserve + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->reserve); + { + int rc = PyObject_SetAttrString(_pymessage, "reserve", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // crc + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->crc); + { + int rc = PyObject_SetAttrString(_pymessage, "crc", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_low_state.py b/python/unitree_go/msg/_low_state.py new file mode 100644 index 0000000..6c02bc4 --- /dev/null +++ b/python/unitree_go/msg/_low_state.py @@ -0,0 +1,734 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/LowState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'head' +# Member 'sn' +# Member 'version' +# Member 'foot_force' +# Member 'foot_force_est' +# Member 'wireless_remote' +# Member 'fan_frequency' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_LowState(type): + """Metaclass of message 'LowState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.LowState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__low_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__low_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__low_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__low_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__low_state + + from unitree_go.msg import BmsState + if BmsState.__class__._TYPE_SUPPORT is None: + BmsState.__class__.__import_type_support__() + + from unitree_go.msg import IMUState + if IMUState.__class__._TYPE_SUPPORT is None: + IMUState.__class__.__import_type_support__() + + from unitree_go.msg import MotorState + if MotorState.__class__._TYPE_SUPPORT is None: + MotorState.__class__.__import_type_support__() + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class LowState(metaclass=Metaclass_LowState): + """Message class 'LowState'.""" + + __slots__ = [ + '_head', + '_level_flag', + '_frame_reserve', + '_sn', + '_version', + '_bandwidth', + '_imu_state', + '_motor_state', + '_bms_state', + '_foot_force', + '_foot_force_est', + '_tick', + '_wireless_remote', + '_bit_flag', + '_adc_reel', + '_temperature_ntc1', + '_temperature_ntc2', + '_power_v', + '_power_a', + '_fan_frequency', + '_reserve', + '_crc', + ] + + _fields_and_field_types = { + 'head': 'uint8[2]', + 'level_flag': 'uint8', + 'frame_reserve': 'uint8', + 'sn': 'uint32[2]', + 'version': 'uint32[2]', + 'bandwidth': 'uint16', + 'imu_state': 'unitree_go/IMUState', + 'motor_state': 'unitree_go/MotorState[20]', + 'bms_state': 'unitree_go/BmsState', + 'foot_force': 'int16[4]', + 'foot_force_est': 'int16[4]', + 'tick': 'uint32', + 'wireless_remote': 'uint8[40]', + 'bit_flag': 'uint8', + 'adc_reel': 'float', + 'temperature_ntc1': 'int8', + 'temperature_ntc2': 'int8', + 'power_v': 'float', + 'power_a': 'float', + 'fan_frequency': 'uint16[4]', + 'reserve': 'uint32', + 'crc': 'uint32', + } + + SLOT_TYPES = ( + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint32'), 2), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint32'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint16'), # noqa: E501 + rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'IMUState'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'MotorState'), 20), # noqa: E501 + rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'BmsState'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('int16'), 4), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('int16'), 4), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 40), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('int8'), # noqa: E501 + rosidl_parser.definition.BasicType('int8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint16'), 4), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + if 'head' not in kwargs: + self.head = numpy.zeros(2, dtype=numpy.uint8) + else: + self.head = numpy.array(kwargs.get('head'), dtype=numpy.uint8) + assert self.head.shape == (2, ) + self.level_flag = kwargs.get('level_flag', int()) + self.frame_reserve = kwargs.get('frame_reserve', int()) + if 'sn' not in kwargs: + self.sn = numpy.zeros(2, dtype=numpy.uint32) + else: + self.sn = numpy.array(kwargs.get('sn'), dtype=numpy.uint32) + assert self.sn.shape == (2, ) + if 'version' not in kwargs: + self.version = numpy.zeros(2, dtype=numpy.uint32) + else: + self.version = numpy.array(kwargs.get('version'), dtype=numpy.uint32) + assert self.version.shape == (2, ) + self.bandwidth = kwargs.get('bandwidth', int()) + from unitree_go.msg import IMUState + self.imu_state = kwargs.get('imu_state', IMUState()) + from unitree_go.msg import MotorState + self.motor_state = kwargs.get( + 'motor_state', + [MotorState() for x in range(20)] + ) + from unitree_go.msg import BmsState + self.bms_state = kwargs.get('bms_state', BmsState()) + if 'foot_force' not in kwargs: + self.foot_force = numpy.zeros(4, dtype=numpy.int16) + else: + self.foot_force = numpy.array(kwargs.get('foot_force'), dtype=numpy.int16) + assert self.foot_force.shape == (4, ) + if 'foot_force_est' not in kwargs: + self.foot_force_est = numpy.zeros(4, dtype=numpy.int16) + else: + self.foot_force_est = numpy.array(kwargs.get('foot_force_est'), dtype=numpy.int16) + assert self.foot_force_est.shape == (4, ) + self.tick = kwargs.get('tick', int()) + if 'wireless_remote' not in kwargs: + self.wireless_remote = numpy.zeros(40, dtype=numpy.uint8) + else: + self.wireless_remote = numpy.array(kwargs.get('wireless_remote'), dtype=numpy.uint8) + assert self.wireless_remote.shape == (40, ) + self.bit_flag = kwargs.get('bit_flag', int()) + self.adc_reel = kwargs.get('adc_reel', float()) + self.temperature_ntc1 = kwargs.get('temperature_ntc1', int()) + self.temperature_ntc2 = kwargs.get('temperature_ntc2', int()) + self.power_v = kwargs.get('power_v', float()) + self.power_a = kwargs.get('power_a', float()) + if 'fan_frequency' not in kwargs: + self.fan_frequency = numpy.zeros(4, dtype=numpy.uint16) + else: + self.fan_frequency = numpy.array(kwargs.get('fan_frequency'), dtype=numpy.uint16) + assert self.fan_frequency.shape == (4, ) + self.reserve = kwargs.get('reserve', int()) + self.crc = kwargs.get('crc', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if all(self.head != other.head): + return False + if self.level_flag != other.level_flag: + return False + if self.frame_reserve != other.frame_reserve: + return False + if all(self.sn != other.sn): + return False + if all(self.version != other.version): + return False + if self.bandwidth != other.bandwidth: + return False + if self.imu_state != other.imu_state: + return False + if self.motor_state != other.motor_state: + return False + if self.bms_state != other.bms_state: + return False + if all(self.foot_force != other.foot_force): + return False + if all(self.foot_force_est != other.foot_force_est): + return False + if self.tick != other.tick: + return False + if all(self.wireless_remote != other.wireless_remote): + return False + if self.bit_flag != other.bit_flag: + return False + if self.adc_reel != other.adc_reel: + return False + if self.temperature_ntc1 != other.temperature_ntc1: + return False + if self.temperature_ntc2 != other.temperature_ntc2: + return False + if self.power_v != other.power_v: + return False + if self.power_a != other.power_a: + return False + if all(self.fan_frequency != other.fan_frequency): + return False + if self.reserve != other.reserve: + return False + if self.crc != other.crc: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def head(self): + """Message field 'head'.""" + return self._head + + @head.setter + def head(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'head' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 2, \ + "The 'head' numpy.ndarray() must have a size of 2" + self._head = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'head' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 255]" + self._head = numpy.array(value, dtype=numpy.uint8) + + @property + def level_flag(self): + """Message field 'level_flag'.""" + return self._level_flag + + @level_flag.setter + def level_flag(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'level_flag' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'level_flag' field must be an unsigned integer in [0, 255]" + self._level_flag = value + + @property + def frame_reserve(self): + """Message field 'frame_reserve'.""" + return self._frame_reserve + + @frame_reserve.setter + def frame_reserve(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'frame_reserve' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'frame_reserve' field must be an unsigned integer in [0, 255]" + self._frame_reserve = value + + @property + def sn(self): + """Message field 'sn'.""" + return self._sn + + @sn.setter + def sn(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint32, \ + "The 'sn' numpy.ndarray() must have the dtype of 'numpy.uint32'" + assert value.size == 2, \ + "The 'sn' numpy.ndarray() must have a size of 2" + self._sn = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 4294967296 for val in value)), \ + "The 'sn' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 4294967295]" + self._sn = numpy.array(value, dtype=numpy.uint32) + + @property + def version(self): + """Message field 'version'.""" + return self._version + + @version.setter + def version(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint32, \ + "The 'version' numpy.ndarray() must have the dtype of 'numpy.uint32'" + assert value.size == 2, \ + "The 'version' numpy.ndarray() must have a size of 2" + self._version = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 4294967296 for val in value)), \ + "The 'version' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 4294967295]" + self._version = numpy.array(value, dtype=numpy.uint32) + + @property + def bandwidth(self): + """Message field 'bandwidth'.""" + return self._bandwidth + + @bandwidth.setter + def bandwidth(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'bandwidth' field must be of type 'int'" + assert value >= 0 and value < 65536, \ + "The 'bandwidth' field must be an unsigned integer in [0, 65535]" + self._bandwidth = value + + @property + def imu_state(self): + """Message field 'imu_state'.""" + return self._imu_state + + @imu_state.setter + def imu_state(self, value): + if __debug__: + from unitree_go.msg import IMUState + assert \ + isinstance(value, IMUState), \ + "The 'imu_state' field must be a sub message of type 'IMUState'" + self._imu_state = value + + @property + def motor_state(self): + """Message field 'motor_state'.""" + return self._motor_state + + @motor_state.setter + def motor_state(self, value): + if __debug__: + from unitree_go.msg import MotorState + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 20 and + all(isinstance(v, MotorState) for v in value) and + True), \ + "The 'motor_state' field must be a set or sequence with length 20 and each value of type 'MotorState'" + self._motor_state = value + + @property + def bms_state(self): + """Message field 'bms_state'.""" + return self._bms_state + + @bms_state.setter + def bms_state(self, value): + if __debug__: + from unitree_go.msg import BmsState + assert \ + isinstance(value, BmsState), \ + "The 'bms_state' field must be a sub message of type 'BmsState'" + self._bms_state = value + + @property + def foot_force(self): + """Message field 'foot_force'.""" + return self._foot_force + + @foot_force.setter + def foot_force(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.int16, \ + "The 'foot_force' numpy.ndarray() must have the dtype of 'numpy.int16'" + assert value.size == 4, \ + "The 'foot_force' numpy.ndarray() must have a size of 4" + self._foot_force = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 4 and + all(isinstance(v, int) for v in value) and + all(val >= -32768 and val < 32768 for val in value)), \ + "The 'foot_force' field must be a set or sequence with length 4 and each value of type 'int' and each integer in [-32768, 32767]" + self._foot_force = numpy.array(value, dtype=numpy.int16) + + @property + def foot_force_est(self): + """Message field 'foot_force_est'.""" + return self._foot_force_est + + @foot_force_est.setter + def foot_force_est(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.int16, \ + "The 'foot_force_est' numpy.ndarray() must have the dtype of 'numpy.int16'" + assert value.size == 4, \ + "The 'foot_force_est' numpy.ndarray() must have a size of 4" + self._foot_force_est = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 4 and + all(isinstance(v, int) for v in value) and + all(val >= -32768 and val < 32768 for val in value)), \ + "The 'foot_force_est' field must be a set or sequence with length 4 and each value of type 'int' and each integer in [-32768, 32767]" + self._foot_force_est = numpy.array(value, dtype=numpy.int16) + + @property + def tick(self): + """Message field 'tick'.""" + return self._tick + + @tick.setter + def tick(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'tick' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'tick' field must be an unsigned integer in [0, 4294967295]" + self._tick = value + + @property + def wireless_remote(self): + """Message field 'wireless_remote'.""" + return self._wireless_remote + + @wireless_remote.setter + def wireless_remote(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'wireless_remote' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 40, \ + "The 'wireless_remote' numpy.ndarray() must have a size of 40" + self._wireless_remote = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 40 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'wireless_remote' field must be a set or sequence with length 40 and each value of type 'int' and each unsigned integer in [0, 255]" + self._wireless_remote = numpy.array(value, dtype=numpy.uint8) + + @property + def bit_flag(self): + """Message field 'bit_flag'.""" + return self._bit_flag + + @bit_flag.setter + def bit_flag(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'bit_flag' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'bit_flag' field must be an unsigned integer in [0, 255]" + self._bit_flag = value + + @property + def adc_reel(self): + """Message field 'adc_reel'.""" + return self._adc_reel + + @adc_reel.setter + def adc_reel(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'adc_reel' field must be of type 'float'" + self._adc_reel = value + + @property + def temperature_ntc1(self): + """Message field 'temperature_ntc1'.""" + return self._temperature_ntc1 + + @temperature_ntc1.setter + def temperature_ntc1(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'temperature_ntc1' field must be of type 'int'" + assert value >= -128 and value < 128, \ + "The 'temperature_ntc1' field must be an integer in [-128, 127]" + self._temperature_ntc1 = value + + @property + def temperature_ntc2(self): + """Message field 'temperature_ntc2'.""" + return self._temperature_ntc2 + + @temperature_ntc2.setter + def temperature_ntc2(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'temperature_ntc2' field must be of type 'int'" + assert value >= -128 and value < 128, \ + "The 'temperature_ntc2' field must be an integer in [-128, 127]" + self._temperature_ntc2 = value + + @property + def power_v(self): + """Message field 'power_v'.""" + return self._power_v + + @power_v.setter + def power_v(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'power_v' field must be of type 'float'" + self._power_v = value + + @property + def power_a(self): + """Message field 'power_a'.""" + return self._power_a + + @power_a.setter + def power_a(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'power_a' field must be of type 'float'" + self._power_a = value + + @property + def fan_frequency(self): + """Message field 'fan_frequency'.""" + return self._fan_frequency + + @fan_frequency.setter + def fan_frequency(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint16, \ + "The 'fan_frequency' numpy.ndarray() must have the dtype of 'numpy.uint16'" + assert value.size == 4, \ + "The 'fan_frequency' numpy.ndarray() must have a size of 4" + self._fan_frequency = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 4 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 65536 for val in value)), \ + "The 'fan_frequency' field must be a set or sequence with length 4 and each value of type 'int' and each unsigned integer in [0, 65535]" + self._fan_frequency = numpy.array(value, dtype=numpy.uint16) + + @property + def reserve(self): + """Message field 'reserve'.""" + return self._reserve + + @reserve.setter + def reserve(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'reserve' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'reserve' field must be an unsigned integer in [0, 4294967295]" + self._reserve = value + + @property + def crc(self): + """Message field 'crc'.""" + return self._crc + + @crc.setter + def crc(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'crc' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'crc' field must be an unsigned integer in [0, 4294967295]" + self._crc = value diff --git a/python/unitree_go/msg/_low_state_s.c b/python/unitree_go/msg/_low_state_s.c new file mode 100644 index 0000000..ad3c234 --- /dev/null +++ b/python/unitree_go/msg/_low_state_s.c @@ -0,0 +1,724 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/LowState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/low_state__struct.h" +#include "unitree_go/msg/detail/low_state__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + +// Nested array functions includes +#include "unitree_go/msg/detail/motor_state__functions.h" +// end nested array functions include +bool unitree_go__msg__imu_state__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__imu_state__convert_to_py(void * raw_ros_message); +bool unitree_go__msg__motor_state__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__motor_state__convert_to_py(void * raw_ros_message); +bool unitree_go__msg__bms_state__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__bms_state__convert_to_py(void * raw_ros_message); + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__low_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[35]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._low_state.LowState", full_classname_dest, 34) == 0); + } + unitree_go__msg__LowState * ros_message = _ros_message; + { // head + PyObject * field = PyObject_GetAttrString(_pymsg, "head"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 2; + uint8_t * dest = ros_message->head; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // level_flag + PyObject * field = PyObject_GetAttrString(_pymsg, "level_flag"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->level_flag = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // frame_reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "frame_reserve"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->frame_reserve = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // sn + PyObject * field = PyObject_GetAttrString(_pymsg, "sn"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + Py_ssize_t size = 2; + uint32_t * dest = ros_message->sn; + for (Py_ssize_t i = 0; i < size; ++i) { + uint32_t tmp = *(npy_uint32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint32_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // version + PyObject * field = PyObject_GetAttrString(_pymsg, "version"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + Py_ssize_t size = 2; + uint32_t * dest = ros_message->version; + for (Py_ssize_t i = 0; i < size; ++i) { + uint32_t tmp = *(npy_uint32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint32_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // bandwidth + PyObject * field = PyObject_GetAttrString(_pymsg, "bandwidth"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->bandwidth = (uint16_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // imu_state + PyObject * field = PyObject_GetAttrString(_pymsg, "imu_state"); + if (!field) { + return false; + } + if (!unitree_go__msg__imu_state__convert_from_py(field, &ros_message->imu_state)) { + Py_DECREF(field); + return false; + } + Py_DECREF(field); + } + { // motor_state + PyObject * field = PyObject_GetAttrString(_pymsg, "motor_state"); + if (!field) { + return false; + } + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'motor_state'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = 20; + unitree_go__msg__MotorState * dest = ros_message->motor_state; + for (Py_ssize_t i = 0; i < size; ++i) { + if (!unitree_go__msg__motor_state__convert_from_py(PySequence_Fast_GET_ITEM(seq_field, i), &dest[i])) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + } + Py_DECREF(seq_field); + Py_DECREF(field); + } + { // bms_state + PyObject * field = PyObject_GetAttrString(_pymsg, "bms_state"); + if (!field) { + return false; + } + if (!unitree_go__msg__bms_state__convert_from_py(field, &ros_message->bms_state)) { + Py_DECREF(field); + return false; + } + Py_DECREF(field); + } + { // foot_force + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_force"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT16); + Py_ssize_t size = 4; + int16_t * dest = ros_message->foot_force; + for (Py_ssize_t i = 0; i < size; ++i) { + int16_t tmp = *(npy_int16 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(int16_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // foot_force_est + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_force_est"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT16); + Py_ssize_t size = 4; + int16_t * dest = ros_message->foot_force_est; + for (Py_ssize_t i = 0; i < size; ++i) { + int16_t tmp = *(npy_int16 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(int16_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // tick + PyObject * field = PyObject_GetAttrString(_pymsg, "tick"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->tick = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // wireless_remote + PyObject * field = PyObject_GetAttrString(_pymsg, "wireless_remote"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 40; + uint8_t * dest = ros_message->wireless_remote; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // bit_flag + PyObject * field = PyObject_GetAttrString(_pymsg, "bit_flag"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->bit_flag = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // adc_reel + PyObject * field = PyObject_GetAttrString(_pymsg, "adc_reel"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->adc_reel = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // temperature_ntc1 + PyObject * field = PyObject_GetAttrString(_pymsg, "temperature_ntc1"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->temperature_ntc1 = (int8_t)PyLong_AsLong(field); + Py_DECREF(field); + } + { // temperature_ntc2 + PyObject * field = PyObject_GetAttrString(_pymsg, "temperature_ntc2"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->temperature_ntc2 = (int8_t)PyLong_AsLong(field); + Py_DECREF(field); + } + { // power_v + PyObject * field = PyObject_GetAttrString(_pymsg, "power_v"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->power_v = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // power_a + PyObject * field = PyObject_GetAttrString(_pymsg, "power_a"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->power_a = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // fan_frequency + PyObject * field = PyObject_GetAttrString(_pymsg, "fan_frequency"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT16); + Py_ssize_t size = 4; + uint16_t * dest = ros_message->fan_frequency; + for (Py_ssize_t i = 0; i < size; ++i) { + uint16_t tmp = *(npy_uint16 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint16_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "reserve"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->reserve = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // crc + PyObject * field = PyObject_GetAttrString(_pymsg, "crc"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->crc = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__low_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of LowState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._low_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "LowState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__LowState * ros_message = (unitree_go__msg__LowState *)raw_ros_message; + { // head + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "head"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->head[0]); + memcpy(dst, src, 2 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // level_flag + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->level_flag); + { + int rc = PyObject_SetAttrString(_pymessage, "level_flag", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // frame_reserve + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->frame_reserve); + { + int rc = PyObject_SetAttrString(_pymessage, "frame_reserve", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // sn + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "sn"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + assert(sizeof(npy_uint32) == sizeof(uint32_t)); + npy_uint32 * dst = (npy_uint32 *)PyArray_GETPTR1(seq_field, 0); + uint32_t * src = &(ros_message->sn[0]); + memcpy(dst, src, 2 * sizeof(uint32_t)); + Py_DECREF(field); + } + { // version + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "version"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + assert(sizeof(npy_uint32) == sizeof(uint32_t)); + npy_uint32 * dst = (npy_uint32 *)PyArray_GETPTR1(seq_field, 0); + uint32_t * src = &(ros_message->version[0]); + memcpy(dst, src, 2 * sizeof(uint32_t)); + Py_DECREF(field); + } + { // bandwidth + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->bandwidth); + { + int rc = PyObject_SetAttrString(_pymessage, "bandwidth", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // imu_state + PyObject * field = NULL; + field = unitree_go__msg__imu_state__convert_to_py(&ros_message->imu_state); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "imu_state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // motor_state + PyObject * field = NULL; + size_t size = 20; + field = PyList_New(size); + if (!field) { + return NULL; + } + unitree_go__msg__MotorState * item; + for (size_t i = 0; i < size; ++i) { + item = &(ros_message->motor_state[i]); + PyObject * pyitem = unitree_go__msg__motor_state__convert_to_py(item); + if (!pyitem) { + Py_DECREF(field); + return NULL; + } + int rc = PyList_SetItem(field, i, pyitem); + (void)rc; + assert(rc == 0); + } + assert(PySequence_Check(field)); + { + int rc = PyObject_SetAttrString(_pymessage, "motor_state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // bms_state + PyObject * field = NULL; + field = unitree_go__msg__bms_state__convert_to_py(&ros_message->bms_state); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "bms_state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // foot_force + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "foot_force"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT16); + assert(sizeof(npy_int16) == sizeof(int16_t)); + npy_int16 * dst = (npy_int16 *)PyArray_GETPTR1(seq_field, 0); + int16_t * src = &(ros_message->foot_force[0]); + memcpy(dst, src, 4 * sizeof(int16_t)); + Py_DECREF(field); + } + { // foot_force_est + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "foot_force_est"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT16); + assert(sizeof(npy_int16) == sizeof(int16_t)); + npy_int16 * dst = (npy_int16 *)PyArray_GETPTR1(seq_field, 0); + int16_t * src = &(ros_message->foot_force_est[0]); + memcpy(dst, src, 4 * sizeof(int16_t)); + Py_DECREF(field); + } + { // tick + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->tick); + { + int rc = PyObject_SetAttrString(_pymessage, "tick", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // wireless_remote + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "wireless_remote"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->wireless_remote[0]); + memcpy(dst, src, 40 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // bit_flag + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->bit_flag); + { + int rc = PyObject_SetAttrString(_pymessage, "bit_flag", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // adc_reel + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->adc_reel); + { + int rc = PyObject_SetAttrString(_pymessage, "adc_reel", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // temperature_ntc1 + PyObject * field = NULL; + field = PyLong_FromLong(ros_message->temperature_ntc1); + { + int rc = PyObject_SetAttrString(_pymessage, "temperature_ntc1", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // temperature_ntc2 + PyObject * field = NULL; + field = PyLong_FromLong(ros_message->temperature_ntc2); + { + int rc = PyObject_SetAttrString(_pymessage, "temperature_ntc2", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // power_v + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->power_v); + { + int rc = PyObject_SetAttrString(_pymessage, "power_v", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // power_a + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->power_a); + { + int rc = PyObject_SetAttrString(_pymessage, "power_a", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // fan_frequency + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "fan_frequency"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT16); + assert(sizeof(npy_uint16) == sizeof(uint16_t)); + npy_uint16 * dst = (npy_uint16 *)PyArray_GETPTR1(seq_field, 0); + uint16_t * src = &(ros_message->fan_frequency[0]); + memcpy(dst, src, 4 * sizeof(uint16_t)); + Py_DECREF(field); + } + { // reserve + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->reserve); + { + int rc = PyObject_SetAttrString(_pymessage, "reserve", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // crc + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->crc); + { + int rc = PyObject_SetAttrString(_pymessage, "crc", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_motor_cmd.py b/python/unitree_go/msg/_motor_cmd.py new file mode 100644 index 0000000..f580bd6 --- /dev/null +++ b/python/unitree_go/msg/_motor_cmd.py @@ -0,0 +1,263 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/MotorCmd.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'reserve' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_MotorCmd(type): + """Metaclass of message 'MotorCmd'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.MotorCmd') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__motor_cmd + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__motor_cmd + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__motor_cmd + cls._TYPE_SUPPORT = module.type_support_msg__msg__motor_cmd + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__motor_cmd + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class MotorCmd(metaclass=Metaclass_MotorCmd): + """Message class 'MotorCmd'.""" + + __slots__ = [ + '_mode', + '_q', + '_dq', + '_tau', + '_kp', + '_kd', + '_reserve', + ] + + _fields_and_field_types = { + 'mode': 'uint8', + 'q': 'float', + 'dq': 'float', + 'tau': 'float', + 'kp': 'float', + 'kd': 'float', + 'reserve': 'uint32[3]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint32'), 3), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.mode = kwargs.get('mode', int()) + self.q = kwargs.get('q', float()) + self.dq = kwargs.get('dq', float()) + self.tau = kwargs.get('tau', float()) + self.kp = kwargs.get('kp', float()) + self.kd = kwargs.get('kd', float()) + if 'reserve' not in kwargs: + self.reserve = numpy.zeros(3, dtype=numpy.uint32) + else: + self.reserve = numpy.array(kwargs.get('reserve'), dtype=numpy.uint32) + assert self.reserve.shape == (3, ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.mode != other.mode: + return False + if self.q != other.q: + return False + if self.dq != other.dq: + return False + if self.tau != other.tau: + return False + if self.kp != other.kp: + return False + if self.kd != other.kd: + return False + if all(self.reserve != other.reserve): + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def mode(self): + """Message field 'mode'.""" + return self._mode + + @mode.setter + def mode(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'mode' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'mode' field must be an unsigned integer in [0, 255]" + self._mode = value + + @property + def q(self): + """Message field 'q'.""" + return self._q + + @q.setter + def q(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'q' field must be of type 'float'" + self._q = value + + @property + def dq(self): + """Message field 'dq'.""" + return self._dq + + @dq.setter + def dq(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'dq' field must be of type 'float'" + self._dq = value + + @property + def tau(self): + """Message field 'tau'.""" + return self._tau + + @tau.setter + def tau(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'tau' field must be of type 'float'" + self._tau = value + + @property + def kp(self): + """Message field 'kp'.""" + return self._kp + + @kp.setter + def kp(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'kp' field must be of type 'float'" + self._kp = value + + @property + def kd(self): + """Message field 'kd'.""" + return self._kd + + @kd.setter + def kd(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'kd' field must be of type 'float'" + self._kd = value + + @property + def reserve(self): + """Message field 'reserve'.""" + return self._reserve + + @reserve.setter + def reserve(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint32, \ + "The 'reserve' numpy.ndarray() must have the dtype of 'numpy.uint32'" + assert value.size == 3, \ + "The 'reserve' numpy.ndarray() must have a size of 3" + self._reserve = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 4294967296 for val in value)), \ + "The 'reserve' field must be a set or sequence with length 3 and each value of type 'int' and each unsigned integer in [0, 4294967295]" + self._reserve = numpy.array(value, dtype=numpy.uint32) diff --git a/python/unitree_go/msg/_motor_cmd_s.c b/python/unitree_go/msg/_motor_cmd_s.c new file mode 100644 index 0000000..64fa078 --- /dev/null +++ b/python/unitree_go/msg/_motor_cmd_s.c @@ -0,0 +1,243 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/MotorCmd.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/motor_cmd__struct.h" +#include "unitree_go/msg/detail/motor_cmd__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__motor_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[35]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._motor_cmd.MotorCmd", full_classname_dest, 34) == 0); + } + unitree_go__msg__MotorCmd * ros_message = _ros_message; + { // mode + PyObject * field = PyObject_GetAttrString(_pymsg, "mode"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->mode = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // q + PyObject * field = PyObject_GetAttrString(_pymsg, "q"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->q = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // dq + PyObject * field = PyObject_GetAttrString(_pymsg, "dq"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->dq = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // tau + PyObject * field = PyObject_GetAttrString(_pymsg, "tau"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->tau = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // kp + PyObject * field = PyObject_GetAttrString(_pymsg, "kp"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->kp = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // kd + PyObject * field = PyObject_GetAttrString(_pymsg, "kd"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->kd = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "reserve"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + Py_ssize_t size = 3; + uint32_t * dest = ros_message->reserve; + for (Py_ssize_t i = 0; i < size; ++i) { + uint32_t tmp = *(npy_uint32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint32_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__motor_cmd__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of MotorCmd */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._motor_cmd"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "MotorCmd"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__MotorCmd * ros_message = (unitree_go__msg__MotorCmd *)raw_ros_message; + { // mode + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->mode); + { + int rc = PyObject_SetAttrString(_pymessage, "mode", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // q + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->q); + { + int rc = PyObject_SetAttrString(_pymessage, "q", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // dq + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->dq); + { + int rc = PyObject_SetAttrString(_pymessage, "dq", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // tau + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->tau); + { + int rc = PyObject_SetAttrString(_pymessage, "tau", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // kp + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->kp); + { + int rc = PyObject_SetAttrString(_pymessage, "kp", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // kd + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->kd); + { + int rc = PyObject_SetAttrString(_pymessage, "kd", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // reserve + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "reserve"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + assert(sizeof(npy_uint32) == sizeof(uint32_t)); + npy_uint32 * dst = (npy_uint32 *)PyArray_GETPTR1(seq_field, 0); + uint32_t * src = &(ros_message->reserve[0]); + memcpy(dst, src, 3 * sizeof(uint32_t)); + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_motor_state.py b/python/unitree_go/msg/_motor_state.py new file mode 100644 index 0000000..739e8f0 --- /dev/null +++ b/python/unitree_go/msg/_motor_state.py @@ -0,0 +1,343 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/MotorState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'reserve' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_MotorState(type): + """Metaclass of message 'MotorState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.MotorState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__motor_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__motor_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__motor_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__motor_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__motor_state + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class MotorState(metaclass=Metaclass_MotorState): + """Message class 'MotorState'.""" + + __slots__ = [ + '_mode', + '_q', + '_dq', + '_ddq', + '_tau_est', + '_q_raw', + '_dq_raw', + '_ddq_raw', + '_temperature', + '_lost', + '_reserve', + ] + + _fields_and_field_types = { + 'mode': 'uint8', + 'q': 'float', + 'dq': 'float', + 'ddq': 'float', + 'tau_est': 'float', + 'q_raw': 'float', + 'dq_raw': 'float', + 'ddq_raw': 'float', + 'temperature': 'int8', + 'lost': 'uint32', + 'reserve': 'uint32[2]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('int8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint32'), 2), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.mode = kwargs.get('mode', int()) + self.q = kwargs.get('q', float()) + self.dq = kwargs.get('dq', float()) + self.ddq = kwargs.get('ddq', float()) + self.tau_est = kwargs.get('tau_est', float()) + self.q_raw = kwargs.get('q_raw', float()) + self.dq_raw = kwargs.get('dq_raw', float()) + self.ddq_raw = kwargs.get('ddq_raw', float()) + self.temperature = kwargs.get('temperature', int()) + self.lost = kwargs.get('lost', int()) + if 'reserve' not in kwargs: + self.reserve = numpy.zeros(2, dtype=numpy.uint32) + else: + self.reserve = numpy.array(kwargs.get('reserve'), dtype=numpy.uint32) + assert self.reserve.shape == (2, ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.mode != other.mode: + return False + if self.q != other.q: + return False + if self.dq != other.dq: + return False + if self.ddq != other.ddq: + return False + if self.tau_est != other.tau_est: + return False + if self.q_raw != other.q_raw: + return False + if self.dq_raw != other.dq_raw: + return False + if self.ddq_raw != other.ddq_raw: + return False + if self.temperature != other.temperature: + return False + if self.lost != other.lost: + return False + if all(self.reserve != other.reserve): + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def mode(self): + """Message field 'mode'.""" + return self._mode + + @mode.setter + def mode(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'mode' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'mode' field must be an unsigned integer in [0, 255]" + self._mode = value + + @property + def q(self): + """Message field 'q'.""" + return self._q + + @q.setter + def q(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'q' field must be of type 'float'" + self._q = value + + @property + def dq(self): + """Message field 'dq'.""" + return self._dq + + @dq.setter + def dq(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'dq' field must be of type 'float'" + self._dq = value + + @property + def ddq(self): + """Message field 'ddq'.""" + return self._ddq + + @ddq.setter + def ddq(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'ddq' field must be of type 'float'" + self._ddq = value + + @property + def tau_est(self): + """Message field 'tau_est'.""" + return self._tau_est + + @tau_est.setter + def tau_est(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'tau_est' field must be of type 'float'" + self._tau_est = value + + @property + def q_raw(self): + """Message field 'q_raw'.""" + return self._q_raw + + @q_raw.setter + def q_raw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'q_raw' field must be of type 'float'" + self._q_raw = value + + @property + def dq_raw(self): + """Message field 'dq_raw'.""" + return self._dq_raw + + @dq_raw.setter + def dq_raw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'dq_raw' field must be of type 'float'" + self._dq_raw = value + + @property + def ddq_raw(self): + """Message field 'ddq_raw'.""" + return self._ddq_raw + + @ddq_raw.setter + def ddq_raw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'ddq_raw' field must be of type 'float'" + self._ddq_raw = value + + @property + def temperature(self): + """Message field 'temperature'.""" + return self._temperature + + @temperature.setter + def temperature(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'temperature' field must be of type 'int'" + assert value >= -128 and value < 128, \ + "The 'temperature' field must be an integer in [-128, 127]" + self._temperature = value + + @property + def lost(self): + """Message field 'lost'.""" + return self._lost + + @lost.setter + def lost(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'lost' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'lost' field must be an unsigned integer in [0, 4294967295]" + self._lost = value + + @property + def reserve(self): + """Message field 'reserve'.""" + return self._reserve + + @reserve.setter + def reserve(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint32, \ + "The 'reserve' numpy.ndarray() must have the dtype of 'numpy.uint32'" + assert value.size == 2, \ + "The 'reserve' numpy.ndarray() must have a size of 2" + self._reserve = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 4294967296 for val in value)), \ + "The 'reserve' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 4294967295]" + self._reserve = numpy.array(value, dtype=numpy.uint32) diff --git a/python/unitree_go/msg/_motor_state_s.c b/python/unitree_go/msg/_motor_state_s.c new file mode 100644 index 0000000..56d9526 --- /dev/null +++ b/python/unitree_go/msg/_motor_state_s.c @@ -0,0 +1,323 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/MotorState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/motor_state__struct.h" +#include "unitree_go/msg/detail/motor_state__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__motor_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[39]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._motor_state.MotorState", full_classname_dest, 38) == 0); + } + unitree_go__msg__MotorState * ros_message = _ros_message; + { // mode + PyObject * field = PyObject_GetAttrString(_pymsg, "mode"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->mode = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // q + PyObject * field = PyObject_GetAttrString(_pymsg, "q"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->q = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // dq + PyObject * field = PyObject_GetAttrString(_pymsg, "dq"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->dq = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // ddq + PyObject * field = PyObject_GetAttrString(_pymsg, "ddq"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->ddq = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // tau_est + PyObject * field = PyObject_GetAttrString(_pymsg, "tau_est"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->tau_est = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // q_raw + PyObject * field = PyObject_GetAttrString(_pymsg, "q_raw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->q_raw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // dq_raw + PyObject * field = PyObject_GetAttrString(_pymsg, "dq_raw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->dq_raw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // ddq_raw + PyObject * field = PyObject_GetAttrString(_pymsg, "ddq_raw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->ddq_raw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // temperature + PyObject * field = PyObject_GetAttrString(_pymsg, "temperature"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->temperature = (int8_t)PyLong_AsLong(field); + Py_DECREF(field); + } + { // lost + PyObject * field = PyObject_GetAttrString(_pymsg, "lost"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->lost = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // reserve + PyObject * field = PyObject_GetAttrString(_pymsg, "reserve"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + Py_ssize_t size = 2; + uint32_t * dest = ros_message->reserve; + for (Py_ssize_t i = 0; i < size; ++i) { + uint32_t tmp = *(npy_uint32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint32_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__motor_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of MotorState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._motor_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "MotorState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__MotorState * ros_message = (unitree_go__msg__MotorState *)raw_ros_message; + { // mode + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->mode); + { + int rc = PyObject_SetAttrString(_pymessage, "mode", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // q + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->q); + { + int rc = PyObject_SetAttrString(_pymessage, "q", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // dq + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->dq); + { + int rc = PyObject_SetAttrString(_pymessage, "dq", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // ddq + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->ddq); + { + int rc = PyObject_SetAttrString(_pymessage, "ddq", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // tau_est + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->tau_est); + { + int rc = PyObject_SetAttrString(_pymessage, "tau_est", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // q_raw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->q_raw); + { + int rc = PyObject_SetAttrString(_pymessage, "q_raw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // dq_raw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->dq_raw); + { + int rc = PyObject_SetAttrString(_pymessage, "dq_raw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // ddq_raw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->ddq_raw); + { + int rc = PyObject_SetAttrString(_pymessage, "ddq_raw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // temperature + PyObject * field = NULL; + field = PyLong_FromLong(ros_message->temperature); + { + int rc = PyObject_SetAttrString(_pymessage, "temperature", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // lost + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->lost); + { + int rc = PyObject_SetAttrString(_pymessage, "lost", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // reserve + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "reserve"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT32); + assert(sizeof(npy_uint32) == sizeof(uint32_t)); + npy_uint32 * dst = (npy_uint32 *)PyArray_GETPTR1(seq_field, 0); + uint32_t * src = &(ros_message->reserve[0]); + memcpy(dst, src, 2 * sizeof(uint32_t)); + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_path_point.py b/python/unitree_go/msg/_path_point.py new file mode 100644 index 0000000..1d70220 --- /dev/null +++ b/python/unitree_go/msg/_path_point.py @@ -0,0 +1,236 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/PathPoint.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_PathPoint(type): + """Metaclass of message 'PathPoint'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.PathPoint') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__path_point + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__path_point + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__path_point + cls._TYPE_SUPPORT = module.type_support_msg__msg__path_point + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__path_point + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class PathPoint(metaclass=Metaclass_PathPoint): + """Message class 'PathPoint'.""" + + __slots__ = [ + '_t_from_start', + '_x', + '_y', + '_yaw', + '_vx', + '_vy', + '_vyaw', + ] + + _fields_and_field_types = { + 't_from_start': 'float', + 'x': 'float', + 'y': 'float', + 'yaw': 'float', + 'vx': 'float', + 'vy': 'float', + 'vyaw': 'float', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.t_from_start = kwargs.get('t_from_start', float()) + self.x = kwargs.get('x', float()) + self.y = kwargs.get('y', float()) + self.yaw = kwargs.get('yaw', float()) + self.vx = kwargs.get('vx', float()) + self.vy = kwargs.get('vy', float()) + self.vyaw = kwargs.get('vyaw', float()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.t_from_start != other.t_from_start: + return False + if self.x != other.x: + return False + if self.y != other.y: + return False + if self.yaw != other.yaw: + return False + if self.vx != other.vx: + return False + if self.vy != other.vy: + return False + if self.vyaw != other.vyaw: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def t_from_start(self): + """Message field 't_from_start'.""" + return self._t_from_start + + @t_from_start.setter + def t_from_start(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 't_from_start' field must be of type 'float'" + self._t_from_start = value + + @property + def x(self): + """Message field 'x'.""" + return self._x + + @x.setter + def x(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'x' field must be of type 'float'" + self._x = value + + @property + def y(self): + """Message field 'y'.""" + return self._y + + @y.setter + def y(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'y' field must be of type 'float'" + self._y = value + + @property + def yaw(self): + """Message field 'yaw'.""" + return self._yaw + + @yaw.setter + def yaw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'yaw' field must be of type 'float'" + self._yaw = value + + @property + def vx(self): + """Message field 'vx'.""" + return self._vx + + @vx.setter + def vx(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'vx' field must be of type 'float'" + self._vx = value + + @property + def vy(self): + """Message field 'vy'.""" + return self._vy + + @vy.setter + def vy(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'vy' field must be of type 'float'" + self._vy = value + + @property + def vyaw(self): + """Message field 'vyaw'.""" + return self._vyaw + + @vyaw.setter + def vyaw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'vyaw' field must be of type 'float'" + self._vyaw = value diff --git a/python/unitree_go/msg/_path_point_s.c b/python/unitree_go/msg/_path_point_s.c new file mode 100644 index 0000000..6be16c7 --- /dev/null +++ b/python/unitree_go/msg/_path_point_s.c @@ -0,0 +1,218 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/PathPoint.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/path_point__struct.h" +#include "unitree_go/msg/detail/path_point__functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__path_point__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[37]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._path_point.PathPoint", full_classname_dest, 36) == 0); + } + unitree_go__msg__PathPoint * ros_message = _ros_message; + { // t_from_start + PyObject * field = PyObject_GetAttrString(_pymsg, "t_from_start"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->t_from_start = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // x + PyObject * field = PyObject_GetAttrString(_pymsg, "x"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->x = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // y + PyObject * field = PyObject_GetAttrString(_pymsg, "y"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->y = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // yaw + PyObject * field = PyObject_GetAttrString(_pymsg, "yaw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->yaw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // vx + PyObject * field = PyObject_GetAttrString(_pymsg, "vx"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->vx = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // vy + PyObject * field = PyObject_GetAttrString(_pymsg, "vy"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->vy = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // vyaw + PyObject * field = PyObject_GetAttrString(_pymsg, "vyaw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->vyaw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__path_point__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of PathPoint */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._path_point"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "PathPoint"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__PathPoint * ros_message = (unitree_go__msg__PathPoint *)raw_ros_message; + { // t_from_start + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->t_from_start); + { + int rc = PyObject_SetAttrString(_pymessage, "t_from_start", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // x + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->x); + { + int rc = PyObject_SetAttrString(_pymessage, "x", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // y + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->y); + { + int rc = PyObject_SetAttrString(_pymessage, "y", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // yaw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->yaw); + { + int rc = PyObject_SetAttrString(_pymessage, "yaw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // vx + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->vx); + { + int rc = PyObject_SetAttrString(_pymessage, "vx", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // vy + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->vy); + { + int rc = PyObject_SetAttrString(_pymessage, "vy", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // vyaw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->vyaw); + { + int rc = PyObject_SetAttrString(_pymessage, "vyaw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_req.py b/python/unitree_go/msg/_req.py new file mode 100644 index 0000000..0827644 --- /dev/null +++ b/python/unitree_go/msg/_req.py @@ -0,0 +1,141 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/Req.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_Req(type): + """Metaclass of message 'Req'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.Req') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__req + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__req + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__req + cls._TYPE_SUPPORT = module.type_support_msg__msg__req + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__req + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class Req(metaclass=Metaclass_Req): + """Message class 'Req'.""" + + __slots__ = [ + '_uuid', + '_body', + ] + + _fields_and_field_types = { + 'uuid': 'string', + 'body': 'string', + } + + SLOT_TYPES = ( + rosidl_parser.definition.UnboundedString(), # noqa: E501 + rosidl_parser.definition.UnboundedString(), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.uuid = kwargs.get('uuid', str()) + self.body = kwargs.get('body', str()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.uuid != other.uuid: + return False + if self.body != other.body: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def uuid(self): + """Message field 'uuid'.""" + return self._uuid + + @uuid.setter + def uuid(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'uuid' field must be of type 'str'" + self._uuid = value + + @property + def body(self): + """Message field 'body'.""" + return self._body + + @body.setter + def body(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'body' field must be of type 'str'" + self._body = value diff --git a/python/unitree_go/msg/_req_s.c b/python/unitree_go/msg/_req_s.c new file mode 100644 index 0000000..856782f --- /dev/null +++ b/python/unitree_go/msg/_req_s.c @@ -0,0 +1,145 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/Req.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/req__struct.h" +#include "unitree_go/msg/detail/req__functions.h" + +#include "rosidl_runtime_c/string.h" +#include "rosidl_runtime_c/string_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__req__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[24]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._req.Req", full_classname_dest, 23) == 0); + } + unitree_go__msg__Req * ros_message = _ros_message; + { // uuid + PyObject * field = PyObject_GetAttrString(_pymsg, "uuid"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->uuid, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + { // body + PyObject * field = PyObject_GetAttrString(_pymsg, "body"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->body, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__req__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of Req */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._req"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "Req"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__Req * ros_message = (unitree_go__msg__Req *)raw_ros_message; + { // uuid + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->uuid.data, + strlen(ros_message->uuid.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "uuid", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // body + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->body.data, + strlen(ros_message->body.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "body", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_res.py b/python/unitree_go/msg/_res.py new file mode 100644 index 0000000..da1126d --- /dev/null +++ b/python/unitree_go/msg/_res.py @@ -0,0 +1,178 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/Res.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'data' +import array # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_Res(type): + """Metaclass of message 'Res'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.Res') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__res + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__res + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__res + cls._TYPE_SUPPORT = module.type_support_msg__msg__res + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__res + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class Res(metaclass=Metaclass_Res): + """Message class 'Res'.""" + + __slots__ = [ + '_uuid', + '_data', + '_body', + ] + + _fields_and_field_types = { + 'uuid': 'string', + 'data': 'sequence', + 'body': 'string', + } + + SLOT_TYPES = ( + rosidl_parser.definition.UnboundedString(), # noqa: E501 + rosidl_parser.definition.UnboundedSequence(rosidl_parser.definition.BasicType('uint8')), # noqa: E501 + rosidl_parser.definition.UnboundedString(), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.uuid = kwargs.get('uuid', str()) + self.data = array.array('B', kwargs.get('data', [])) + self.body = kwargs.get('body', str()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.uuid != other.uuid: + return False + if self.data != other.data: + return False + if self.body != other.body: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def uuid(self): + """Message field 'uuid'.""" + return self._uuid + + @uuid.setter + def uuid(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'uuid' field must be of type 'str'" + self._uuid = value + + @property + def data(self): + """Message field 'data'.""" + return self._data + + @data.setter + def data(self, value): + if isinstance(value, array.array): + assert value.typecode == 'B', \ + "The 'data' array.array() must have the type code of 'B'" + self._data = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'data' field must be a set or sequence and each value of type 'int' and each unsigned integer in [0, 255]" + self._data = array.array('B', value) + + @property + def body(self): + """Message field 'body'.""" + return self._body + + @body.setter + def body(self, value): + if __debug__: + assert \ + isinstance(value, str), \ + "The 'body' field must be of type 'str'" + self._body = value diff --git a/python/unitree_go/msg/_res_s.c b/python/unitree_go/msg/_res_s.c new file mode 100644 index 0000000..4e40f1d --- /dev/null +++ b/python/unitree_go/msg/_res_s.c @@ -0,0 +1,268 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/Res.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/res__struct.h" +#include "unitree_go/msg/detail/res__functions.h" + +#include "rosidl_runtime_c/string.h" +#include "rosidl_runtime_c/string_functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__res__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[24]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._res.Res", full_classname_dest, 23) == 0); + } + unitree_go__msg__Res * ros_message = _ros_message; + { // uuid + PyObject * field = PyObject_GetAttrString(_pymsg, "uuid"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->uuid, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + { // data + PyObject * field = PyObject_GetAttrString(_pymsg, "data"); + if (!field) { + return false; + } + if (PyObject_CheckBuffer(field)) { + // Optimization for converting arrays of primitives + Py_buffer view; + int rc = PyObject_GetBuffer(field, &view, PyBUF_SIMPLE); + if (rc < 0) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = view.len / sizeof(uint8_t); + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->data), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->data.data; + rc = PyBuffer_ToContiguous(dest, &view, view.len, 'C'); + if (rc < 0) { + PyBuffer_Release(&view); + Py_DECREF(field); + return false; + } + PyBuffer_Release(&view); + } else { + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'data'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = PySequence_Size(field); + if (-1 == size) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + if (!rosidl_runtime_c__uint8__Sequence__init(&(ros_message->data), size)) { + PyErr_SetString(PyExc_RuntimeError, "unable to create uint8__Sequence ros_message"); + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + uint8_t * dest = ros_message->data.data; + for (Py_ssize_t i = 0; i < size; ++i) { + PyObject * item = PySequence_Fast_GET_ITEM(seq_field, i); + if (!item) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + assert(PyLong_Check(item)); + uint8_t tmp = (uint8_t)PyLong_AsUnsignedLong(item); + + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // body + PyObject * field = PyObject_GetAttrString(_pymsg, "body"); + if (!field) { + return false; + } + assert(PyUnicode_Check(field)); + PyObject * encoded_field = PyUnicode_AsUTF8String(field); + if (!encoded_field) { + Py_DECREF(field); + return false; + } + rosidl_runtime_c__String__assign(&ros_message->body, PyBytes_AS_STRING(encoded_field)); + Py_DECREF(encoded_field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__res__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of Res */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._res"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "Res"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__Res * ros_message = (unitree_go__msg__Res *)raw_ros_message; + { // uuid + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->uuid.data, + strlen(ros_message->uuid.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "uuid", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // data + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "data"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "array.array") == 0); + // ensure that itemsize matches the sizeof of the ROS message field + PyObject * itemsize_attr = PyObject_GetAttrString(field, "itemsize"); + assert(itemsize_attr != NULL); + size_t itemsize = PyLong_AsSize_t(itemsize_attr); + Py_DECREF(itemsize_attr); + if (itemsize != sizeof(uint8_t)) { + PyErr_SetString(PyExc_RuntimeError, "itemsize doesn't match expectation"); + Py_DECREF(field); + return NULL; + } + // clear the array, poor approach to remove potential default values + Py_ssize_t length = PyObject_Length(field); + if (-1 == length) { + Py_DECREF(field); + return NULL; + } + if (length > 0) { + PyObject * pop = PyObject_GetAttrString(field, "pop"); + assert(pop != NULL); + for (Py_ssize_t i = 0; i < length; ++i) { + PyObject * ret = PyObject_CallFunctionObjArgs(pop, NULL); + if (!ret) { + Py_DECREF(pop); + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(pop); + } + if (ros_message->data.size > 0) { + // populating the array.array using the frombytes method + PyObject * frombytes = PyObject_GetAttrString(field, "frombytes"); + assert(frombytes != NULL); + uint8_t * src = &(ros_message->data.data[0]); + PyObject * data = PyBytes_FromStringAndSize((const char *)src, ros_message->data.size * sizeof(uint8_t)); + assert(data != NULL); + PyObject * ret = PyObject_CallFunctionObjArgs(frombytes, data, NULL); + Py_DECREF(data); + Py_DECREF(frombytes); + if (!ret) { + Py_DECREF(field); + return NULL; + } + Py_DECREF(ret); + } + Py_DECREF(field); + } + { // body + PyObject * field = NULL; + field = PyUnicode_DecodeUTF8( + ros_message->body.data, + strlen(ros_message->body.data), + "replace"); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "body", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_sport_mode_cmd.py b/python/unitree_go/msg/_sport_mode_cmd.py new file mode 100644 index 0000000..7bcaf06 --- /dev/null +++ b/python/unitree_go/msg/_sport_mode_cmd.py @@ -0,0 +1,415 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/SportModeCmd.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'position' +# Member 'euler' +# Member 'velocity' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_SportModeCmd(type): + """Metaclass of message 'SportModeCmd'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.SportModeCmd') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__sport_mode_cmd + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__sport_mode_cmd + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__sport_mode_cmd + cls._TYPE_SUPPORT = module.type_support_msg__msg__sport_mode_cmd + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__sport_mode_cmd + + from unitree_go.msg import BmsCmd + if BmsCmd.__class__._TYPE_SUPPORT is None: + BmsCmd.__class__.__import_type_support__() + + from unitree_go.msg import PathPoint + if PathPoint.__class__._TYPE_SUPPORT is None: + PathPoint.__class__.__import_type_support__() + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class SportModeCmd(metaclass=Metaclass_SportModeCmd): + """Message class 'SportModeCmd'.""" + + __slots__ = [ + '_mode', + '_gait_type', + '_speed_level', + '_foot_raise_height', + '_body_height', + '_position', + '_euler', + '_velocity', + '_yaw_speed', + '_bms_cmd', + '_path_point', + ] + + _fields_and_field_types = { + 'mode': 'uint8', + 'gait_type': 'uint8', + 'speed_level': 'uint8', + 'foot_raise_height': 'float', + 'body_height': 'float', + 'position': 'float[2]', + 'euler': 'float[3]', + 'velocity': 'float[2]', + 'yaw_speed': 'float', + 'bms_cmd': 'unitree_go/BmsCmd', + 'path_point': 'unitree_go/PathPoint[30]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 2), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'BmsCmd'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'PathPoint'), 30), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.mode = kwargs.get('mode', int()) + self.gait_type = kwargs.get('gait_type', int()) + self.speed_level = kwargs.get('speed_level', int()) + self.foot_raise_height = kwargs.get('foot_raise_height', float()) + self.body_height = kwargs.get('body_height', float()) + if 'position' not in kwargs: + self.position = numpy.zeros(2, dtype=numpy.float32) + else: + self.position = numpy.array(kwargs.get('position'), dtype=numpy.float32) + assert self.position.shape == (2, ) + if 'euler' not in kwargs: + self.euler = numpy.zeros(3, dtype=numpy.float32) + else: + self.euler = numpy.array(kwargs.get('euler'), dtype=numpy.float32) + assert self.euler.shape == (3, ) + if 'velocity' not in kwargs: + self.velocity = numpy.zeros(2, dtype=numpy.float32) + else: + self.velocity = numpy.array(kwargs.get('velocity'), dtype=numpy.float32) + assert self.velocity.shape == (2, ) + self.yaw_speed = kwargs.get('yaw_speed', float()) + from unitree_go.msg import BmsCmd + self.bms_cmd = kwargs.get('bms_cmd', BmsCmd()) + from unitree_go.msg import PathPoint + self.path_point = kwargs.get( + 'path_point', + [PathPoint() for x in range(30)] + ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.mode != other.mode: + return False + if self.gait_type != other.gait_type: + return False + if self.speed_level != other.speed_level: + return False + if self.foot_raise_height != other.foot_raise_height: + return False + if self.body_height != other.body_height: + return False + if all(self.position != other.position): + return False + if all(self.euler != other.euler): + return False + if all(self.velocity != other.velocity): + return False + if self.yaw_speed != other.yaw_speed: + return False + if self.bms_cmd != other.bms_cmd: + return False + if self.path_point != other.path_point: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def mode(self): + """Message field 'mode'.""" + return self._mode + + @mode.setter + def mode(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'mode' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'mode' field must be an unsigned integer in [0, 255]" + self._mode = value + + @property + def gait_type(self): + """Message field 'gait_type'.""" + return self._gait_type + + @gait_type.setter + def gait_type(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'gait_type' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'gait_type' field must be an unsigned integer in [0, 255]" + self._gait_type = value + + @property + def speed_level(self): + """Message field 'speed_level'.""" + return self._speed_level + + @speed_level.setter + def speed_level(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'speed_level' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'speed_level' field must be an unsigned integer in [0, 255]" + self._speed_level = value + + @property + def foot_raise_height(self): + """Message field 'foot_raise_height'.""" + return self._foot_raise_height + + @foot_raise_height.setter + def foot_raise_height(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'foot_raise_height' field must be of type 'float'" + self._foot_raise_height = value + + @property + def body_height(self): + """Message field 'body_height'.""" + return self._body_height + + @body_height.setter + def body_height(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'body_height' field must be of type 'float'" + self._body_height = value + + @property + def position(self): + """Message field 'position'.""" + return self._position + + @position.setter + def position(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'position' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 2, \ + "The 'position' numpy.ndarray() must have a size of 2" + self._position = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'position' field must be a set or sequence with length 2 and each value of type 'float'" + self._position = numpy.array(value, dtype=numpy.float32) + + @property + def euler(self): + """Message field 'euler'.""" + return self._euler + + @euler.setter + def euler(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'euler' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'euler' numpy.ndarray() must have a size of 3" + self._euler = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'euler' field must be a set or sequence with length 3 and each value of type 'float'" + self._euler = numpy.array(value, dtype=numpy.float32) + + @property + def velocity(self): + """Message field 'velocity'.""" + return self._velocity + + @velocity.setter + def velocity(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'velocity' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 2, \ + "The 'velocity' numpy.ndarray() must have a size of 2" + self._velocity = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'velocity' field must be a set or sequence with length 2 and each value of type 'float'" + self._velocity = numpy.array(value, dtype=numpy.float32) + + @property + def yaw_speed(self): + """Message field 'yaw_speed'.""" + return self._yaw_speed + + @yaw_speed.setter + def yaw_speed(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'yaw_speed' field must be of type 'float'" + self._yaw_speed = value + + @property + def bms_cmd(self): + """Message field 'bms_cmd'.""" + return self._bms_cmd + + @bms_cmd.setter + def bms_cmd(self, value): + if __debug__: + from unitree_go.msg import BmsCmd + assert \ + isinstance(value, BmsCmd), \ + "The 'bms_cmd' field must be a sub message of type 'BmsCmd'" + self._bms_cmd = value + + @property + def path_point(self): + """Message field 'path_point'.""" + return self._path_point + + @path_point.setter + def path_point(self, value): + if __debug__: + from unitree_go.msg import PathPoint + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 30 and + all(isinstance(v, PathPoint) for v in value) and + True), \ + "The 'path_point' field must be a set or sequence with length 30 and each value of type 'PathPoint'" + self._path_point = value diff --git a/python/unitree_go/msg/_sport_mode_cmd_s.c b/python/unitree_go/msg/_sport_mode_cmd_s.c new file mode 100644 index 0000000..8163331 --- /dev/null +++ b/python/unitree_go/msg/_sport_mode_cmd_s.c @@ -0,0 +1,409 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/SportModeCmd.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/sport_mode_cmd__struct.h" +#include "unitree_go/msg/detail/sport_mode_cmd__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + +// Nested array functions includes +#include "unitree_go/msg/detail/path_point__functions.h" +// end nested array functions include +bool unitree_go__msg__bms_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__bms_cmd__convert_to_py(void * raw_ros_message); +bool unitree_go__msg__path_point__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__path_point__convert_to_py(void * raw_ros_message); + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__sport_mode_cmd__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[44]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._sport_mode_cmd.SportModeCmd", full_classname_dest, 43) == 0); + } + unitree_go__msg__SportModeCmd * ros_message = _ros_message; + { // mode + PyObject * field = PyObject_GetAttrString(_pymsg, "mode"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->mode = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // gait_type + PyObject * field = PyObject_GetAttrString(_pymsg, "gait_type"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->gait_type = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // speed_level + PyObject * field = PyObject_GetAttrString(_pymsg, "speed_level"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->speed_level = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // foot_raise_height + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_raise_height"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->foot_raise_height = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // body_height + PyObject * field = PyObject_GetAttrString(_pymsg, "body_height"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->body_height = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // position + PyObject * field = PyObject_GetAttrString(_pymsg, "position"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 2; + float * dest = ros_message->position; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // euler + PyObject * field = PyObject_GetAttrString(_pymsg, "euler"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->euler; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // velocity + PyObject * field = PyObject_GetAttrString(_pymsg, "velocity"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 2; + float * dest = ros_message->velocity; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // yaw_speed + PyObject * field = PyObject_GetAttrString(_pymsg, "yaw_speed"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->yaw_speed = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // bms_cmd + PyObject * field = PyObject_GetAttrString(_pymsg, "bms_cmd"); + if (!field) { + return false; + } + if (!unitree_go__msg__bms_cmd__convert_from_py(field, &ros_message->bms_cmd)) { + Py_DECREF(field); + return false; + } + Py_DECREF(field); + } + { // path_point + PyObject * field = PyObject_GetAttrString(_pymsg, "path_point"); + if (!field) { + return false; + } + PyObject * seq_field = PySequence_Fast(field, "expected a sequence in 'path_point'"); + if (!seq_field) { + Py_DECREF(field); + return false; + } + Py_ssize_t size = 30; + unitree_go__msg__PathPoint * dest = ros_message->path_point; + for (Py_ssize_t i = 0; i < size; ++i) { + if (!unitree_go__msg__path_point__convert_from_py(PySequence_Fast_GET_ITEM(seq_field, i), &dest[i])) { + Py_DECREF(seq_field); + Py_DECREF(field); + return false; + } + } + Py_DECREF(seq_field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__sport_mode_cmd__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of SportModeCmd */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._sport_mode_cmd"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "SportModeCmd"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__SportModeCmd * ros_message = (unitree_go__msg__SportModeCmd *)raw_ros_message; + { // mode + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->mode); + { + int rc = PyObject_SetAttrString(_pymessage, "mode", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // gait_type + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->gait_type); + { + int rc = PyObject_SetAttrString(_pymessage, "gait_type", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // speed_level + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->speed_level); + { + int rc = PyObject_SetAttrString(_pymessage, "speed_level", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // foot_raise_height + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->foot_raise_height); + { + int rc = PyObject_SetAttrString(_pymessage, "foot_raise_height", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // body_height + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->body_height); + { + int rc = PyObject_SetAttrString(_pymessage, "body_height", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // position + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "position"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->position[0]); + memcpy(dst, src, 2 * sizeof(float)); + Py_DECREF(field); + } + { // euler + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "euler"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->euler[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // velocity + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "velocity"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->velocity[0]); + memcpy(dst, src, 2 * sizeof(float)); + Py_DECREF(field); + } + { // yaw_speed + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->yaw_speed); + { + int rc = PyObject_SetAttrString(_pymessage, "yaw_speed", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // bms_cmd + PyObject * field = NULL; + field = unitree_go__msg__bms_cmd__convert_to_py(&ros_message->bms_cmd); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "bms_cmd", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // path_point + PyObject * field = NULL; + size_t size = 30; + field = PyList_New(size); + if (!field) { + return NULL; + } + unitree_go__msg__PathPoint * item; + for (size_t i = 0; i < size; ++i) { + item = &(ros_message->path_point[i]); + PyObject * pyitem = unitree_go__msg__path_point__convert_to_py(item); + if (!pyitem) { + Py_DECREF(field); + return NULL; + } + int rc = PyList_SetItem(field, i, pyitem); + (void)rc; + assert(rc == 0); + } + assert(PySequence_Check(field)); + { + int rc = PyObject_SetAttrString(_pymessage, "path_point", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_sport_mode_state.py b/python/unitree_go/msg/_sport_mode_state.py new file mode 100644 index 0000000..a00aa27 --- /dev/null +++ b/python/unitree_go/msg/_sport_mode_state.py @@ -0,0 +1,546 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/SportModeState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'position' +# Member 'velocity' +# Member 'range_obstacle' +# Member 'foot_force' +# Member 'foot_position_body' +# Member 'foot_speed_body' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_SportModeState(type): + """Metaclass of message 'SportModeState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.SportModeState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__sport_mode_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__sport_mode_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__sport_mode_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__sport_mode_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__sport_mode_state + + from unitree_go.msg import IMUState + if IMUState.__class__._TYPE_SUPPORT is None: + IMUState.__class__.__import_type_support__() + + from unitree_go.msg import TimeSpec + if TimeSpec.__class__._TYPE_SUPPORT is None: + TimeSpec.__class__.__import_type_support__() + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class SportModeState(metaclass=Metaclass_SportModeState): + """Message class 'SportModeState'.""" + + __slots__ = [ + '_stamp', + '_error_code', + '_imu_state', + '_mode', + '_progress', + '_gait_type', + '_foot_raise_height', + '_position', + '_body_height', + '_velocity', + '_yaw_speed', + '_range_obstacle', + '_foot_force', + '_foot_position_body', + '_foot_speed_body', + ] + + _fields_and_field_types = { + 'stamp': 'unitree_go/TimeSpec', + 'error_code': 'uint32', + 'imu_state': 'unitree_go/IMUState', + 'mode': 'uint8', + 'progress': 'float', + 'gait_type': 'uint8', + 'foot_raise_height': 'float', + 'position': 'float[3]', + 'body_height': 'float', + 'velocity': 'float[3]', + 'yaw_speed': 'float', + 'range_obstacle': 'float[4]', + 'foot_force': 'int16[4]', + 'foot_position_body': 'float[12]', + 'foot_speed_body': 'float[12]', + } + + SLOT_TYPES = ( + rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'TimeSpec'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + rosidl_parser.definition.NamespacedType(['unitree_go', 'msg'], 'IMUState'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 3), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 4), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('int16'), 4), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 12), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 12), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + from unitree_go.msg import TimeSpec + self.stamp = kwargs.get('stamp', TimeSpec()) + self.error_code = kwargs.get('error_code', int()) + from unitree_go.msg import IMUState + self.imu_state = kwargs.get('imu_state', IMUState()) + self.mode = kwargs.get('mode', int()) + self.progress = kwargs.get('progress', float()) + self.gait_type = kwargs.get('gait_type', int()) + self.foot_raise_height = kwargs.get('foot_raise_height', float()) + if 'position' not in kwargs: + self.position = numpy.zeros(3, dtype=numpy.float32) + else: + self.position = numpy.array(kwargs.get('position'), dtype=numpy.float32) + assert self.position.shape == (3, ) + self.body_height = kwargs.get('body_height', float()) + if 'velocity' not in kwargs: + self.velocity = numpy.zeros(3, dtype=numpy.float32) + else: + self.velocity = numpy.array(kwargs.get('velocity'), dtype=numpy.float32) + assert self.velocity.shape == (3, ) + self.yaw_speed = kwargs.get('yaw_speed', float()) + if 'range_obstacle' not in kwargs: + self.range_obstacle = numpy.zeros(4, dtype=numpy.float32) + else: + self.range_obstacle = numpy.array(kwargs.get('range_obstacle'), dtype=numpy.float32) + assert self.range_obstacle.shape == (4, ) + if 'foot_force' not in kwargs: + self.foot_force = numpy.zeros(4, dtype=numpy.int16) + else: + self.foot_force = numpy.array(kwargs.get('foot_force'), dtype=numpy.int16) + assert self.foot_force.shape == (4, ) + if 'foot_position_body' not in kwargs: + self.foot_position_body = numpy.zeros(12, dtype=numpy.float32) + else: + self.foot_position_body = numpy.array(kwargs.get('foot_position_body'), dtype=numpy.float32) + assert self.foot_position_body.shape == (12, ) + if 'foot_speed_body' not in kwargs: + self.foot_speed_body = numpy.zeros(12, dtype=numpy.float32) + else: + self.foot_speed_body = numpy.array(kwargs.get('foot_speed_body'), dtype=numpy.float32) + assert self.foot_speed_body.shape == (12, ) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.stamp != other.stamp: + return False + if self.error_code != other.error_code: + return False + if self.imu_state != other.imu_state: + return False + if self.mode != other.mode: + return False + if self.progress != other.progress: + return False + if self.gait_type != other.gait_type: + return False + if self.foot_raise_height != other.foot_raise_height: + return False + if all(self.position != other.position): + return False + if self.body_height != other.body_height: + return False + if all(self.velocity != other.velocity): + return False + if self.yaw_speed != other.yaw_speed: + return False + if all(self.range_obstacle != other.range_obstacle): + return False + if all(self.foot_force != other.foot_force): + return False + if all(self.foot_position_body != other.foot_position_body): + return False + if all(self.foot_speed_body != other.foot_speed_body): + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def stamp(self): + """Message field 'stamp'.""" + return self._stamp + + @stamp.setter + def stamp(self, value): + if __debug__: + from unitree_go.msg import TimeSpec + assert \ + isinstance(value, TimeSpec), \ + "The 'stamp' field must be a sub message of type 'TimeSpec'" + self._stamp = value + + @property + def error_code(self): + """Message field 'error_code'.""" + return self._error_code + + @error_code.setter + def error_code(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'error_code' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'error_code' field must be an unsigned integer in [0, 4294967295]" + self._error_code = value + + @property + def imu_state(self): + """Message field 'imu_state'.""" + return self._imu_state + + @imu_state.setter + def imu_state(self, value): + if __debug__: + from unitree_go.msg import IMUState + assert \ + isinstance(value, IMUState), \ + "The 'imu_state' field must be a sub message of type 'IMUState'" + self._imu_state = value + + @property + def mode(self): + """Message field 'mode'.""" + return self._mode + + @mode.setter + def mode(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'mode' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'mode' field must be an unsigned integer in [0, 255]" + self._mode = value + + @property + def progress(self): + """Message field 'progress'.""" + return self._progress + + @progress.setter + def progress(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'progress' field must be of type 'float'" + self._progress = value + + @property + def gait_type(self): + """Message field 'gait_type'.""" + return self._gait_type + + @gait_type.setter + def gait_type(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'gait_type' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'gait_type' field must be an unsigned integer in [0, 255]" + self._gait_type = value + + @property + def foot_raise_height(self): + """Message field 'foot_raise_height'.""" + return self._foot_raise_height + + @foot_raise_height.setter + def foot_raise_height(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'foot_raise_height' field must be of type 'float'" + self._foot_raise_height = value + + @property + def position(self): + """Message field 'position'.""" + return self._position + + @position.setter + def position(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'position' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'position' numpy.ndarray() must have a size of 3" + self._position = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'position' field must be a set or sequence with length 3 and each value of type 'float'" + self._position = numpy.array(value, dtype=numpy.float32) + + @property + def body_height(self): + """Message field 'body_height'.""" + return self._body_height + + @body_height.setter + def body_height(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'body_height' field must be of type 'float'" + self._body_height = value + + @property + def velocity(self): + """Message field 'velocity'.""" + return self._velocity + + @velocity.setter + def velocity(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'velocity' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 3, \ + "The 'velocity' numpy.ndarray() must have a size of 3" + self._velocity = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 3 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'velocity' field must be a set or sequence with length 3 and each value of type 'float'" + self._velocity = numpy.array(value, dtype=numpy.float32) + + @property + def yaw_speed(self): + """Message field 'yaw_speed'.""" + return self._yaw_speed + + @yaw_speed.setter + def yaw_speed(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'yaw_speed' field must be of type 'float'" + self._yaw_speed = value + + @property + def range_obstacle(self): + """Message field 'range_obstacle'.""" + return self._range_obstacle + + @range_obstacle.setter + def range_obstacle(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'range_obstacle' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 4, \ + "The 'range_obstacle' numpy.ndarray() must have a size of 4" + self._range_obstacle = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 4 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'range_obstacle' field must be a set or sequence with length 4 and each value of type 'float'" + self._range_obstacle = numpy.array(value, dtype=numpy.float32) + + @property + def foot_force(self): + """Message field 'foot_force'.""" + return self._foot_force + + @foot_force.setter + def foot_force(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.int16, \ + "The 'foot_force' numpy.ndarray() must have the dtype of 'numpy.int16'" + assert value.size == 4, \ + "The 'foot_force' numpy.ndarray() must have a size of 4" + self._foot_force = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 4 and + all(isinstance(v, int) for v in value) and + all(val >= -32768 and val < 32768 for val in value)), \ + "The 'foot_force' field must be a set or sequence with length 4 and each value of type 'int' and each integer in [-32768, 32767]" + self._foot_force = numpy.array(value, dtype=numpy.int16) + + @property + def foot_position_body(self): + """Message field 'foot_position_body'.""" + return self._foot_position_body + + @foot_position_body.setter + def foot_position_body(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'foot_position_body' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 12, \ + "The 'foot_position_body' numpy.ndarray() must have a size of 12" + self._foot_position_body = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 12 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'foot_position_body' field must be a set or sequence with length 12 and each value of type 'float'" + self._foot_position_body = numpy.array(value, dtype=numpy.float32) + + @property + def foot_speed_body(self): + """Message field 'foot_speed_body'.""" + return self._foot_speed_body + + @foot_speed_body.setter + def foot_speed_body(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'foot_speed_body' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 12, \ + "The 'foot_speed_body' numpy.ndarray() must have a size of 12" + self._foot_speed_body = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 12 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'foot_speed_body' field must be a set or sequence with length 12 and each value of type 'float'" + self._foot_speed_body = numpy.array(value, dtype=numpy.float32) diff --git a/python/unitree_go/msg/_sport_mode_state_s.c b/python/unitree_go/msg/_sport_mode_state_s.c new file mode 100644 index 0000000..b25a50b --- /dev/null +++ b/python/unitree_go/msg/_sport_mode_state_s.c @@ -0,0 +1,527 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/SportModeState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/sport_mode_state__struct.h" +#include "unitree_go/msg/detail/sport_mode_state__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + +bool unitree_go__msg__time_spec__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__time_spec__convert_to_py(void * raw_ros_message); +bool unitree_go__msg__imu_state__convert_from_py(PyObject * _pymsg, void * _ros_message); +PyObject * unitree_go__msg__imu_state__convert_to_py(void * raw_ros_message); + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__sport_mode_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[48]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._sport_mode_state.SportModeState", full_classname_dest, 47) == 0); + } + unitree_go__msg__SportModeState * ros_message = _ros_message; + { // stamp + PyObject * field = PyObject_GetAttrString(_pymsg, "stamp"); + if (!field) { + return false; + } + if (!unitree_go__msg__time_spec__convert_from_py(field, &ros_message->stamp)) { + Py_DECREF(field); + return false; + } + Py_DECREF(field); + } + { // error_code + PyObject * field = PyObject_GetAttrString(_pymsg, "error_code"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->error_code = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // imu_state + PyObject * field = PyObject_GetAttrString(_pymsg, "imu_state"); + if (!field) { + return false; + } + if (!unitree_go__msg__imu_state__convert_from_py(field, &ros_message->imu_state)) { + Py_DECREF(field); + return false; + } + Py_DECREF(field); + } + { // mode + PyObject * field = PyObject_GetAttrString(_pymsg, "mode"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->mode = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // progress + PyObject * field = PyObject_GetAttrString(_pymsg, "progress"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->progress = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // gait_type + PyObject * field = PyObject_GetAttrString(_pymsg, "gait_type"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->gait_type = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // foot_raise_height + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_raise_height"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->foot_raise_height = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // position + PyObject * field = PyObject_GetAttrString(_pymsg, "position"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->position; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // body_height + PyObject * field = PyObject_GetAttrString(_pymsg, "body_height"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->body_height = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // velocity + PyObject * field = PyObject_GetAttrString(_pymsg, "velocity"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 3; + float * dest = ros_message->velocity; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // yaw_speed + PyObject * field = PyObject_GetAttrString(_pymsg, "yaw_speed"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->yaw_speed = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // range_obstacle + PyObject * field = PyObject_GetAttrString(_pymsg, "range_obstacle"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 4; + float * dest = ros_message->range_obstacle; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // foot_force + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_force"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT16); + Py_ssize_t size = 4; + int16_t * dest = ros_message->foot_force; + for (Py_ssize_t i = 0; i < size; ++i) { + int16_t tmp = *(npy_int16 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(int16_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // foot_position_body + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_position_body"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 12; + float * dest = ros_message->foot_position_body; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // foot_speed_body + PyObject * field = PyObject_GetAttrString(_pymsg, "foot_speed_body"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 12; + float * dest = ros_message->foot_speed_body; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__sport_mode_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of SportModeState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._sport_mode_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "SportModeState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__SportModeState * ros_message = (unitree_go__msg__SportModeState *)raw_ros_message; + { // stamp + PyObject * field = NULL; + field = unitree_go__msg__time_spec__convert_to_py(&ros_message->stamp); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "stamp", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // error_code + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->error_code); + { + int rc = PyObject_SetAttrString(_pymessage, "error_code", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // imu_state + PyObject * field = NULL; + field = unitree_go__msg__imu_state__convert_to_py(&ros_message->imu_state); + if (!field) { + return NULL; + } + { + int rc = PyObject_SetAttrString(_pymessage, "imu_state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // mode + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->mode); + { + int rc = PyObject_SetAttrString(_pymessage, "mode", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // progress + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->progress); + { + int rc = PyObject_SetAttrString(_pymessage, "progress", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // gait_type + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->gait_type); + { + int rc = PyObject_SetAttrString(_pymessage, "gait_type", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // foot_raise_height + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->foot_raise_height); + { + int rc = PyObject_SetAttrString(_pymessage, "foot_raise_height", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // position + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "position"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->position[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // body_height + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->body_height); + { + int rc = PyObject_SetAttrString(_pymessage, "body_height", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // velocity + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "velocity"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->velocity[0]); + memcpy(dst, src, 3 * sizeof(float)); + Py_DECREF(field); + } + { // yaw_speed + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->yaw_speed); + { + int rc = PyObject_SetAttrString(_pymessage, "yaw_speed", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // range_obstacle + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "range_obstacle"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->range_obstacle[0]); + memcpy(dst, src, 4 * sizeof(float)); + Py_DECREF(field); + } + { // foot_force + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "foot_force"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_INT16); + assert(sizeof(npy_int16) == sizeof(int16_t)); + npy_int16 * dst = (npy_int16 *)PyArray_GETPTR1(seq_field, 0); + int16_t * src = &(ros_message->foot_force[0]); + memcpy(dst, src, 4 * sizeof(int16_t)); + Py_DECREF(field); + } + { // foot_position_body + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "foot_position_body"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->foot_position_body[0]); + memcpy(dst, src, 12 * sizeof(float)); + Py_DECREF(field); + } + { // foot_speed_body + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "foot_speed_body"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->foot_speed_body[0]); + memcpy(dst, src, 12 * sizeof(float)); + Py_DECREF(field); + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_time_spec.py b/python/unitree_go/msg/_time_spec.py new file mode 100644 index 0000000..2282825 --- /dev/null +++ b/python/unitree_go/msg/_time_spec.py @@ -0,0 +1,145 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/TimeSpec.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_TimeSpec(type): + """Metaclass of message 'TimeSpec'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.TimeSpec') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__time_spec + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__time_spec + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__time_spec + cls._TYPE_SUPPORT = module.type_support_msg__msg__time_spec + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__time_spec + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class TimeSpec(metaclass=Metaclass_TimeSpec): + """Message class 'TimeSpec'.""" + + __slots__ = [ + '_sec', + '_nanosec', + ] + + _fields_and_field_types = { + 'sec': 'int32', + 'nanosec': 'uint32', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('int32'), # noqa: E501 + rosidl_parser.definition.BasicType('uint32'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.sec = kwargs.get('sec', int()) + self.nanosec = kwargs.get('nanosec', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.sec != other.sec: + return False + if self.nanosec != other.nanosec: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def sec(self): + """Message field 'sec'.""" + return self._sec + + @sec.setter + def sec(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'sec' field must be of type 'int'" + assert value >= -2147483648 and value < 2147483648, \ + "The 'sec' field must be an integer in [-2147483648, 2147483647]" + self._sec = value + + @property + def nanosec(self): + """Message field 'nanosec'.""" + return self._nanosec + + @nanosec.setter + def nanosec(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'nanosec' field must be of type 'int'" + assert value >= 0 and value < 4294967296, \ + "The 'nanosec' field must be an unsigned integer in [0, 4294967295]" + self._nanosec = value diff --git a/python/unitree_go/msg/_time_spec_s.c b/python/unitree_go/msg/_time_spec_s.c new file mode 100644 index 0000000..a9643e1 --- /dev/null +++ b/python/unitree_go/msg/_time_spec_s.c @@ -0,0 +1,118 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/TimeSpec.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/time_spec__struct.h" +#include "unitree_go/msg/detail/time_spec__functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__time_spec__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[35]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._time_spec.TimeSpec", full_classname_dest, 34) == 0); + } + unitree_go__msg__TimeSpec * ros_message = _ros_message; + { // sec + PyObject * field = PyObject_GetAttrString(_pymsg, "sec"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->sec = (int32_t)PyLong_AsLong(field); + Py_DECREF(field); + } + { // nanosec + PyObject * field = PyObject_GetAttrString(_pymsg, "nanosec"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->nanosec = PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__time_spec__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of TimeSpec */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._time_spec"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "TimeSpec"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__TimeSpec * ros_message = (unitree_go__msg__TimeSpec *)raw_ros_message; + { // sec + PyObject * field = NULL; + field = PyLong_FromLong(ros_message->sec); + { + int rc = PyObject_SetAttrString(_pymessage, "sec", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // nanosec + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->nanosec); + { + int rc = PyObject_SetAttrString(_pymessage, "nanosec", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_uwb_state.py b/python/unitree_go/msg/_uwb_state.py new file mode 100644 index 0000000..5ed22b5 --- /dev/null +++ b/python/unitree_go/msg/_uwb_state.py @@ -0,0 +1,484 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/UwbState.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +# Member 'version' +# Member 'joystick' +import numpy # noqa: E402, I100 + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_UwbState(type): + """Metaclass of message 'UwbState'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.UwbState') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__uwb_state + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__uwb_state + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__uwb_state + cls._TYPE_SUPPORT = module.type_support_msg__msg__uwb_state + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__uwb_state + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class UwbState(metaclass=Metaclass_UwbState): + """Message class 'UwbState'.""" + + __slots__ = [ + '_version', + '_channel', + '_joy_mode', + '_orientation_est', + '_pitch_est', + '_distance_est', + '_yaw_est', + '_tag_roll', + '_tag_pitch', + '_tag_yaw', + '_base_roll', + '_base_pitch', + '_base_yaw', + '_joystick', + '_error_state', + '_buttons', + '_enabled_from_app', + ] + + _fields_and_field_types = { + 'version': 'uint8[2]', + 'channel': 'uint8', + 'joy_mode': 'uint8', + 'orientation_est': 'float', + 'pitch_est': 'float', + 'distance_est': 'float', + 'yaw_est': 'float', + 'tag_roll': 'float', + 'tag_pitch': 'float', + 'tag_yaw': 'float', + 'base_roll': 'float', + 'base_pitch': 'float', + 'base_yaw': 'float', + 'joystick': 'float[2]', + 'error_state': 'uint8', + 'buttons': 'uint8', + 'enabled_from_app': 'uint8', + } + + SLOT_TYPES = ( + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('uint8'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.Array(rosidl_parser.definition.BasicType('float'), 2), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + if 'version' not in kwargs: + self.version = numpy.zeros(2, dtype=numpy.uint8) + else: + self.version = numpy.array(kwargs.get('version'), dtype=numpy.uint8) + assert self.version.shape == (2, ) + self.channel = kwargs.get('channel', int()) + self.joy_mode = kwargs.get('joy_mode', int()) + self.orientation_est = kwargs.get('orientation_est', float()) + self.pitch_est = kwargs.get('pitch_est', float()) + self.distance_est = kwargs.get('distance_est', float()) + self.yaw_est = kwargs.get('yaw_est', float()) + self.tag_roll = kwargs.get('tag_roll', float()) + self.tag_pitch = kwargs.get('tag_pitch', float()) + self.tag_yaw = kwargs.get('tag_yaw', float()) + self.base_roll = kwargs.get('base_roll', float()) + self.base_pitch = kwargs.get('base_pitch', float()) + self.base_yaw = kwargs.get('base_yaw', float()) + if 'joystick' not in kwargs: + self.joystick = numpy.zeros(2, dtype=numpy.float32) + else: + self.joystick = numpy.array(kwargs.get('joystick'), dtype=numpy.float32) + assert self.joystick.shape == (2, ) + self.error_state = kwargs.get('error_state', int()) + self.buttons = kwargs.get('buttons', int()) + self.enabled_from_app = kwargs.get('enabled_from_app', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if all(self.version != other.version): + return False + if self.channel != other.channel: + return False + if self.joy_mode != other.joy_mode: + return False + if self.orientation_est != other.orientation_est: + return False + if self.pitch_est != other.pitch_est: + return False + if self.distance_est != other.distance_est: + return False + if self.yaw_est != other.yaw_est: + return False + if self.tag_roll != other.tag_roll: + return False + if self.tag_pitch != other.tag_pitch: + return False + if self.tag_yaw != other.tag_yaw: + return False + if self.base_roll != other.base_roll: + return False + if self.base_pitch != other.base_pitch: + return False + if self.base_yaw != other.base_yaw: + return False + if all(self.joystick != other.joystick): + return False + if self.error_state != other.error_state: + return False + if self.buttons != other.buttons: + return False + if self.enabled_from_app != other.enabled_from_app: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def version(self): + """Message field 'version'.""" + return self._version + + @version.setter + def version(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.uint8, \ + "The 'version' numpy.ndarray() must have the dtype of 'numpy.uint8'" + assert value.size == 2, \ + "The 'version' numpy.ndarray() must have a size of 2" + self._version = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, int) for v in value) and + all(val >= 0 and val < 256 for val in value)), \ + "The 'version' field must be a set or sequence with length 2 and each value of type 'int' and each unsigned integer in [0, 255]" + self._version = numpy.array(value, dtype=numpy.uint8) + + @property + def channel(self): + """Message field 'channel'.""" + return self._channel + + @channel.setter + def channel(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'channel' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'channel' field must be an unsigned integer in [0, 255]" + self._channel = value + + @property + def joy_mode(self): + """Message field 'joy_mode'.""" + return self._joy_mode + + @joy_mode.setter + def joy_mode(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'joy_mode' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'joy_mode' field must be an unsigned integer in [0, 255]" + self._joy_mode = value + + @property + def orientation_est(self): + """Message field 'orientation_est'.""" + return self._orientation_est + + @orientation_est.setter + def orientation_est(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'orientation_est' field must be of type 'float'" + self._orientation_est = value + + @property + def pitch_est(self): + """Message field 'pitch_est'.""" + return self._pitch_est + + @pitch_est.setter + def pitch_est(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'pitch_est' field must be of type 'float'" + self._pitch_est = value + + @property + def distance_est(self): + """Message field 'distance_est'.""" + return self._distance_est + + @distance_est.setter + def distance_est(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'distance_est' field must be of type 'float'" + self._distance_est = value + + @property + def yaw_est(self): + """Message field 'yaw_est'.""" + return self._yaw_est + + @yaw_est.setter + def yaw_est(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'yaw_est' field must be of type 'float'" + self._yaw_est = value + + @property + def tag_roll(self): + """Message field 'tag_roll'.""" + return self._tag_roll + + @tag_roll.setter + def tag_roll(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'tag_roll' field must be of type 'float'" + self._tag_roll = value + + @property + def tag_pitch(self): + """Message field 'tag_pitch'.""" + return self._tag_pitch + + @tag_pitch.setter + def tag_pitch(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'tag_pitch' field must be of type 'float'" + self._tag_pitch = value + + @property + def tag_yaw(self): + """Message field 'tag_yaw'.""" + return self._tag_yaw + + @tag_yaw.setter + def tag_yaw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'tag_yaw' field must be of type 'float'" + self._tag_yaw = value + + @property + def base_roll(self): + """Message field 'base_roll'.""" + return self._base_roll + + @base_roll.setter + def base_roll(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'base_roll' field must be of type 'float'" + self._base_roll = value + + @property + def base_pitch(self): + """Message field 'base_pitch'.""" + return self._base_pitch + + @base_pitch.setter + def base_pitch(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'base_pitch' field must be of type 'float'" + self._base_pitch = value + + @property + def base_yaw(self): + """Message field 'base_yaw'.""" + return self._base_yaw + + @base_yaw.setter + def base_yaw(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'base_yaw' field must be of type 'float'" + self._base_yaw = value + + @property + def joystick(self): + """Message field 'joystick'.""" + return self._joystick + + @joystick.setter + def joystick(self, value): + if isinstance(value, numpy.ndarray): + assert value.dtype == numpy.float32, \ + "The 'joystick' numpy.ndarray() must have the dtype of 'numpy.float32'" + assert value.size == 2, \ + "The 'joystick' numpy.ndarray() must have a size of 2" + self._joystick = value + return + if __debug__: + from collections.abc import Sequence + from collections.abc import Set + from collections import UserList + from collections import UserString + assert \ + ((isinstance(value, Sequence) or + isinstance(value, Set) or + isinstance(value, UserList)) and + not isinstance(value, str) and + not isinstance(value, UserString) and + len(value) == 2 and + all(isinstance(v, float) for v in value) and + True), \ + "The 'joystick' field must be a set or sequence with length 2 and each value of type 'float'" + self._joystick = numpy.array(value, dtype=numpy.float32) + + @property + def error_state(self): + """Message field 'error_state'.""" + return self._error_state + + @error_state.setter + def error_state(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'error_state' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'error_state' field must be an unsigned integer in [0, 255]" + self._error_state = value + + @property + def buttons(self): + """Message field 'buttons'.""" + return self._buttons + + @buttons.setter + def buttons(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'buttons' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'buttons' field must be an unsigned integer in [0, 255]" + self._buttons = value + + @property + def enabled_from_app(self): + """Message field 'enabled_from_app'.""" + return self._enabled_from_app + + @enabled_from_app.setter + def enabled_from_app(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'enabled_from_app' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'enabled_from_app' field must be an unsigned integer in [0, 255]" + self._enabled_from_app = value diff --git a/python/unitree_go/msg/_uwb_state_s.c b/python/unitree_go/msg/_uwb_state_s.c new file mode 100644 index 0000000..c551163 --- /dev/null +++ b/python/unitree_go/msg/_uwb_state_s.c @@ -0,0 +1,465 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/UwbState.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/uwb_state__struct.h" +#include "unitree_go/msg/detail/uwb_state__functions.h" + +#include "rosidl_runtime_c/primitives_sequence.h" +#include "rosidl_runtime_c/primitives_sequence_functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__uwb_state__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[35]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._uwb_state.UwbState", full_classname_dest, 34) == 0); + } + unitree_go__msg__UwbState * ros_message = _ros_message; + { // version + PyObject * field = PyObject_GetAttrString(_pymsg, "version"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + Py_ssize_t size = 2; + uint8_t * dest = ros_message->version; + for (Py_ssize_t i = 0; i < size; ++i) { + uint8_t tmp = *(npy_uint8 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(uint8_t)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // channel + PyObject * field = PyObject_GetAttrString(_pymsg, "channel"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->channel = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // joy_mode + PyObject * field = PyObject_GetAttrString(_pymsg, "joy_mode"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->joy_mode = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // orientation_est + PyObject * field = PyObject_GetAttrString(_pymsg, "orientation_est"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->orientation_est = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // pitch_est + PyObject * field = PyObject_GetAttrString(_pymsg, "pitch_est"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->pitch_est = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // distance_est + PyObject * field = PyObject_GetAttrString(_pymsg, "distance_est"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->distance_est = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // yaw_est + PyObject * field = PyObject_GetAttrString(_pymsg, "yaw_est"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->yaw_est = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // tag_roll + PyObject * field = PyObject_GetAttrString(_pymsg, "tag_roll"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->tag_roll = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // tag_pitch + PyObject * field = PyObject_GetAttrString(_pymsg, "tag_pitch"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->tag_pitch = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // tag_yaw + PyObject * field = PyObject_GetAttrString(_pymsg, "tag_yaw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->tag_yaw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // base_roll + PyObject * field = PyObject_GetAttrString(_pymsg, "base_roll"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->base_roll = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // base_pitch + PyObject * field = PyObject_GetAttrString(_pymsg, "base_pitch"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->base_pitch = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // base_yaw + PyObject * field = PyObject_GetAttrString(_pymsg, "base_yaw"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->base_yaw = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // joystick + PyObject * field = PyObject_GetAttrString(_pymsg, "joystick"); + if (!field) { + return false; + } + { + // TODO(dirk-thomas) use a better way to check the type before casting + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + Py_INCREF(seq_field); + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + Py_ssize_t size = 2; + float * dest = ros_message->joystick; + for (Py_ssize_t i = 0; i < size; ++i) { + float tmp = *(npy_float32 *)PyArray_GETPTR1(seq_field, i); + memcpy(&dest[i], &tmp, sizeof(float)); + } + Py_DECREF(seq_field); + } + Py_DECREF(field); + } + { // error_state + PyObject * field = PyObject_GetAttrString(_pymsg, "error_state"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->error_state = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // buttons + PyObject * field = PyObject_GetAttrString(_pymsg, "buttons"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->buttons = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + { // enabled_from_app + PyObject * field = PyObject_GetAttrString(_pymsg, "enabled_from_app"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->enabled_from_app = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__uwb_state__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of UwbState */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._uwb_state"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "UwbState"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__UwbState * ros_message = (unitree_go__msg__UwbState *)raw_ros_message; + { // version + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "version"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_UINT8); + assert(sizeof(npy_uint8) == sizeof(uint8_t)); + npy_uint8 * dst = (npy_uint8 *)PyArray_GETPTR1(seq_field, 0); + uint8_t * src = &(ros_message->version[0]); + memcpy(dst, src, 2 * sizeof(uint8_t)); + Py_DECREF(field); + } + { // channel + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->channel); + { + int rc = PyObject_SetAttrString(_pymessage, "channel", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // joy_mode + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->joy_mode); + { + int rc = PyObject_SetAttrString(_pymessage, "joy_mode", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // orientation_est + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->orientation_est); + { + int rc = PyObject_SetAttrString(_pymessage, "orientation_est", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // pitch_est + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->pitch_est); + { + int rc = PyObject_SetAttrString(_pymessage, "pitch_est", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // distance_est + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->distance_est); + { + int rc = PyObject_SetAttrString(_pymessage, "distance_est", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // yaw_est + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->yaw_est); + { + int rc = PyObject_SetAttrString(_pymessage, "yaw_est", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // tag_roll + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->tag_roll); + { + int rc = PyObject_SetAttrString(_pymessage, "tag_roll", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // tag_pitch + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->tag_pitch); + { + int rc = PyObject_SetAttrString(_pymessage, "tag_pitch", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // tag_yaw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->tag_yaw); + { + int rc = PyObject_SetAttrString(_pymessage, "tag_yaw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // base_roll + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->base_roll); + { + int rc = PyObject_SetAttrString(_pymessage, "base_roll", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // base_pitch + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->base_pitch); + { + int rc = PyObject_SetAttrString(_pymessage, "base_pitch", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // base_yaw + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->base_yaw); + { + int rc = PyObject_SetAttrString(_pymessage, "base_yaw", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // joystick + PyObject * field = NULL; + field = PyObject_GetAttrString(_pymessage, "joystick"); + if (!field) { + return NULL; + } + assert(field->ob_type != NULL); + assert(field->ob_type->tp_name != NULL); + assert(strcmp(field->ob_type->tp_name, "numpy.ndarray") == 0); + PyArrayObject * seq_field = (PyArrayObject *)field; + assert(PyArray_NDIM(seq_field) == 1); + assert(PyArray_TYPE(seq_field) == NPY_FLOAT32); + assert(sizeof(npy_float32) == sizeof(float)); + npy_float32 * dst = (npy_float32 *)PyArray_GETPTR1(seq_field, 0); + float * src = &(ros_message->joystick[0]); + memcpy(dst, src, 2 * sizeof(float)); + Py_DECREF(field); + } + { // error_state + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->error_state); + { + int rc = PyObject_SetAttrString(_pymessage, "error_state", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // buttons + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->buttons); + { + int rc = PyObject_SetAttrString(_pymessage, "buttons", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // enabled_from_app + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->enabled_from_app); + { + int rc = PyObject_SetAttrString(_pymessage, "enabled_from_app", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_uwb_switch.py b/python/unitree_go/msg/_uwb_switch.py new file mode 100644 index 0000000..5d28dcb --- /dev/null +++ b/python/unitree_go/msg/_uwb_switch.py @@ -0,0 +1,124 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/UwbSwitch.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_UwbSwitch(type): + """Metaclass of message 'UwbSwitch'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.UwbSwitch') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__uwb_switch + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__uwb_switch + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__uwb_switch + cls._TYPE_SUPPORT = module.type_support_msg__msg__uwb_switch + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__uwb_switch + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class UwbSwitch(metaclass=Metaclass_UwbSwitch): + """Message class 'UwbSwitch'.""" + + __slots__ = [ + '_enabled', + ] + + _fields_and_field_types = { + 'enabled': 'uint8', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('uint8'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.enabled = kwargs.get('enabled', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.enabled != other.enabled: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def enabled(self): + """Message field 'enabled'.""" + return self._enabled + + @enabled.setter + def enabled(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'enabled' field must be of type 'int'" + assert value >= 0 and value < 256, \ + "The 'enabled' field must be an unsigned integer in [0, 255]" + self._enabled = value diff --git a/python/unitree_go/msg/_uwb_switch_s.c b/python/unitree_go/msg/_uwb_switch_s.c new file mode 100644 index 0000000..64fae02 --- /dev/null +++ b/python/unitree_go/msg/_uwb_switch_s.c @@ -0,0 +1,98 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/UwbSwitch.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/uwb_switch__struct.h" +#include "unitree_go/msg/detail/uwb_switch__functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__uwb_switch__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[37]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._uwb_switch.UwbSwitch", full_classname_dest, 36) == 0); + } + unitree_go__msg__UwbSwitch * ros_message = _ros_message; + { // enabled + PyObject * field = PyObject_GetAttrString(_pymsg, "enabled"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->enabled = (uint8_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__uwb_switch__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of UwbSwitch */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._uwb_switch"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "UwbSwitch"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__UwbSwitch * ros_message = (unitree_go__msg__UwbSwitch *)raw_ros_message; + { // enabled + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->enabled); + { + int rc = PyObject_SetAttrString(_pymessage, "enabled", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} diff --git a/python/unitree_go/msg/_wireless_controller.py b/python/unitree_go/msg/_wireless_controller.py new file mode 100644 index 0000000..ceeb80a --- /dev/null +++ b/python/unitree_go/msg/_wireless_controller.py @@ -0,0 +1,200 @@ +# generated from rosidl_generator_py/resource/_idl.py.em +# with input from unitree_go:msg/WirelessController.idl +# generated code does not contain a copyright notice + + +# Import statements for member types + +import rosidl_parser.definition # noqa: E402, I100 + + +class Metaclass_WirelessController(type): + """Metaclass of message 'WirelessController'.""" + + _CREATE_ROS_MESSAGE = None + _CONVERT_FROM_PY = None + _CONVERT_TO_PY = None + _DESTROY_ROS_MESSAGE = None + _TYPE_SUPPORT = None + + __constants = { + } + + @classmethod + def __import_type_support__(cls): + try: + from rosidl_generator_py import import_type_support + module = import_type_support('unitree_go') + except ImportError: + import logging + import traceback + logger = logging.getLogger( + 'unitree_go.msg.WirelessController') + logger.debug( + 'Failed to import needed modules for type support:\n' + + traceback.format_exc()) + else: + cls._CREATE_ROS_MESSAGE = module.create_ros_message_msg__msg__wireless_controller + cls._CONVERT_FROM_PY = module.convert_from_py_msg__msg__wireless_controller + cls._CONVERT_TO_PY = module.convert_to_py_msg__msg__wireless_controller + cls._TYPE_SUPPORT = module.type_support_msg__msg__wireless_controller + cls._DESTROY_ROS_MESSAGE = module.destroy_ros_message_msg__msg__wireless_controller + + @classmethod + def __prepare__(cls, name, bases, **kwargs): + # list constant names here so that they appear in the help text of + # the message class under "Data and other attributes defined here:" + # as well as populate each message instance + return { + } + + +class WirelessController(metaclass=Metaclass_WirelessController): + """Message class 'WirelessController'.""" + + __slots__ = [ + '_lx', + '_ly', + '_rx', + '_ry', + '_keys', + ] + + _fields_and_field_types = { + 'lx': 'float', + 'ly': 'float', + 'rx': 'float', + 'ry': 'float', + 'keys': 'uint16', + } + + SLOT_TYPES = ( + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('float'), # noqa: E501 + rosidl_parser.definition.BasicType('uint16'), # noqa: E501 + ) + + def __init__(self, **kwargs): + assert all('_' + key in self.__slots__ for key in kwargs.keys()), \ + 'Invalid arguments passed to constructor: %s' % \ + ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) + self.lx = kwargs.get('lx', float()) + self.ly = kwargs.get('ly', float()) + self.rx = kwargs.get('rx', float()) + self.ry = kwargs.get('ry', float()) + self.keys = kwargs.get('keys', int()) + + def __repr__(self): + typename = self.__class__.__module__.split('.') + typename.pop() + typename.append(self.__class__.__name__) + args = [] + for s, t in zip(self.__slots__, self.SLOT_TYPES): + field = getattr(self, s) + fieldstr = repr(field) + # We use Python array type for fields that can be directly stored + # in them, and "normal" sequences for everything else. If it is + # a type that we store in an array, strip off the 'array' portion. + if ( + isinstance(t, rosidl_parser.definition.AbstractSequence) and + isinstance(t.value_type, rosidl_parser.definition.BasicType) and + t.value_type.typename in ['float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64'] + ): + if len(field) == 0: + fieldstr = '[]' + else: + assert fieldstr.startswith('array(') + prefix = "array('X', " + suffix = ')' + fieldstr = fieldstr[len(prefix):-len(suffix)] + args.append(s[1:] + '=' + fieldstr) + return '%s(%s)' % ('.'.join(typename), ', '.join(args)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if self.lx != other.lx: + return False + if self.ly != other.ly: + return False + if self.rx != other.rx: + return False + if self.ry != other.ry: + return False + if self.keys != other.keys: + return False + return True + + @classmethod + def get_fields_and_field_types(cls): + from copy import copy + return copy(cls._fields_and_field_types) + + @property + def lx(self): + """Message field 'lx'.""" + return self._lx + + @lx.setter + def lx(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'lx' field must be of type 'float'" + self._lx = value + + @property + def ly(self): + """Message field 'ly'.""" + return self._ly + + @ly.setter + def ly(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'ly' field must be of type 'float'" + self._ly = value + + @property + def rx(self): + """Message field 'rx'.""" + return self._rx + + @rx.setter + def rx(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'rx' field must be of type 'float'" + self._rx = value + + @property + def ry(self): + """Message field 'ry'.""" + return self._ry + + @ry.setter + def ry(self, value): + if __debug__: + assert \ + isinstance(value, float), \ + "The 'ry' field must be of type 'float'" + self._ry = value + + @property + def keys(self): + """Message field 'keys'.""" + return self._keys + + @keys.setter + def keys(self, value): + if __debug__: + assert \ + isinstance(value, int), \ + "The 'keys' field must be of type 'int'" + assert value >= 0 and value < 65536, \ + "The 'keys' field must be an unsigned integer in [0, 65535]" + self._keys = value diff --git a/python/unitree_go/msg/_wireless_controller_s.c b/python/unitree_go/msg/_wireless_controller_s.c new file mode 100644 index 0000000..f02defc --- /dev/null +++ b/python/unitree_go/msg/_wireless_controller_s.c @@ -0,0 +1,178 @@ +// generated from rosidl_generator_py/resource/_idl_support.c.em +// with input from unitree_go:msg/WirelessController.idl +// generated code does not contain a copyright notice +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include +#ifndef _WIN32 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#include "numpy/ndarrayobject.h" +#ifndef _WIN32 +# pragma GCC diagnostic pop +#endif +#include "rosidl_runtime_c/visibility_control.h" +#include "unitree_go/msg/detail/wireless_controller__struct.h" +#include "unitree_go/msg/detail/wireless_controller__functions.h" + + +ROSIDL_GENERATOR_C_EXPORT +bool unitree_go__msg__wireless_controller__convert_from_py(PyObject * _pymsg, void * _ros_message) +{ + // check that the passed message is of the expected Python class + { + char full_classname_dest[55]; + { + char * class_name = NULL; + char * module_name = NULL; + { + PyObject * class_attr = PyObject_GetAttrString(_pymsg, "__class__"); + if (class_attr) { + PyObject * name_attr = PyObject_GetAttrString(class_attr, "__name__"); + if (name_attr) { + class_name = (char *)PyUnicode_1BYTE_DATA(name_attr); + Py_DECREF(name_attr); + } + PyObject * module_attr = PyObject_GetAttrString(class_attr, "__module__"); + if (module_attr) { + module_name = (char *)PyUnicode_1BYTE_DATA(module_attr); + Py_DECREF(module_attr); + } + Py_DECREF(class_attr); + } + } + if (!class_name || !module_name) { + return false; + } + snprintf(full_classname_dest, sizeof(full_classname_dest), "%s.%s", module_name, class_name); + } + assert(strncmp("unitree_go.msg._wireless_controller.WirelessController", full_classname_dest, 54) == 0); + } + unitree_go__msg__WirelessController * ros_message = _ros_message; + { // lx + PyObject * field = PyObject_GetAttrString(_pymsg, "lx"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->lx = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // ly + PyObject * field = PyObject_GetAttrString(_pymsg, "ly"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->ly = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // rx + PyObject * field = PyObject_GetAttrString(_pymsg, "rx"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->rx = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // ry + PyObject * field = PyObject_GetAttrString(_pymsg, "ry"); + if (!field) { + return false; + } + assert(PyFloat_Check(field)); + ros_message->ry = (float)PyFloat_AS_DOUBLE(field); + Py_DECREF(field); + } + { // keys + PyObject * field = PyObject_GetAttrString(_pymsg, "keys"); + if (!field) { + return false; + } + assert(PyLong_Check(field)); + ros_message->keys = (uint16_t)PyLong_AsUnsignedLong(field); + Py_DECREF(field); + } + + return true; +} + +ROSIDL_GENERATOR_C_EXPORT +PyObject * unitree_go__msg__wireless_controller__convert_to_py(void * raw_ros_message) +{ + /* NOTE(esteve): Call constructor of WirelessController */ + PyObject * _pymessage = NULL; + { + PyObject * pymessage_module = PyImport_ImportModule("unitree_go.msg._wireless_controller"); + assert(pymessage_module); + PyObject * pymessage_class = PyObject_GetAttrString(pymessage_module, "WirelessController"); + assert(pymessage_class); + Py_DECREF(pymessage_module); + _pymessage = PyObject_CallObject(pymessage_class, NULL); + Py_DECREF(pymessage_class); + if (!_pymessage) { + return NULL; + } + } + unitree_go__msg__WirelessController * ros_message = (unitree_go__msg__WirelessController *)raw_ros_message; + { // lx + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->lx); + { + int rc = PyObject_SetAttrString(_pymessage, "lx", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // ly + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->ly); + { + int rc = PyObject_SetAttrString(_pymessage, "ly", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // rx + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->rx); + { + int rc = PyObject_SetAttrString(_pymessage, "rx", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // ry + PyObject * field = NULL; + field = PyFloat_FromDouble(ros_message->ry); + { + int rc = PyObject_SetAttrString(_pymessage, "ry", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + { // keys + PyObject * field = NULL; + field = PyLong_FromUnsignedLong(ros_message->keys); + { + int rc = PyObject_SetAttrString(_pymessage, "keys", field); + Py_DECREF(field); + if (rc) { + return NULL; + } + } + } + + // ownership of _pymessage is transferred to the caller + return _pymessage; +} From 0131e8ff23ce604af8444f5cc25fbfeb14ad2aa8 Mon Sep 17 00:00:00 2001 From: Yihuai Date: Mon, 5 Feb 2024 15:40:30 -0800 Subject: [PATCH 03/12] Update --- .gitignore | 3 +- .vscode/settings.json | 64 ++++++++++++++++- example/low_level/low_level.cpp | 20 +++++- python/CMakeLists.txt | 2 +- python/crc_module.so | Bin 763624 -> 798952 bytes python/crc_pybind.cpp | 121 ++++++++++++++++++++++++++++++-- python/test_crc.py | 12 +++- 7 files changed, 210 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 2b33733..d874231 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build __pycache__ -*cpython* \ No newline at end of file +*cpython* +.vscode \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 0478e07..2f2b5ad 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,68 @@ "bitset": "cpp", "initializer_list": "cpp", "regex": "cpp", - "utility": "cpp" + "utility": "cpp", + "random": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "atomic": "cpp", + "strstream": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "complex": "cpp", + "condition_variable": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "ratio": "cpp", + "string": "cpp", + "system_error": "cpp", + "type_traits": "cpp", + "fstream": "cpp", + "future": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cfenv": "cpp", + "cinttypes": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "valarray": "cpp", + "variant": "cpp" } } \ No newline at end of file diff --git a/example/low_level/low_level.cpp b/example/low_level/low_level.cpp index e1f08c8..14715cc 100644 --- a/example/low_level/low_level.cpp +++ b/example/low_level/low_level.cpp @@ -195,7 +195,25 @@ void Custom::LowCmdWrite() int main(int argc, const char** argv) { - printf("lowcmd length: %d\n", sizeof(unitree_go::msg::dds_::LowCmd_)); + unitree_go::msg::dds_::LowCmd_ lowcmd; + lowcmd.head() = {20, 30}; + for(int k = 0; k < 20; ++k){ + lowcmd.motor_cmd()[k].mode() = 1; + } + + lowcmd.led() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + + uint32_t crc = crc32_core((uint32_t *)&lowcmd, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); + + for (int i = 0; i < (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1; i++){ + printf("%x\n", ((uint32_t *)&lowcmd)[i]); + } + printf("head: %x %x\n", lowcmd.head()[0], lowcmd.head()[1]); + printf("crc: %d, size: %d\n", crc, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); + + + // lowcmd.led = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + // printf("lowcmd length: %d\n", sizeof(unitree_go::msg::dds_::LowCmd_)); // if (argc < 2) // { // std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 72b316b..343aab8 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,7 +1,7 @@ project(crc_module) cmake_minimum_required(VERSION 3.5) -find_package(pybind11 REQUIRED PATHS /home/unitree/miniforge3/lib/python3.10/site-packages/pybind11/share/cmake/pybind11 NO_DEFAULT_PATH) +find_package(pybind11 REQUIRED PATHS /home/unitree/.local/lib/python3.8/site-packages/pybind11/share/cmake/pybind11 NO_DEFAULT_PATH) add_library(crc_module MODULE crc_pybind.cpp) include_directories(/usr/local/include/ddscxx /usr/local/include/iceoryx/v2.0.2) diff --git a/python/crc_module.so b/python/crc_module.so index c4b437804e733c6f8bec0526345e666972f07713..5ad145a100b194bbf0fefaef05b0696d305dc314 100755 GIT binary patch literal 798952 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

  • yn&?rxzA284Z&Gbm=R*Ddl*FqN>+ZgS-Glx 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 z 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 literal 763624 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%0AGy$=1{$Thm*}){I8kdQ7wn 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 BnGgT~ diff --git a/python/crc_pybind.cpp b/python/crc_pybind.cpp index 33b6d82..5ccf8d3 100644 --- a/python/crc_pybind.cpp +++ b/python/crc_pybind.cpp @@ -4,6 +4,44 @@ namespace py = pybind11; +typedef struct +{ + uint8_t off; // off 0xA5 + std::array reserve; +} BmsCmd; + +typedef struct +{ + uint8_t mode; // desired working mode + float q; // desired angle (unit: radian) + float dq; // desired velocity (unit: radian/second) + float tau; // desired output torque (unit: N.m) + float Kp; // desired position stiffness (unit: N.m/rad ) + float Kd; // desired velocity stiffness (unit: N.m/(rad/s) ) + std::array reserve; +} MotorCmd; // motor control + +typedef struct +{ + std::array head; + uint8_t levelFlag; + uint8_t frameReserve; + + std::array SN; + std::array version; + uint16_t bandWidth; + std::array motorCmd; + BmsCmd bms; + std::array wirelessRemote; + std::array led; + std::array fan; + uint8_t gpio; + uint32_t reserve; + + uint32_t crc; +} LowCmd; + + uint32_t crc32_core(uint32_t* ptr, uint32_t len) { unsigned int xbit = 0; @@ -38,14 +76,83 @@ uint32_t crc32_core(uint32_t* ptr, uint32_t len) uint32_t get_crc(py::object msg) { - // LowCmd raw; - std::vector head = py::cast>(msg.attr("head")); - auto size = head.size(); - printf("head len: %ld, vals: %d %d\n", size, head[0], head[1]); - return 0; + LowCmd raw{}; + + std::array head = py::cast>(msg.attr("head")); + + memcpy(&raw.head, &head, 2); + + raw.levelFlag = py::cast(msg.attr("level_flag")); + raw.frameReserve = py::cast(msg.attr("frame_reserve")); + + std::array SN = py::cast>(msg.attr("sn")); + memcpy(&raw.SN, &SN, 8); + + std::array version = py::cast>(msg.attr("version")); + memcpy(&raw.version, &version, 8); + + raw.bandWidth = py::cast(msg.attr("bandwidth")); + std::list motor_cmds = py::cast>(msg.attr("motor_cmd")); - // uint32_t crc = crc32_core((uint32_t *)&raw, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); - // return crc; + for (int i = 0; i < 20; i++) + { + py::object motor_cmd = motor_cmds.front(); + uint8_t mode = py::cast(motor_cmd.attr("mode")); + float q = py::cast(motor_cmd.attr("q")); + float dq = py::cast(motor_cmd.attr("dq")); + float tau = py::cast(motor_cmd.attr("tau")); + float Kp = py::cast(motor_cmd.attr("kp")); + float Kd = py::cast(motor_cmd.attr("kd")); + raw.motorCmd[i].mode = mode; + raw.motorCmd[i].q = q; + raw.motorCmd[i].dq = dq; + raw.motorCmd[i].tau = tau; + raw.motorCmd[i].Kp = Kp; + raw.motorCmd[i].Kd = Kd; + motor_cmds.pop_front(); + } + + BmsCmd bms; + py::object bms_msg = msg.attr("bms_cmd"); + bms.off = py::cast(bms_msg.attr("off")); + bms.reserve = py::cast>(bms_msg.attr("reserve")); + raw.bms.off = bms.off; + memcpy(&raw.bms.reserve, &bms.reserve, bms.reserve.size()*sizeof(uint8_t)); + + std::array wirelessRemote = py::cast>(msg.attr("wireless_remote")); + memcpy(&raw.wirelessRemote, &wirelessRemote, wirelessRemote.size()*sizeof(uint8_t)); + std::array led = py::cast>(msg.attr("led")); + memcpy(&raw.led, &led, led.size()*sizeof(uint8_t)); + std::array fan = py::cast>(msg.attr("fan")); + memcpy(&raw.fan, &fan, fan.size()*sizeof(uint8_t)); + + raw.gpio = py::cast(msg.attr("gpio")); + raw.reserve = py::cast(msg.attr("reserve")); + + // printf("head: %x %x\n", raw.head[0], raw.head[1]); + // printf("levelFlag: %x\n", raw.levelFlag); + // printf("frameReserve: %x\n", raw.frameReserve); + // printf("SN: %x %x\n", raw.SN[0], raw.SN[1]); + // printf("version: %x %x\n", raw.version[0], raw.version[1]); + // printf("bandWidth: %x\n", raw.bandWidth); + // printf("motorCmd[0]: %x %f %f %f %f %f\n", raw.motorCmd[0].mode, raw.motorCmd[0].q, raw.motorCmd[0].dq, raw.motorCmd[0].tau, raw.motorCmd[0].Kp, raw.motorCmd[0].Kd); + // printf("motorCmd[1]: %x %f %f %f %f %f\n", raw.motorCmd[1].mode, raw.motorCmd[1].q, raw.motorCmd[1].dq, raw.motorCmd[1].tau, raw.motorCmd[1].Kp, raw.motorCmd[1].Kd); + // printf("motorCmd[2]: %x %f %f %f %f %f\n", raw.motorCmd[2].mode, raw.motorCmd[2].q, raw.motorCmd[2].dq, raw.motorCmd[2].tau, raw.motorCmd[2].Kp, raw.motorCmd[2].Kd); + // printf("bms: %x %x %x %x\n", raw.bms.off, raw.bms.reserve[0], raw.bms.reserve[1], raw.bms.reserve[2]); + // printf("wirelessRemote: %x %x %x %x\n", raw.wirelessRemote[0], raw.wirelessRemote[1], raw.wirelessRemote[2], raw.wirelessRemote[3]); + // printf("led: %x %x %x %x\n", raw.led[0], raw.led[1], raw.led[2], raw.led[3]); + // printf("fan: %x %x\n", raw.fan[0], raw.fan[1]); + // printf("gpio: %x\n", raw.gpio); + // printf("reserve: %x\n", raw.reserve); + // printf("crc: %x\n", raw.crc); + + // for (int i = 0; i < (sizeof(LowCmd)>>2)-1; i++){ + // printf("%x\n", ((uint32_t *)&raw)[i]); + // } + + uint32_t crc = crc32_core((uint32_t *)&raw, (sizeof(LowCmd)>>2)-1); + // printf("crc: %d, size: %d\n", crc, (sizeof(LowCmd)>>2)-1); + return crc; } PYBIND11_MODULE(crc_module, m) { diff --git a/python/test_crc.py b/python/test_crc.py index d3fc85d..00e5f94 100644 --- a/python/test_crc.py +++ b/python/test_crc.py @@ -4,4 +4,14 @@ lowcmd = LowCmd() lowcmd.head = [20, 30] -get_crc(lowcmd) \ No newline at end of file +for k in range(20): + lowcmd.motor_cmd[k].mode = 1 + # lowcmd.motor_cmd[k].q = float(k) + # lowcmd.motor_cmd[k].dq = float(k) + # lowcmd.motor_cmd[k].tau = float(k) + # lowcmd.motor_cmd[k].kp = float(k) + # lowcmd.motor_cmd[k].kd = float(k) + + +lowcmd.led = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +print(get_crc(lowcmd)) \ No newline at end of file From 5481e2f08865967f060a7758b2d83fdc1d5afbce Mon Sep 17 00:00:00 2001 From: Yihuai Date: Mon, 5 Feb 2024 19:48:54 -0800 Subject: [PATCH 04/12] Remove redundant files --- .vscode/settings.json | 78 ------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 2f2b5ad..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "files.associations": { - "*.ino": "cpp", - "*.m": "matlab", - "*.cls": "latex", - "*.dtx": "latex", - "*.lsf": "matlab", - "tuple": "cpp", - "array": "cpp", - "string_view": "cpp", - "bitset": "cpp", - "initializer_list": "cpp", - "regex": "cpp", - "utility": "cpp", - "random": "cpp", - "cctype": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "atomic": "cpp", - "strstream": "cpp", - "bit": "cpp", - "*.tcc": "cpp", - "chrono": "cpp", - "codecvt": "cpp", - "complex": "cpp", - "condition_variable": "cpp", - "cstdint": "cpp", - "deque": "cpp", - "forward_list": "cpp", - "list": "cpp", - "map": "cpp", - "set": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "optional": "cpp", - "ratio": "cpp", - "string": "cpp", - "system_error": "cpp", - "type_traits": "cpp", - "fstream": "cpp", - "future": "cpp", - "iomanip": "cpp", - "iosfwd": "cpp", - "iostream": "cpp", - "istream": "cpp", - "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "ostream": "cpp", - "shared_mutex": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "cfenv": "cpp", - "cinttypes": "cpp", - "typeindex": "cpp", - "typeinfo": "cpp", - "valarray": "cpp", - "variant": "cpp" - } -} \ No newline at end of file From ca18a401adeceef36bcf006c882b9d64a88c5a0b Mon Sep 17 00:00:00 2001 From: Yihuai Date: Mon, 5 Feb 2024 19:51:28 -0800 Subject: [PATCH 05/12] Remove testing scripts --- example/low_level/low_level.cpp | 39 +++++++++------------------------ python/crc_pybind.cpp | 21 ------------------ python/test_crc.py | 10 ++++----- 3 files changed, 15 insertions(+), 55 deletions(-) diff --git a/example/low_level/low_level.cpp b/example/low_level/low_level.cpp index 14715cc..3a72803 100644 --- a/example/low_level/low_level.cpp +++ b/example/low_level/low_level.cpp @@ -195,40 +195,21 @@ void Custom::LowCmdWrite() int main(int argc, const char** argv) { - unitree_go::msg::dds_::LowCmd_ lowcmd; - lowcmd.head() = {20, 30}; - for(int k = 0; k < 20; ++k){ - lowcmd.motor_cmd()[k].mode() = 1; + if (argc < 2) + { + std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; + exit(-1); } - lowcmd.led() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + ChannelFactory::Instance()->Init(0, argv[1]); - uint32_t crc = crc32_core((uint32_t *)&lowcmd, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); + Custom custom; + custom.Init(); - for (int i = 0; i < (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1; i++){ - printf("%x\n", ((uint32_t *)&lowcmd)[i]); + while (1) + { + sleep(10); } - printf("head: %x %x\n", lowcmd.head()[0], lowcmd.head()[1]); - printf("crc: %d, size: %d\n", crc, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); - - - // lowcmd.led = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] - // printf("lowcmd length: %d\n", sizeof(unitree_go::msg::dds_::LowCmd_)); - // if (argc < 2) - // { - // std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; - // exit(-1); - // } - - // ChannelFactory::Instance()->Init(0, argv[1]); - - // Custom custom; - // custom.Init(); - - // while (1) - // { - // sleep(10); - // } return 0; } diff --git a/python/crc_pybind.cpp b/python/crc_pybind.cpp index 5ccf8d3..3a72d58 100644 --- a/python/crc_pybind.cpp +++ b/python/crc_pybind.cpp @@ -129,29 +129,8 @@ uint32_t get_crc(py::object msg) raw.gpio = py::cast(msg.attr("gpio")); raw.reserve = py::cast(msg.attr("reserve")); - // printf("head: %x %x\n", raw.head[0], raw.head[1]); - // printf("levelFlag: %x\n", raw.levelFlag); - // printf("frameReserve: %x\n", raw.frameReserve); - // printf("SN: %x %x\n", raw.SN[0], raw.SN[1]); - // printf("version: %x %x\n", raw.version[0], raw.version[1]); - // printf("bandWidth: %x\n", raw.bandWidth); - // printf("motorCmd[0]: %x %f %f %f %f %f\n", raw.motorCmd[0].mode, raw.motorCmd[0].q, raw.motorCmd[0].dq, raw.motorCmd[0].tau, raw.motorCmd[0].Kp, raw.motorCmd[0].Kd); - // printf("motorCmd[1]: %x %f %f %f %f %f\n", raw.motorCmd[1].mode, raw.motorCmd[1].q, raw.motorCmd[1].dq, raw.motorCmd[1].tau, raw.motorCmd[1].Kp, raw.motorCmd[1].Kd); - // printf("motorCmd[2]: %x %f %f %f %f %f\n", raw.motorCmd[2].mode, raw.motorCmd[2].q, raw.motorCmd[2].dq, raw.motorCmd[2].tau, raw.motorCmd[2].Kp, raw.motorCmd[2].Kd); - // printf("bms: %x %x %x %x\n", raw.bms.off, raw.bms.reserve[0], raw.bms.reserve[1], raw.bms.reserve[2]); - // printf("wirelessRemote: %x %x %x %x\n", raw.wirelessRemote[0], raw.wirelessRemote[1], raw.wirelessRemote[2], raw.wirelessRemote[3]); - // printf("led: %x %x %x %x\n", raw.led[0], raw.led[1], raw.led[2], raw.led[3]); - // printf("fan: %x %x\n", raw.fan[0], raw.fan[1]); - // printf("gpio: %x\n", raw.gpio); - // printf("reserve: %x\n", raw.reserve); - // printf("crc: %x\n", raw.crc); - - // for (int i = 0; i < (sizeof(LowCmd)>>2)-1; i++){ - // printf("%x\n", ((uint32_t *)&raw)[i]); - // } uint32_t crc = crc32_core((uint32_t *)&raw, (sizeof(LowCmd)>>2)-1); - // printf("crc: %d, size: %d\n", crc, (sizeof(LowCmd)>>2)-1); return crc; } diff --git a/python/test_crc.py b/python/test_crc.py index 00e5f94..5679823 100644 --- a/python/test_crc.py +++ b/python/test_crc.py @@ -6,11 +6,11 @@ lowcmd.head = [20, 30] for k in range(20): lowcmd.motor_cmd[k].mode = 1 - # lowcmd.motor_cmd[k].q = float(k) - # lowcmd.motor_cmd[k].dq = float(k) - # lowcmd.motor_cmd[k].tau = float(k) - # lowcmd.motor_cmd[k].kp = float(k) - # lowcmd.motor_cmd[k].kd = float(k) + lowcmd.motor_cmd[k].q = float(k) + lowcmd.motor_cmd[k].dq = float(k) + lowcmd.motor_cmd[k].tau = float(k) + lowcmd.motor_cmd[k].kp = float(k) + lowcmd.motor_cmd[k].kd = float(k) lowcmd.led = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] From 7c66f8b91dc31de5b26ebd9513c3d9c3dbad9407 Mon Sep 17 00:00:00 2001 From: Yihuai Date: Mon, 5 Feb 2024 20:17:49 -0800 Subject: [PATCH 06/12] Add readme --- python/README.md | 17 +++++++++++++++++ python/crc_module.pyi | 4 ++++ python/test_crc.py | 3 ++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 python/README.md create mode 100644 python/crc_module.pyi diff --git a/python/README.md b/python/README.md new file mode 100644 index 0000000..4250f61 --- /dev/null +++ b/python/README.md @@ -0,0 +1,17 @@ +# Usage + +The current `crc_module.so` is compiled on arm64 cpu and python3.8 (compatible with the default Go2 environment). Please compile the library yourself if you are running on a different platform/python environment. + +To use it in your Python script (both sdk and ros), please put this file to a directory included in `$PYTHONPATH` and refer to `test_crc.py` for an example. You can also put `crc_module.pyi` to the same directory as `crc_module.so` to enable python type hint. + +# Compiling + +Activate the correct python environment and use `pip install pybind11` to install pybind. +Find the pybind cmake path and replace `/home/unitree/.local/lib/python3.8/site-packages/pybind11/share/cmake/pybind11` in CMakeLists.txt + +```bash +cd python +mkdir build && cd build +cmake .. +make +``` diff --git a/python/crc_module.pyi b/python/crc_module.pyi new file mode 100644 index 0000000..531f80a --- /dev/null +++ b/python/crc_module.pyi @@ -0,0 +1,4 @@ +from unitree_go.msg import LowCmd +def get_crc(LowCmd: LowCmd) -> int: + """Calculates the CRC of a LowCmd message. Same as the C++ function.""" + ... \ No newline at end of file diff --git a/python/test_crc.py b/python/test_crc.py index 5679823..fbebefa 100644 --- a/python/test_crc.py +++ b/python/test_crc.py @@ -14,4 +14,5 @@ lowcmd.led = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] -print(get_crc(lowcmd)) \ No newline at end of file +print(get_crc(lowcmd)) +lowcmd.crc = get_crc(lowcmd) \ No newline at end of file From 4875240d620aaa76c4a1038aae718cf3b4aa55a2 Mon Sep 17 00:00:00 2001 From: Yihuai Gao Date: Mon, 25 Mar 2024 10:58:57 -0700 Subject: [PATCH 07/12] Update pybind path --- python/CMakeLists.txt | 2 +- python/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 343aab8..a450696 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,7 +1,7 @@ project(crc_module) cmake_minimum_required(VERSION 3.5) -find_package(pybind11 REQUIRED PATHS /home/unitree/.local/lib/python3.8/site-packages/pybind11/share/cmake/pybind11 NO_DEFAULT_PATH) +find_package(pybind11 REQUIRED PATHS ${PYBIND_PATH}/pybind11/share/cmake/pybind11 NO_DEFAULT_PATH) add_library(crc_module MODULE crc_pybind.cpp) include_directories(/usr/local/include/ddscxx /usr/local/include/iceoryx/v2.0.2) diff --git a/python/README.md b/python/README.md index 4250f61..30d928e 100644 --- a/python/README.md +++ b/python/README.md @@ -7,11 +7,11 @@ To use it in your Python script (both sdk and ros), please put this file to a di # Compiling Activate the correct python environment and use `pip install pybind11` to install pybind. -Find the pybind cmake path and replace `/home/unitree/.local/lib/python3.8/site-packages/pybind11/share/cmake/pybind11` in CMakeLists.txt +Find the pybind cmake path using `pip show pybind11 | grep Location | cut -d' ' -f2` and pass it to CMakeLists.txt ```bash cd python mkdir build && cd build -cmake .. +cmake .. -DPYBIND_PATH=$(pip show pybind11 | grep Location | cut -d' ' -f2) make ``` From b65c1bad26f8df7116437f7588caf9c8bf1e2d95 Mon Sep 17 00:00:00 2001 From: Yihuai Gao Date: Tue, 26 Mar 2024 17:20:05 -0700 Subject: [PATCH 08/12] (fix)crc: Include more directories in CMakeLists --- python/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index a450696..e611504 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -5,9 +5,11 @@ find_package(pybind11 REQUIRED PATHS ${PYBIND_PATH}/pybind11/share/cmake/pybind1 add_library(crc_module MODULE crc_pybind.cpp) include_directories(/usr/local/include/ddscxx /usr/local/include/iceoryx/v2.0.2) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include/ddscxx) link_libraries(unitree_sdk2 ddsc ddscxx rt pthread) - # Link pybind11 to your module target_link_libraries(crc_module PRIVATE pybind11::module) From 8c7738f22ea43567e2100d56d93dcfc9bb33eab8 Mon Sep 17 00:00:00 2001 From: Yihuai Gao Date: Tue, 26 Mar 2024 17:23:35 -0700 Subject: [PATCH 09/12] (feat)crc: specify python version and sys arch --- python/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index e611504..25b0fbf 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.5) find_package(pybind11 REQUIRED PATHS ${PYBIND_PATH}/pybind11/share/cmake/pybind11 NO_DEFAULT_PATH) -add_library(crc_module MODULE crc_pybind.cpp) +pybind11_add_module(crc_module crc_pybind.cpp) include_directories(/usr/local/include/ddscxx /usr/local/include/iceoryx/v2.0.2) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include) From 92506a409843c78be358d761d19aa254053a045f Mon Sep 17 00:00:00 2001 From: Yihuai Gao Date: Tue, 26 Mar 2024 18:24:38 -0700 Subject: [PATCH 10/12] (add)disable_sports --- CMakeLists.txt | 5 +- example/low_level/disable_sports_mode_go2.cpp | 308 ++++++++++++++++++ 2 files changed, 312 insertions(+), 1 deletion(-) create mode 100644 example/low_level/disable_sports_mode_go2.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 280584a..baa1f85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,9 @@ cmake_minimum_required(VERSION 3.5) SET(CMAKE_CXX_STANDARD 17) -include_directories(/usr/local/include/ddscxx /usr/local/include/iceoryx/v2.0.2) +include_directories(include thirdparty/include thirdparty/include/ddscxx thirdparty/include/iceoryx/v2.0.2) +link_directories(lib/${CMAKE_HOST_SYSTEM_PROCESSOR} thirdparty/lib/${CMAKE_HOST_SYSTEM_PROCESSOR}) + link_libraries(unitree_sdk2 ddsc ddscxx rt pthread) add_executable(test_publisher example/helloworld/publisher.cpp example/helloworld/HelloWorldData.cpp) @@ -12,6 +14,7 @@ add_executable(high_follow_sin example/high_level/follow_sin.cpp) add_executable(sportmode_test example/high_level/sportmode_test.cpp) add_executable(low_level example/low_level/low_level.cpp) add_executable(stand_example_go2 example/low_level/stand_example_go2.cpp) +add_executable(disable_sports_mode_go2 example/low_level/disable_sports_mode_go2.cpp) add_executable(stand_example_b2 example/low_level/stand_example_b2.cpp) add_executable(wireless example/wireless/wireless.cpp) add_executable(advanced_gamepad example/advanced_gamepad/main.cpp) diff --git a/example/low_level/disable_sports_mode_go2.cpp b/example/low_level/disable_sports_mode_go2.cpp new file mode 100644 index 0000000..c52fe04 --- /dev/null +++ b/example/low_level/disable_sports_mode_go2.cpp @@ -0,0 +1,308 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace unitree::common; +using namespace unitree::robot; +using namespace unitree::robot::go2; + +#define TOPIC_LOWCMD "rt/lowcmd" +#define TOPIC_LOWSTATE "rt/lowstate" + +constexpr double PosStopF = (2.146E+9f); +constexpr double VelStopF = (16000.0f); + +class Custom +{ +public: + explicit Custom(){} + ~Custom(){} + + void Init(); + void InitRobotStateClient(); + int queryServiceStatus(const std::string& serviceName); + void activateService(const std::string& serviceName,int activate); +private: + void InitLowCmd(); + void LowStateMessageHandler(const void* messages); + void LowCmdWrite(); + +private: + float Kp = 60.0; + float Kd = 5.0; + double time_consume = 0; + int rate_count = 0; + int sin_count = 0; + int motiontime = 0; + float dt = 0.002; // 0.001~0.01 + + RobotStateClient rsc; + + unitree_go::msg::dds_::LowCmd_ low_cmd{}; // default init + unitree_go::msg::dds_::LowState_ low_state{}; // default init + + /*publisher*/ + ChannelPublisherPtr lowcmd_publisher; + /*subscriber*/ + ChannelSubscriberPtr lowstate_subscriber; + + /*LowCmd write thread*/ + ThreadPtr lowCmdWriteThreadPtr; + + float _targetPos_1[12] = {0.0, 1.36, -2.65, 0.0, 1.36, -2.65, + -0.2, 1.36, -2.65, 0.2, 1.36, -2.65}; + + float _targetPos_2[12] = {0.0, 0.67, -1.3, 0.0, 0.67, -1.3, + 0.0, 0.67, -1.3, 0.0, 0.67, -1.3}; + + float _targetPos_3[12] = {-0.35, 1.36, -2.65, 0.35, 1.36, -2.65, + -0.5, 1.36, -2.65, 0.5, 1.36, -2.65}; + + float _startPos[12]; + float _duration_1 = 500; + float _duration_2 = 500; + float _duration_3 = 1000; + float _duration_4 = 900; + float _percent_1 = 0; + float _percent_2 = 0; + float _percent_3 = 0; + float _percent_4 = 0; + + bool firstRun = true; + bool done = false; +}; + +uint32_t crc32_core(uint32_t* ptr, uint32_t len) +{ + unsigned int xbit = 0; + unsigned int data = 0; + unsigned int CRC32 = 0xFFFFFFFF; + const unsigned int dwPolynomial = 0x04c11db7; + + for (unsigned int i = 0; i < len; i++) + { + xbit = 1 << 31; + data = ptr[i]; + for (unsigned int bits = 0; bits < 32; bits++) + { + if (CRC32 & 0x80000000) + { + CRC32 <<= 1; + CRC32 ^= dwPolynomial; + } + else + { + CRC32 <<= 1; + } + + if (data & xbit) + CRC32 ^= dwPolynomial; + xbit >>= 1; + } + } + + return CRC32; +} + +void Custom::Init() +{ + InitLowCmd(); + + /*create publisher*/ + lowcmd_publisher.reset(new ChannelPublisher(TOPIC_LOWCMD)); + lowcmd_publisher->InitChannel(); + + /*create subscriber*/ + lowstate_subscriber.reset(new ChannelSubscriber(TOPIC_LOWSTATE)); + lowstate_subscriber->InitChannel(std::bind(&Custom::LowStateMessageHandler, this, std::placeholders::_1), 1); + + /*loop publishing thread*/ + lowCmdWriteThreadPtr = CreateRecurrentThreadEx("writebasiccmd", UT_CPU_ID_NONE, 2000, &Custom::LowCmdWrite, this); +} + +void Custom::InitLowCmd() +{ + low_cmd.head()[0] = 0xFE; + low_cmd.head()[1] = 0xEF; + low_cmd.level_flag() = 0xFF; + low_cmd.gpio() = 0; + + for(int i=0; i<20; i++) + { + low_cmd.motor_cmd()[i].mode() = (0x01); // motor switch to servo (PMSM) mode + low_cmd.motor_cmd()[i].q() = (PosStopF); + low_cmd.motor_cmd()[i].kp() = (0); + low_cmd.motor_cmd()[i].dq() = (VelStopF); + low_cmd.motor_cmd()[i].kd() = (0); + low_cmd.motor_cmd()[i].tau() = (0); + } +} + +void Custom::InitRobotStateClient() +{ + rsc.SetTimeout(10.0f); + rsc.Init(); +} + +int Custom::queryServiceStatus(const std::string& serviceName) +{ + std::vector serviceStateList; + int ret,serviceStatus; + ret = rsc.ServiceList(serviceStateList); + size_t i, count=serviceStateList.size(); + for (i=0; i=500) + { + if(firstRun) + { + for(int i = 0; i < 12; i++) + { + _startPos[i] = low_state.motor_state()[i].q(); + } + firstRun = false; + } + + _percent_1 += (float)1 / _duration_1; + _percent_1 = _percent_1 > 1 ? 1 : _percent_1; + if (_percent_1 < 1) + { + for (int j = 0; j < 12; j++) + { + low_cmd.motor_cmd()[j].q() = (1 - _percent_1) * _startPos[j] + _percent_1 * _targetPos_1[j]; + low_cmd.motor_cmd()[j].dq() = 0; + low_cmd.motor_cmd()[j].kp() = Kp; + low_cmd.motor_cmd()[j].kd() = Kd; + low_cmd.motor_cmd()[j].tau() = 0; + } + + } + if ((_percent_1 == 1)&&(_percent_2 < 1)) + { + _percent_2 += (float)1 / _duration_2; + _percent_2 = _percent_2 > 1 ? 1 : _percent_2; + + for (int j = 0; j < 12; j++) + { + low_cmd.motor_cmd()[j].q() = (1 - _percent_2) * _targetPos_1[j] + _percent_2 * _targetPos_2[j]; + low_cmd.motor_cmd()[j].dq() = 0; + low_cmd.motor_cmd()[j].kp() = Kp; + low_cmd.motor_cmd()[j].kd() = Kd; + low_cmd.motor_cmd()[j].tau() = 0; + } + } + + if ((_percent_1 == 1)&&(_percent_2 == 1)&&(_percent_3<1)) + { + _percent_3 += (float)1 / _duration_3; + _percent_3 = _percent_3 > 1 ? 1 : _percent_3; + + for (int j = 0; j < 12; j++) + { + low_cmd.motor_cmd()[j].q() = _targetPos_2[j]; + low_cmd.motor_cmd()[j].dq() = 0; + low_cmd.motor_cmd()[j].kp() = Kp; + low_cmd.motor_cmd()[j].kd() = Kd; + low_cmd.motor_cmd()[j].tau() = 0; + } + } + if ((_percent_1 == 1)&&(_percent_2 == 1)&&(_percent_3==1)&&((_percent_4<=1))) + { + _percent_4 += (float)1 / _duration_4; + _percent_4 = _percent_4 > 1 ? 1 : _percent_4; + for (int j = 0; j < 12; j++) + { + low_cmd.motor_cmd()[j].q() = (1 - _percent_4) * _targetPos_2[j] + _percent_4 * _targetPos_3[j]; + low_cmd.motor_cmd()[j].dq() = 0; + low_cmd.motor_cmd()[j].kp() = Kp; + low_cmd.motor_cmd()[j].kd() = Kd; + low_cmd.motor_cmd()[j].tau() = 0; + } + } + low_cmd.crc() = crc32_core((uint32_t *)&low_cmd, (sizeof(unitree_go::msg::dds_::LowCmd_)>>2)-1); + + lowcmd_publisher->Write(low_cmd); + } + +} + +int main(int argc, const char** argv) +{ + if (argc < 2) + { + std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; + exit(-1); + } + + std::cout << "WARNING: Make sure the robot is hung up or lying on the ground." << std::endl + << "Press Enter to continue..." << std::endl; + std::cin.ignore(); + + ChannelFactory::Instance()->Init(0, argv[1]); + + Custom custom; + custom.InitRobotStateClient(); + while(custom.queryServiceStatus("sport_mode")) + { + std::cout<<"Try to deactivate the service: "<<"sport_mode"< Date: Mon, 1 Jul 2024 20:30:22 -0700 Subject: [PATCH 11/12] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ffd31c..62ff66c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # unitree_sdk2 -Unitree robot sdk version 2. +Unitree robot sdk version 2 modified by @yihuai-gao + +## Additional features +- python/crc_module.cpython-310-aarch64-linux-gnu.so to calculate crc for each message pack when running python ros2 +- build/disable_sports_mode_go2 to disable sports mode before running self-built controller +usage: [README](python/README.md) + ### Prebuild environment * OS (Ubuntu 20.04 LTS) From 8bf103822dd7cade647032caf6cec0b162af0889 Mon Sep 17 00:00:00 2001 From: Yihuai Gao <70081676+yihuai-gao@users.noreply.github.com> Date: Mon, 1 Jul 2024 20:30:49 -0700 Subject: [PATCH 12/12] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 62ff66c..cd68eb5 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Unitree robot sdk version 2 modified by @yihuai-gao ## Additional features - python/crc_module.cpython-310-aarch64-linux-gnu.so to calculate crc for each message pack when running python ros2 - build/disable_sports_mode_go2 to disable sports mode before running self-built controller + usage: [README](python/README.md)